diff --git a/programs/demos/magnify/trunk/magnify.asm b/programs/demos/magnify/trunk/magnify.asm index ec14c8e302..8d58e3f904 100644 --- a/programs/demos/magnify/trunk/magnify.asm +++ b/programs/demos/magnify/trunk/magnify.asm @@ -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 - +redraw: + call draw_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 - jmp still - - key: ; key - mov eax,2 ; just read it and ignore - int 0x40 - 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' + call draw_screen +wtevent: + mov eax, 23 ; wait here for event with timeout + mov ebx, delay + int 0x40 + dec eax + js still + jz redraw + dec eax + jnz button +; key in buffer + mov al, 2 + int 0x40 + jmp wtevent +button: +; we have only one button, close + or eax, -1 + int 0x40 ; ********************************************* ; ******* 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 - int 0x40 + 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 - 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 + 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 - int 0x40 - - ret + 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 - - 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 - - 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 - - + 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 + 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 ; 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 ?