Subversion Repositories Kolibri OS

Rev

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