From 19ee52261b5ea094fb67641ba268d41354efbf82 Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Fri, 30 Mar 2012 16:11:37 +0000 Subject: [PATCH] @SS - screensaver. Some optimisations and code refactoring. git-svn-id: svn://kolibrios.org@2529 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/system/ss/trunk/@ss.asm | 975 ++++++++++++++------------ programs/system/ss/trunk/build_en.bat | 3 +- programs/system/ss/trunk/build_ru.bat | 3 +- 3 files changed, 548 insertions(+), 433 deletions(-) diff --git a/programs/system/ss/trunk/@ss.asm b/programs/system/ss/trunk/@ss.asm index 3984a19942..9c420cf894 100644 --- a/programs/system/ss/trunk/@ss.asm +++ b/programs/system/ss/trunk/@ss.asm @@ -1,500 +1,613 @@ +;------------------------------------------------------------------------------ +; @SS - screensaver +;------------------------------------------------------------------------------ +; last update: 30/03/2012 +; changed by: Marat Zakiyanov aka Mario79, aka Mario +; changes: The program uses only 4 Kb memory is now. +; Code refactoring. Using transparent cursor. +; Fix bug - using lots of buttons from f.8. +;--------------------------------------------------------------------- ; SCREENSAVER APPLICATION by lisovin@26.ru ; ; Compile with FASM for Menuet ; - use32 - org 0x0 - -used_memory = 0x10000 - - db 'MENUET01' ; 8 byte id - dd 0x01 ; header version - dd START ; start of code - dd I_END ; size of image - dd used_memory ; memory for app - dd used_memory ; esp - dd 0x0 , 0x0 ; I_Param , I_Icon - -include 'lang.inc' -include '..\..\..\macros.inc' -purge mov ; decrease kpack'ed size +;------------------------------------------------------------------------------ + use32 + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd IM_END ; size of image + dd I_END ; memory for app + dd stack_top ; esp + dd 0x0 ; I_Param + dd 0x0 ; path +;------------------------------------------------------------------------------ +include 'lang.inc' +include '..\..\..\macros.inc' ;include 'debug.inc' - +;------------------------------------------------------------------------------ +align 4 START: - mov eax,40 ; установить маску событий - mov ebx,110010b ; реагируем на клавиатуру, мышь, отрисовку фона - mcall - + mcall 68,11 + mcall 40,110010b +;------------------------------------------------------------------------------ +align 4 bgr_changed: - mov eax,14 - mcall - mov [y_max], ax - shr eax, 16 - mov [x_max], ax - shl eax, 16 - mov [top_right_corner], eax + mcall 14 + mov [y_max],ax + shr eax,16 + mov [x_max],ax + shl eax,16 + mov [top_right_corner],eax +;------------------------------------------------------------------------------ +align 4 still: - movzx ebx, [time] - imul ebx, 60*100 - mcall 23 ; ждём события в течение [time] минут - test eax, eax - jz create_ss_thread - cmp al, 2 ; key in buffer? - jz key - cmp al, 5 ; background redraw? - jz bgr_changed + movzx ebx,[time] + imul ebx,60*100 + mcall 23 ; ждём события в течение [time] минут + test eax,eax + jz create_ss_thread + + cmp al,2 ; key in buffer? + jz key + + cmp al,5 ; background redraw? + jz bgr_changed ; mouse event - mcall 37,2 ; проверим кнопки - and al, 3 - cmp al, 3 ; нажаты обе кнопки мыши? - jnz still - mcall 37,0 ; проверим координаты - cmp [top_right_corner], eax - jnz still + mcall 37,2 ; проверим кнопки + and al,3 + cmp al,3 ; нажаты обе кнопки мыши? + jnz still + + mcall 37,0 ; проверим координаты + cmp [top_right_corner],eax + jnz still +;------------------------------------------------------------------------------ +align 4 create_setup: - test [params], 2 - jnz still ; окно настроек уже создано - mcall 51,1,sthread,used_memory-0x1000 - or [params], 2 - jmp still + test [params],2 + jnz still ; окно настроек уже создано + mcall 51,1,sthread,sthread_stack_top + or [params],2 + jmp still +;------------------------------------------------------------------------------ +align 4 key: - mcall ; eax = 2 - jmp still - + mcall ; eax = 2 + jmp still +;------------------------------------------------------------------------------ +align 4 create_ss_thread: - test [params], 3 - jnz still - call create_ss - jmp still - + test [params],3 + jnz still + call create_ss + jmp still +;------------------------------------------------------------------------------ +align 4 create_ss: - mcall 51,1,thread,used_memory-0x2000 - or [params], 1 - ret + mcall 51,1,thread,thread_stack_top + or [params],1 + ret +;------------------------------------------------------------------------------ +align 4 +thread: + mcall 40,100010b +;set_new_cursor_skin - transparent cursor + mcall 68,12,32*32*4 ; get memory for own cursor area - thread: -; mov eax,5 -; mov ebx,eax -; mcall - mov eax,40 - mov ebx,100010b - mcall - cmp dword [type],0 - je drawsswin - cmp dword [type],24 - je asminit - mov dword [delay],1 - mov [lx1],10 ; for "draw line" - mov [lx2],40 - mov [ly1],50 - mov [ly2],100 - mov [addx1],1 - mov [addx2],1 - mov [addy1],1 - mov [addy2],1 - jmp drawsswin - asminit: ; for "assembler" - mov dword [delay],25 - mov eax,70 - mov ebx,fileinfo - mcall - mov [filesize], ebx - asminit1: - mov [stringstart],data_from_file - mov dword [stringlen],1 - newpage: - mov word [stringpos],10 + push eax + mov ecx,eax + mcall 37,4,,2 ; load own cursor - drawsswin: - xor eax,eax - movzx ebx,[x_max] - movzx ecx,[y_max] - inc ebx - inc ecx - mov edx,0x01000000 - mcall - mov eax,13 - xor edx,edx - mcall - tstill: - mov eax,23 - mov ebx,[delay] - mcall - test eax,eax - jnz thr_end - cmp dword [type],0 - je tstill - cmp dword [type],24 - je drawssasm - call draw_line - jmp tstill - thr_end: - and [params], not 1 - or eax,-1 - mcall + mov ecx,eax + mcall 37,5 ; set own cursor - drawssasm: - mov edi,[stringstart] - add edi,[stringlen] - dec edi - lea eax,[edi-data_from_file] - cmp eax,[filesize] - ja asminit1 - cmp word [edi],0x0a0d - je addstring - cmp byte [edi],0x0a - jne noaddstring - dec edi + pop ecx + mcall 68,13 ; free own cursor area + + cmp [type],dword 0 + je drawsswin + + cmp [type],dword 24 + je asminit + + mov dword [delay],1 + mov [lx1],10 ; for "draw line" + mov [lx2],40 + mov [ly1],50 + mov [ly2],100 + mov [addx1],1 + mov [addx2],1 + mov [addy1],1 + mov [addy2],1 + jmp drawsswin +;-------------------------------------- +align 4 +asminit: ; for "assembler" - assembler sources demo +; get size of file + mov [fileinfo],dword 5 + mov [fileinfo.point],dword fileinfo_buffer + mcall 70,fileinfo + test eax,eax + jnz .no_file +; get memory for file + mov ecx,[fileinfo_buffer+32] + mov [fileinfo.size],ecx + mcall 68,12 + mov [fileinfo.point],eax +; load file + mov [fileinfo],dword 0 + mcall 70,fileinfo + test eax,eax + jz @f + mcall 68,13,[fileinfo.point] +;-------------------------------------- +align 4 +.no_file: + mov [type],dword 0 + jmp drawsswin +;-------------------------------------- +align 4 +@@: + mov dword [delay],1 ;25 - old value +;-------------------------------------- +align 4 +asminit1: + mov eax,[fileinfo.point] + mov [stringstart],eax + mov dword [stringlen],1 +;-------------------------------------- +align 4 +newpage: + mov word [stringpos],10 +;-------------------------------------- +align 4 +drawsswin: + xor eax,eax + movzx ebx,[x_max] + movzx ecx,[y_max] + inc ebx + inc ecx + mcall ,,,0x01000000 + + xor edx,edx + mcall 13 +;-------------------------------------- +align 4 +tstill: + mcall 23,[delay] + test eax,eax + jnz thr_end + + cmp [type],dword 0 + je tstill + + cmp [type],dword 24 + je drawssasm + + call draw_line + jmp tstill +;-------------------------------------- +align 4 +thr_end: + cmp [type],dword 24 + jne @f + mcall 68,13,[fileinfo.point] +;-------------------------------------- +align 4 +@@: + and [params], not 1 + or eax,-1 + mcall +;------------------------------------------------------------------------------ +align 4 +drawssasm: + mov edi,[stringstart] + add edi,[stringlen] + dec edi + + mov eax,edi + sub eax,[fileinfo.point] + + cmp eax,[fileinfo.size] + ja asminit1 + + cmp word [edi],0x0a0d + je addstring + + cmp byte [edi],0x0a + jne noaddstring + + dec edi +;-------------------------------------- +align 4 addstring: - add word [stringpos],10 - add edi,2 - mov [stringstart],edi - mov dword [stringlen],1 - mov ax,[stringpos] - cmp ax,[y_max] - jb tstill - jmp newpage - noaddstring: - mov eax,4 - mov ebx,10*65536 - mov bx,[stringpos] - mov ecx,0x104ba010 - mov edx,[stringstart] - mov esi,[stringlen] - mcall - inc dword [stringlen] - cmp byte [edi],byte ' ' - je drawssasm - jmp tstill - + add word [stringpos],10 + add edi,2 + mov [stringstart],edi + mov dword [stringlen],1 + mov ax,[stringpos] + cmp ax,[y_max] + jb tstill + jmp newpage +;-------------------------------------- +align 4 +noaddstring: + mov ebx,10*65536 + mov bx,[stringpos] + mcall 4,,0x104ba010,[stringstart],[stringlen] + inc dword [stringlen] + cmp [edi],byte ' ' + je drawssasm + jmp tstill +;------------------------------------------------------------------------------ +align 4 draw_line: - movzx esi,[x_max] - movzx edi,[y_max] + movzx esi,[x_max] + movzx edi,[y_max] - mov eax,[addx1] - add [lx1],eax - mov eax,[addy1] - add [ly1],eax + mov eax,[addx1] + add [lx1],eax + mov eax,[addy1] + add [ly1],eax - mov eax,[addx2] - add [lx2],eax - mov eax,[addy2] - add [ly2],eax + mov eax,[addx2] + add [lx2],eax + mov eax,[addy2] + add [ly2],eax + + cmp [lx1],1 + jge dl1 + mov [addx1],1 +;-------------------------------------- +align 4 +dl1: + cmp [lx2],1 + jge dl2 - cmp [lx1],1 - jge dl1 - mov [addx1],1 - dl1: - cmp [lx2],1 - jge dl2 - mov [addx2],1 - dl2: - cmp [lx1],esi - jbe dl3 - mov [addx1],0xffffffff - dl3: - cmp [lx2],esi - jbe dl4 - mov [addx2],0xffffffff - dl4: + mov [addx2],1 +;-------------------------------------- +align 4 +dl2: + cmp [lx1],esi + jbe dl3 - cmp [ly1],1 - jge dl5 - mov [addy1],1 - dl5: - cmp [ly2],2 - jge dl6 - mov [addy2],1 - dl6: - cmp [ly1],edi - jbe dl7 - mov [addy1],-1 - dl7: - cmp [ly2],edi - jbe dl8 - mov [addy2],-1 - dl8: + mov [addx1],0xffffffff +;-------------------------------------- +align 4 +dl3: + cmp [lx2],esi + jbe dl4 - mov eax,[lx2] - cmp [lx1],eax - jz dnol + mov [addx2],0xffffffff +;-------------------------------------- +align 4 +dl4: + cmp [ly1],1 + jge dl5 + mov [addy1],1 +;-------------------------------------- +align 4 +dl5: + cmp [ly2],2 + jge dl6 - mov bx,word [lx1] - shl ebx,16 - mov bx,word [lx2] + mov [addy2],1 +;-------------------------------------- +align 4 +dl6: + cmp [ly1],edi + jbe dl7 - mov cx,word [ly1] - shl ecx,16 - mov cx,word [ly2] + mov [addy1],-1 +;-------------------------------------- +align 4 +dl7: + cmp [ly2],edi + jbe dl8 - mov eax,38 - mov edx,[lcolor] - and edx,0xffffff - mcall - - dnol: - - add [lcolor],0x010201 - - ret - - -sthread: ; start of execution + mov [addy2],-1 +;-------------------------------------- +align 4 +dl8: + mov eax,[lx2] + cmp [lx1],eax + jz dnol + + mov bx,word [lx1] + shl ebx,16 + mov bx,word [lx2] + mov cx,word [ly1] + shl ecx,16 + mov cx,word [ly2] + + mov edx,[lcolor] + and edx,0xffffff + mcall 38 +;-------------------------------------- +align 4 +dnol: + add [lcolor],0x010201 + ret +;------------------------------------------------------------------------------ +align 4 +sthread: ; start of execution call sdraw_window - +;-------------------------------------- +align 4 sstill: + mcall 10 ; wait here for event + dec eax ; redraw request ? + je sthread - mov eax,10 ; wait here for event - mcall + dec eax ; key in buffer ? + jne sbutton - dec eax ; redraw request ? - je sthread - dec eax ; key in buffer ? - jne sbutton - mov al,2 - mcall - jmp snoclose ;sstill + mcall 2 + jmp snoclose ;sstill +;------------------------------------------------------------------------------ +align 4 +sbutton: ; button + mcall 17 ; get id - sbutton: ; button - mov eax,17 ; get id - mcall + cmp ah,1 ; button id=1 ? + jne snoclose - cmp ah,1 ; button id=1 ? - jne snoclose + and [params],not 2 + mov eax,-1 ; close this program + mcall +;-------------------------------------- +align 4 +snoclose: + cmp ah,7 + jne nosetfl - and [params], not 2 - mov eax,-1 ; close this program - mcall - snoclose: - cmp ah,7 - jne nosetfl - xor [params], 1 - call drawflag - call drawtype - call drawtime - jmp sstill - nosetfl: - test [params], 1 - jnz sstill - cmp ah,2 - jne notypedown - mov eax,[type] - test eax,eax - je sstill - sub eax,12 - jmp typeupdn - notypedown: - cmp ah,3 - jne notypeup - mov eax,[type] - cmp eax,24 - jae sstill - add eax,12 - jmp typeupdn - notypeup: - cmp ah,4 - jne notimedown - mov al,[time] - cmp al,1 - jbe sstill - dec eax -; das - jmp timeupdn - notimedown: - cmp ah,5 - jne notimeup - mov al,[time] - cmp al,59 ; 0x59 - jae sstill - inc eax -; daa - jmp timeupdn - notimeup: - cmp ah,6 - jne noshow - mov eax,5 - mov ebx,10;150 - mcall - call create_ss - noshow: - jmp sstill + xor [params],1 + call drawflag + call drawtype + call drawtime + jmp sstill +;-------------------------------------- +align 4 +nosetfl: + test [params],1 + jnz sstill - timeupdn: - mov [time],al - call drawtime - jmp sstill - typeupdn: - mov [type],eax - call drawtype - jmp sstill + cmp ah,2 + jne notypedown + mov eax,[type] + test eax,eax + je sstill + + sub eax,12 + jmp typeupdn +;-------------------------------------- +align 4 +notypedown: + cmp ah,3 + jne notypeup + + mov eax,[type] + cmp eax,24 + jae sstill + + add eax,12 + jmp typeupdn +;-------------------------------------- +align 4 +notypeup: + cmp ah,4 + jne notimedown + + mov al,[time] + cmp al,1 + jbe sstill + + dec eax +; das + jmp timeupdn +;-------------------------------------- +align 4 +notimedown: + cmp ah,5 + jne notimeup + + mov al,[time] + cmp al,59 ; 0x59 + jae sstill + + inc eax +; daa + jmp timeupdn +;-------------------------------------- +align 4 +notimeup: + cmp ah,6 + jne noshow + + mcall 5,10 + call create_ss +;-------------------------------------- +align 4 +noshow: + jmp sstill +;-------------------------------------- +align 4 +timeupdn: + mov [time],al + call drawtime + jmp sstill +;-------------------------------------- +align 4 +typeupdn: + mov [type],eax + call drawtype + jmp sstill +;------------------------------------------------------------------------------ ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* - - +align 4 sdraw_window: + mcall 12,1 + xor eax,eax ; function 0 : define and draw window + xor esi,esi + mcall ,<100,215>,<100,70>,0x13400088,,title - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,1 ; 1, start of draw - mcall + mcall 8,<47,10>,<31,10>,2,0x702050 + + push ebx + add ebx,13*65536 + mov edi,ebx + inc edx + mcall + pop ebx + + add ecx,15*65536 + inc edx + mcall - ; DRAW WINDOW - xor eax,eax ; function 0 : define and draw window - mov ebx,100*65536+215 ; [x start] *65536 + [x size] - mov ecx,100*65536+70 ; [y start] *65536 + [y size] - mov edx,0x13400088 ; color of work area RRGGBB,8->color gl - mov edi,title - mcall + mov ebx,edi + inc edx + mcall - mov al,8 - mov ebx,47*65536+10 - mov ecx,31*65536+10 - mov edx,2 - mov esi,0x702050 - mcall - push ebx - add ebx,13*65536 - mov edi,ebx - inc edx - mcall - pop ebx - add ecx,15*65536 - inc edx - mcall - mov ebx,edi - inc edx - mcall - mov ebx,160*65536+40 - mov ecx,28*65536+14 - inc edx - mcall + inc edx + mcall ,<160,40>,<28,14> - mov al,4 ; function 4 : write text to window - mov ebx,15*65536+33 ; [x start] *65536 + [y start] - mov ecx,0x80ffffff - mov edx,setuptext - mcall - add ebx,15 - add edx,10 - mcall - mov ebx,169*65536+32 - mov edx,buttext - mcall + mcall 4,<15,33>,0x80ffffff,setuptext ; write text to window - call drawtype - call drawtime - call drawflag + add ebx,15 + add edx,10 + mcall - mov eax,12 ; function 12:tell os about windowdraw - mov ebx,2 ; 2, end of draw - mcall + mcall ,<169,32>,,buttext - ret + call drawtype + call drawtime + call drawflag + mcall 12,2 + ret +;------------------------------------------------------------------------------ +align 4 drawtype: - mov eax,13 - mov ebx,80*65536+75 - mov ecx,30*65536+12 - mov edx,0xffffff - test [params], 1 - jz noblue - mov edx,0x4e00e7 - noblue: - mcall - mov al,4 - mov ebx,82*65536+32 - xor ecx,ecx - mov edx,typetext - add edx,[type] - mov esi,12 - mcall - ret + mov edx,0xffffff + test [params], 1 + jz noblue + mov edx,0x4e00e7 +;-------------------------------------- +align 4 +noblue: + mcall 13,<80,75>,<30,12> + xor ecx,ecx + mov edx,typetext + add edx,[type] + mcall 4,<82,32>,,,12 + ret +;------------------------------------------------------------------------------ +align 4 drawtime: - mov eax,13 - mov ebx,80*65536+15 - mov ecx,45*65536+12 - mov edx,0xffffff - test [params], 1 - jz noblue1 - mov edx,0x4e00e7 - noblue1: - mcall - mov al,47 - mov edx,82*65536+47 - xor esi,esi - movzx ecx,byte [time] - mov ebx,0x00020000 - mcall - ret + mov edx,0xffffff + test [params], 1 + jz noblue1 + mov edx,0x4e00e7 +;-------------------------------------- +align 4 +noblue1: + mcall 13,<80,15>,<45,12> + xor esi,esi + movzx ecx,byte [time] + mcall 47,0x00020000,,<82,47> + ret +;------------------------------------------------------------------------------ +align 4 drawflag: - mov eax,8 - mov ebx,150*65536+10 - mov ecx,45*65536+10 - mov edx,7 - mov esi,0xe0e0e0 - mcall - mov al,4 - mov ebx,153*65536+47 - xor ecx,ecx - mov esi,1 - mov edx,flag - bt dword [params],0 - jc setf - inc edx - setf: - mcall - ret + mcall 8,,,0x80000007 ; before we need delete button +; otherwise, a few hours later the application will spend all buttons of system + mcall ,<150,10>,<45,10>,7,0xe0e0e0 ; then create button + + mov edx,flag + bt dword [params],0 + jc setf + inc edx +;-------------------------------------- +align 4 +setf: + xor ecx,ecx + mcall 4,<153,47>,,,1 + ret +;------------------------------------------------------------------------------ +align 4 ; DATA AREA -buttext db 'SHOW',0 -flag db 'V ' -title db 'SCREENSAVER SETUP',0 -setuptext db 'TYPE: < >',0 - db 'TIME: < > MINUTES NEVER',0 -typetext db 'BLACK SCREENCOLOR LINES ASSEMBLER ' -type dd 12 -time db 15 ; время до запуска заставки в минутах -delay dd 100 +buttext db 'SHOW',0 +flag db 'V ' +title db 'SCREENSAVER SETUP',0 +setuptext db 'TYPE: < >',0 + db 'TIME: < > MINUTES NEVER',0 +typetext db 'BLACK SCREENCOLOR LINES ASSEMBLER ' +type dd 12 +time db 15 ; время до запуска заставки в минутах +delay dd 100 -lx1 dd 10 -lx2 dd 40 +lx1 dd 10 +lx2 dd 40 -ly1 dd 50 -ly2 dd 100 +ly1 dd 50 +ly2 dd 100 -addx1 dd 1 -addx2 dd 1 +addx1 dd 1 +addx2 dd 1 -addy1 dd 1 -addy2 dd 1 +addy1 dd 1 +addy2 dd 1 -stringlen dd 1 -stringstart dd 0 -stringpos dw 10 +stringlen dd 1 +stringstart dd 0 +stringpos dw 10 -params db 0 ;if bit 0 set-ssaver works if bit 1 set-setup works +params db 0 ;if bit 0 set-ssaver works if bit 1 set-setup works fileinfo: -; used_memory-0x3000-data_from_file = ~50 Kb with current settings - dd 0,0,0,used_memory-0x3000-data_from_file,data_from_file - db '/sys/NETWORK/PPP.ASM',0 - -I_END: - - + dd 0 + dd 0 + dd 0 +.size: dd 0 +.point: dd 0 + db '/sys/macros.inc',0 +;------------------------------------------------------------------------------ +align 4 +IM_END: ; UNINITIALIZED DATA: -lcolor dd ? -x_max dw ? ; размеры экрана -y_max dw ? +lcolor dd ? +x_max dw ? ; размеры экрана +y_max dw ? -top_right_corner dd ? -filesize dd ? -data_from_file: +top_right_corner rd 1 +;------------------------------------------------------------------------------ +align 4 +fileinfo_buffer: + rb 40 +;------------------------------------------------------------------------------ +align 4 + rb 512 +sthread_stack_top: +;------------------------------------------------------------------------------ +align 4 + rb 512 +thread_stack_top: +;------------------------------------------------------------------------------ +align 4 + rb 512 +stack_top: +I_END: +;------------------------------------------------------------------------------ diff --git a/programs/system/ss/trunk/build_en.bat b/programs/system/ss/trunk/build_en.bat index 23730d0c88..4629c2f083 100644 --- a/programs/system/ss/trunk/build_en.bat +++ b/programs/system/ss/trunk/build_en.bat @@ -1,5 +1,6 @@ @erase lang.inc @echo lang fix en >lang.inc -@fasm @ss.asm @ss +@fasm -m 16384 @ss.asm @ss +@kpack @ss @erase lang.inc @pause \ No newline at end of file diff --git a/programs/system/ss/trunk/build_ru.bat b/programs/system/ss/trunk/build_ru.bat index b9ae059645..0bfa374768 100644 --- a/programs/system/ss/trunk/build_ru.bat +++ b/programs/system/ss/trunk/build_ru.bat @@ -1,5 +1,6 @@ @erase lang.inc @echo lang fix ru >lang.inc -@fasm @ss.asm @ss +@fasm -m 16384 @ss.asm @ss +@kpack @ss @erase lang.inc @pause \ No newline at end of file