0,0 → 1,417 |
; |
; VIRTUAL SCREEN 2 |
; based on the original VSCREEN |
; |
; Compile with FASM for Menuet |
;' |
|
use32 |
|
org 0x0 |
|
db 'MENUET01' ; 8 byte id |
dd 0x01 ; required os |
dd START ; program start |
dd I_END ; program image size |
dd 0x600000 ; required amount of memory |
dd 0xfff0 |
dd 0,0 |
|
scr equ 0x20000 |
|
include 'lang.inc' |
include 'macros.inc' |
|
START: ; start of execution |
|
mov eax,14 ; get screen size |
int 0x40 |
push eax |
and eax,0x0000ffff |
inc eax |
mov [size_y],eax |
pop eax |
shr eax,16 |
inc eax |
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 |
|
mov eax,[size_y] |
imul eax,[size_x] |
imul eax,3 |
mov [i_size],eax |
|
red: |
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 |
|
dec eax ; redraw request ? |
jz red |
dec eax ; key in buffer ? |
jz key |
dec eax ; button in buffer ? |
jz button |
|
jmp still |
|
key: ; key |
mov eax,2 |
int 0x40 ; just read it and ignore |
jmp still |
|
button: ; button |
mov eax,17 ; get id |
int 0x40 |
|
cmp ah,1 ; button id=1 ? |
jnz noclose |
exit: |
or eax,-1 ; close this program |
int 0x40 |
noclose: |
|
cmp ah,2 |
jnz still |
|
mov eax,51 |
xor ebx,ebx |
inc ebx |
mov ecx,thread_start |
mov edx,0xe000 |
int 0x40 |
|
jmp exit |
|
thread_start: |
mov eax,5 ; wait for termination (1 sec.) |
mov ebx,100 |
int 0x40 |
|
call save_screen |
jmp exit ; exit thread |
|
save_screen: |
|
pusha |
|
; mov eax,5 |
; mov ebx,500 |
; int 0x40 |
|
; xor ebx,ebx |
; mov edi,0x10036 ;0x10000 |
; mov esi,edi ;0x10000 |
; add esi,[i_size] |
|
; ss1: |
|
; mov eax,35 |
; int 0x40 |
|
; inc ebx |
|
; mov [edi],eax |
; add edi,3 |
|
; cmp edi,esi |
; jb ss1 |
|
; 1) READ SCREEN |
mov edi,0x10036 |
|
mov eax,[size_y] |
dec eax |
mov [temp_y],eax |
|
ynew: |
|
xor eax,eax |
mov [temp_x],eax |
|
xnew: |
|
mov eax,[temp_x] |
mov ebx,[temp_y] |
call read_pixel |
|
mov [edi],eax |
add edi,3 |
|
inc [temp_x] |
|
mov eax,[size_x] |
cmp [temp_x],eax |
jb xnew |
|
dec [temp_y] |
|
cmp [temp_y],0 |
jge ynew |
|
; 2) BMP HEADER |
|
mov [0x10000],word 'BM' ; bmp signature |
mov eax,[i_size] |
mov [0x10000+34],eax ; image size |
mov ebx,0x36 |
mov [0x10000+10],ebx ; headers size |
add eax,ebx |
mov [0x10000+2],eax ; file size |
mov [0x10000+14],dword 0x28 |
mov eax,[size_x] |
mov [0x10000+18],eax ; x size |
mov eax,[size_y] |
mov [0x10000+22],eax ; y size |
mov [0x10000+26],word 1 |
mov [0x10000+28],word 0x18 ; bpp = 24 = 0x18 |
|
; 3) SAVE FILE |
|
mov eax,56 |
mov ebx,filename |
mov edx,0x10000 |
mov ecx,[i_size] |
add ecx,0x36 |
mov esi,path |
int 0x40 |
|
popa |
ret |
|
filename db 'SCREEN BMP' |
path db 0 |
|
read_pixel: |
pushad |
|
mov esi,eax |
mov eax,[size_x] |
mul ebx |
add eax,esi |
|
xchg eax,ebx |
mov eax,35 |
int 0x40 |
mov [esp+28],eax |
|
popad |
ret |
|
; ********************************************* |
; ******* 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 |
xor eax,eax ; function 0 : define and draw window |
movzx ebx,word [size_x] |
shr ebx,2 |
add ebx,100*65536+40 |
|
movzx ecx,word [size_y] |
shr ecx,2 |
add ecx,100*65536+75 |
|
mov edx,0x027777dd ;82 ; color of work area RRGGBB |
mov esi,0x807777dd ; color of grab bar RRGGBB,8->color gl |
mov edi,0x007777dd ; color of frames RRGGBB |
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,0x10ffffff ; 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 ebx,[size_x] |
shr ebx,2 |
add ebx,40-19 |
shl ebx,16 |
mov bx,12 ; [x start] *65536 + [x size] |
mov ecx,5*65536+12 ; [y start] *65536 + [y size] |
xor edx,edx ; button id |
inc edx |
mov esi,0x7777dd ; button color RRGGBB |
int 0x40 |
|
; save image |
mov ebx,20*65536 |
mov bx,word [size_x] |
shr bx,2 |
mov cx,word [size_y] |
shr cx,2 |
add cx,49 |
shl ecx,16 |
mov cx,12 |
mov edx,2 |
mov esi,0x4f4f9f |
int 0x40 |
|
shr ecx,16 |
mov ebx,25*65536 |
mov bx,cx |
add bx,3 |
mov eax,4 |
mov ecx,0xffffff |
mov edx,savetext |
mov esi,24 ;22 |
int 0x40 |
|
call draw_screen |
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,2 ; 2, end of draw |
int 0x40 |
|
ret |
|
draw_screen: |
|
pusha |
|
mov edi,scr |
|
xor ecx,ecx |
xor edx,edx |
|
xor esi,esi |
|
ds1: |
|
mov eax,35 |
mov ebx,esi |
int 0x40 |
stosd |
dec edi |
|
add esi,4 |
inc ecx |
cmp ecx,[cmp_ecx] ; 800/4 |
jb ds1 |
|
add esi,[add_esi] ; 800*3 |
xor ecx,ecx |
inc edx |
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 |
|
ret |
|
draw_magnify: |
|
pusha |
|
mov [m_x],dword 0x0 |
mov [m_y],dword 0x0 |
|
xor ecx,ecx |
xor edx,edx |
|
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 |
mov ecx,edx |
shl ebx,3 |
add ebx,20 |
shl ebx,16 |
mov bx,8 |
shl ecx,3 |
add ecx,35 |
shl ecx,16 |
mov cx,8 |
|
mov edx,eax |
mov eax,13 |
int 0x40 |
popa |
|
inc ecx |
cmp ecx,40 |
jnz dm1 |
xor ecx,ecx |
inc edx |
cmp edx,32 |
jnz dm1 |
|
popa |
ret |
|
; DATA AREA |
|
i_size dd 0x1 |
|
m_x dd 100 |
m_y dd 100 |
|
cmp_ecx dd 0 |
add_esi dd 0 |
cmp_edx dd 0 |
|
delay dd 100 |
|
labelt: |
db 'VIRTUAL SCREEN 2' |
labellen: |
|
savetext db 'SAVE AS /HD/1/SCREEN.BMP ' |
|
I_END: |
|
temp_x dd ? |
temp_y dd ? |
|
size_x dd ? |
size_y dd ? |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |