magnify: skinned window & optimized program (726 -> 326 bytes, 16Kb -> 4Kb memory)

git-svn-id: svn://kolibrios.org@209 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Evgeny Grechnikov (Diamond) 2006-11-07 16:11:51 +00:00
parent 9e37e39a22
commit ca9c99d8c9

View File

@ -8,341 +8,145 @@ use32
org 0x0
db 'MENUET00' ; 8 byte id
dd 38 ; required os
db 'MENUET01' ; 8 byte id
dd 1 ; header version
dd START ; program start
dd I_END ; program image size
dd 0x10000 ; required amount of memory
dd 0x10000
dd 0x00000000 ; reserved=no extended header
dd 0x1000 ; required amount of memory
dd 0x1000 ; esp
dd 0, 0 ; no parameters, no path
include 'lang.inc'
include 'macros.inc'
scr equ 0x1000
delay equ 20
magnify_width = 40
magnify_height = 30
START: ; start of execution
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
mov eax,23 ; wait here for event with timeout
mov ebx,[delay]
int 0x40
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
redraw:
call draw_window
jmp still
key: ; key
mov eax,2 ; just read it and ignore
still:
call draw_screen
wtevent:
mov eax, 23 ; wait here for event with timeout
mov ebx, delay
int 0x40
jmp still
button: ; button
mov eax,17 ; get id
dec eax
js still
jz redraw
dec eax
jnz button
; key in buffer
mov al, 2
int 0x40
cmp ah,1 ; button id=1 ?
jnz noclose
mov eax,0xffffffff ; close this program
jmp wtevent
button:
; we have only one button, close
or eax, -1
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 eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
mov al, 48 ; function 48 : graphics parameters
mov bl, 4 ; subfunction 4 : get skin height
int 0x40
; 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
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
int 0x40
; 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
call draw_screen
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
mov al, 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
mov ebx,0
mov eax, 37
xor ebx, ebx
int 0x40 ; get mouse coordinates
mov ecx, eax
shr ecx, 16 ; ecx = x
movzx edx, ax ; edx = y
inc ecx
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 eax, 35
int 0x40 ; read pixel
.nopix:
push ecx edx
sub ecx, [m_x]
sub edx, [m_y]
mov ebx, ecx
shl ebx, 3+16
mov bl, 7
mov ecx, edx
shl ecx, 3+16
mov cl, 7
mov edx, eax
mov eax, 13
int 0x40
mov ecx,eax
mov edx,eax
shr ecx,16
and edx,65535
sub ecx,39
sub edx,29
cmp ecx,3000
jb co1
popa
pop edx ecx
inc ecx
cmp ecx, [m_xe]
jnz .loop_x
mov ecx, [m_x]
inc edx
cmp edx, [m_ye]
jnz .loop_y
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
mov [m_ye],edx
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
pusha
mov ebx,ecx
sub ebx,[m_x]
mov ecx,edx
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
popa
add ecx,1
cmp ecx,[m_xe]
jnz dm1
mov ecx,[m_x]
add edx,1
cmp edx,[m_ye]
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'
labellen:
db 'MAGNIFIER - MOVE MOUSE POINTER', 0
I_END:
align 4
m_x dd ?
m_y dd ?
m_xe dd ?
m_ye dd ?
size_x dd ?
size_y dd ?