;===[includes]===; include 'lang.inc' include 'ascl.inc' include 'macros.inc' ;===[header and etc.]===; meos_app_start ;===[code:]===; code ;--------------------------------------- ;====== we want keyborad events ======== mov eax,40 mov ebx,00000000000000000000000000000010b int 0x40 ;====== wanna use keyboard scan codes == mov eax,66 mov ebx,1 mov ecx,1 int 0x40 ;=======GET SCREEN SIZE================= 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 ;======================================= still: mov eax,10 int 0x40 cmp eax,2 je key jmp still key: mov eax,2 int 0x40 cmp ah,55 ;===print screen to hdd je print_screen_hdd cmp ah,84 ;===alt+prnt.screen = print screen to fdd je print_screen_fdd cmp ah,70 ;===lets make exit - scroll lock je close_now jmp still close_now: close ;================================== ;===save file to hdd=============== print_screen_hdd: mov [savetofdd],0 call change_fname call save_screen jmp still ;===save file to fdd=============== print_screen_fdd: mov [savetofdd],1 call change_fname call save_screen jmp still ;===change our file name ========== change_fname: cmp [bmp_name+7],'9' jne addfname cmp [bmp_name+6],'9' je leavenow ;if name is > than 'screen99.bmp' then we do not change name mov [bmp_name+7],'0' add [bmp_name+6],0x1 jmp leavenow addfname: add [bmp_name+7],0x1 leavenow: ret ;================================== ;============SAVE SCREEN=========== 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 save_screen: pusha ; 1) READ SCREEN mov edi,bmp_file_area+0x36 ;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 [bmp_file_area],word 'BM' ; bmp signature mov eax,[i_size] mov [bmp_file_area+34],eax ; image size mov ebx,0x36 mov [bmp_file_area+10],ebx ; headers size add eax,ebx mov [bmp_file_area+2],eax ; file size mov [bmp_file_area+14],dword 0x28 mov eax,[size_x] mov [bmp_file_area+18],eax ; x size mov eax,[size_y] mov [bmp_file_area+22],eax ; y size mov [bmp_file_area+26],word 1 mov [bmp_file_area+28],word 0x18 ; bpp = 24 = 0x18 ; 3) SAVE FILE cmp [savetofdd],1 je save_to_fdd mov eax,56 mov ebx,bmp_name mov edx,bmp_file_area mov ecx,[i_size] add ecx,0x36 mov esi,path int 0x40 popa ret save_to_fdd: mov eax,33; mov ebx,bmp_name mov ecx,bmp_file_area mov edx,[i_size] add edx,0x36 mov esi,0 int 0x40 popa ret ;======================================= ;--------------------------------------- ;===[DATA]===; data ;--------------------------------------- bmp_name db 'SCREEN00BMP' path db 0 i_size dd 0x1 m_x dd 100 m_y dd 100 cmp_ecx dd 0 add_esi dd 0 cmp_edx dd 0 savetofdd db 0 ;===[uninitialised data]===; udata ;--------------------------------------- temp_x dd ? temp_y dd ? size_x dd ? size_y dd ? bmp_file_area: rb 0x250000 ;the happy end meos_app_end