-
Notifications
You must be signed in to change notification settings - Fork 0
/
tinydoze.asm
157 lines (114 loc) · 2.66 KB
/
tinydoze.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
.386
.model flat, stdcall
option casemap : none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
.data
c_AppName byte "Josh's Tiny App", 0
.code
WndProc proc hWindow:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL paintStructure : PAINTSTRUCT
LOCAL clientRect : RECT
cmp uMsg, WM_DESTROY
je DestroyMessageHandler
cmp uMsg, WM_PAINT
je PaintMessageHandler
invoke DefWindowProc,
hWindow,
uMsg,
wParam,
lParam
ret
PaintMessageHandler:
lea ebx, clientRect
invoke GetClientRect,
hWindow,
ebx
lea eax, paintStructure
push eax
invoke BeginPaint,
hWindow,
eax
push DT_CENTER or DT_VCENTER or DT_SINGLELINE
push ebx
xchg ebx, eax
invoke SetBkMode,
ebx,
TRANSPARENT
push -1
push offset c_AppName
push ebx
call DrawText
push hWindow
call EndPaint
jmp ReturnFromMessageHandler
DestroyMessageHandler:
invoke PostQuitMessage,
0
ReturnFromMessageHandler:
xor eax, eax
ret
WndProc endp
start proc
LOCAL windowClass : WNDCLASSEX
LOCAL message : MSG
xor ebx, ebx
push ebx
push ebx
push ebx
push ebx
push 480 ; you could write an 8 bit value here to use a smaller op code and save space
push 600 ; but I didn't count that as "functionally equivalent"
mov edx, CW_USEDEFAULT
push edx
push edx
push WS_OVERLAPPEDWINDOW or WS_VISIBLE
mov ecx, offset c_AppName
push ecx
xor windowClass.cbSize, sizeof windowClass
xor windowClass.style, CS_HREDRAW or CS_VREDRAW
xor windowClass.lpfnWndProc, offset WndProc
xor windowClass.cbClsExtra, ebx
xor windowClass.cbWndExtra, ebx
xor windowClass.hInstance, ebx
xor windowClass.hbrBackground, COLOR_3DSHADOW + 1
xor windowClass.lpszMenuName, ebx
xor windowClass.lpszClassName, ecx
invoke LoadIconA,
ebx,
IDI_APPLICATION
mov windowClass.hIcon, eax
mov windowClass.hIconSm, eax
invoke LoadCursorA,
ebx,
IDC_ARROW
mov windowClass.hCursor, eax
lea eax, windowClass
invoke RegisterClassEx,
eax
push eax
push ebx
call CreateWindowEx
MessageLoop:
xor eax, eax
lea ebx, message
invoke GetMessage,
ebx,
eax,
eax,
eax
test eax, eax
je NoMoreMessages
invoke TranslateMessage,
ebx
invoke DispatchMessage,
ebx
jmp MessageLoop
NoMoreMessages:
mov eax, message.wParam
ret
start endp
end start