From 9823d47546c3644d74918e1c212a2ca4be341fe1 Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Mon, 11 Mar 2019 21:34:36 +0000 Subject: [PATCH] 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 --- programs/demos/spiral/Tupfile.lua | 4 + programs/demos/spiral/spiral.asm | 433 ++++++++++++++++++++++++++++++ 2 files changed, 437 insertions(+) create mode 100644 programs/demos/spiral/Tupfile.lua create mode 100644 programs/demos/spiral/spiral.asm diff --git a/programs/demos/spiral/Tupfile.lua b/programs/demos/spiral/Tupfile.lua new file mode 100644 index 0000000000..44f82cf9d3 --- /dev/null +++ b/programs/demos/spiral/Tupfile.lua @@ -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") diff --git a/programs/demos/spiral/spiral.asm b/programs/demos/spiral/spiral.asm new file mode 100644 index 0000000000..b7aa721513 --- /dev/null +++ b/programs/demos/spiral/spiral.asm @@ -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: