kolibrios-gitea/programs/system/ss/trunk/@SS.ASM
Evgeny Grechnikov (Diamond) 827172f6c0 * pic4, rdsave, cpuid: size optimization
* @ss: decrease used memory & time requirements, size optimization
* @panel: if there is only one window, Alt+[Shift+]Tab activates it
* jpegview: IPC service to unpack JPEG data for other apps
* chess: bmp-file is now inlined
* @ss, chess moved to more appropriate place in file structure

git-svn-id: svn://kolibrios.org@532 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-06-04 09:21:07 +00:00

502 lines
9.9 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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 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 '/RD/1/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: