Rev 6035 | Rev 8869 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6035 | Rev 6044 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
6 | ;; ;; |
6 | ;; ;; |
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
8 | 8 | ||
9 | $Revision: 6035 $ |
9 | $Revision: 6044 $ |
10 | 10 | ||
11 | button.MAX_BUTTONS = 4095 |
11 | button.MAX_BUTTONS = 4095 |
12 | 12 | ||
13 | struct SYS_BUTTON |
13 | struct SYS_BUTTON |
14 | pslot dw ? |
14 | pslot dw ? |
15 | id_lo dw ? |
15 | id_lo dw ? |
16 | left dw ? |
16 | left dw ? |
17 | width dw ? |
17 | width dw ? |
18 | top dw ? |
18 | top dw ? |
19 | height dw ? |
19 | height dw ? |
20 | id_hi dw ? |
20 | id_hi dw ? |
21 | dw ? |
21 | dw ? |
22 | ends |
22 | ends |
23 | 23 | ||
24 | ;--------------------------------------------------------------- |
24 | ;--------------------------------------------------------------- |
25 | syscall_button: ;////////////// system function 8 ////////////// |
25 | syscall_button: ;////////////// system function 8 ////////////// |
26 | ;--------------------------------------------------------------- |
26 | ;--------------------------------------------------------------- |
27 | ;? Define/undefine GUI button object |
27 | ;? Define/undefine GUI button object |
28 | ;--------------------------------------------------------------- |
28 | ;--------------------------------------------------------------- |
29 | ;; Define button: |
29 | ;; Define button: |
30 | ;> ebx = pack[16(x), 16(width)] |
30 | ;> ebx = pack[16(x), 16(width)] |
31 | ;> ecx = pack[16(y), 16(height)] |
31 | ;> ecx = pack[16(y), 16(height)] |
32 | ;> edx = pack[8(flags), 24(button identifier)] |
32 | ;> edx = pack[8(flags), 24(button identifier)] |
33 | ;> flags bits: |
33 | ;> flags bits: |
34 | ;> 7 (31) = 0 |
34 | ;> 7 (31) = 0 |
35 | ;> 6 (30) = don't draw button |
35 | ;> 6 (30) = don't draw button |
36 | ;> 5 (29) = don't draw button frame when pressed |
36 | ;> 5 (29) = don't draw button frame when pressed |
37 | ;> esi = button color |
37 | ;> esi = button color |
38 | ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
38 | ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
39 | ;; Undefine button: |
39 | ;; Undefine button: |
40 | ;> edx = pack[8(flags), 24(button identifier)] |
40 | ;> edx = pack[8(flags), 24(button identifier)] |
41 | ;> flags bits: |
41 | ;> flags bits: |
42 | ;> 7 (31) = 1 |
42 | ;> 7 (31) = 1 |
43 | ;--------------------------------------------------------------- |
43 | ;--------------------------------------------------------------- |
44 | ; do we actually need to undefine the button? |
44 | ; do we actually need to undefine the button? |
45 | test edx, 0x80000000 |
45 | test edx, 0x80000000 |
46 | jnz .remove_button |
46 | jnz .remove_button |
47 | 47 | ||
48 | ; do we have free button slots available? |
48 | ; do we have free button slots available? |
49 | mov edi, [BTN_ADDR] |
49 | mov edi, [BTN_ADDR] |
50 | mov eax, [edi] |
50 | mov eax, [edi] |
51 | cmp eax, button.MAX_BUTTONS |
51 | cmp eax, button.MAX_BUTTONS |
52 | jge .exit |
52 | jge .exit |
53 | 53 | ||
54 | ; does it have positive size? (otherwise it doesn't have sense) |
54 | ; does it have positive size? (otherwise it doesn't have sense) |
55 | or bx, bx |
55 | or bx, bx |
56 | jle .exit |
56 | jle .exit |
57 | or cx, cx |
57 | or cx, cx |
58 | jle .exit |
58 | jle .exit |
59 | 59 | ||
60 | ; make coordinates clientbox-relative |
60 | ; make coordinates clientbox-relative |
61 | push eax |
61 | push eax |
62 | mov eax, [current_slot] |
62 | mov eax, [current_slot] |
63 | rol ebx, 16 |
63 | rol ebx, 16 |
64 | add bx, word[eax + APPDATA.wnd_clientbox.left] |
64 | add bx, word[eax + APPDATA.wnd_clientbox.left] |
65 | rol ebx, 16 |
65 | rol ebx, 16 |
66 | rol ecx, 16 |
66 | rol ecx, 16 |
67 | add cx, word[eax + APPDATA.wnd_clientbox.top] |
67 | add cx, word[eax + APPDATA.wnd_clientbox.top] |
68 | rol ecx, 16 |
68 | rol ecx, 16 |
69 | pop eax |
69 | pop eax |
70 | 70 | ||
71 | ; basic checks passed, define the button |
71 | ; basic checks passed, define the button |
72 | inc eax |
72 | inc eax |
73 | mov [edi], ax |
73 | mov [edi], ax |
74 | shl eax, 4 |
74 | shl eax, 4 |
75 | add edi, eax |
75 | add edi, eax |
76 | ; NOTE: this code doesn't rely on SYS_BUTTON struct, |
76 | ; NOTE: this code doesn't rely on SYS_BUTTON struct, |
77 | ; please revise it, if you change something. |
77 | ; please revise it, if you change something. |
78 | mov ax, [CURRENT_TASK] |
78 | mov ax, [CURRENT_TASK] |
79 | stosw |
79 | stosw |
80 | mov ax, dx |
80 | mov ax, dx |
81 | stosw ; button id number: bits 0-15 |
81 | stosw ; button id number: bits 0-15 |
82 | mov eax, ebx |
82 | mov eax, ebx |
83 | rol eax, 16 |
83 | rol eax, 16 |
84 | stosd ; x start | x size |
84 | stosd ; x start | x size |
85 | mov eax, ecx |
85 | mov eax, ecx |
86 | rol eax, 16 |
86 | rol eax, 16 |
87 | stosd ; y start | y size |
87 | stosd ; y start | y size |
88 | mov eax, edx |
88 | mov eax, edx |
89 | shr eax, 16 |
89 | shr eax, 16 |
90 | stosw ; button id number: bits 16-31 |
90 | stosw ; button id number: bits 16-31 |
91 | 91 | ||
92 | ; do we also need to draw the button? |
92 | ; do we also need to draw the button? |
93 | test edx, 0x40000000 |
93 | test edx, 0x40000000 |
94 | jnz .exit |
94 | jnz .exit |
95 | 95 | ||
96 | and esi, 0xFFFFFF |
96 | and esi, 0xFFFFFF |
97 | xor edi, edi |
97 | xor edi, edi |
98 | push ebx ecx esi |
98 | push ebx ecx esi |
99 | dec cx |
99 | dec cx |
100 | dec cx |
100 | dec cx |
101 | cmp [buttontype], 1 |
101 | cmp [buttontype], 1 |
102 | jnz .draw |
102 | jnz .draw |
103 | cmp cx, 65 |
103 | cmp cx, 65 |
104 | jnc .draw |
104 | jnc .draw |
105 | 105 | ||
106 | ; calculate gradient data |
106 | ; calculate gradient data |
107 | mov eax, esi |
107 | mov eax, esi |
108 | shl eax, 8 |
108 | shl eax, 8 |
109 | mov edx, 3 |
109 | mov edx, 3 |
110 | .calculate: |
110 | .calculate: |
111 | rol eax, 8 |
111 | rol eax, 8 |
112 | shl al, 1 |
112 | shl al, 1 |
113 | jnc @f |
113 | jnc @f |
114 | neg al |
114 | neg al |
115 | jnz @f |
115 | jnz @f |
116 | mov al, 64 |
116 | mov al, 64 |
117 | @@: |
117 | @@: |
118 | cmp al, 65 |
118 | cmp al, 65 |
119 | jc @f |
119 | jc @f |
120 | mov al, 64 |
120 | mov al, 64 |
121 | @@: |
121 | @@: |
122 | div cl |
122 | div cl |
123 | shl ax, 8 |
123 | shl ax, 8 |
124 | dec edx |
124 | dec edx |
125 | jnz .calculate |
125 | jnz .calculate |
126 | mov dl, cl |
126 | mov dl, cl |
127 | dec edx |
127 | dec edx |
128 | shr edx, 1 |
128 | shr edx, 1 |
129 | shr eax, 8 |
129 | shr eax, 8 |
130 | mov edi, eax |
130 | mov edi, eax |
131 | mul edx |
131 | mul edx |
132 | add esi, eax |
132 | add esi, eax |
133 | 133 | ||
134 | .draw: ; calculate window-relative coordinates |
134 | .draw: ; calculate window-relative coordinates |
135 | movzx ebp, cx |
135 | movzx ebp, cx |
136 | dec ebp |
136 | dec ebp |
137 | shr ebx, 16 |
137 | shr ebx, 16 |
138 | shr ecx, 16 |
138 | shr ecx, 16 |
139 | mov eax, [TASK_BASE] |
139 | mov eax, [TASK_BASE] |
140 | add ebx, [eax - twdw + WDATA.box.left] |
140 | add ebx, [eax - twdw + WDATA.box.left] |
141 | add ecx, [eax - twdw + WDATA.box.top] |
141 | add ecx, [eax - twdw + WDATA.box.top] |
142 | mov eax, ebx |
142 | mov eax, ebx |
143 | inc eax |
143 | inc eax |
144 | mov edx, ebx |
144 | mov edx, ebx |
145 | add dx, [esp+8] |
145 | add dx, [esp+8] |
146 | dec edx |
146 | dec edx |
147 | mov ebx, ecx |
147 | mov ebx, ecx |
148 | mov ecx, esi |
148 | mov ecx, esi |
149 | shr ecx, 1 |
149 | shr ecx, 1 |
150 | and cx, 7F7Fh |
150 | and cx, 7F7Fh |
151 | push esi |
151 | push esi |
152 | mov esi, edi |
152 | mov esi, edi |
153 | xor edi, edi |
153 | xor edi, edi |
154 | call hline ; top border |
154 | call hline ; top border |
155 | inc ebx |
155 | inc ebx |
156 | or ecx, 808080h |
156 | or ecx, 808080h |
157 | call hline ; top light line |
157 | call hline ; top light line |
158 | pop ecx |
158 | pop ecx |
159 | inc ebx |
159 | inc ebx |
160 | .next_line: |
160 | .next_line: |
161 | call hline ; button body |
161 | call hline ; button body |
162 | inc ebx |
162 | inc ebx |
163 | sub ecx, esi |
163 | sub ecx, esi |
164 | dec ebp |
164 | dec ebp |
165 | jnz .next_line |
165 | jnz .next_line |
166 | shr ecx, 2 |
166 | shr ecx, 2 |
167 | and cx, 3F3Fh |
167 | and cx, 3F3Fh |
168 | mov ebp, ecx |
168 | mov ebp, ecx |
169 | shl ecx, 1 |
169 | shl ecx, 1 |
170 | add ecx, ebp |
170 | add ecx, ebp |
171 | call hline ; bottom dark line |
171 | call hline ; bottom dark line |
172 | inc ebx |
172 | inc ebx |
173 | sub ecx, ebp |
173 | sub ecx, ebp |
174 | call hline ; bottom border |
174 | call hline ; bottom border |
175 | pop ecx |
175 | pop ecx |
176 | shr ecx, 1 |
176 | shr ecx, 1 |
177 | inc edx |
177 | inc edx |
178 | push edx |
178 | push edx |
179 | mov edx, ebx |
179 | mov edx, ebx |
180 | sub bx, [esp+4] |
180 | sub bx, [esp+4] |
181 | dec edx |
181 | dec edx |
182 | inc ebx |
182 | inc ebx |
183 | cmp [buttontype], 0 |
183 | cmp [buttontype], 0 |
184 | jnz @f |
184 | jnz @f |
185 | dec edx |
185 | dec edx |
186 | or ecx, 808080h |
186 | or ecx, 808080h |
187 | call vline ; left light line |
187 | call vline ; left light line |
188 | inc edx |
188 | inc edx |
189 | @@: |
189 | @@: |
190 | and ecx, 7F7F7Fh |
190 | and ecx, 7F7F7Fh |
191 | dec eax |
191 | dec eax |
192 | call vline ; left border |
192 | call vline ; left border |
193 | pop eax |
193 | pop eax |
194 | call vline ; right border |
194 | call vline ; right border |
195 | cmp [buttontype], 0 |
195 | cmp [buttontype], 0 |
196 | jnz @f |
196 | jnz @f |
197 | mov ebp, ecx |
197 | mov ebp, ecx |
198 | shr ecx, 1 |
198 | shr ecx, 1 |
199 | and cx, 7F7Fh |
199 | and cx, 7F7Fh |
200 | add ecx, ebp |
200 | add ecx, ebp |
201 | dec eax |
201 | dec eax |
202 | inc ebx |
202 | inc ebx |
203 | call vline ; right dark line |
203 | call vline ; right dark line |
204 | @@: |
204 | @@: |
205 | pop ecx ebx |
205 | pop ecx ebx |
206 | .exit: |
206 | .exit: |
207 | ret |
207 | ret |
208 | 208 | ||
209 | ; FIXME: mutex needed |
209 | ; FIXME: mutex needed |
210 | .remove_button: |
210 | .remove_button: |
211 | and edx, 0x00ffffff |
211 | and edx, 0x00ffffff |
212 | mov edi, [BTN_ADDR] |
212 | mov edi, [BTN_ADDR] |
213 | mov ebx, [edi] |
213 | mov ebx, [edi] |
214 | inc ebx |
214 | inc ebx |
215 | imul esi, ebx, sizeof.SYS_BUTTON |
215 | imul esi, ebx, sizeof.SYS_BUTTON |
216 | add esi, edi |
216 | add esi, edi |
217 | xor ecx, ecx |
217 | xor ecx, ecx |
218 | add ecx, -sizeof.SYS_BUTTON |
218 | add ecx, -sizeof.SYS_BUTTON |
219 | add esi, sizeof.SYS_BUTTON |
219 | add esi, sizeof.SYS_BUTTON |
220 | 220 | ||
221 | .next_button: |
221 | .next_button: |
222 | dec ebx |
222 | dec ebx |
223 | jz .exit |
223 | jz .exit |
224 | 224 | ||
225 | add ecx, sizeof.SYS_BUTTON |
225 | add ecx, sizeof.SYS_BUTTON |
226 | add esi, -sizeof.SYS_BUTTON |
226 | add esi, -sizeof.SYS_BUTTON |
227 | 227 | ||
228 | ; does it belong to our process? |
228 | ; does it belong to our process? |
229 | mov ax, [CURRENT_TASK] |
229 | mov ax, [CURRENT_TASK] |
230 | cmp ax, [esi + SYS_BUTTON.pslot] |
230 | cmp ax, [esi + SYS_BUTTON.pslot] |
231 | jne .next_button |
231 | jne .next_button |
232 | 232 | ||
233 | ; does the identifier match? |
233 | ; does the identifier match? |
234 | mov eax, dword[esi + SYS_BUTTON.id_hi - 2] |
234 | mov eax, dword[esi + SYS_BUTTON.id_hi - 2] |
235 | mov ax, [esi + SYS_BUTTON.id_lo] |
235 | mov ax, [esi + SYS_BUTTON.id_lo] |
236 | and eax, 0x00ffffff |
236 | and eax, 0x00ffffff |
237 | cmp edx, eax |
237 | cmp edx, eax |
238 | jne .next_button |
238 | jne .next_button |
239 | 239 | ||
240 | ; okay, undefine it |
240 | ; okay, undefine it |
241 | push ebx |
241 | push ebx |
242 | mov ebx, esi |
242 | mov ebx, esi |
243 | lea eax, [esi + sizeof.SYS_BUTTON] |
243 | lea eax, [esi + sizeof.SYS_BUTTON] |
244 | call memmove |
244 | call memmove |
245 | dec dword[edi] |
245 | dec dword[edi] |
246 | add ecx, -sizeof.SYS_BUTTON |
246 | add ecx, -sizeof.SYS_BUTTON |
247 | pop ebx |
247 | pop ebx |
248 | jmp .next_button |
248 | jmp .next_button |
249 | 249 | ||
250 | ;--------------------------------------------------------------- |
250 | ;--------------------------------------------------------------- |
251 | sys_button_activate_handler: |
251 | sys_button_activate_handler: |
252 | sys_button_deactivate_handler: |
252 | sys_button_deactivate_handler: |
253 | ;--------------------------------------------------------------- |
253 | ;--------------------------------------------------------------- |
254 | ;> eax = pack[8(process slot), 24(button id)] |
254 | ;> eax = pack[8(process slot), 24(button id)] |
255 | ;> ebx = pack[16(button x coord), 16(button y coord)] |
255 | ;> ebx = pack[16(button x coord), 16(button y coord)] |
256 | ;> cl = mouse button mask this system button was pressed with |
256 | ;> cl = mouse button mask this system button was pressed with |
257 | ;--------------------------------------------------------------- |
257 | ;--------------------------------------------------------------- |
258 | ; find system button by specified process slot, id and coordinates |
258 | ; find system button by specified process slot, id and coordinates |
259 | push ecx edx esi edi |
259 | push ecx edx esi edi |
260 | mov edx, eax |
260 | mov edx, eax |
261 | shr edx, 24 |
261 | shr edx, 24 |
262 | and eax, 0x0ffffff |
262 | and eax, 0x0ffffff |
263 | mov edi, [BTN_ADDR] |
263 | mov edi, [BTN_ADDR] |
264 | mov ecx, [edi] |
264 | mov ecx, [edi] |
265 | imul esi, ecx, sizeof.SYS_BUTTON |
265 | imul esi, ecx, sizeof.SYS_BUTTON |
266 | add esi, edi |
266 | add esi, edi |
267 | inc ecx |
267 | inc ecx |
268 | add esi, sizeof.SYS_BUTTON |
268 | add esi, sizeof.SYS_BUTTON |
269 | .next_button: |
269 | .next_button: |
270 | dec ecx |
270 | dec ecx |
271 | jz .popexit |
271 | jz .popexit |
272 | add esi, -sizeof.SYS_BUTTON |
272 | add esi, -sizeof.SYS_BUTTON |
273 | 273 | ||
274 | ; does it belong to our process? |
274 | ; does it belong to our process? |
275 | cmp dx, [esi + SYS_BUTTON.pslot] |
275 | cmp dx, [esi + SYS_BUTTON.pslot] |
276 | jne .next_button |
276 | jne .next_button |
277 | 277 | ||
278 | ; does id match? |
278 | ; does id match? |
279 | mov edi, dword[esi + SYS_BUTTON.id_hi - 2] |
279 | mov edi, dword[esi + SYS_BUTTON.id_hi - 2] |
280 | mov di, [esi + SYS_BUTTON.id_lo] |
280 | mov di, [esi + SYS_BUTTON.id_lo] |
281 | and edi, 0x0ffffff |
281 | and edi, 0x0ffffff |
282 | cmp eax, edi |
282 | cmp eax, edi |
283 | jne .next_button |
283 | jne .next_button |
284 | 284 | ||
285 | ; does coordinates match? |
285 | ; does coordinates match? |
286 | mov edi, dword[esi + SYS_BUTTON.left - 2] |
286 | mov edi, dword[esi + SYS_BUTTON.left - 2] |
287 | mov di, [esi + SYS_BUTTON.top] |
287 | mov di, [esi + SYS_BUTTON.top] |
288 | cmp ebx, edi |
288 | cmp ebx, edi |
289 | jne .next_button |
289 | jne .next_button |
290 | 290 | ||
291 | mov eax, esi |
291 | mov eax, esi |
292 | pop edi esi edx ecx |
292 | pop edi esi edx ecx |
293 | mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] |
293 | mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] |
294 | 294 | ||
295 | ; display button border on press? |
295 | ; display button border on press? |
296 | test ebx, 0x20000000 |
296 | bt ebx, 29 |
297 | jnz .exit |
297 | jc .exit |
298 | 298 | ||
299 | ; invert system button border |
299 | ; invert system button border |
300 | pushad |
300 | pushad |
301 | mov esi, eax |
301 | mov esi, eax |
- | 302 | mov edi, ebx |
|
302 | movzx ecx, [esi + SYS_BUTTON.pslot] |
303 | movzx ecx, [esi + SYS_BUTTON.pslot] |
303 | shl ecx, 5 |
304 | shl ecx, 5 |
304 | add ecx, window_data |
305 | add ecx, window_data |
305 | mov eax, dword[esi + SYS_BUTTON.left] |
306 | mov eax, dword[esi + SYS_BUTTON.left] |
306 | mov ebx, dword[esi + SYS_BUTTON.top] |
307 | mov ebx, dword[esi + SYS_BUTTON.top] |
307 | add eax, [ecx + WDATA.box.left] |
308 | add eax, [ecx + WDATA.box.left] |
308 | add ebx, [ecx + WDATA.box.top] |
309 | add ebx, [ecx + WDATA.box.top] |
309 | mov ecx, eax |
310 | mov ecx, eax |
310 | mov edx, ebx |
311 | mov edx, ebx |
- | 312 | bt edi, 30 |
|
- | 313 | jc @f |
|
311 | inc ax |
314 | inc ax |
312 | inc bx |
315 | inc bx |
- | 316 | dec cx |
|
- | 317 | dec dx |
|
- | 318 | @@: |
|
313 | rol eax, 16 |
319 | rol eax, 16 |
314 | rol ebx, 16 |
320 | rol ebx, 16 |
315 | add ax, cx |
321 | add ax, cx |
316 | add bx, dx |
322 | add bx, dx |
317 | dec ax |
- | |
318 | dec bx |
- | |
319 | mov esi, 1000000h |
323 | mov esi, 1000000h |
320 | call draw_rectangle.forced |
324 | call draw_rectangle.forced |
321 | popad |
325 | popad |
322 | .exit: |
326 | .exit: |
323 | ret |
327 | ret |
324 | .popexit: |
328 | .popexit: |
325 | pop edi esi edx ecx |
329 | pop edi esi edx ecx |
326 | ret |
330 | ret |
327 | 331 | ||
328 | ;--------------------------------------------------------------- |
332 | ;--------------------------------------------------------------- |
329 | sys_button_perform_handler: |
333 | sys_button_perform_handler: |
330 | ;--------------------------------------------------------------- |
334 | ;--------------------------------------------------------------- |
331 | ;> eax = pack[8(process slot), 24(button id)] |
335 | ;> eax = pack[8(process slot), 24(button id)] |
332 | ;> ebx = pack[16(button x coord), 16(button y coord)] |
336 | ;> ebx = pack[16(button x coord), 16(button y coord)] |
333 | ;> cl = mouse button mask this system button was pressed with |
337 | ;> cl = mouse button mask this system button was pressed with |
334 | ;--------------------------------------------------------------- |
338 | ;--------------------------------------------------------------- |
335 | shl eax, 8 |
339 | shl eax, 8 |
336 | mov al, cl |
340 | mov al, cl |
337 | movzx ebx, byte[BTN_COUNT] |
341 | movzx ebx, byte[BTN_COUNT] |
338 | mov [BTN_BUFF + ebx * 4], eax |
342 | mov [BTN_BUFF + ebx * 4], eax |
339 | inc bl |
343 | inc bl |
340 | mov [BTN_COUNT], bl |
344 | mov [BTN_COUNT], bl |
341 | ret |
345 | ret |