Full.asm 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. ; #########################################################################
  2. .386
  3. .model flat, stdcall
  4. option casemap :none ; case sensitive
  5. ; #########################################################################
  6. include \masm32\include\windows.inc
  7. include \masm32\include\user32.inc
  8. include \masm32\include\kernel32.inc
  9. includelib \masm32\lib\user32.lib
  10. includelib \masm32\lib\kernel32.lib
  11. ; #########################################################################
  12. ;=============
  13. ; Local macros
  14. ;=============
  15. szText MACRO Name, Text:VARARG
  16. LOCAL lbl
  17. jmp lbl
  18. Name db Text,0
  19. lbl:
  20. ENDM
  21. m2m MACRO M1, M2
  22. push M2
  23. pop M1
  24. ENDM
  25. return MACRO arg
  26. mov eax, arg
  27. ret
  28. ENDM
  29. ;=================
  30. ; Local prototypes
  31. ;=================
  32. WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
  33. WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
  34. TopXY PROTO :DWORD,:DWORD
  35. .data
  36. szDisplayName db "Template",0
  37. CommandLine dd 0
  38. hWnd dd 0
  39. hInstance dd 0
  40. .code
  41. start:
  42. invoke GetModuleHandle, NULL
  43. mov hInstance, eax
  44. invoke GetCommandLine
  45. mov CommandLine, eax
  46. invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
  47. invoke ExitProcess,eax
  48. ; #########################################################################
  49. WinMain proc hInst :DWORD,
  50. hPrevInst :DWORD,
  51. CmdLine :DWORD,
  52. CmdShow :DWORD
  53. ;====================
  54. ; Put LOCALs on stack
  55. ;====================
  56. LOCAL wc :WNDCLASSEX
  57. LOCAL msg :MSG
  58. LOCAL Wwd :DWORD
  59. LOCAL Wht :DWORD
  60. LOCAL Wtx :DWORD
  61. LOCAL Wty :DWORD
  62. ;==================================================
  63. ; Fill WNDCLASSEX structure with required variables
  64. ;==================================================
  65. mov wc.cbSize, sizeof WNDCLASSEX
  66. mov wc.style, CS_HREDRAW or CS_VREDRAW \
  67. or CS_BYTEALIGNWINDOW
  68. mov wc.lpfnWndProc, offset WndProc
  69. mov wc.cbClsExtra, NULL
  70. mov wc.cbWndExtra, NULL
  71. m2m wc.hInstance, hInst
  72. mov wc.hbrBackground, COLOR_BTNFACE+1
  73. mov wc.lpszMenuName, NULL
  74. mov wc.lpszClassName, offset szClassName
  75. invoke LoadIcon,hInst,500 ; icon ID
  76. mov wc.hIcon, eax
  77. invoke LoadCursor,NULL,IDC_ARROW
  78. mov wc.hCursor, eax
  79. mov wc.hIconSm, 0
  80. invoke RegisterClassEx, ADDR wc
  81. ;================================
  82. ; Centre window at following size
  83. ;================================
  84. mov Wwd, 500
  85. mov Wht, 350
  86. invoke GetSystemMetrics,SM_CXSCREEN
  87. invoke TopXY,Wwd,eax
  88. mov Wtx, eax
  89. invoke GetSystemMetrics,SM_CYSCREEN
  90. invoke TopXY,Wht,eax
  91. mov Wty, eax
  92. szText szClassName,"Template_Class"
  93. invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
  94. ADDR szClassName,
  95. ADDR szDisplayName,
  96. WS_OVERLAPPEDWINDOW,
  97. Wtx,Wty,Wwd,Wht,
  98. NULL,NULL,
  99. hInst,NULL
  100. mov hWnd,eax
  101. invoke LoadMenu,hInst,600 ; menu ID
  102. invoke SetMenu,hWnd,eax
  103. invoke ShowWindow,hWnd,SW_SHOWNORMAL
  104. invoke UpdateWindow,hWnd
  105. ;===================================
  106. ; Loop until PostQuitMessage is sent
  107. ;===================================
  108. StartLoop:
  109. invoke GetMessage,ADDR msg,NULL,0,0
  110. cmp eax, 0
  111. je ExitLoop
  112. invoke TranslateMessage, ADDR msg
  113. invoke DispatchMessage, ADDR msg
  114. jmp StartLoop
  115. ExitLoop:
  116. return msg.wParam
  117. WinMain endp
  118. ; #########################################################################
  119. WndProc proc hWin :DWORD,
  120. uMsg :DWORD,
  121. wParam :DWORD,
  122. lParam :DWORD
  123. .if uMsg == WM_COMMAND
  124. ;======== menu commands ========
  125. .if wParam == 1000
  126. invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
  127. .elseif wParam == 1900
  128. szText TheMsg,"Assembler, Pure & Simple"
  129. invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK
  130. .endif
  131. ;====== end menu commands ======
  132. .elseif uMsg == WM_CLOSE
  133. szText TheText,"Please Confirm Exit"
  134. invoke MessageBox,hWin,ADDR TheText,ADDR szDisplayName,MB_YESNO
  135. .if eax == IDNO
  136. return 0
  137. .endif
  138. .elseif uMsg == WM_DESTROY
  139. invoke PostQuitMessage,NULL
  140. return 0
  141. .endif
  142. invoke DefWindowProc,hWin,uMsg,wParam,lParam
  143. ret
  144. WndProc endp
  145. ; ########################################################################
  146. TopXY proc wDim:DWORD, sDim:DWORD
  147. shr sDim, 1 ; divide screen dimension by 2
  148. shr wDim, 1 ; divide window dimension by 2
  149. mov eax, wDim ; copy window dimension into eax
  150. sub sDim, eax ; sub half win dimension from half screen dimension
  151. return sDim
  152. TopXY endp
  153. ; ########################################################################
  154. end start