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 org 0x0
db 'MENUET00' ; 8 byte id db 'MENUET01' ; 8 byte id
dd 38 ; required os dd 1 ; header version
dd START ; program start dd START ; program start
dd I_END ; program image size dd I_END ; program image size
dd 0x10000 ; required amount of memory dd 0x1000 ; required amount of memory
dd 0x10000 dd 0x1000 ; esp
dd 0x00000000 ; reserved=no extended header dd 0, 0 ; no parameters, no path
include 'lang.inc'
include 'macros.inc' include 'macros.inc'
scr equ 0x1000 delay equ 20
magnify_width = 40
magnify_height = 30
START: ; start of execution START: ; start of execution
redraw:
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
call draw_window call draw_window
jmp still still:
call draw_screen
key: ; key wtevent:
mov eax,2 ; just read it and ignore mov eax, 23 ; wait here for event with timeout
mov ebx, delay
int 0x40 int 0x40
jmp still dec eax
js still
button: ; button jz redraw
mov eax,17 ; get id dec eax
jnz button
; key in buffer
mov al, 2
int 0x40 int 0x40
jmp wtevent
cmp ah,1 ; button id=1 ? button:
jnz noclose ; we have only one button, close
mov eax,0xffffffff ; close this program or eax, -1
int 0x40 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 ******** ; ******* WINDOW DEFINITIONS AND DRAW ********
; ********************************************* ; *********************************************
draw_window: draw_window:
mov eax, 12 ; function 12:tell os about windowdraw mov eax, 12 ; function 12:tell os about windowdraw
mov ebx, 1 ; 1, start of draw mov ebx, 1 ; 1, start of draw
int 0x40
mov al, 48 ; function 48 : graphics parameters
mov bl, 4 ; subfunction 4 : get skin height
int 0x40 int 0x40
; DRAW WINDOW ; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window mov ebx, 100*65536 + 8*magnify_width + 8
mov ebx,100*65536 ; [x start] *65536 + [x size] lea ecx, [eax + 100*65536 + 8*magnify_height + 3]
mov ebx,100*65536+322 mov edx, 0x33000000 ; color of work area RRGGBB
mov ecx,100*65536+262 ; [y start] *65536 + [y size] mov edi, labelt ; header
mov edx,0x0;01111cc ; color of work area RRGGBB xor eax, eax ; function 0 : define and draw window
mov esi,0x809977ff ; color of grab bar RRGGBB,8->color glide
mov edi,0x00ffff00 ; color of frames RRGGBB
int 0x40 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 al, 12 ; function 12:tell os about windowdraw
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 ebx, 2 ; 2, end of draw
int 0x40 int 0x40
ret ret
draw_screen: 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: draw_magnify:
mov eax, 14
pusha int 0x40 ; get screen size
movzx ecx, ax
inc ecx
mov [size_y], ecx
shr eax, 16
inc eax
mov [size_x], eax
mov eax, 37 mov eax, 37
mov ebx,0 xor ebx, ebx
int 0x40 int 0x40 ; get mouse coordinates
mov ecx, eax mov ecx, eax
mov edx,eax shr ecx, 16 ; ecx = x
shr ecx,16 movzx edx, ax ; edx = y
and edx,65535 inc ecx
mov [m_xe], ecx
sub ecx,39 inc edx
sub edx,29 mov [m_ye], edx
sub ecx, magnify_width
cmp ecx,3000 sub edx, magnify_height
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_x], ecx
mov [m_y], edx mov [m_y], edx
.loop_y:
add ecx,40 .loop_x:
add edx,30 xor eax, eax ; assume black color for invalid pixels
test ecx, ecx
mov [m_xe],ecx js .nopix
mov [m_ye],edx cmp ecx, [size_x]
jge .nopix
mov ecx,[m_x] test edx, edx
mov edx,[m_y] js .nopix
cmp edx, [size_y]
dm1: jge .nopix
mov ebx, edx
push edx imul ebx, [size_x]
mov eax,edx add ebx, ecx
mul [size_x]
pop edx
add eax,ecx
mov ebx,eax
mov eax, 35 mov eax, 35
int 0x40 int 0x40 ; read pixel
.nopix:
pusha push ecx edx
sub ecx, [m_x]
sub edx, [m_y]
mov ebx, ecx mov ebx, ecx
sub ebx,[m_x] shl ebx, 3+16
mov bl, 7
mov ecx, edx mov ecx, edx
sub ecx,[m_y] shl ecx, 3+16
shl ebx,3 mov cl, 7
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 edx, eax
mov eax, 13 mov eax, 13
int 0x40 int 0x40
popa pop edx ecx
inc ecx
add ecx,1
cmp ecx, [m_xe] cmp ecx, [m_xe]
jnz dm1 jnz .loop_x
mov ecx, [m_x] mov ecx, [m_x]
add edx,1 inc edx
cmp edx, [m_ye] cmp edx, [m_ye]
jnz dm1 jnz .loop_y
popa
ret ret
; DATA AREA ; 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: labelt:
db 'MAGNIFIER - MOVE MOUSE POINTER' db 'MAGNIFIER - MOVE MOUSE POINTER', 0
labellen:
I_END: I_END:
align 4
m_x dd ?
m_y dd ?
m_xe dd ?
m_ye dd ?
size_x dd ?
size_y dd ?