forked from KolibriOS/kolibrios
Add spiral: 2D demo and screen saver example.
Originally written in UASM by 0CodErr. git-svn-id: svn://kolibrios.org@7599 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
8973200440
commit
9823d47546
4
programs/demos/spiral/Tupfile.lua
Normal file
4
programs/demos/spiral/Tupfile.lua
Normal file
@ -0,0 +1,4 @@
|
||||
if tup.getconfig("NO_FASM") ~= "" then return end
|
||||
HELPERDIR = (tup.getconfig("HELPERDIR") == "") and "../.." or tup.getconfig("HELPERDIR")
|
||||
tup.include(HELPERDIR .. "/use_fasm.lua")
|
||||
tup.rule("spiral.asm", FASM .. " %f %o " .. tup.getconfig("KPACK_CMD"), "spiral")
|
433
programs/demos/spiral/spiral.asm
Normal file
433
programs/demos/spiral/spiral.asm
Normal file
@ -0,0 +1,433 @@
|
||||
;
|
||||
; Spiral demo using Turtle graphics
|
||||
;
|
||||
; Written in UASM by 0CorErr
|
||||
; Translated to FASM by dunkaist
|
||||
;
|
||||
|
||||
use32
|
||||
org 0
|
||||
db 'MENUET01'
|
||||
dd 0x01,start,i_end,e_end,e_end,params,0
|
||||
|
||||
include 'proc32.inc'
|
||||
include 'macros.inc'
|
||||
|
||||
struct RGB
|
||||
Blue db ?
|
||||
Green db ?
|
||||
Red db ?
|
||||
ends
|
||||
|
||||
struct HSV
|
||||
Hue dw ?
|
||||
Sat db ?
|
||||
Val db ?
|
||||
ends
|
||||
|
||||
struct Turtle
|
||||
PosX dd ?
|
||||
PosY dd ?
|
||||
Orientation dd ?
|
||||
PenColor HSV
|
||||
ends
|
||||
|
||||
|
||||
proc forward _t, _d
|
||||
locals
|
||||
.x1 dd ?
|
||||
.x2 dd ?
|
||||
.y1 dd ?
|
||||
.y2 dd ?
|
||||
endl
|
||||
mov eax, [_t]
|
||||
|
||||
fld [eax+Turtle.PosX]
|
||||
fistp [.x1]
|
||||
|
||||
fld [eax+Turtle.PosY]
|
||||
fistp [.y1]
|
||||
|
||||
fld [eax+Turtle.Orientation]
|
||||
fcos
|
||||
fmul [_d]
|
||||
fadd [eax+Turtle.PosX]
|
||||
fstp [eax+Turtle.PosX]
|
||||
|
||||
fld [eax+Turtle.Orientation]
|
||||
fsin
|
||||
fmul [_d]
|
||||
fadd [eax+Turtle.PosY]
|
||||
fstp [eax+Turtle.PosY]
|
||||
|
||||
fld [eax+Turtle.PosX]
|
||||
fistp [.x2]
|
||||
|
||||
fld [eax+Turtle.PosY]
|
||||
fistp [.y2]
|
||||
|
||||
mov ebx, [.x1]
|
||||
shl ebx, 16
|
||||
add ebx, [.x2]
|
||||
mov ecx, [.y1]
|
||||
shl ecx, 16
|
||||
add ecx, [.y2]
|
||||
mov edx, [color]
|
||||
mcall 38
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc turn _t, _degrees
|
||||
mov eax, [_t]
|
||||
fldpi
|
||||
fmul [_degrees]
|
||||
fdiv [float_180]
|
||||
fadd [eax+Turtle.Orientation]
|
||||
fstp [eax+Turtle.Orientation]
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc reposition _t, _x, _y
|
||||
mov eax, [_t]
|
||||
mov ecx, [_x]
|
||||
mov [eax+Turtle.PosX], ecx
|
||||
mov ecx, [_y]
|
||||
mov [eax+Turtle.PosY], ecx
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
; H = 0..360, S = 0..255, V = 0..255 --> R = 0..255, G = 0..255, B = 0..255
|
||||
proc hsv_to_rgb uses ebx, _h, _s, _v, _rgb
|
||||
locals
|
||||
.f dd ?
|
||||
.vs dd ?
|
||||
endl
|
||||
mov ebx, [_rgb]
|
||||
cmp [_s], 0
|
||||
jnz @f
|
||||
mov eax, [_v]
|
||||
mov [ebx+RGB.Red], al
|
||||
mov [ebx+RGB.Green], al
|
||||
mov [ebx+RGB.Blue], al
|
||||
jmp .end
|
||||
@@:
|
||||
cmp [_h], 360
|
||||
jnz @f
|
||||
mov [_h], 0
|
||||
@@:
|
||||
mov eax, [_v]
|
||||
mul [_s]
|
||||
mov [.vs], eax
|
||||
mov eax, [_h]
|
||||
mov ecx, 60
|
||||
xor edx, edx
|
||||
div ecx
|
||||
mov [.f], edx
|
||||
|
||||
test eax, eax
|
||||
jnz @f
|
||||
mov eax, [_v]
|
||||
mov [ebx+RGB.Red], al
|
||||
mov eax, 60
|
||||
sub eax, [.f]
|
||||
mul [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255_mul_60]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Green], dl
|
||||
mov eax, [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Blue], dl
|
||||
jmp .end
|
||||
@@:
|
||||
cmp eax, 1
|
||||
jnz @f
|
||||
mov eax, [.vs]
|
||||
mul [.f]
|
||||
xor edx, edx
|
||||
div [dword_255_mul_60]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Red], dl
|
||||
mov eax, [_v]
|
||||
mov [ebx+RGB.Green], al
|
||||
mov eax, [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Blue], dl
|
||||
jmp .end
|
||||
@@:
|
||||
cmp eax, 2
|
||||
jnz @f
|
||||
mov eax, [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Red], dl
|
||||
mov eax, [_v]
|
||||
mov [ebx+RGB.Green], al
|
||||
mov eax, 60
|
||||
sub eax, [.f]
|
||||
mul [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255_mul_60]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Blue], dl
|
||||
jmp .end
|
||||
@@:
|
||||
cmp eax, 3
|
||||
jnz @f
|
||||
mov eax, [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Red], dl
|
||||
mov eax, [.vs]
|
||||
mul [.f]
|
||||
xor edx, edx
|
||||
div [dword_255_mul_60]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Green], dl
|
||||
mov eax, [_v]
|
||||
mov [ebx+RGB.Blue], al
|
||||
jmp .end
|
||||
@@:
|
||||
cmp eax, 4
|
||||
jnz @f
|
||||
mov eax, 60
|
||||
sub eax, [.f]
|
||||
mul [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255_mul_60]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Red], dl
|
||||
mov eax, [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Green], dl
|
||||
mov eax, [_v]
|
||||
mov [ebx+RGB.Blue], al
|
||||
jmp .end
|
||||
@@:
|
||||
cmp eax, 5
|
||||
jnz @f
|
||||
mov eax, [_v]
|
||||
mov [ebx+RGB.Red], al
|
||||
mov eax, [.vs]
|
||||
xor edx, edx
|
||||
div [dword_255]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Green], dl
|
||||
mov eax, [.vs]
|
||||
mul [.f]
|
||||
xor edx, edx
|
||||
div [dword_255_mul_60]
|
||||
mov edx, [_v]
|
||||
sub dl, al
|
||||
mov [ebx+RGB.Blue], dl
|
||||
@@:
|
||||
.end:
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc hue_shift _t, _n
|
||||
mov ecx, [_t]
|
||||
movzx eax, [ecx+Turtle.PenColor.Hue]
|
||||
add eax, [_n]
|
||||
xor edx, edx
|
||||
div [dword_360]
|
||||
mov [ecx+Turtle.PenColor.Hue], dx
|
||||
|
||||
movzx eax, [ecx+Turtle.PenColor.Hue]
|
||||
movzx edx, [ecx+Turtle.PenColor.Sat]
|
||||
movzx ecx, [ecx+Turtle.PenColor.Val]
|
||||
|
||||
stdcall hsv_to_rgb, eax, edx, ecx, color
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc query_perf
|
||||
locals
|
||||
.diff dd ?
|
||||
endl
|
||||
mcall 26, 9
|
||||
sub eax, [frame_start]
|
||||
mov [.diff], eax
|
||||
fild [.diff]
|
||||
fild [freq]
|
||||
fdivrp
|
||||
fstp [instant]
|
||||
mcall 26, 9
|
||||
mov [frame_start], eax
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc waiting
|
||||
fld [max_frame_rate]
|
||||
fld [instant]
|
||||
fcomip st1
|
||||
fstp st0
|
||||
jna @f
|
||||
inc [sleep_time]
|
||||
jmp .end
|
||||
@@:
|
||||
fld [min_frame_rate]
|
||||
fld [instant]
|
||||
fcomip st1
|
||||
fstp st0
|
||||
jnc .end
|
||||
cmp [sleep_time], 0
|
||||
jz .end
|
||||
dec [sleep_time]
|
||||
.end:
|
||||
mcall 5, [sleep_time]
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc drawing
|
||||
locals
|
||||
.i dd ?
|
||||
.n dd ?
|
||||
.posx dd ?
|
||||
.posy dd ?
|
||||
endl
|
||||
mov [turtle.Orientation], 0
|
||||
mov eax, [window_width]
|
||||
mov ecx, [window_height]
|
||||
shr eax, 1
|
||||
shr ecx, 1
|
||||
mov [.posx], eax
|
||||
mov [.posy], ecx
|
||||
fild [.posx]
|
||||
fstp [.posx]
|
||||
fild [.posy]
|
||||
fstp [.posy]
|
||||
stdcall reposition, turtle, [.posx], [.posy]
|
||||
mov [.n], 5.0
|
||||
mov eax, [window_height]
|
||||
imul eax, 15
|
||||
shr eax, 4
|
||||
mov ecx, eax
|
||||
xor edx, edx
|
||||
div [dword_360]
|
||||
neg edx
|
||||
add edx, ecx
|
||||
sub edx, 10
|
||||
mov [.i], edx
|
||||
@@:
|
||||
stdcall hue_shift, turtle, 1
|
||||
stdcall forward, turtle, [.n]
|
||||
stdcall turn, turtle, 72.5
|
||||
fld [.n]
|
||||
fadd [ndelta]
|
||||
fstp [.n]
|
||||
dec [.i]
|
||||
jnz @b
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
start:
|
||||
cmp dword[params], '@ss'
|
||||
setz [screensaver]
|
||||
mov ebx, EVM_REDRAW + EVM_KEY
|
||||
cmovz ebx, EVM_REDRAW + EVM_KEY + EVM_MOUSE
|
||||
mcall 40
|
||||
|
||||
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
|
||||
|
||||
mcall 14
|
||||
add eax, 0x00010001
|
||||
movzx ecx, ax
|
||||
shr eax, 16
|
||||
mov [window_width], eax
|
||||
mov [window_height], ecx
|
||||
mcall 26, 9
|
||||
mov [frame_start], eax
|
||||
.still:
|
||||
mcall 11
|
||||
dec eax
|
||||
js .draw_spiral ; no event
|
||||
jnz .quit
|
||||
mcall 12, 1
|
||||
mcall 0, [window_width], [window_height], 0, 0x01000000
|
||||
mcall 12, 2
|
||||
.draw_spiral:
|
||||
cmp [screensaver], 0
|
||||
jz @f
|
||||
mcall 9, proc_info, -1
|
||||
cmp [proc_info.window_stack_position], ax
|
||||
jnz .quit
|
||||
@@:
|
||||
stdcall query_perf
|
||||
stdcall drawing
|
||||
stdcall waiting
|
||||
jmp .still
|
||||
.quit:
|
||||
cmp [screensaver], 0
|
||||
jz @f
|
||||
mcall 70, f70
|
||||
@@:
|
||||
mcall -1
|
||||
|
||||
|
||||
align 4
|
||||
dword_255_mul_60 dd 255 * 60
|
||||
dword_255 dd 255
|
||||
dword_360 dd 360
|
||||
float_180 dd 180.0
|
||||
ndelta dd 0.6 ; used in drawing Proc: n = n + ndelta
|
||||
max_frame_rate dd 15.0 ; to keep the FrameRate
|
||||
min_frame_rate dd 8.0 ; around min_frame_rate..max_frame_rate FPS
|
||||
|
||||
freq dd 100 ; GetTickCount return count of 1/100s of second
|
||||
instant dd 0.0
|
||||
sleep_time dd 0
|
||||
|
||||
turtle Turtle 0.0, 0.0, 0.0, <180, 255, 255>
|
||||
|
||||
f70: ; run
|
||||
dd 7, 0, 0, 0, 0
|
||||
db '/sys/@ss',0
|
||||
i_end:
|
||||
|
||||
align 4
|
||||
window_width dd ?
|
||||
window_height dd ?
|
||||
frame_start dd ?
|
||||
color dd ?
|
||||
|
||||
proc_info process_information
|
||||
params rb 0x400
|
||||
transparent_cursor rd 32*32
|
||||
screensaver db ?
|
||||
align 4
|
||||
rb 0x200
|
||||
e_end:
|
Loading…
Reference in New Issue
Block a user