Rev 109 | Rev 205 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 109 | Rev 133 | ||
---|---|---|---|
Line 18... | Line 18... | ||
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 EYES_END |
23 | dd I_END |
24 | dd 0x3000 |
24 | dd 0x3000 |
25 | dd 0x3000 |
25 | dd 0x3000 |
26 | dd 0x0 |
26 | dd 0x0 |
Line 27... | Line 27... | ||
27 | dd 0x0 |
27 | dd 0x0 |
28 | 28 | ||
Line 29... | Line 29... | ||
29 | include 'macros.inc' |
29 | include 'macros.inc' |
- | 30 | ENTRANCE: ; start of code |
|
Line -... | Line 31... | ||
- | 31 | ||
30 | ENTRANCE: ; start of code |
32 | ; ==== main ==== |
- | 33 | prepare_eyes: |
|
- | 34 | ||
- | 35 | mov esi,imagedata ; transform grayscale to putimage format |
|
- | 36 | mov edi,skindata |
|
31 | 37 | mov ecx,30 |
|
- | 38 | transform_loop: |
|
- | 39 | push ecx |
|
- | 40 | mov ecx,30 |
|
- | 41 | lp1: |
|
- | 42 | lodsb |
|
32 | ; ==== main ==== |
43 | stosb |
- | 44 | stosb |
|
33 | 45 | stosb |
|
- | 46 | loop lp1 |
|
- | 47 | sub esi,30 |
|
34 | call prepare_eyes |
48 | mov ecx,30 |
35 | 49 | lp2: |
|
- | 50 | lodsb |
|
- | 51 | stosb |
|
36 | call shape_window |
52 | stosb |
Line 37... | Line 53... | ||
37 | 53 | stosb |
|
38 | still: |
- | |
39 | 54 | loop lp2 |
|
- | 55 | pop ecx |
|
- | 56 | loop transform_loop |
|
- | 57 | ||
- | 58 | mov eax,14 ; calculating screen position |
|
- | 59 | int 0x40 |
|
Line 40... | Line 60... | ||
40 | call draw_eyes ; draw those funny "eyes" |
60 | shr eax,1 |
41 | - | ||
42 | mov eax,23 ; wait for event with timeout |
61 | mov ax,59 |
43 | mov ebx,TIMEOUT |
- | |
44 | int 0x40 |
- | |
45 | - | ||
46 | cmp eax,1 ; redraw ? |
- | |
47 | jnz no_draw |
- | |
48 | call redraw_overlap |
- | |
49 | no_draw: |
- | |
50 | - | ||
51 | cmp eax,2 ; key ? |
- | |
52 | jz key |
- | |
53 | - | ||
54 | cmp eax,3 ; button ? |
- | |
55 | jz button |
- | |
56 | 62 | sub eax,30*65536 |
|
57 | jmp still ; loop |
63 | mov [win_ebx],eax |
58 | 64 | mov [win_ecx],dword 10*65536+44 |
|
Line 59... | Line -... | ||
59 | ; EVENTS |
- | |
60 | 65 | ||
61 | key: |
66 | mov esi,imagedata ; calculate shape reference area |
62 | mov eax,2 ; just read and ignore |
67 | mov edi,winref |
Line -... | Line 68... | ||
- | 68 | mov ecx,900 ; disable drag bar |
|
- | 69 | mov al,0 |
|
63 | int 0x40 |
70 | rep stosb |
Line 64... | Line 71... | ||
64 | jmp still |
71 | |
65 | 72 | mov ecx,30 ; calculate circles for eyes |
|
66 | button: ; analyze button |
- | |
Line 67... | Line 73... | ||
67 | mov eax,-1 ; this is button 1 - we have only one button :-) |
73 | shape_loop: |
Line 68... | Line 74... | ||
68 | int 0x40 |
74 | push ecx |
Line 69... | Line 75... | ||
69 | jmp still |
75 | |
70 | 76 | call copy_line ; duplicate (we have two eyes :) |
|
71 | ; -====- declarations -====- |
77 | sub esi,30 |
72 | 78 | call copy_line |
|
Line -... | Line 79... | ||
- | 79 | ||
- | 80 | pop ecx |
|
- | 81 | loop shape_loop |
|
- | 82 | ||
- | 83 | ; -====- shape -====- |
|
- | 84 | ||
- | 85 | shape_window: |
|
- | 86 | ||
- | 87 | mov eax,50 ; set up shape reference area |
|
- | 88 | xor ebx,ebx |
|
- | 89 | mov ecx,winref |
|
- | 90 | int 0x40 |
|
- | 91 | ||
- | 92 | call draw_window |
|
- | 93 | ||
- | 94 | still: |
|
- | 95 | ||
- | 96 | call draw_eyes ; draw those funny "eyes" |
|
- | 97 | ||
73 | imagedata equ EYES_END |
98 | _wait: |
- | 99 | mov eax,23 ; wait for event with timeout |
|
- | 100 | mov ebx,TIMEOUT |
|
- | 101 | int 0x40 |
|
- | 102 | dec eax |
|
- | 103 | jz redraw |
|
- | 104 | dec eax |
|
- | 105 | jz key |
|
Line 74... | Line 106... | ||
74 | skindata equ EYES_END+925 |
106 | dec eax |
Line 75... | Line 107... | ||
75 | winref equ EYES_END+6325 |
107 | jnz still |
Line 96... | Line 128... | ||
96 | jne redraw_ok |
128 | jne redraw_ok |
97 | ret |
129 | ret |
98 | redraw_ok: |
130 | redraw_ok: |
99 | mov [mouse],eax |
131 | mov [mouse],eax |
Line -... | Line 132... | ||
- | 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 |
|
100 | 143 | add eax,30 |
|
- | 144 | call draw_eye_point |
|
- | 145 | ret |
|
- | 146 | ||
Line 101... | Line 147... | ||
101 | redraw_overlap: ; label for redraw event (without checkmouse) |
147 | draw_window: |
102 | 148 | ||
103 | mov eax,12 |
149 | mov eax,12 |
Line 116... | Line 162... | ||
116 | mov ebx,60 |
162 | mov ebx,60 |
117 | mov ecx,45 |
163 | mov ecx,45 |
118 | mov edx,1 |
164 | mov edx,1 |
119 | int 0x40 |
165 | int 0x40 |
Line 120... | Line -... | ||
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 |
- | |
132 | 166 | ||
133 | mov eax,12 |
167 | mov eax,12 |
134 | mov ebx,2 |
168 | mov ebx,2 |
Line 135... | Line 169... | ||
135 | int 0x40 |
169 | int 0x40 |
Line 136... | Line 170... | ||
136 | 170 | ||
137 | ret |
171 | ret |
Line 138... | Line 172... | ||
138 | 172 | ||
139 | draw_eye_point: ; draw eye point (EAX=X, EBX=Y) |
173 | draw_eye_point: ; draw eye point (EAX=X, EBX=Y) |
140 | pusha |
- | |
141 | - | ||
Line 142... | Line 174... | ||
142 | mov ecx, [mouse] ; ecx = mousex, edx = mousey |
174 | pusha |
Line 143... | Line 175... | ||
143 | mov edx,ecx |
175 | |
144 | shr ecx,16 |
176 | movzx ecx, word [mouse+2] ; ecx = mousex, esi = mousey |
145 | and edx,0xFFFF |
177 | movzx esi, word [mouse] |
146 | 178 | ||
147 | ; ===> calculate position |
179 | ; ===> calculate position |
148 | 180 | ||
149 | push eax |
181 | push eax |
150 | push ebx |
182 | push ebx |
151 | mov byte [sign1],0 |
183 | mov byte [sign1],0 |
152 | mov esi, [win_ebx] |
184 | mov edx, [win_ebx] |
153 | shr esi,16 |
185 | shr edx,16 |
154 | add eax,esi |
186 | add eax,edx |
155 | sub ecx,eax ; ECX=ECX-EAX (signed) , ECX=|ECX| |
187 | sub ecx,eax ; ECX=ECX-EAX (signed) , ECX=|ECX| |
156 | jnc abs_ok_1 |
188 | jnc abs_ok_1 |
157 | neg ecx |
189 | neg ecx |
158 | mov byte [sign1],1 |
190 | mov byte [sign1],1 |
159 | abs_ok_1: |
191 | abs_ok_1: |
160 | mov [temp1],ecx |
192 | push ecx ; save x distance |
161 | mov byte [sign2],0 |
193 | mov byte [sign2],0 |
162 | mov esi,[win_ecx] |
194 | mov edx,[win_ecx] |
163 | shr esi,16 |
195 | shr edx,16 |
164 | add ebx,esi |
196 | add ebx,edx |
165 | sub edx,ebx ; EDX=EDX-EBX (signed) , EDX=|EDX| |
- | |
166 | jnc abs_ok_2 |
- | |
Line 167... | Line 197... | ||
167 | neg edx |
197 | sub esi,ebx ; EDX=EDX-EBX (signed) , EDX=|EDX| |
168 | mov byte [sign2],1 |
- | |
169 | abs_ok_2: |
- | |
170 | mov [temp2],edx |
198 | jnc abs_ok_2 |
171 | pop ebx |
- | |
172 | pop eax |
- | |
173 | - | ||
174 | push eax ; ECX*=ECX |
199 | neg esi |
175 | push edx |
200 | mov byte [sign2],1 |
176 | xor eax,eax |
- | |
177 | xor edx,edx |
- | |
Line 178... | Line 201... | ||
178 | mov ax,cx |
201 | abs_ok_2: |
179 | mul cx |
- | |
180 | shl edx,16 |
- | |
181 | or eax,edx |
- | |
182 | mov ecx,eax |
202 | mov [temp2],esi |
183 | pop edx |
- | |
184 | pop eax |
- | |
185 | - | ||
186 | push eax ; EDX*=EDX |
- | |
187 | push ecx |
- | |
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 |
203 | |
202 | push eax |
- | |
203 | mov ebx,ecx ; EBX=ECX+EDX |
204 | ; ESI = ECX*ECX+ESI*ESI |
- | 205 | imul ecx, ecx |
|
204 | add ebx,edx |
206 | imul esi, esi |
- | 207 | add esi, ecx |
|
205 | xor edi,edi ; ESI=SQRT(EBX) |
208 | |
206 | mov ecx,edi |
209 | xor ecx,ecx ; EDX=SQRT(EBX) |
207 | mov edx,edi |
210 | xor edx,edx |
208 | inc edi |
211 | mov eax,1 |
209 | mov eax,edi |
212 | sqrt_loop: |
210 | inc edi |
- | |
211 | sqrt_loop: |
213 | ; in this moment ecx=edx*edx, eax=1+2*edx |
212 | add ecx,eax |
214 | add ecx,eax |
213 | add eax,edi |
215 | inc eax |
214 | inc edx |
216 | inc eax |
215 | cmp ecx,ebx |
217 | inc edx |
216 | jbe sqrt_loop |
218 | cmp ecx,esi |
217 | dec edx |
219 | jbe sqrt_loop |
218 | mov esi,edx |
220 | dec edx |
Line 219... | Line 221... | ||
219 | mov ax,si ; ESI=ESI/7 |
221 | mov eax,edx ; EDX=EDX/7 |
220 | mov dl,7 |
- | |
221 | div dl |
- | |
222 | and ax,0xFF |
- | |
223 | mov si,ax ; ESI ? 0 : ESI=1 |
- | |
224 | jnz nozeroflag1 |
222 | mov dl,7 |
225 | mov si,1 |
- | |
226 | nozeroflag1: |
- | |
227 | - | ||
228 | pop eax |
223 | div dl |
229 | pop edx |
224 | and eax,0xFF |
230 | pop ecx |
- | |
231 | pop ebx |
225 | mov edx,eax ; EDX ? 0 : EDX=1 |
232 | 226 | jnz nozeroflag1 |
|
Line 233... | Line 227... | ||
233 | push eax ; ECX=[temp1]/ESI |
227 | inc edx |
234 | push edx |
228 | nozeroflag1: |
235 | mov eax,[temp1] |
229 | |
236 | mov dx,si |
- | |
237 | div dl |
230 | pop eax ; EAX = x distance |
238 | mov cl,al |
231 | ; ECX=EAX/EDX |
239 | and ecx,0xFF |
- | |
Line 240... | Line 232... | ||
240 | pop edx |
232 | div dl |
241 | pop eax |
- | |
242 | 233 | movzx ecx,al |
|
243 | cmp byte [sign1],1 |
- | |
244 | je subtract_1 |
234 | pop ebx |
245 | add eax,ecx ; EAX=EAX+ECX |
235 | pop eax |
246 | jmp calc_ok_1 |
- | |
247 | subtract_1: |
- | |
248 | sub eax,ecx ; EAX=EAX-ECX |
236 | |
Line 249... | Line 237... | ||
249 | calc_ok_1: |
237 | cmp byte [sign1], 0 |
250 | 238 | jz @f |
|
251 | push eax ; EDX=[temp2]/ESI |
239 | neg ecx |
252 | push ecx |
- | |
253 | mov eax,[temp2] |
240 | @@: |
254 | mov dx,si |
241 | add eax, ecx |
255 | div dl |
- | |
Line 256... | Line 242... | ||
256 | mov dl,al |
242 | |
Line 257... | Line 243... | ||
257 | and dx,0xFF |
243 | push eax ; ESI=[temp2]/EDX |
258 | pop ecx |
244 | mov eax,[temp2] |
259 | pop eax |
245 | div dl |
260 | - | ||
261 | cmp byte [sign2],1 |
- | |
262 | je subtract_2 |
- | |
263 | add ebx,edx ; EBX=EBX+EDX |
- | |
264 | jmp calc_ok_2 |
246 | movzx esi,al |
265 | subtract_2: |
247 | pop eax |
266 | sub ebx,edx ; EBX=EBX-EDX |
248 | |
267 | calc_ok_2: |
249 | cmp byte [sign2], 0 |
268 | 250 | jz @f |
|
Line 286... | Line 268... | ||
286 | popa |
268 | popa |
287 | ret |
269 | ret |
Line 288... | Line 270... | ||
288 | 270 | ||
Line 289... | Line -... | ||
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 |
271 | ; -====- working on images and window -====- |
355 | 272 | ||
356 | copy_line: ; copy single line to shape reference area |
273 | copy_line: ; copy single line to shape reference area |
357 | mov ecx,30 |
274 | mov ecx,30 |
358 | cpl_loop: |
275 | cpl_loop: |
359 | lodsb |
276 | lodsb |
360 | cmp al,0xFF |
277 | ; input is image: 0xFF = white pixel, 0 = black pixel |
361 | jnz set_one |
- | |
362 | mov al,0 |
- | |
363 | jmp cpl_ok |
- | |
364 | set_one: |
- | |
365 | mov al,1 |
278 | ; output is membership boolean: 0 = pixel no, 1 = pixel ok |
366 | cpl_ok: |
279 | inc eax |
367 | stosb |
280 | stosb |
Line 368... | Line 281... | ||
368 | loop cpl_loop |
281 | loop cpl_loop |
Line 373... | Line 286... | ||
373 | ; environment |
286 | ; environment |
Line 374... | Line 287... | ||
374 | 287 | ||
375 | win_ebx dd 0x0 |
288 | win_ebx dd 0x0 |
376 | win_ecx dd 0x0 |
289 | win_ecx dd 0x0 |
- | 290 | mouse dd 0xFFFFFFFF |
|
- | 291 | ||
- | 292 | EYES_END: ; end of code |
|
377 | mouse dd 0xFFFFFFFF |
293 | imagedata: |
- | 294 | ; texture is 900 bytes starting from 25th |
|
- | 295 | file "eyes.raw":25,900 |
|
Line 378... | Line 296... | ||
378 | ;graphix db "EYES.RAW " |
296 | I_END: |
Line 379... | Line 297... | ||
379 | 297 | ||
380 | ; temporary storage for math routines |
298 | ; temporary storage for math routines |
381 | 299 | ||
382 | temp1 dd 0 |
300 | sign1 db ? |
Line 383... | Line 301... | ||
383 | temp2 dd 0 |
301 | sign2 db ? |
384 | sign1 db 0 |
302 | align 4 |