Rev 133 | Rev 1728 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 133 | Rev 205 | ||
---|---|---|---|
1 | ; |
1 | ; |
2 | ; EYES FOR MENUET |
2 | ; EYES FOR MENUET |
3 | ; |
3 | ; |
4 | ; Written by Nikita Lesnikov (nlo_one@mail.ru) |
4 | ; Written by Nikita Lesnikov (nlo_one@mail.ru) |
5 | ; |
5 | ; |
6 | ; Position of "eyes" is fixed. To close "eyes" just click on them. |
6 | ; Position of "eyes" is fixed. To close "eyes" just click on them. |
7 | ; |
7 | ; |
8 | ; NOTE: quite big timeout is used to disable blinking when redrawing. |
8 | ; NOTE: quite big timeout is used to disable blinking when redrawing. |
9 | ; If "eyes" blink on your system, enlarge the TIMEOUT. If not, you can |
9 | ; If "eyes" blink on your system, enlarge the TIMEOUT. If not, you can |
10 | ; decrease it due to more realistic movement. |
10 | ; decrease it due to more realistic movement. |
11 | ; |
11 | ; |
12 | 12 | ||
13 | TIMEOUT equ 5 |
13 | TIMEOUT equ 5 |
14 | 14 | ||
15 | ; EXECUTABLE HEADER |
15 | ; EXECUTABLE HEADER |
16 | 16 | ||
17 | use32 |
17 | use32 |
18 | 18 | ||
19 | org 0x0 |
19 | org 0x0 |
20 | db "MENUET01" |
20 | db "MENUET01" |
21 | dd 0x01 |
21 | dd 0x01 |
22 | dd ENTRANCE |
22 | dd ENTRANCE |
23 | dd I_END |
23 | dd EYES_END |
24 | dd 0x3000 |
24 | dd 0x3000 |
25 | dd 0x3000 |
25 | dd 0x3000 |
26 | dd 0x0 |
26 | dd 0x0 |
27 | dd 0x0 |
27 | dd 0x0 |
28 | 28 | ||
29 | include 'macros.inc' |
29 | include 'macros.inc' |
30 | ENTRANCE: ; start of code |
30 | ENTRANCE: ; start of code |
31 | 31 | ||
32 | ; ==== main ==== |
32 | ; ==== main ==== |
33 | prepare_eyes: |
- | |
34 | - | ||
35 | mov esi,imagedata ; transform grayscale to putimage format |
- | |
36 | mov edi,skindata |
- | |
37 | mov ecx,30 |
- | |
38 | transform_loop: |
- | |
39 | push ecx |
- | |
40 | mov ecx,30 |
- | |
41 | lp1: |
- | |
42 | lodsb |
- | |
43 | stosb |
- | |
44 | stosb |
- | |
45 | stosb |
- | |
46 | loop lp1 |
- | |
47 | sub esi,30 |
- | |
48 | mov ecx,30 |
- | |
49 | lp2: |
- | |
50 | lodsb |
- | |
51 | stosb |
- | |
52 | stosb |
- | |
53 | stosb |
- | |
54 | loop lp2 |
- | |
55 | pop ecx |
33 | |
- | 34 | call prepare_eyes |
|
- | 35 | ||
- | 36 | call shape_window |
|
- | 37 | ||
- | 38 | still: |
|
- | 39 | ||
56 | loop transform_loop |
40 | call draw_eyes ; draw those funny "eyes" |
- | 41 | ||
57 | 42 | mov eax,23 ; wait for event with timeout |
|
58 | mov eax,14 ; calculating screen position |
- | |
59 | int 0x40 |
- | |
60 | shr eax,1 |
- | |
61 | mov ax,59 |
- | |
62 | sub eax,30*65536 |
- | |
63 | mov [win_ebx],eax |
43 | mov ebx,TIMEOUT |
64 | mov [win_ecx],dword 10*65536+44 |
44 | int 0x40 |
65 | 45 | ||
66 | mov esi,imagedata ; calculate shape reference area |
46 | cmp eax,1 ; redraw ? |
67 | mov edi,winref |
- | |
68 | mov ecx,900 ; disable drag bar |
47 | jnz no_draw |
69 | mov al,0 |
- | |
70 | rep stosb |
48 | call redraw_overlap |
71 | 49 | no_draw: |
|
72 | mov ecx,30 ; calculate circles for eyes |
50 | |
73 | shape_loop: |
- | |
74 | push ecx |
- | |
75 | 51 | cmp eax,2 ; key ? |
|
76 | call copy_line ; duplicate (we have two eyes :) |
52 | jz key |
- | 53 | ||
- | 54 | cmp eax,3 ; button ? |
|
- | 55 | jz button |
|
77 | sub esi,30 |
56 | |
- | 57 | jmp still ; loop |
|
78 | call copy_line |
58 | |
79 | - | ||
80 | pop ecx |
- | |
81 | loop shape_loop |
59 | ; EVENTS |
- | 60 | ||
82 | 61 | key: |
|
83 | ; -====- shape -====- |
62 | mov eax,2 ; just read and ignore |
- | 63 | int 0x40 |
|
- | 64 | jmp still |
|
84 | 65 | ||
85 | shape_window: |
66 | button: ; analyze button |
- | 67 | mov eax,-1 ; this is button 1 - we have only one button :-) |
|
86 | 68 | int 0x40 |
|
87 | mov eax,50 ; set up shape reference area |
69 | jmp still |
88 | xor ebx,ebx |
- | |
89 | mov ecx,winref |
- | |
90 | int 0x40 |
- | |
91 | - | ||
92 | call draw_window |
- | |
93 | 70 | ||
94 | still: |
- | |
95 | - | ||
96 | call draw_eyes ; draw those funny "eyes" |
- | |
97 | - | ||
98 | _wait: |
- | |
99 | mov eax,23 ; wait for event with timeout |
- | |
100 | mov ebx,TIMEOUT |
71 | ; -====- declarations -====- |
101 | int 0x40 |
- | |
- | 72 | ||
102 | dec eax |
73 | imagedata equ EYES_END |
103 | jz redraw |
- | |
104 | dec eax |
- | |
105 | jz key |
- | |
106 | dec eax |
74 | skindata equ EYES_END+925 |
107 | jnz still |
75 | winref equ EYES_END+6325 |
108 | button: |
76 | |
109 | or eax, -1 |
77 | ; -====- shape -====- |
110 | int 0x40 |
78 | |
111 | key: |
79 | shape_window: |
112 | mov al, 2 |
80 | |
113 | int 0x40 |
81 | mov eax,50 ; set up shape reference area |
114 | jmp still |
82 | mov ebx,0 |
115 | redraw: |
83 | mov ecx,winref |
116 | call draw_window |
84 | int 0x40 |
117 | call redraw_eyes |
85 | |
118 | jmp _wait |
86 | ret |
119 | 87 | ||
120 | ; -====- redrawing -====- |
88 | ; -====- redrawing -====- |
121 | 89 | ||
122 | draw_eyes: ; check mousepos to disable blinking |
90 | draw_eyes: ; check mousepos to disable blinking |
123 | 91 | ||
124 | mov eax,37 |
92 | mov eax,37 |
125 | xor ebx,ebx |
93 | xor ebx,ebx |
126 | int 0x40 |
94 | int 0x40 |
127 | cmp dword [mouse],eax |
95 | cmp dword [mouse],eax |
128 | jne redraw_ok |
96 | jne redraw_ok |
129 | ret |
97 | ret |
130 | redraw_ok: |
98 | redraw_ok: |
131 | mov [mouse],eax |
99 | mov [mouse],eax |
132 | - | ||
133 | redraw_eyes: |
- | |
134 | mov eax,7 |
- | |
135 | mov ebx,skindata |
- | |
136 | mov ecx,60*65536+30 |
- | |
137 | mov edx,15 |
- | |
138 | int 0x40 |
- | |
139 | - | ||
140 | mov eax,15 |
- | |
141 | mov ebx,30 |
- | |
142 | call draw_eye_point |
- | |
143 | add eax,30 |
100 | |
144 | call draw_eye_point |
- | |
145 | ret |
- | |
146 | - | ||
147 | draw_window: |
101 | redraw_overlap: ; label for redraw event (without checkmouse) |
148 | 102 | ||
149 | mov eax,12 |
103 | mov eax,12 |
150 | mov ebx,1 |
104 | mov ebx,1 |
151 | int 0x40 |
105 | int 0x40 |
152 | 106 | ||
153 | xor eax,eax ; define window |
107 | xor eax,eax ; define window |
154 | mov ebx,[win_ebx] |
108 | mov ebx,[win_ebx] |
155 | mov ecx,[win_ecx] |
109 | mov ecx,[win_ecx] |
156 | xor edx,edx |
110 | xor edx,edx |
157 | xor esi,esi |
111 | xor esi,esi |
158 | xor edi,edi |
112 | xor edi,edi |
159 | int 0x40 |
113 | int 0x40 |
160 | 114 | ||
161 | mov eax,8 ; define closebutton |
115 | mov eax,8 ; define closebutton |
162 | mov ebx,60 |
116 | mov ebx,60 |
163 | mov ecx,45 |
117 | mov ecx,45 |
164 | mov edx,1 |
118 | mov edx,1 |
165 | int 0x40 |
119 | int 0x40 |
- | 120 | ||
- | 121 | mov eax,7 |
|
- | 122 | mov ebx,skindata |
|
- | 123 | mov ecx,60*65536+30 |
|
- | 124 | mov edx,15 |
|
- | 125 | int 0x40 |
|
- | 126 | ||
- | 127 | mov eax,15 |
|
- | 128 | mov ebx,30 |
|
- | 129 | call draw_eye_point |
|
- | 130 | add eax,30 |
|
- | 131 | call draw_eye_point |
|
166 | 132 | ||
167 | mov eax,12 |
133 | mov eax,12 |
168 | mov ebx,2 |
134 | mov ebx,2 |
169 | int 0x40 |
135 | int 0x40 |
170 | 136 | ||
171 | ret |
137 | ret |
172 | 138 | ||
173 | draw_eye_point: ; draw eye point (EAX=X, EBX=Y) |
139 | draw_eye_point: ; draw eye point (EAX=X, EBX=Y) |
174 | pusha |
140 | pusha |
175 | 141 | ||
176 | movzx ecx, word [mouse+2] ; ecx = mousex, esi = mousey |
142 | mov ecx, [mouse] ; ecx = mousex, edx = mousey |
- | 143 | mov edx,ecx |
|
- | 144 | shr ecx,16 |
|
177 | movzx esi, word [mouse] |
145 | and edx,0xFFFF |
178 | 146 | ||
179 | ; ===> calculate position |
147 | ; ===> calculate position |
180 | 148 | ||
181 | push eax |
149 | push eax |
182 | push ebx |
150 | push ebx |
183 | mov byte [sign1],0 |
151 | mov byte [sign1],0 |
184 | mov edx, [win_ebx] |
152 | mov esi, [win_ebx] |
185 | shr edx,16 |
153 | shr esi,16 |
186 | add eax,edx |
154 | add eax,esi |
187 | sub ecx,eax ; ECX=ECX-EAX (signed) , ECX=|ECX| |
155 | sub ecx,eax ; ECX=ECX-EAX (signed) , ECX=|ECX| |
188 | jnc abs_ok_1 |
156 | jnc abs_ok_1 |
189 | neg ecx |
157 | neg ecx |
190 | mov byte [sign1],1 |
158 | mov byte [sign1],1 |
191 | abs_ok_1: |
159 | abs_ok_1: |
192 | push ecx ; save x distance |
160 | mov [temp1],ecx |
193 | mov byte [sign2],0 |
161 | mov byte [sign2],0 |
194 | mov edx,[win_ecx] |
162 | mov esi,[win_ecx] |
195 | shr edx,16 |
163 | shr esi,16 |
196 | add ebx,edx |
164 | add ebx,esi |
197 | sub esi,ebx ; EDX=EDX-EBX (signed) , EDX=|EDX| |
165 | sub edx,ebx ; EDX=EDX-EBX (signed) , EDX=|EDX| |
198 | jnc abs_ok_2 |
166 | jnc abs_ok_2 |
199 | neg esi |
167 | neg edx |
200 | mov byte [sign2],1 |
168 | mov byte [sign2],1 |
201 | abs_ok_2: |
169 | abs_ok_2: |
202 | mov [temp2],esi |
170 | mov [temp2],edx |
- | 171 | pop ebx |
|
- | 172 | pop eax |
|
203 | 173 | ||
- | 174 | push eax ; ECX*=ECX |
|
- | 175 | push edx |
|
204 | ; ESI = ECX*ECX+ESI*ESI |
176 | xor eax,eax |
- | 177 | xor edx,edx |
|
- | 178 | mov ax,cx |
|
- | 179 | mul cx |
|
205 | imul ecx, ecx |
180 | shl edx,16 |
206 | imul esi, esi |
181 | or eax,edx |
- | 182 | mov ecx,eax |
|
- | 183 | pop edx |
|
207 | add esi, ecx |
184 | pop eax |
- | 185 | ||
- | 186 | push eax ; EDX*=EDX |
|
- | 187 | push ecx |
|
208 | 188 | mov ecx,edx |
|
- | 189 | xor eax,eax |
|
- | 190 | xor edx,edx |
|
- | 191 | mov ax,cx |
|
- | 192 | mul cx |
|
- | 193 | shl edx,16 |
|
- | 194 | or eax,edx |
|
- | 195 | mov edx,eax |
|
- | 196 | pop ecx |
|
- | 197 | pop eax |
|
- | 198 | ||
- | 199 | push ebx |
|
- | 200 | push ecx |
|
- | 201 | push edx |
|
- | 202 | push eax |
|
- | 203 | mov ebx,ecx ; EBX=ECX+EDX |
|
- | 204 | add ebx,edx |
|
- | 205 | xor edi,edi ; ESI=SQRT(EBX) |
|
- | 206 | mov ecx,edi |
|
209 | xor ecx,ecx ; EDX=SQRT(EBX) |
207 | mov edx,edi |
- | 208 | inc edi |
|
210 | xor edx,edx |
209 | mov eax,edi |
211 | mov eax,1 |
- | |
212 | sqrt_loop: |
210 | inc edi |
213 | ; in this moment ecx=edx*edx, eax=1+2*edx |
- | |
214 | add ecx,eax |
211 | sqrt_loop: |
215 | inc eax |
212 | add ecx,eax |
216 | inc eax |
213 | add eax,edi |
217 | inc edx |
214 | inc edx |
218 | cmp ecx,esi |
215 | cmp ecx,ebx |
- | 216 | jbe sqrt_loop |
|
219 | jbe sqrt_loop |
217 | dec edx |
220 | dec edx |
218 | mov esi,edx |
221 | mov eax,edx ; EDX=EDX/7 |
219 | mov ax,si ; ESI=ESI/7 |
222 | mov dl,7 |
220 | mov dl,7 |
223 | div dl |
221 | div dl |
224 | and eax,0xFF |
222 | and ax,0xFF |
225 | mov edx,eax ; EDX ? 0 : EDX=1 |
223 | mov si,ax ; ESI ? 0 : ESI=1 |
226 | jnz nozeroflag1 |
224 | jnz nozeroflag1 |
227 | inc edx |
225 | mov si,1 |
228 | nozeroflag1: |
- | |
229 | 226 | nozeroflag1: |
|
230 | pop eax ; EAX = x distance |
227 | |
231 | ; ECX=EAX/EDX |
228 | pop eax |
- | 229 | pop edx |
|
- | 230 | pop ecx |
|
- | 231 | pop ebx |
|
- | 232 | ||
- | 233 | push eax ; ECX=[temp1]/ESI |
|
- | 234 | push edx |
|
- | 235 | mov eax,[temp1] |
|
- | 236 | mov dx,si |
|
- | 237 | div dl |
|
232 | div dl |
238 | mov cl,al |
233 | movzx ecx,al |
239 | and ecx,0xFF |
234 | pop ebx |
240 | pop edx |
235 | pop eax |
241 | pop eax |
- | 242 | ||
236 | 243 | cmp byte [sign1],1 |
|
237 | cmp byte [sign1], 0 |
244 | je subtract_1 |
- | 245 | add eax,ecx ; EAX=EAX+ECX |
|
238 | jz @f |
246 | jmp calc_ok_1 |
- | 247 | subtract_1: |
|
239 | neg ecx |
248 | sub eax,ecx ; EAX=EAX-ECX |
- | 249 | calc_ok_1: |
|
240 | @@: |
250 | |
241 | add eax, ecx |
251 | push eax ; EDX=[temp2]/ESI |
- | 252 | push ecx |
|
- | 253 | mov eax,[temp2] |
|
242 | 254 | mov dx,si |
|
243 | push eax ; ESI=[temp2]/EDX |
255 | div dl |
244 | mov eax,[temp2] |
256 | mov dl,al |
245 | div dl |
257 | and dx,0xFF |
- | 258 | pop ecx |
|
246 | movzx esi,al |
259 | pop eax |
247 | pop eax |
260 | |
- | 261 | cmp byte [sign2],1 |
|
248 | 262 | je subtract_2 |
|
249 | cmp byte [sign2], 0 |
263 | add ebx,edx ; EBX=EBX+EDX |
250 | jz @f |
264 | jmp calc_ok_2 |
251 | neg esi |
265 | subtract_2: |
252 | @@: |
266 | sub ebx,edx ; EBX=EBX-EDX |
253 | add ebx, esi |
267 | calc_ok_2: |
254 | 268 | ||
255 | ; <=== |
269 | ; <=== |
256 | 270 | ||
257 | ; draw point |
271 | mov ecx,ebx ; draw point |
258 | lea ecx, [ebx-2] |
272 | mov ebx,eax |
- | 273 | mov eax,13 |
|
- | 274 | dec ecx |
|
- | 275 | dec ecx |
|
- | 276 | dec ebx |
|
259 | lea ebx, [eax-2] |
277 | dec ebx |
260 | shl ecx,16 |
278 | shl ecx,16 |
261 | add ecx,4 |
279 | add ecx,4 |
262 | shl ebx,16 |
280 | shl ebx,16 |
263 | add ebx,4 |
281 | add ebx,4 |
264 | mov eax,13 |
282 | mov eax,13 |
265 | xor edx,edx |
283 | xor edx,edx |
266 | int 0x40 |
284 | int 0x40 |
267 | 285 | ||
268 | popa |
286 | popa |
269 | ret |
287 | ret |
270 | 288 | ||
271 | ; -====- working on images and window -====- |
289 | ; -====- working on images and window -====- |
- | 290 | ||
- | 291 | prepare_eyes: |
|
- | 292 | ||
- | 293 | ;mov eax,6 ; load EYES.RAW |
|
- | 294 | ;mov ebx,graphix |
|
- | 295 | ;mov ecx,0x00000000 |
|
- | 296 | ;mov edx,0xFFFFFFFF |
|
- | 297 | ;mov esi,imagedata |
|
- | 298 | ;int 0x40 |
|
- | 299 | ;cmp eax,0xFFFFFFFF |
|
- | 300 | ;jnz filefound |
|
- | 301 | ||
- | 302 | ;mov eax,-1 ; file not exists... |
|
- | 303 | ;int 0x40 |
|
- | 304 | ||
- | 305 | ;filefound: |
|
- | 306 | mov esi,imagedata+25 ; transform grayscale to putimage format |
|
- | 307 | mov edi,skindata |
|
- | 308 | mov ecx,30 |
|
- | 309 | transform_loop: |
|
- | 310 | push ecx |
|
- | 311 | mov ecx,30 |
|
- | 312 | lp1: |
|
- | 313 | lodsb |
|
- | 314 | stosb |
|
- | 315 | stosb |
|
- | 316 | stosb |
|
- | 317 | loop lp1 |
|
- | 318 | sub esi,30 |
|
- | 319 | mov ecx,30 |
|
- | 320 | lp2: |
|
- | 321 | lodsb |
|
- | 322 | stosb |
|
- | 323 | stosb |
|
- | 324 | stosb |
|
- | 325 | loop lp2 |
|
- | 326 | pop ecx |
|
- | 327 | loop transform_loop |
|
- | 328 | ||
- | 329 | mov eax,14 ; calculating screen position |
|
- | 330 | int 0x40 |
|
- | 331 | shr eax,1 |
|
- | 332 | mov ax,59 |
|
- | 333 | sub eax,30*65536 |
|
- | 334 | mov [win_ebx],eax |
|
- | 335 | mov [win_ecx],dword 10*65536+44 |
|
- | 336 | ||
- | 337 | mov esi,imagedata+25 ; calculate shape reference area |
|
- | 338 | mov edi,winref |
|
- | 339 | mov ecx,900 ; disable drag bar |
|
- | 340 | mov al,0 |
|
- | 341 | rep stosb |
|
- | 342 | ||
- | 343 | mov ecx,30 ; calculate circles for eyes |
|
- | 344 | shape_loop: |
|
- | 345 | push ecx |
|
- | 346 | ||
- | 347 | call copy_line ; duplicate (we have two eyes :) |
|
- | 348 | sub esi,30 |
|
- | 349 | call copy_line |
|
- | 350 | ||
- | 351 | pop ecx |
|
- | 352 | loop shape_loop |
|
- | 353 | ||
- | 354 | ret |
|
272 | 355 | ||
273 | copy_line: ; copy single line to shape reference area |
356 | copy_line: ; copy single line to shape reference area |
274 | mov ecx,30 |
357 | mov ecx,30 |
275 | cpl_loop: |
358 | cpl_loop: |
276 | lodsb |
359 | lodsb |
277 | ; input is image: 0xFF = white pixel, 0 = black pixel |
360 | cmp al,0xFF |
278 | ; output is membership boolean: 0 = pixel no, 1 = pixel ok |
361 | jnz set_one |
279 | inc eax |
362 | mov al,0 |
- | 363 | jmp cpl_ok |
|
- | 364 | set_one: |
|
- | 365 | mov al,1 |
|
- | 366 | cpl_ok: |
|
280 | stosb |
367 | stosb |
281 | loop cpl_loop |
368 | loop cpl_loop |
282 | ret |
369 | ret |
283 | 370 | ||
284 | ; DATA |
371 | ; DATA |
285 | 372 | ||
286 | ; environment |
373 | ; environment |
287 | 374 | ||
288 | win_ebx dd 0x0 |
375 | win_ebx dd 0x0 |
289 | win_ecx dd 0x0 |
376 | win_ecx dd 0x0 |
290 | mouse dd 0xFFFFFFFF |
377 | mouse dd 0xFFFFFFFF |
291 | - | ||
292 | EYES_END: ; end of code |
- | |
293 | imagedata: |
- | |
294 | ; texture is 900 bytes starting from 25th |
378 | ;graphix db "EYES.RAW " |
295 | file "eyes.raw":25,900 |
- | |
296 | I_END: |
- | |
297 | 379 | ||
298 | ; temporary storage for math routines |
380 | ; temporary storage for math routines |
299 | 381 | ||
300 | sign1 db ? |
382 | temp1 dd 0 |
301 | sign2 db ? |
383 | temp2 dd 0 |
302 | align 4 |
384 | sign1 db 0 |
303 | temp2 dd ? |
385 | sign2 db 0 |
304 | 386 | ||
305 | skindata rb 60*30*3 |
387 | EYES_END: ; end of code |
306 | winref rb 45*60=== |
388 | file "EYES.RAW"=== |
307 | 389 | ||
308 | ;> |
390 | mov> |