Files
KOS_qrcodes/programs/system/ss/trunk/@ss.asm
T
pathoswithin 6dfe65cba8 Screensaver optimization
git-svn-id: svn://kolibrios.org@5888 a494cfbc-eb01-0410-851d-a64ba20cac60
2015-11-06 16:26:35 +00:00

613 lines
12 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.
;------------------------------------------------------------------------------
; @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 [stringpos],16
;--------------------------------------
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 [stringpos],16
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,[stringlen]
shl ebx,19
mov bx,[stringpos]
mov edx,[stringstart]
add edx,[stringlen]
dec edx
mcall 4,,0x104ba010,,1
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
type dd 12
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 16
time db 15 ; ¢à¥¬ï ¤® § ¯ã᪠ § áâ ¢ª¨ ¢ ¬¨­ãâ å
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
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 '
;-------------------------------
IM_END: ; UNINITIALIZED DATA
top_right_corner rd 1
align 4
lcolor dd ?
x_max dw ? ; à §¬¥àë íªà ­ 
y_max dw ?
I_Param:
fileinfo_buffer:
rb 40
;-------------------------------
rb 512
sthread_stack_top:
rb 512
thread_stack_top:
rb 512
stack_top:
I_END: