8,341 → 8,145 |
|
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 |
|
redraw: |
call draw_window |
still: |
|
call draw_screen |
|
wtevent: |
mov eax,23 ; wait here for event with timeout |
mov ebx,[delay] |
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 |
jmp still |
|
key: ; key |
mov eax,2 ; just read it and ignore |
dec eax |
js still |
jz redraw |
dec eax |
jnz button |
; key in buffer |
mov al, 2 |
int 0x40 |
jmp still |
|
button: ; button |
mov eax,17 ; get id |
jmp wtevent |
button: |
; we have only one button, close |
or eax, -1 |
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 |
|
; 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 al, 48 ; function 48 : graphics parameters |
mov bl, 4 ; subfunction 4 : get skin height |
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 |
; 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 |
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 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 |
int 0x40 |
|
xor ebx, ebx |
int 0x40 ; get mouse coordinates |
mov ecx,eax |
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 |
|
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 |
|
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 |
.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 |
|
pusha |
int 0x40 ; read pixel |
.nopix: |
push ecx edx |
sub ecx, [m_x] |
sub edx, [m_y] |
mov ebx,ecx |
sub ebx,[m_x] |
shl ebx, 3+16 |
mov bl, 7 |
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 |
|
shl ecx, 3+16 |
mov cl, 7 |
mov edx,eax |
mov eax,13 |
int 0x40 |
popa |
|
add ecx,1 |
pop edx ecx |
inc ecx |
cmp ecx,[m_xe] |
jnz dm1 |
jnz .loop_x |
mov ecx,[m_x] |
add edx,1 |
inc edx |
cmp edx,[m_ye] |
jnz dm1 |
|
popa |
|
jnz .loop_y |
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 ? |