Subversion Repositories Kolibri OS

Rev

Rev 7599 | Rev 9449 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; Spiral demo using Turtle graphics
  3. ;
  4. ; Written in UASM by 0CorErr
  5. ; Translated to FASM by dunkaist
  6. ;
  7.  
  8. use32
  9.     org 0
  10.     db  'MENUET01'
  11.     dd  0x01,start,i_end,e_end,e_end,params,0
  12.  
  13. include 'proc32.inc'
  14. include 'macros.inc'
  15.  
  16. struct RGB
  17.     Blue  db ?
  18.     Green db ?
  19.     Red   db ?
  20. ends
  21.  
  22. struct HSV
  23.     Hue dw ?
  24.     Sat db ?
  25.     Val db ?
  26. ends
  27.  
  28. struct Turtle
  29.     PosX        dd ?
  30.     PosY        dd ?
  31.     Orientation dd ?
  32.     PenColor    HSV
  33. ends
  34.  
  35.  
  36. proc forward _t, _d
  37. locals
  38.     .x1 dd ?
  39.     .x2 dd ?
  40.     .y1 dd ?
  41.     .y2 dd ?
  42. endl
  43.         mov     eax, [_t]
  44.  
  45.         fld     [eax+Turtle.PosX]
  46.         fistp   [.x1]
  47.  
  48.         fld     [eax+Turtle.PosY]
  49.         fistp   [.y1]
  50.  
  51.         fld     [eax+Turtle.Orientation]
  52.         fcos
  53.         fmul    [_d]
  54.         fadd    [eax+Turtle.PosX]
  55.         fstp    [eax+Turtle.PosX]
  56.  
  57.         fld     [eax+Turtle.Orientation]
  58.         fsin
  59.         fmul    [_d]
  60.         fadd    [eax+Turtle.PosY]
  61.         fstp    [eax+Turtle.PosY]
  62.  
  63.         fld     [eax+Turtle.PosX]
  64.         fistp   [.x2]
  65.  
  66.         fld     [eax+Turtle.PosY]
  67.         fistp   [.y2]
  68.  
  69.         mov     ebx, [.x1]
  70.         shl     ebx, 16
  71.         add     ebx, [.x2]
  72.         mov     ecx, [.y1]
  73.         shl     ecx, 16
  74.         add     ecx, [.y2]
  75.         mov     edx, [color]
  76.         mcall   38
  77.         ret
  78. endp
  79.  
  80.  
  81. proc turn _t, _degrees
  82.         mov     eax, [_t]
  83.         fldpi
  84.         fmul    [_degrees]
  85.         fdiv    [float_180]
  86.         fadd    [eax+Turtle.Orientation]
  87.         fstp    [eax+Turtle.Orientation]
  88.         ret
  89. endp
  90.  
  91.  
  92. proc reposition _t, _x, _y
  93.         mov     eax, [_t]
  94.         mov     ecx, [_x]
  95.         mov     [eax+Turtle.PosX], ecx
  96.         mov     ecx, [_y]
  97.         mov     [eax+Turtle.PosY], ecx
  98.         ret
  99. endp
  100.  
  101.  
  102. ; H = 0..360, S = 0..255, V = 0..255  -->  R = 0..255, G = 0..255, B = 0..255
  103. proc hsv_to_rgb uses ebx, _h, _s, _v, _rgb
  104. locals
  105.         .f  dd ?
  106.         .vs dd ?
  107. endl
  108.         mov     ebx, [_rgb]
  109.         cmp     [_s], 0
  110.         jnz     @f
  111.         mov     eax, [_v]
  112.         mov     [ebx+RGB.Red], al
  113.         mov     [ebx+RGB.Green], al
  114.         mov     [ebx+RGB.Blue], al
  115.         jmp     .end
  116.     @@:
  117.         cmp     [_h], 360
  118.         jnz     @f
  119.         mov     [_h], 0
  120.     @@:
  121.         mov     eax, [_v]
  122.         mul     [_s]
  123.         mov     [.vs], eax
  124.         mov     eax, [_h]
  125.         mov     ecx, 60
  126.         xor     edx, edx
  127.         div     ecx
  128.         mov     [.f], edx
  129.  
  130.         test    eax, eax
  131.         jnz     @f
  132.         mov     eax, [_v]
  133.         mov     [ebx+RGB.Red], al
  134.         mov     eax, 60
  135.         sub     eax, [.f]
  136.         mul     [.vs]
  137.         xor     edx, edx
  138.         div     [dword_255_mul_60]
  139.         mov     edx, [_v]
  140.         sub     dl, al
  141.         mov     [ebx+RGB.Green], dl
  142.         mov     eax, [.vs]
  143.         xor     edx, edx
  144.         div     [dword_255]
  145.         mov     edx, [_v]
  146.         sub     dl, al
  147.         mov     [ebx+RGB.Blue], dl
  148.         jmp     .end
  149.     @@:
  150.         cmp     eax, 1
  151.         jnz     @f
  152.         mov     eax, [.vs]
  153.         mul     [.f]
  154.         xor     edx, edx
  155.         div     [dword_255_mul_60]
  156.         mov     edx, [_v]
  157.         sub     dl, al
  158.         mov     [ebx+RGB.Red], dl
  159.         mov     eax, [_v]
  160.         mov     [ebx+RGB.Green], al
  161.         mov     eax, [.vs]
  162.         xor     edx, edx
  163.         div     [dword_255]
  164.         mov     edx, [_v]
  165.         sub     dl, al
  166.         mov     [ebx+RGB.Blue], dl
  167.         jmp     .end
  168.     @@:
  169.         cmp     eax, 2
  170.         jnz     @f
  171.         mov     eax, [.vs]
  172.         xor     edx, edx
  173.         div     [dword_255]
  174.         mov     edx, [_v]
  175.         sub     dl, al
  176.         mov     [ebx+RGB.Red], dl
  177.         mov     eax, [_v]
  178.         mov     [ebx+RGB.Green], al
  179.         mov     eax, 60
  180.         sub     eax, [.f]
  181.         mul     [.vs]
  182.         xor     edx, edx
  183.         div     [dword_255_mul_60]
  184.         mov     edx, [_v]
  185.         sub     dl, al
  186.         mov     [ebx+RGB.Blue], dl
  187.         jmp     .end
  188.     @@:
  189.         cmp     eax, 3
  190.         jnz     @f
  191.         mov     eax, [.vs]
  192.         xor     edx, edx
  193.         div     [dword_255]
  194.         mov     edx, [_v]
  195.         sub     dl, al
  196.         mov     [ebx+RGB.Red], dl
  197.         mov     eax, [.vs]
  198.         mul     [.f]
  199.         xor     edx, edx
  200.         div     [dword_255_mul_60]
  201.         mov     edx, [_v]
  202.         sub     dl, al
  203.         mov     [ebx+RGB.Green], dl
  204.         mov     eax, [_v]
  205.         mov     [ebx+RGB.Blue], al
  206.         jmp     .end
  207.     @@:
  208.         cmp     eax, 4
  209.         jnz     @f
  210.         mov     eax, 60
  211.         sub     eax, [.f]
  212.         mul     [.vs]
  213.         xor     edx, edx
  214.         div     [dword_255_mul_60]
  215.         mov     edx, [_v]
  216.         sub     dl, al
  217.         mov     [ebx+RGB.Red], dl
  218.         mov     eax, [.vs]
  219.         xor     edx, edx
  220.         div     [dword_255]
  221.         mov     edx, [_v]
  222.         sub     dl, al
  223.         mov     [ebx+RGB.Green], dl
  224.         mov     eax, [_v]
  225.         mov     [ebx+RGB.Blue], al
  226.         jmp     .end
  227.     @@:
  228.         cmp     eax, 5
  229.         jnz     @f
  230.         mov     eax, [_v]
  231.         mov     [ebx+RGB.Red], al
  232.         mov     eax, [.vs]
  233.         xor     edx, edx
  234.         div     [dword_255]
  235.         mov     edx, [_v]
  236.         sub     dl, al
  237.         mov     [ebx+RGB.Green], dl
  238.         mov     eax, [.vs]
  239.         mul     [.f]
  240.         xor     edx, edx
  241.         div     [dword_255_mul_60]
  242.         mov     edx, [_v]
  243.         sub     dl, al
  244.         mov     [ebx+RGB.Blue], dl
  245.     @@:
  246.   .end:
  247.         ret
  248. endp
  249.  
  250.  
  251. proc hue_shift _t, _n
  252.         mov     ecx, [_t]
  253.         movzx   eax, [ecx+Turtle.PenColor.Hue]
  254.         add     eax, [_n]
  255.         xor     edx, edx
  256.         div     [dword_360]
  257.         mov     [ecx+Turtle.PenColor.Hue], dx
  258.  
  259.         movzx   eax, [ecx+Turtle.PenColor.Hue]
  260.         movzx   edx, [ecx+Turtle.PenColor.Sat]
  261.         movzx   ecx, [ecx+Turtle.PenColor.Val]
  262.  
  263.         stdcall hsv_to_rgb, eax, edx, ecx, color
  264.         ret
  265. endp
  266.  
  267.  
  268. proc query_perf
  269. locals
  270.         .diff    dd ?
  271. endl
  272.         mcall   26, 9
  273.         sub     eax, [frame_start]
  274.         mov     [.diff], eax
  275.         fild    [.diff]
  276.         fild    [freq]
  277.         fdivrp
  278.         fstp    [instant]
  279.         mcall   26, 9
  280.         mov     [frame_start], eax
  281.         ret
  282. endp
  283.  
  284.  
  285. proc waiting
  286.         fld     [max_frame_rate]
  287.         fld     [instant]
  288.         fcompp
  289.         fstsw   ax
  290.         sahf
  291.         jc      @f
  292.         inc     [sleep_time]
  293.         jmp     .end
  294.     @@:
  295.         fld     [min_frame_rate]
  296.         fld     [instant]
  297.         fcompp
  298.         fstsw   ax
  299.         sahf
  300.         jnc     .end
  301.         cmp     [sleep_time], 0
  302.         jz      .end
  303.         dec     [sleep_time]
  304.   .end:
  305.         mcall   5, [sleep_time]
  306.         ret
  307. endp
  308.  
  309.  
  310. proc drawing
  311. locals
  312.         .i    dd ?
  313.         .n    dd ?
  314.         .posx dd ?
  315.         .posy dd ?
  316. endl
  317.         mov     [turtle.Orientation], 0
  318.         mov     eax, [window_width]
  319.         mov     ecx, [window_height]
  320.         shr     eax, 1
  321.         shr     ecx, 1
  322.         mov     [.posx], eax
  323.         mov     [.posy], ecx
  324.         fild    [.posx]
  325.         fstp    [.posx]
  326.         fild    [.posy]
  327.         fstp    [.posy]
  328.         stdcall reposition, turtle, [.posx], [.posy]
  329.         mov     [.n], 5.0
  330.         mov     eax, [window_height]
  331.         imul    eax, 15
  332.         shr     eax, 4
  333.         mov     ecx, eax
  334.         xor     edx, edx
  335.         div     [dword_360]
  336.         neg     edx
  337.         add     edx, ecx
  338.         sub     edx, 10
  339.         mov     [.i], edx
  340.     @@:
  341.         stdcall hue_shift, turtle, 1
  342.         stdcall forward, turtle, [.n]
  343.         stdcall turn, turtle, 72.5
  344.         fld     [.n]
  345.         fadd    [ndelta]
  346.         fstp    [.n]
  347.         dec     [.i]
  348.         jnz     @b
  349.         ret
  350. endp
  351.  
  352.  
  353. start:
  354.         cmp     dword[params], '@ss'
  355.         setz    [screensaver]
  356.         mov     ebx, EVM_REDRAW + EVM_KEY
  357.         cmovz   ebx, EVM_REDRAW + EVM_KEY + EVM_MOUSE
  358.         mcall   40
  359.  
  360.         mov     edi, transparent_cursor
  361.         xor     eax, eax
  362.         mov     ecx, 32*32
  363.         rep     stosd
  364.         mcall   37, 4, transparent_cursor, 2
  365.         mov     ecx, eax
  366.         mcall   37, 5
  367.  
  368.         mcall   14
  369.         add     eax, 0x00010001
  370.         movzx   ecx, ax
  371.         shr     eax, 16
  372.         mov     [window_width], eax
  373.         mov     [window_height], ecx
  374.         mcall   26, 9
  375.         mov     [frame_start], eax
  376.   .still:
  377.         mcall   11
  378.         dec     eax
  379.         js      .draw_spiral    ; no event
  380.         jnz     .quit
  381.         mcall   12, 1
  382.         mcall   0, [window_width], [window_height], 0, 0x01000000
  383.         mcall   12, 2
  384.   .draw_spiral:
  385.         cmp     [screensaver], 0
  386.         jz      @f
  387.         mcall   9, proc_info, -1
  388.         cmp     [proc_info.window_stack_position], ax
  389.         jnz     .quit
  390.     @@:
  391.         stdcall query_perf
  392.         stdcall drawing
  393.         stdcall waiting
  394.         jmp     .still
  395.   .quit:
  396.         cmp     [screensaver], 0
  397.         jz      @f
  398.         mcall   70, f70
  399.     @@:
  400.         mcall   -1
  401.  
  402.  
  403. align 4
  404. dword_255_mul_60 dd 255 * 60
  405. dword_255        dd 255
  406. dword_360        dd 360
  407. float_180        dd 180.0
  408. ndelta           dd 0.6  ; used in drawing Proc: n = n + ndelta
  409. max_frame_rate   dd 15.0 ; to keep the FrameRate
  410. min_frame_rate   dd 8.0  ; around min_frame_rate..max_frame_rate FPS
  411.  
  412. freq       dd 100  ; GetTickCount return count of 1/100s of second
  413. instant    dd 0.0
  414. sleep_time dd 0
  415.  
  416. turtle Turtle 0.0, 0.0, 0.0, <180, 255, 255>
  417.  
  418. f70:    ; run
  419.         dd 7, 0, 0, 0, 0
  420.         db '/sys/@ss',0
  421. i_end:
  422.  
  423. align 4
  424. window_width  dd ?
  425. window_height dd ?
  426. frame_start   dd ?
  427. color         dd ?
  428.  
  429. proc_info process_information
  430. params rb 0x400
  431. transparent_cursor rd 32*32
  432. screensaver db ?
  433. align 4
  434. rb 0x200
  435. e_end:
  436.