Subversion Repositories Kolibri OS

Compare Revisions

Ignore whitespace Rev 131 → Rev 133

/programs/demos/eyes/trunk/eyes.asm
20,7 → 20,7
db "MENUET01"
dd 0x01
dd ENTRANCE
dd EYES_END
dd I_END
dd 0x3000
dd 0x3000
dd 0x0
30,61 → 30,93
ENTRANCE: ; start of code
 
; ==== main ====
prepare_eyes:
 
call prepare_eyes
mov esi,imagedata ; transform grayscale to putimage format
mov edi,skindata
mov ecx,30
transform_loop:
push ecx
mov ecx,30
lp1:
lodsb
stosb
stosb
stosb
loop lp1
sub esi,30
mov ecx,30
lp2:
lodsb
stosb
stosb
stosb
loop lp2
pop ecx
loop transform_loop
 
call shape_window
 
still:
 
call draw_eyes ; draw those funny "eyes"
 
mov eax,23 ; wait for event with timeout
mov ebx,TIMEOUT
mov eax,14 ; calculating screen position
int 0x40
shr eax,1
mov ax,59
sub eax,30*65536
mov [win_ebx],eax
mov [win_ecx],dword 10*65536+44
 
cmp eax,1 ; redraw ?
jnz no_draw
call redraw_overlap
no_draw:
mov esi,imagedata ; calculate shape reference area
mov edi,winref
mov ecx,900 ; disable drag bar
mov al,0
rep stosb
 
cmp eax,2 ; key ?
jz key
mov ecx,30 ; calculate circles for eyes
shape_loop:
push ecx
 
cmp eax,3 ; button ?
jz button
call copy_line ; duplicate (we have two eyes :)
sub esi,30
call copy_line
 
jmp still ; loop
pop ecx
loop shape_loop
 
; EVENTS
; -====- shape -====-
 
key:
mov eax,2 ; just read and ignore
int 0x40
jmp still
shape_window:
 
button: ; analyze button
mov eax,-1 ; this is button 1 - we have only one button :-)
mov eax,50 ; set up shape reference area
xor ebx,ebx
mov ecx,winref
int 0x40
jmp still
 
; -====- declarations -====-
call draw_window
 
imagedata equ EYES_END
skindata equ EYES_END+925
winref equ EYES_END+6325
still:
 
; -====- shape -====-
call draw_eyes ; draw those funny "eyes"
 
shape_window:
 
mov eax,50 ; set up shape reference area
mov ebx,0
mov ecx,winref
_wait:
mov eax,23 ; wait for event with timeout
mov ebx,TIMEOUT
int 0x40
dec eax
jz redraw
dec eax
jz key
dec eax
jnz still
button:
or eax, -1
int 0x40
key:
mov al, 2
int 0x40
jmp still
redraw:
call draw_window
call redraw_eyes
jmp _wait
 
ret
 
; -====- redrawing -====-
 
draw_eyes: ; check mousepos to disable blinking
98,8 → 130,22
redraw_ok:
mov [mouse],eax
 
redraw_overlap: ; label for redraw event (without checkmouse)
redraw_eyes:
mov eax,7
mov ebx,skindata
mov ecx,60*65536+30
mov edx,15
int 0x40
 
mov eax,15
mov ebx,30
call draw_eye_point
add eax,30
call draw_eye_point
ret
 
draw_window:
 
mov eax,12
mov ebx,1
int 0x40
118,18 → 164,6
mov edx,1
int 0x40
 
mov eax,7
mov ebx,skindata
mov ecx,60*65536+30
mov edx,15
int 0x40
 
mov eax,15
mov ebx,30
call draw_eye_point
add eax,30
call draw_eye_point
 
mov eax,12
mov ebx,2
int 0x40
139,10 → 173,8
draw_eye_point: ; draw eye point (EAX=X, EBX=Y)
pusha
 
mov ecx, [mouse] ; ecx = mousex, edx = mousey
mov edx,ecx
shr ecx,16
and edx,0xFFFF
movzx ecx, word [mouse+2] ; ecx = mousex, esi = mousey
movzx esi, word [mouse]
 
; ===> calculate position
 
149,132 → 181,82
push eax
push ebx
mov byte [sign1],0
mov esi, [win_ebx]
shr esi,16
add eax,esi
mov edx, [win_ebx]
shr edx,16
add eax,edx
sub ecx,eax ; ECX=ECX-EAX (signed) , ECX=|ECX|
jnc abs_ok_1
neg ecx
mov byte [sign1],1
abs_ok_1:
mov [temp1],ecx
push ecx ; save x distance
mov byte [sign2],0
mov esi,[win_ecx]
shr esi,16
add ebx,esi
sub edx,ebx ; EDX=EDX-EBX (signed) , EDX=|EDX|
mov edx,[win_ecx]
shr edx,16
add ebx,edx
sub esi,ebx ; EDX=EDX-EBX (signed) , EDX=|EDX|
jnc abs_ok_2
neg edx
neg esi
mov byte [sign2],1
abs_ok_2:
mov [temp2],edx
pop ebx
pop eax
mov [temp2],esi
 
push eax ; ECX*=ECX
push edx
xor eax,eax
xor edx,edx
mov ax,cx
mul cx
shl edx,16
or eax,edx
mov ecx,eax
pop edx
pop eax
; ESI = ECX*ECX+ESI*ESI
imul ecx, ecx
imul esi, esi
add esi, ecx
 
push eax ; EDX*=EDX
push ecx
mov ecx,edx
xor eax,eax
xor ecx,ecx ; EDX=SQRT(EBX)
xor edx,edx
mov ax,cx
mul cx
shl edx,16
or eax,edx
mov edx,eax
pop ecx
pop eax
 
push ebx
push ecx
push edx
push eax
mov ebx,ecx ; EBX=ECX+EDX
add ebx,edx
xor edi,edi ; ESI=SQRT(EBX)
mov ecx,edi
mov edx,edi
inc edi
mov eax,edi
inc edi
mov eax,1
sqrt_loop:
; in this moment ecx=edx*edx, eax=1+2*edx
add ecx,eax
add eax,edi
inc eax
inc eax
inc edx
cmp ecx,ebx
cmp ecx,esi
jbe sqrt_loop
dec edx
mov esi,edx
mov ax,si ; ESI=ESI/7
mov eax,edx ; EDX=EDX/7
mov dl,7
div dl
and ax,0xFF
mov si,ax ; ESI ? 0 : ESI=1
and eax,0xFF
mov edx,eax ; EDX ? 0 : EDX=1
jnz nozeroflag1
mov si,1
inc edx
nozeroflag1:
 
pop eax
pop edx
pop ecx
pop ebx
 
push eax ; ECX=[temp1]/ESI
push edx
mov eax,[temp1]
mov dx,si
pop eax ; EAX = x distance
; ECX=EAX/EDX
div dl
mov cl,al
and ecx,0xFF
pop edx
movzx ecx,al
pop ebx
pop eax
 
cmp byte [sign1],1
je subtract_1
add eax,ecx ; EAX=EAX+ECX
jmp calc_ok_1
subtract_1:
sub eax,ecx ; EAX=EAX-ECX
calc_ok_1:
cmp byte [sign1], 0
jz @f
neg ecx
@@:
add eax, ecx
 
push eax ; EDX=[temp2]/ESI
push ecx
push eax ; ESI=[temp2]/EDX
mov eax,[temp2]
mov dx,si
div dl
mov dl,al
and dx,0xFF
pop ecx
movzx esi,al
pop eax
 
cmp byte [sign2],1
je subtract_2
add ebx,edx ; EBX=EBX+EDX
jmp calc_ok_2
subtract_2:
sub ebx,edx ; EBX=EBX-EDX
calc_ok_2:
cmp byte [sign2], 0
jz @f
neg esi
@@:
add ebx, esi
 
; <===
 
mov ecx,ebx ; draw point
mov ebx,eax
mov eax,13
dec ecx
dec ecx
dec ebx
dec ebx
; draw point
lea ecx, [ebx-2]
lea ebx, [eax-2]
shl ecx,16
add ecx,4
shl ebx,16
288,82 → 270,13
 
; -====- working on images and window -====-
 
prepare_eyes:
 
;mov eax,6 ; load EYES.RAW
;mov ebx,graphix
;mov ecx,0x00000000
;mov edx,0xFFFFFFFF
;mov esi,imagedata
;int 0x40
;cmp eax,0xFFFFFFFF
;jnz filefound
 
;mov eax,-1 ; file not exists...
;int 0x40
 
;filefound:
mov esi,imagedata+25 ; transform grayscale to putimage format
mov edi,skindata
mov ecx,30
transform_loop:
push ecx
mov ecx,30
lp1:
lodsb
stosb
stosb
stosb
loop lp1
sub esi,30
mov ecx,30
lp2:
lodsb
stosb
stosb
stosb
loop lp2
pop ecx
loop transform_loop
 
mov eax,14 ; calculating screen position
int 0x40
shr eax,1
mov ax,59
sub eax,30*65536
mov [win_ebx],eax
mov [win_ecx],dword 10*65536+44
 
mov esi,imagedata+25 ; calculate shape reference area
mov edi,winref
mov ecx,900 ; disable drag bar
mov al,0
rep stosb
 
mov ecx,30 ; calculate circles for eyes
shape_loop:
push ecx
 
call copy_line ; duplicate (we have two eyes :)
sub esi,30
call copy_line
 
pop ecx
loop shape_loop
 
ret
 
copy_line: ; copy single line to shape reference area
mov ecx,30
cpl_loop:
lodsb
cmp al,0xFF
jnz set_one
mov al,0
jmp cpl_ok
set_one:
mov al,1
cpl_ok:
; input is image: 0xFF = white pixel, 0 = black pixel
; output is membership boolean: 0 = pixel no, 1 = pixel ok
inc eax
stosb
loop cpl_loop
ret
375,14 → 288,19
win_ebx dd 0x0
win_ecx dd 0x0
mouse dd 0xFFFFFFFF
;graphix db "EYES.RAW "
 
EYES_END: ; end of code
imagedata:
; texture is 900 bytes starting from 25th
file "eyes.raw":25,900
I_END:
 
; temporary storage for math routines
 
temp1 dd 0
temp2 dd 0
sign1 db 0
sign2 db 0
sign1 db ?
sign2 db ?
align 4
temp2 dd ?
 
EYES_END: ; end of code
file "EYES.RAW"
skindata rb 60*30*3
winref rb 45*60