kolibrios/programs/demos/crownscr/trunk/crownscr.asm

408 lines
8.1 KiB
NASM
Raw Normal View History

;
; Crown_s Soft Screensaver v1.13m
; WWW: http://www.crown-s-soft.com
;
; You may add you own figures. See file FIGURES.INC
;
; Compile with FASM v1.48 for Menuet or hier (FASM v1.40 contains bug)
;
; Copyright(c) 2002-2004 Crown_s Soft. All rights reserved.
;
fullscreen = 1
n_points = 0x1800
delay = 2
const480 = 480
speed equ 0.004
macro align value { rb (value-1) - ($ + value-1) mod value }
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd start ; start of code
dd i_end ; size of image
dd i_end+0x1000 ; memory for app
dd i_end+0x1000 ; esp
dd params ; I_Param
dd 0x0 ; I_Icon
copyright db 'Crown_s Soft(c) Screensaver - www.crown-s-soft.com',0
copyrightlen:
include "lang.inc"
include "figuresi.inc"
include "..\..\..\macros.inc"
start:
cmp dword[params], '@ss'
setz [screensaver]
mov ebx, EVM_REDRAW + EVM_KEY + EVM_BUTTON
cmovz ebx, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE
mcall 40
cmp [flscr],0
jz @f
mov edi, transparent_cursor
xor eax, eax
mov ecx, 32*32
rep stosd
mcall 37, 4, transparent_cursor, 2
mov ecx, eax
mcall 37, 5
@@:
cld
finit
call filling_alfbet ; fill table alfbet by casual numbers
mov eax,[tabl_calls]
mov [pp1adr],eax
cmp [flscr],0
jz nofullscreen
mov eax,14
mcall
mov [maxy],ax
sub ax,const480
jnc m5
xor ax,ax
m5:
shr ax,1
mov [posy],ax
shr eax,16
mov [maxx],ax
sub ax,const480
jnc m6
xor ax,ax
m6:
shr ax,1
mov [posx],ax
mov [outsize],const480+65536*const480
jmp m4
nofullscreen:
mov [posx],75
mov [posy],20
mov [outsize],const480+65536*const480
m4:
red:
call draw_window
still:
mcall 23,delay ; wait here for event
cmp eax,1 ; redraw request ?
je red
cmp eax,2 ; key in buffer ?
je key
cmp eax,3 ; button in buffer ?
je close
cmp eax,6 ; mouse moved ?
je close
call calcframe
mov eax,07 ; putimage
mov ebx,scr ; ebx pointer to image in memory
mov ecx,[outsize] ; ecx=image position in window [w]*65536+[h]
mov edx,dword [posy] ; edx=image position in window [x]*65536+[y]
mcall
jmp still
key:
cmp [screensaver], 0
jnz close
mov eax,2
mcall
cmp al,1 ; is key in buffer ?
jz still
cmp ah,0x1B ; is key ESC ?
jz close
jmp still
close:
cmp [screensaver], 0
jz @f
mcall 70, f70
@@:
mcall -1
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
mcall 12, 1 ;start draw
cmp [flscr],0
jnz m2
mcall 48,4
mov esi, eax
; DRAW WINDOW
mov ecx,100*65536+const480+4 ; [y start] *65536 + [y size]
add ecx, esi
mcall 0, 100*65536+const480+9,,0x74000000,,copyright
jmp m3
m2:
movzx ebx,[maxx] ; [x start] *65536 + [x size]
movzx ecx,[maxy] ; [y start] *65536 + [y size]
mov edx,0x01000000 ; color of work area RRGGBB,8->color gl
mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl
mov edi,0x005080d0 ; color of frames RRGGBB
xor eax,eax ; function 0 : define and draw window
mcall
inc bx
inc cx
mov eax,13 ; functiom 13 : draw bar
mcall
m3:
mcall 12, 2 ;end draw
ret
calcframe:
cld
mov edi,scr
mov ecx,const480*const480*3/4
xor eax,eax
rep stosd ; CLS
mov ebx,[frame]
not bh
test bh,03h
not bh
jnz lb1
; ebx=xxxx xxxx xxxx xxxx xxxx xx11 xxxx xxxxb
mov byte [p],bl
lb1:
test bx,03ffh
jnz lb2
; ebx=xxxx xxxx xxxx xxxx xxxx xx00 0000 0000b
mov [p],0
mov eax,[pp1adr]
mov [pp0adr],eax
inc [pp1]
cmp [pp1],num_tabl_calls
jnz lb3
mov [pp1],0
lb3:
movzx eax,[pp1]
mov eax,[tabl_calls+eax*4]
mov [pp1adr],eax
lb2:
fild [frame] ; st0=STime
fmul [speed1] ; st0=STime*Speed
fst [bt_r] ; al_rSTime*Speed
fadd st0,st0
fstp [al_r] ; al_rSTime*Speed*2
mov [Fl],0
mov ecx,[mFl]
mov esi,alfbet
ckl1:
call [pp0adr]
cmp [p],0
jz lb4
fstp [x1]
fstp [y1]
fstp [z1]
call [pp1adr]
call mix
lb4:
call turn
add esi,4
inc [Fl]
loop ckl1
inc ebx
mov [frame],ebx
ret
; turn coordinate system
turn:
; around Y
; x= x*cos(a)-z*sin(a)
; y= y
; z= x*sin(a)+z*cos(a)
fld st2 ; st0=z st1=x st2=y st3=z
fld st1 ; st0=x st1=z st2=x st3=y st4=z
fld [al_r] ; st0=a st1=x st2=z st3=x st4=y st5=z
fsincos ; st0=cos(a) st1=sin(a) st2=x st3=z st4=x st5=y st6=z
fmul st4,st0
fmulp st6,st0 ; st0=sin(a) st1=x st2=z st3=x*cos(a) st4=y st5=z*cos(a)
fmul st2,st0
fmulp st1,st0 ; st0=x*sin(a) st1=z*sin(a) st2=x*cos(a) st3=y st4=z*c
faddp st4,st0
fsubp st1,st0
; around X
; x=x
; y= y*cos(b)+z*sin(b)
; z=-y*sin(b)+z*cos(b)
fld st2 ; st0=z st1=x st2=y st3=z
fld st2 ; st0=y st1=z st2=x st3=y st4=z
fld [bt_r] ; st0=b st1=y st2=z st3=x st4=y st5=z
fsincos ; st0=cos(b) st1=sin(b) st2=y st3=z st4=x st5=y st6=z
fmul st5,st0
fmulp st6,st0 ; st0=sin(b) st1=y st2=z st3=x st4=y*cos(b) st5=z*cos(b)
fmul st2,st0
fmulp st1,st0 ; st0=y*sin(b) st1=z*sin(b) st2=x st3=y*cos(b) st4=z*cos(b)
fsubp st4,st0 ; st0=z*sin(b) st1=x st2=y*cos(b) st3=z*cos(b)-y*sin(b)
faddp st2,st0
; st0=x st1=y st2=z
fistp [x1]
fistp [y1]
fmul [Zdepth] ; st0=z*Zdepth
fiadd [Zcolor] ; st0=z*Zdepth+Zcolor
fistp [z_w] ; st0z*Zdepth+Zcolor
push edx
mov eax,[x1]
add eax,[mid]
mul [consts]
add eax,[y1]
add eax,[mid]
mul [const3]
mov dl,byte [z_w] ; al=ZZ
mov [scr+0+eax],dl
mov [scr+1+eax],dl
mov [scr+2+eax],dl
pop edx
ret
mix:
fild [p] ; st0=p
fmul [mp] ; st0=p=p*mp
fld st0 ; st0=p st1=p
fmul st4,st0
fmul st3,st0
fmulp st2,st0 ; st0=p st1=x*p st2=y*p st3=z*p
fld1
fsubrp st1,st0 ; st0=1-p st1=x*p st2=y*p st3=z*p
fld [z1] ; st0=z1 st1=1-p st2=x*p st3=y*p st4=z*p
fmul st0,st1
faddp st4,st0
fld [y1] ; st0=y1 st1=1-p st2=x*p st3=y*p st4=
fmul st0,st1
faddp st3,st0
fld [x1] ; st0=x1 st1=1-p st2=x*p st3=y*p+y1*(1-p) st4=
fmulp st1,st0 ; st0=x1*(1-p) st1=x*p st2=y*p+y1*(1-p) st3=
faddp st1,st0 ; st0=x=x*p+x1*(1-p) st1=y=y*p+y1*(1-p) st2=z
ret
filling_alfbet:
; Initialize RND
mov eax,3
mcall
; eax - fist random number
mov ecx,n_points
mov edi,alfbet
mov ebx,8088405h
ck2:
stosd
; Compute next random number
; New := 8088405H * Old + 1
mul ebx
inc eax
loop ck2
ret
; DATA AREA
align 2
frame dd 0
mp dd 0.00390625
n_r dd 0.00390625
mal_r dd 6.28318530717958648
mbt_r dd 6.28318530717958648
const3 dd 3
const6 dw 6
consts dd const480
mFl dd n_points
pp1 dw 0
Zdepth dd 0.3
Zcolor dw 140
mid dd 240 ; centre of screen
speed1 dd speed
flscr db fullscreen
align 4
outsize dd ?
posy dw ?
posx dw ?
maxy dw ?
maxx dw ?
Fl dd ?
p dd ?
al_r dd ?
bt_r dd ?
pp0adr dd ?
pp1adr dd ?
z_w dw ?
x1 dd ?
y1 dd ?
z1 dd ?
f70: ; run
dd 7, 0, 0, 0, 0
db '/sys/@SS',0
screensaver db ?
params rb 4
transparent_cursor rd 32*32
align 16
alfbet: ; alfbet db n_points*4 dup (?)
scr = alfbet+n_points*4 ; scr db 480*480*3+1 dup (?)
i_end = scr+const480*const480*3+1 ; i_param db 256 dup (?)