kolibrios/programs/vscreen/trunk/vscreen.asm

418 lines
7.2 KiB
NASM
Raw Normal View History

;
; 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 ?