forked from KolibriOS/kolibrios
630234432f
git-svn-id: svn://kolibrios.org@109 a494cfbc-eb01-0410-851d-a64ba20cac60
553 lines
11 KiB
NASM
553 lines
11 KiB
NASM
; SCREENSAVER APPLICATION by lisovin@26.ru
|
||
;
|
||
; Compile with FASM for Menuet
|
||
;
|
||
use32
|
||
org 0x0
|
||
|
||
db 'MENUET01' ; 8 byte id
|
||
dd 0x01 ; header version
|
||
dd START ; start of code
|
||
dd I_END ; size of image
|
||
dd 0x40000 ; memory for app (256 Kb)
|
||
dd 0x40000 ; esp
|
||
dd 0x0 , 0x0 ; I_Param , I_Icon
|
||
|
||
include 'lang.inc'
|
||
include 'macros.inc'
|
||
|
||
;include 'debug.inc'
|
||
|
||
START:
|
||
mov eax,14
|
||
int 0x40
|
||
and eax,0xFFFF0000
|
||
mov [top_right_corner],eax
|
||
|
||
mov eax,40 ; ãáâ ®¢¨âì ¬ áªã ᮡë⨩
|
||
mov ebx,110010b ; ॠ£¨à㥬 ª« ¢¨ âãàã, ¬ëèì, ®âà¨á®¢ªã ä®
|
||
int 0x40
|
||
|
||
mov eax,14 ; ¯®«ã稬 à §¬¥àë íªà
|
||
int 0x40
|
||
mov [y_max],ax
|
||
shr eax,16
|
||
mov [x_max],ax
|
||
|
||
event: ; ®¡à ¡®â稪 ᮡë⨩ (¢á¥å)
|
||
mov eax,26
|
||
mov ebx,9
|
||
int 0x40 ; ¯®«ãç¨âì ¢à¥¬ï á¨á⥬ë
|
||
; mov eax,3
|
||
; int 0x40
|
||
mov [evtime],eax ; § ¯®¬¨âì ¥£®
|
||
mov eax,37
|
||
mov ebx,2
|
||
int 0x40
|
||
cmp eax,3 ; ¯à®¤®«¦¨¬, ¥á«¨ ¦ â á।ïï ª®¯ª ¬ëè¨
|
||
jne still
|
||
mov eax,37 ; ¯à®¢¥à¨¬ ª®®à¤¨ âë
|
||
mov ebx,0
|
||
int 0x40
|
||
cmp [top_right_corner],eax
|
||
je create_setup ; ᮧ¤ ñ¬ ®ª® áâனª¨, ¥á«¨ ¬ëèì ¢ ¢¥à奬 ¯à ¢®¬
|
||
; 㣫ã íªà
|
||
|
||
|
||
|
||
still: ; ®á®¢®© 横« ¯à®£à ¬¬ë
|
||
|
||
mov eax,23 ; ¦¤ñ¬ ᮡëâ¨ï ¢ â¥ç¥¨¥ 1 ᥪã¤ë
|
||
mov ebx,100
|
||
int 0x40
|
||
|
||
bt dword [params],0 ; ssaver works?
|
||
jc event
|
||
bt dword [params],1 ; setup works?
|
||
jc event
|
||
|
||
cmp eax,2 ; key in buffer ?
|
||
je event
|
||
cmp eax,5
|
||
je event
|
||
cmp eax,6
|
||
je event
|
||
|
||
mov eax,26
|
||
mov ebx,9
|
||
int 0x40
|
||
sub eax,[evtime]
|
||
xor edx,edx
|
||
mov ebx,60*100 ; ¯®¤¥«¨¬ 60*100, ¯®«ã稬 ¢à¥¬ï ¢ ¬¨ãâ å
|
||
div ebx
|
||
cmp al,[time]
|
||
jb still
|
||
|
||
; current_time-evtime/100/60 = ¢à¥¬ï ¢ ¬¨ãâ å á ¯à®è«®£® ᮡëâ¨ï
|
||
|
||
call create_ss
|
||
jmp still
|
||
|
||
|
||
|
||
create_setup:
|
||
bt dword [params],1
|
||
jc still
|
||
mov eax,51
|
||
mov ebx,1
|
||
mov ecx,sthread
|
||
mov edx,0x3F000
|
||
int 0x40
|
||
bts dword [params],1
|
||
jmp still
|
||
|
||
create_ss:
|
||
mov eax,51
|
||
mov ebx,1
|
||
mov ecx,thread
|
||
mov edx,0x3E000
|
||
int 0x40
|
||
bts dword [params],0
|
||
ret
|
||
|
||
thread:
|
||
mov eax,5
|
||
mov ebx,eax
|
||
int 0x40
|
||
mov eax,40
|
||
mov ebx,100010b
|
||
int 0x40
|
||
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,58
|
||
mov ebx,fileinfo
|
||
int 0x40
|
||
asminit1:
|
||
mov eax,data_from_file
|
||
mov [stringstart],eax
|
||
mov dword [stringlen],1
|
||
newpage:
|
||
mov word [stringpos],10
|
||
|
||
drawsswin:
|
||
xor eax,eax
|
||
mov ebx,eax
|
||
mov ecx,eax
|
||
mov bx,[x_max]
|
||
mov cx,[y_max]
|
||
inc ebx
|
||
inc ecx
|
||
mov edx,0x01000000
|
||
int 0x40
|
||
mov eax,13
|
||
xor edx,edx
|
||
int 0x40
|
||
tstill:
|
||
mov eax,23
|
||
mov ebx,[delay]
|
||
int 0x40
|
||
cmp eax,2
|
||
je thr_end
|
||
cmp eax,6
|
||
je thr_end
|
||
cmp dword [type],0
|
||
je tstill
|
||
cmp dword [type],24
|
||
je drawssasm
|
||
call draw_line
|
||
jmp tstill
|
||
thr_end:
|
||
btr dword [params],0
|
||
mov eax,26
|
||
mov ebx,9
|
||
int 0x40
|
||
mov [evtime],eax
|
||
or eax,-1
|
||
int 0x40
|
||
|
||
drawssasm:
|
||
mov edi,[stringstart]
|
||
add edi,[stringlen]
|
||
dec edi
|
||
mov eax,edi
|
||
sub eax,data_from_file
|
||
cmp eax,10450
|
||
ja asminit1
|
||
cmp word [edi],0x0a0d
|
||
jne noaddstring
|
||
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]
|
||
int 0x40
|
||
inc dword [stringlen]
|
||
cmp byte [edi],byte ' '
|
||
je drawssasm
|
||
jmp tstill
|
||
|
||
draw_line:
|
||
|
||
xor esi,esi
|
||
xor edi,edi
|
||
mov si,[x_max]
|
||
mov di,[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
|
||
int 0x40
|
||
|
||
dnol:
|
||
|
||
add [lcolor],0x010201
|
||
|
||
ret
|
||
|
||
|
||
sthread: ; start of execution
|
||
|
||
call sdraw_window
|
||
|
||
sstill:
|
||
|
||
mov eax,10 ; wait here for event
|
||
int 0x40
|
||
|
||
cmp eax,1 ; redraw request ?
|
||
je sthread
|
||
cmp eax,2 ; key in buffer ?
|
||
je sstill
|
||
cmp eax,3 ; button in buffer ?
|
||
je sbutton
|
||
|
||
jmp sstill
|
||
|
||
sbutton: ; button
|
||
mov eax,17 ; get id
|
||
int 0x40
|
||
|
||
cmp ah,1 ; button id=1 ?
|
||
jne snoclose
|
||
|
||
btr dword [params],1
|
||
mov eax,-1 ; close this program
|
||
int 0x40
|
||
snoclose:
|
||
cmp ah,7
|
||
jne nosetfl
|
||
btc dword [params],0
|
||
call drawflag
|
||
call drawtype
|
||
call drawtime
|
||
jmp sstill
|
||
nosetfl:
|
||
bt dword [params],0
|
||
jc 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 al
|
||
; das
|
||
jmp timeupdn
|
||
notimedown:
|
||
cmp ah,5
|
||
jne notimeup
|
||
mov al,[time]
|
||
cmp al,59 ; 0x59
|
||
jae sstill
|
||
inc al
|
||
; daa
|
||
jmp timeupdn
|
||
notimeup:
|
||
cmp ah,6
|
||
jne noshow
|
||
mov eax,5
|
||
mov ebx,150
|
||
int 0x40
|
||
call create_ss
|
||
jmp sstill
|
||
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
|
||
int 0x40
|
||
|
||
; 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,0x03400088 ; color of work area RRGGBB,8->color gl
|
||
int 0x40
|
||
|
||
mov eax,8
|
||
mov ebx,47*65536+10
|
||
mov ecx,31*65536+10
|
||
mov edx,2
|
||
mov esi,0x702050
|
||
int 0x40
|
||
push ebx
|
||
add ebx,13*65536
|
||
mov edi,ebx
|
||
inc edx
|
||
int 0x40
|
||
pop ebx
|
||
add ecx,15*65536
|
||
inc edx
|
||
int 0x40
|
||
mov ebx,edi
|
||
inc edx
|
||
int 0x40
|
||
mov ebx,160*65536+40
|
||
mov ecx,28*65536+14
|
||
inc edx
|
||
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,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB )
|
||
mov edx,labelt ; pointer to text beginning
|
||
mov esi,17 ; text length
|
||
int 0x40
|
||
add ebx,7*65536+25
|
||
mov ecx,0xffffff
|
||
mov edx,setuptext
|
||
mov esi,9
|
||
int 0x40
|
||
add ebx,15
|
||
add edx,esi
|
||
mov esi,30
|
||
int 0x40
|
||
mov ebx,169*65536+32
|
||
mov edx,buttext
|
||
mov esi,4
|
||
int 0x40
|
||
|
||
call drawtype
|
||
call drawtime
|
||
call drawflag
|
||
|
||
mov eax,12 ; function 12:tell os about windowdraw
|
||
mov ebx,2 ; 2, end of draw
|
||
int 0x40
|
||
|
||
ret
|
||
|
||
drawtype:
|
||
mov eax,13
|
||
mov ebx,80*65536+75
|
||
mov ecx,30*65536+12
|
||
mov edx,0xffffff
|
||
bt dword [params],0
|
||
jnc noblue
|
||
mov edx,0x4e00e7
|
||
noblue:
|
||
int 0x40
|
||
mov eax,4
|
||
mov ebx,82*65536+32
|
||
xor ecx,ecx
|
||
mov edx,typetext
|
||
add edx,[type]
|
||
mov esi,12
|
||
int 0x40
|
||
ret
|
||
|
||
drawtime:
|
||
mov eax,13
|
||
mov ebx,80*65536+15
|
||
mov ecx,45*65536+12
|
||
mov edx,0xffffff
|
||
bt dword [params],0
|
||
jnc noblue1
|
||
mov edx,0x4e00e7
|
||
noblue1:
|
||
int 0x40
|
||
mov eax,47
|
||
mov edx,82*65536+47
|
||
xor esi,esi
|
||
movzx ecx,byte [time]
|
||
mov ebx,0x00020000
|
||
int 0x40
|
||
ret
|
||
|
||
drawflag:
|
||
mov eax,8
|
||
mov ebx,150*65536+10
|
||
mov ecx,45*65536+10
|
||
mov edx,7
|
||
mov esi,0xe0e0e0
|
||
int 0x40
|
||
mov eax,4
|
||
mov ebx,153*65536+47
|
||
xor ecx,ecx
|
||
mov esi,1
|
||
mov edx,flag
|
||
bt dword [params],0
|
||
jc setf
|
||
inc edx
|
||
setf:
|
||
int 0x40
|
||
ret
|
||
|
||
; DATA AREA
|
||
buttext db 'SHOW'
|
||
flag db 'V '
|
||
labelt db 'SCREENSAVER SETUP'
|
||
setuptext db 'TYPE: < >TIME: < > MINUTES NEVER'
|
||
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 dd 0 ;if bit 0 set-ssaver works if bit 1 set-setup works
|
||
|
||
fileinfo:
|
||
dd 0,0,21,data_from_file,work_area
|
||
db '/RD/1/SS.ASM',0
|
||
|
||
I_END:
|
||
|
||
|
||
; UNINITIALIZED DATA:
|
||
|
||
lcolor dd ?
|
||
evtime dd ? ; ¢à¥¬ï ¯à¥¤ë¤ã饣® ᮡëâ¨ï
|
||
x_max dw ? ; à §¬¥àë íªà
|
||
y_max dw ?
|
||
|
||
top_right_corner dd ?
|
||
work_area:
|
||
rb 0x10000
|
||
data_from_file: |