Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 209 → Rev 109

/programs/demos/magnify/trunk/magnify.asm
8,145 → 8,341
 
org 0x0
 
db 'MENUET01' ; 8 byte id
dd 1 ; header version
db 'MENUET00' ; 8 byte id
dd 38 ; required os
dd START ; program start
dd I_END ; program image size
dd 0x1000 ; required amount of memory
dd 0x1000 ; esp
dd 0, 0 ; no parameters, no path
dd 0x10000 ; required amount of memory
dd 0x10000
dd 0x00000000 ; reserved=no extended header
 
include 'lang.inc'
include 'macros.inc'
delay equ 20
scr equ 0x1000
 
magnify_width = 40
magnify_height = 30
 
START: ; start of execution
redraw:
call draw_window
 
mov esp,0xfff0
 
mov eax,14 ; get screen size
int 0x40
push eax
and eax,0x0000ffff
add eax,1
mov [size_y],eax
pop eax
shr eax,16
add eax,1
mov [size_x],eax
 
mov eax,[size_x]
shr eax,2
mov [cmp_ecx],eax
 
mov eax,[size_x]
xor edx,edx
mov ebx,3
mul ebx
mov [add_esi],eax
 
mov eax,[size_y]
shr eax,2
mov [cmp_edx],eax
 
 
 
call draw_window ; at first, draw the window
 
still:
 
call draw_screen
wtevent:
 
mov eax, 23 ; wait here for event with timeout
mov ebx, delay
mov ebx,[delay]
int 0x40
dec eax
js still
jz redraw
dec eax
jnz button
; key in buffer
mov al, 2
 
cmp eax,1 ; redraw request ?
jz red
cmp eax,2 ; key in buffer ?
jz key
cmp eax,3 ; button in buffer ?
jz button
 
jmp still
 
red: ; redraw
call draw_window
jmp still
 
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
jmp wtevent
button:
; we have only one button, close
or eax, -1
jmp still
 
button: ; button
mov eax,17 ; get id
int 0x40
 
cmp ah,1 ; button id=1 ?
jnz noclose
mov eax,0xffffffff ; close this program
int 0x40
noclose:
 
cmp ah,2
jnz nosave
call save_screen
nosave:
 
jmp still
 
 
 
save_screen:
 
pusha
 
mov ebx,0
mov edi,0x10000
 
ss1:
 
mov eax,35
int 0x40
 
add ebx,1
 
mov [edi],eax
add edi,3
 
cmp edi,0xFFFF0
jb ss1
 
mov eax,33
mov ebx,filename
mov ecx,0x10000
mov edx,0xEFFF0
mov esi,0
int 0x40
 
popa
 
ret
 
 
filename db 'SCREEN RAW'
 
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
 
 
draw_window:
 
mov eax, 12 ; function 12:tell os about windowdraw
mov ebx, 1 ; 1, start of draw
int 0x40
 
mov al, 48 ; function 48 : graphics parameters
mov bl, 4 ; subfunction 4 : get skin height
; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window
mov ebx,100*65536 ; [x start] *65536 + [x size]
mov ebx,100*65536+322
mov ecx,100*65536+262 ; [y start] *65536 + [y size]
mov edx,0x0;01111cc ; color of work area RRGGBB
mov esi,0x809977ff ; color of grab bar RRGGBB,8->color glide
mov edi,0x00ffff00 ; color of frames RRGGBB
int 0x40
 
; DRAW WINDOW
mov ebx, 100*65536 + 8*magnify_width + 8
lea ecx, [eax + 100*65536 + 8*magnify_height + 3]
mov edx, 0x33000000 ; color of work area RRGGBB
mov edi, labelt ; header
xor eax, eax ; function 0 : define and draw window
; WINDOW LABEL
mov eax,4 ; function 4 : write text to window
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
mov ecx,0x00ffffff ; color of text RRGGBB
mov edx,labelt ; pointer to text beginning
mov esi,labellen-labelt ; text length
int 0x40
 
; CLOSE BUTTON
mov eax,8 ; function 8 : define and draw button
mov bx,12 ; [x start] *65536 + [x size]
mov ebx,(322-19)*65536+12
mov ecx,5*65536+12 ; [y start] *65536 + [y size]
mov edx,1 ; button id
mov esi,0x22aacc ; button color RRGGBB
int 0x40
 
mov al, 12 ; function 12:tell os about windowdraw
call draw_screen
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx, 2 ; 2, end of draw
int 0x40
 
ret
 
 
draw_screen:
 
call draw_magnify
 
ret
 
pusha
 
mov edi,scr
 
mov ecx,0
mov edx,0
 
mov esi,0
 
ds1:
 
mov eax,35
mov ebx,esi
int 0x40
stosd
sub edi,1
 
add esi,4
add ecx,1
cmp ecx,[cmp_ecx] ; 800/4
jb ds1
 
add esi,[add_esi] ; 800*3
mov ecx,0
add edx,1
cmp edx,[cmp_edx] ; 600/4
jb ds1
 
mov eax,7
mov ebx,scr
mov ecx,200*65536+160
mov ecx,[size_x]
shr ecx,2
shl ecx,16
mov cx,word [size_y]
shr cx,2
mov edx,20*65536+35
int 0x40
 
popa
 
call draw_magnify
 
ret
 
 
draw_magnify:
mov eax, 14
int 0x40 ; get screen size
movzx ecx, ax
inc ecx
mov [size_y], ecx
shr eax, 16
inc eax
mov [size_x], eax
 
pusha
 
mov eax, 37
xor ebx, ebx
int 0x40 ; get mouse coordinates
mov ebx,0
int 0x40
 
mov ecx, eax
shr ecx, 16 ; ecx = x
movzx edx, ax ; edx = y
inc ecx
mov edx,eax
shr ecx,16
and edx,65535
 
sub ecx,39
sub edx,29
 
cmp ecx,3000
jb co1
popa
ret
co1:
cmp edx,3000
jb co2
popa
ret
 
co2:
 
and ecx,2047
and edx,2047
 
mov [m_x],ecx
mov [m_y],edx
 
add ecx,40
add edx,30
 
mov [m_xe], ecx
inc edx
mov [m_ye], edx
sub ecx, magnify_width
sub edx, magnify_height
mov [m_x], ecx
mov [m_y], edx
.loop_y:
.loop_x:
xor eax, eax ; assume black color for invalid pixels
test ecx, ecx
js .nopix
cmp ecx, [size_x]
jge .nopix
test edx, edx
js .nopix
cmp edx, [size_y]
jge .nopix
mov ebx, edx
imul ebx, [size_x]
add ebx, ecx
 
mov ecx,[m_x]
mov edx,[m_y]
 
dm1:
 
push edx
mov eax,edx
mul [size_x]
pop edx
add eax,ecx
 
mov ebx,eax
mov eax, 35
int 0x40 ; read pixel
.nopix:
push ecx edx
sub ecx, [m_x]
sub edx, [m_y]
int 0x40
 
pusha
mov ebx, ecx
shl ebx, 3+16
mov bl, 7
sub ebx,[m_x]
mov ecx, edx
shl ecx, 3+16
mov cl, 7
sub ecx,[m_y]
shl ebx,3
add ebx,2
shl ebx,16
mov bx,7
shl ecx,3
add ecx,22
shl ecx,16
mov cx,7
 
mov edx, eax
mov eax, 13
int 0x40
pop edx ecx
inc ecx
popa
 
add ecx,1
cmp ecx, [m_xe]
jnz .loop_x
jnz dm1
mov ecx, [m_x]
inc edx
add edx,1
cmp edx, [m_ye]
jnz .loop_y
jnz dm1
 
popa
 
ret
 
 
 
; DATA AREA
 
m_x dd 100
m_y dd 100
 
m_xe dd 110
m_ye dd 110
 
size_x dd 0
size_y dd 0
 
cmp_ecx dd 0
add_esi dd 0
cmp_edx dd 0
 
delay dd 20
 
labelt:
db 'MAGNIFIER - MOVE MOUSE POINTER', 0
db 'MAGNIFIER - MOVE MOUSE POINTER'
labellen:
 
 
I_END:
align 4
m_x dd ?
m_y dd ?
m_xe dd ?
m_ye dd ?
size_x dd ?
size_y dd ?