diff --git a/programs/system/ss/trunk/@ss.asm b/programs/system/ss/trunk/@ss.asm new file mode 100644 index 0000000000..3984a19942 --- /dev/null +++ b/programs/system/ss/trunk/@ss.asm @@ -0,0 +1,500 @@ +; 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 + +;include 'debug.inc' + +START: + mov eax,40 ; установить маску событий + mov ebx,110010b ; реагируем на клавиатуру, мышь, отрисовку фона + mcall + +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 +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 +; mouse event + mcall 37,2 ; проверим кнопки + and al, 3 + cmp al, 3 ; нажаты обе кнопки мыши? + jnz still + mcall 37,0 ; проверим координаты + cmp [top_right_corner], eax + jnz still +create_setup: + test [params], 2 + jnz still ; окно настроек уже создано + mcall 51,1,sthread,used_memory-0x1000 + or [params], 2 + jmp still +key: + mcall ; eax = 2 + jmp still + +create_ss_thread: + test [params], 3 + jnz still + call create_ss + jmp still + +create_ss: + mcall 51,1,thread,used_memory-0x2000 + or [params], 1 + ret + + 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 + + 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 + + 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 +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 + +draw_line: + movzx esi,[x_max] + movzx edi,[y_max] + + mov eax,[addx1] + add [lx1],eax + mov eax,[addy1] + add [ly1],eax + + mov eax,[addx2] + add [lx2],eax + mov eax,[addy2] + add [ly2],eax + + 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: + + 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 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 eax,38 + mov edx,[lcolor] + and edx,0xffffff + mcall + + dnol: + + add [lcolor],0x010201 + + ret + + +sthread: ; start of execution + + call sdraw_window + +sstill: + + mov eax,10 ; wait here for event + mcall + + dec eax ; redraw request ? + je sthread + dec eax ; key in buffer ? + jne sbutton + mov al,2 + mcall + jmp snoclose ;sstill + + sbutton: ; button + mov eax,17 ; get id + mcall + + cmp ah,1 ; button id=1 ? + jne snoclose + + 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 + + timeupdn: + mov [time],al + call drawtime + jmp sstill + typeupdn: + mov [type],eax + call drawtype + jmp sstill + +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* + + +sdraw_window: + + + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,1 ; 1, start of draw + 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 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 + + 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 + + call drawtype + call drawtime + call drawflag + + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,2 ; 2, end of draw + mcall + + ret + +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 + +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 + +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 + +; 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 + +lx1 dd 10 +lx2 dd 40 + +ly1 dd 50 +ly2 dd 100 + +addx1 dd 1 +addx2 dd 1 + +addy1 dd 1 +addy2 dd 1 + +stringlen dd 1 +stringstart dd 0 +stringpos dw 10 + +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: + + +; UNINITIALIZED DATA: + +lcolor dd ? +x_max dw ? ; размеры экрана +y_max dw ? + +top_right_corner dd ? +filesize dd ? +data_from_file: