2f59aa1b32
git-svn-id: svn://kolibrios.org@3645 a494cfbc-eb01-0410-851d-a64ba20cac60
625 lines
12 KiB
NASM
625 lines
12 KiB
NASM
;------------------------------------------------------------------------------
|
|
; @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
|
|
|
|
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 I_Param ; boot parameters
|
|
dd 0x0 ; path
|
|
;------------------------------------------------------------------------------
|
|
include 'lang.inc'
|
|
include '..\..\..\macros.inc'
|
|
;include 'debug.inc'
|
|
;------------------------------------------------------------------------------
|
|
align 4
|
|
START:
|
|
mcall 68,11
|
|
mcall 40,110010b
|
|
; boot parameters
|
|
cmp [I_Param],dword 'ZERO'
|
|
jne @f
|
|
mov [type],dword 0
|
|
;--------------------------------------
|
|
align 4
|
|
@@:
|
|
cmp [I_Param],dword 'ASSM'
|
|
jne bgr_changed
|
|
mov [type],dword 24
|
|
;------------------------------------------------------------------------------
|
|
align 4
|
|
bgr_changed:
|
|
|
|
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
|
|
; mouse event
|
|
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,sthread_stack_top
|
|
or [params],2
|
|
jmp still
|
|
;------------------------------------------------------------------------------
|
|
align 4
|
|
key:
|
|
mcall ; eax = 2
|
|
jmp still
|
|
;------------------------------------------------------------------------------
|
|
align 4
|
|
create_ss_thread:
|
|
test [params],3
|
|
jnz still
|
|
call create_ss
|
|
jmp still
|
|
;------------------------------------------------------------------------------
|
|
align 4
|
|
create_ss:
|
|
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
|
|
|
|
push eax
|
|
mov ecx,eax
|
|
mcall 37,4,,2 ; load own cursor
|
|
|
|
mov ecx,eax
|
|
mcall 37,5 ; set own cursor
|
|
|
|
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
|
|
;--------------------------------------
|
|
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]
|
|
|
|
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
|
|
;--------------------------------------
|
|
align 4
|
|
dl1:
|
|
cmp [lx2],1
|
|
jge dl2
|
|
|
|
mov [addx2],1
|
|
;--------------------------------------
|
|
align 4
|
|
dl2:
|
|
cmp [lx1],esi
|
|
jbe dl3
|
|
|
|
mov [addx1],0xffffffff
|
|
;--------------------------------------
|
|
align 4
|
|
dl3:
|
|
cmp [lx2],esi
|
|
jbe dl4
|
|
|
|
mov [addx2],0xffffffff
|
|
;--------------------------------------
|
|
align 4
|
|
dl4:
|
|
cmp [ly1],1
|
|
jge dl5
|
|
mov [addy1],1
|
|
;--------------------------------------
|
|
align 4
|
|
dl5:
|
|
cmp [ly2],2
|
|
jge dl6
|
|
|
|
mov [addy2],1
|
|
;--------------------------------------
|
|
align 4
|
|
dl6:
|
|
cmp [ly1],edi
|
|
jbe dl7
|
|
|
|
mov [addy1],-1
|
|
;--------------------------------------
|
|
align 4
|
|
dl7:
|
|
cmp [ly2],edi
|
|
jbe dl8
|
|
|
|
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
|
|
|
|
dec eax ; key in buffer ?
|
|
jne sbutton
|
|
|
|
mcall 2
|
|
jmp snoclose ;sstill
|
|
;------------------------------------------------------------------------------
|
|
align 4
|
|
sbutton: ; button
|
|
mcall 17 ; get id
|
|
|
|
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
|
|
|
|
xor [params],1
|
|
call drawflag
|
|
call drawtype
|
|
call drawtime
|
|
jmp sstill
|
|
;--------------------------------------
|
|
align 4
|
|
nosetfl:
|
|
test [params],1
|
|
jnz 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
|
|
|
|
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
|
|
|
|
mov ebx,edi
|
|
inc edx
|
|
mcall
|
|
|
|
inc edx
|
|
mcall ,<160,40>,<28,14>
|
|
|
|
mcall 4,<15,33>,0x80ffffff,setuptext ; write text to window
|
|
|
|
add ebx,15
|
|
add edx,10
|
|
mcall
|
|
|
|
mcall ,<169,32>,,buttext
|
|
|
|
call drawtype
|
|
call drawtime
|
|
call drawflag
|
|
|
|
mcall 12,2
|
|
ret
|
|
;------------------------------------------------------------------------------
|
|
align 4
|
|
drawtype:
|
|
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 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:
|
|
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
|
|
|
|
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:
|
|
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 ?
|
|
|
|
top_right_corner rd 1
|
|
;------------------------------------------------------------------------------
|
|
align 4
|
|
I_Param:
|
|
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:
|
|
;------------------------------------------------------------------------------
|