Subversion Repositories Kolibri OS

Rev

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>