Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; Newton fractal demo
  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. WS_DRAW_NOTHING        = 0x0100_0000
  17. WS_SKINNED_FIXED       = 0x0400_0000
  18. WS_BACKGROUND_NOREDRAW = 0x4000_0000
  19. WS_COORD_CLIENT        = 0x2000_0000
  20. WS_CAPTION             = 0x1000_0000
  21.  
  22. CS_MOVABLE        = 0
  23.  
  24. WINDOW_STATE_ROLLED_UP = 4
  25.  
  26. WINDOW_BORDER_SIZE = 5
  27.  
  28. ;COUNT = 16
  29. COUNT = 100
  30.  
  31. struct TSize
  32.   SizeY dw ?
  33.   SizeX dw ?
  34. ends
  35.  
  36. struct TBox
  37.   X     dd ?
  38.   Y     dd ?
  39.   SizeX dd ?
  40.   SizeY dd ?
  41. ends
  42.  
  43. struct Complex
  44.   X dd ?
  45.   Y dd ?
  46. ends
  47.  
  48.  
  49. proc get_newton_fractal uses ebx edi, _width, _height
  50. locals
  51.         Pow2_Z_X dd ?
  52.         Pow2_D_X dd ?
  53.         Pow2_T_Y dd ?
  54.         Pow2_T_X dd ?
  55.         P        dd ?
  56.         N        dd ?
  57.         YMax     dd ?
  58.         XMax     dd ?
  59.         Y        dd ?
  60.         X        dd ?
  61.         D        Complex
  62.         T        Complex
  63.         Z        Complex
  64.         Buf      dd ?
  65.         ImgH     dd ?
  66.         ImgW     dd ?
  67. endl
  68.         mov     eax, [_width]
  69.         mov     [ImgW], eax
  70.         shr     eax, 1
  71.         mov     [XMax], eax
  72.  
  73.         mov     eax, [_height]
  74.         mov     [ImgH], eax
  75.         shr     eax, 1
  76.         mov     [YMax], eax
  77.  
  78.         mov     eax, [ImgH]
  79.         dec     eax
  80.         imul    eax, [ImgW]
  81.         mov     [line_shift], eax
  82.  
  83.         ; allocate buffer for image
  84.         mov     ecx, [ImgW]
  85.         imul    ecx, [ImgH]
  86.         mcall   68, 12,
  87.         mov     [Buf], eax
  88.  
  89.         mov     edi, [Buf]
  90.         mov     eax, [YMax]
  91.         neg     eax
  92.         mov     [Y], eax
  93. .next_line:
  94.         mov     eax, [XMax]
  95.         neg     eax
  96.         mov     [X], eax
  97. .next_pixel:
  98.         mov     [N], 0
  99.         fild    [X]
  100.         fdiv    [Float_250]
  101.         fstp    [Z.X]
  102.         fild    [Y]
  103.         fdiv    [Float_250]
  104.         fstp    [Z.Y]
  105.         mov     eax, [Z.X]
  106.         mov     ecx, [Z.Y]
  107.         mov     [D.X], eax
  108.         mov     [D.Y], ecx
  109. @@:
  110.         fld     [Z.X]
  111.         fmul    st0, st0
  112.         fstp    [Pow2_Z_X]
  113.         fld     [Z.Y]
  114.         fmul    st0, st0
  115.         fadd    [Pow2_Z_X]
  116.         fcomp   [Max]
  117.         fnstsw  ax
  118. ;.Break .If !(ah & 1)   ; >= Max
  119.         test    ah, 1
  120.         jz      @f
  121.         fld     [D.X]
  122.         fmul    st0, st0
  123.         fstp    [Pow2_D_X]
  124.         fld     [D.Y]
  125.         fmul    st0, st0
  126.         fadd    [Pow2_D_X]
  127.         fcomp   [Min]
  128.         fnstsw  ax
  129. ;.Break .If ah & 1      ; <= Min
  130.         test    ah, 1
  131.         jnz     @f
  132.         mov     eax, [Z.X]
  133.         mov     ecx, [Z.Y]
  134.         mov     [T.X], eax
  135.         mov     [T.Y], ecx
  136.  
  137.         fld     [T.X]
  138.         fmul    st0, st0        ; Pow2_T_X = T.X * T.X
  139.         fstp    [Pow2_T_X]
  140.  
  141.         fld     [T.Y]
  142.         fmul    st0, st0
  143.         fst     [Pow2_T_Y]      ; Pow2_T_Y = T.Y * T.Y
  144.         fadd    [Pow2_T_X]
  145.         fmul    st0, st0
  146.         fstp    [P]             ; P = (Pow2_T_X + Pow2_T_Y) * (Pow2_T_X + Pow2_T_Y)
  147.  
  148.         fld     [Pow2_T_X]
  149.         fsub    [Pow2_T_Y]
  150.         fld     [Float_3]
  151.         fmul    [P]
  152.         fxch    st1
  153.         fdivrp                  ; Z.X = (Pow2_T_X - Pow2_T_Y) / (3 * P) + 2 * T.X / 3
  154.         fld     [Float_2]
  155.         fmul    [T.X]
  156.         fdiv    [Float_3]
  157.         fxch    st1
  158.         faddp
  159.         fstp    [Z.X]
  160.  
  161.         fld     [P]
  162.         fsub    [T.X]
  163.         fdiv    [P]
  164.         fmul    [T.Y]           ; Z.Y = (P - T.X) / P * 2 * T.Y / 3
  165.         fmul    [Float_2]
  166.         fdiv    [Float_3]
  167.         fstp    [Z.Y]
  168.  
  169.         fld     [T.X]
  170.         fsub    [Z.X]
  171.         fabs
  172.         fstp    [D.X]
  173.  
  174.         fld     [T.Y]
  175.         fsub    [Z.Y]
  176.         fabs
  177.         fstp    [D.Y]
  178.  
  179.         inc     [N]
  180.         cmp     [N], COUNT
  181.         jbe     @b
  182. @@:
  183.         mov     eax, [N]
  184.         mov     ecx, palette_colors
  185.         xor     edx, edx
  186.         div     ecx
  187.  
  188.         ; Set next pixel
  189.         mov     [edi], dl
  190.         mov     eax, [line_shift]
  191.         mov     [edi+eax], dl
  192.         inc     edi
  193.         mov     eax, [X]
  194.         inc     eax
  195.         mov     [X], eax
  196.         cmp     eax, [XMax]
  197.         jnz     .next_pixel
  198.  
  199.         mov     eax, [ImgW]
  200.         add     eax, eax
  201.         sub     [line_shift], eax
  202.         mov     eax, [Y]
  203.         inc     eax
  204.         mov     [Y], eax
  205.         cmp     eax, 0
  206.         jle     .next_line
  207. .done:
  208.         mov     eax, [Buf]
  209.         ret
  210. endp
  211.  
  212.  
  213. start:
  214.         mcall   68, 11
  215.         cmp     dword[params], '@ss'
  216.         setz    [screensaver]
  217.         jnz     .windowed
  218.         ; fullscreen
  219.         mcall   14
  220.         movzx   ecx, ax
  221.         shr     eax, 16
  222.         mov     [Window.SizeX], eax
  223.         mov     [Window.SizeY], ecx
  224.         xor     [window_style], WS_SKINNED_FIXED + WS_DRAW_NOTHING
  225.         mov     [window_border_size], 0
  226.         mov     [skin_height], 0
  227.  
  228.         mov     edi, transparent_cursor
  229.         xor     eax, eax
  230.         mov     ecx, 32*32
  231.         rep     stosd
  232.         mcall   37, 4, transparent_cursor, 2
  233.         mov     ecx, eax
  234.         mcall   37, 5
  235.  
  236.         mov     ebx, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE
  237.         jmp     .common
  238. .windowed:
  239.         mcall   48, 4
  240.         mov     [skin_height], eax
  241.         bt      eax, 0
  242.         sbb     [Window.SizeY], 0
  243.         mcall   14
  244.         movzx   ecx, ax
  245.         shr     eax, 16
  246.         sub     eax, [Window.SizeX]
  247.         sub     ecx, [Window.SizeY]
  248.         shr     eax, 1
  249.         shr     ecx, 1
  250.         mov     [Window.X], eax
  251.         mov     [Window.Y], ecx
  252.  
  253.         mov     ebx, EVM_REDRAW + EVM_KEY + EVM_BUTTON
  254. .common:
  255.         mcall   40
  256.  
  257.         mov     ebx, [Window.SizeX]
  258.         inc     ebx
  259.         sub     ebx, [window_border_size]
  260.         sub     ebx, [window_border_size]
  261.         mov     ecx, [Window.SizeY]
  262.         inc     ecx
  263.         sub     ecx, [skin_height]
  264.         sub     ecx, [window_border_size]
  265.         stdcall get_newton_fractal, ebx, ecx
  266.         mov     [image], eax
  267.  
  268. .still:
  269. ;        mcall   11
  270. ;        dec     eax
  271. ;        jz      .redraw
  272. ;        jns     .exit
  273. ;        mcall   5, 10
  274.         mcall   10
  275.         dec     eax
  276.         jnz     .exit
  277. .redraw:
  278.         mcall   12, 1
  279.         mcall   0, <[Window.X],[Window.SizeX]>, <[Window.Y],[Window.SizeY]>, [window_style], 0, window_title
  280.         mcall   9, proc_info, -1
  281.         test    [proc_info.wnd_state], WINDOW_STATE_ROLLED_UP
  282.         jnz     .no_draw
  283.         inc     [proc_info.client_box.width]
  284.         inc     [proc_info.client_box.height]
  285.         mcall   65, [image], <[proc_info.client_box.width],[proc_info.client_box.height]>, 0, 8, palette, 0
  286. ;        call    rotate_palette
  287. .no_draw:
  288.         mcall   12, 2
  289.         jmp     .still
  290. .exit:
  291.         mcall   -1
  292.  
  293.  
  294. proc rotate_palette
  295.         mov     esi, palette
  296.         mov     edi, esi
  297.         mov     ecx, palette_colors
  298. .next_color:
  299.         mov     ebx, 2
  300.         lodsd
  301. .next_channel:
  302.         cmp     [palette_rotate_direction+ebx], 1
  303.         jnz     .down
  304. .up:
  305.         add     al, 1
  306.         jnc     .ok
  307.         btc     word[palette_rotate_direction+ebx], 0
  308.         sub     al, 1
  309. .down:
  310.         sub     al, 1
  311.         jnc     .ok
  312.         btc     word[palette_rotate_direction+ebx], 0
  313.         add     al, 2
  314. .ok:
  315.         ror     eax, 8
  316.         dec     ebx
  317.         jns     .next_channel
  318.         ror     eax, 8
  319.         stosd
  320.         dec     ecx
  321.         jnz     .next_color
  322.         ret
  323. endp
  324.  
  325. palette:
  326.         dd 0x00C5037D, 0x006D398B, 0x00454E99, 0x002A71AF, \
  327.            0x000696BB, 0x00008F5A, 0x008DBB25, 0x00F3E500, \
  328.            0x00FCC609, 0x00F28E1C, 0x00E96220, 0x00E32322
  329. palette_colors = ($-palette)/4
  330.  
  331. ;        dd 0x00C21460, 0x008601AF, 0x004424D6, 0x000247FE, \
  332. ;           0x00347C98, 0x0066B032, 0x00B2D732, 0x00FEFE33, \
  333. ;           0x00FCCC1A, 0x00FB9902, 0x00FC600A, 0x00FE2712
  334.  
  335. ;        dd 0x00C21460, 0x008601AF, 0x004424D6, 0x00347C98, \
  336. ;           0x0066B032, 0x00B2D732, 0x00FCCC1A, 0x00FB9902, \
  337. ;           0x00FC600A
  338.  
  339. ;        dd 0x00C21460, 0x004424D6, 0x00347C98, 0x0066B032, \
  340. ;           0x00B2D732, 0x00FEFE33, 0x00FCCC1A, 0x00FC600A, \
  341. ;           0x00FE2712
  342.  
  343. ;        dd 0x00FE2712, 0x00FC600A, 0x00FCCC1A, 0x00FEFE33, \
  344. ;           0x00B2D732, 0x0066B032, 0x00347C98, 0x004424D6, \
  345. ;           0x00C21460
  346.  
  347. ;        dd 0x00347C98, 0x004424D6, 0x00C21460, 0x00FE2712, \
  348. ;           0x00FC600A, 0x00FCCC1A, 0x00FEFE33, 0x00B2D732, \
  349. ;           0x0066B032
  350.  
  351. Float_250 dd 250.0
  352. Float_3   dd 3.0
  353. Float_2   dd 2.0
  354.  
  355. ;Max dd 10000.0
  356. ;Min dd 0.0001
  357. Max dd 10000000.0
  358. Min dd 0.0000001
  359.  
  360. Window TBox 0, 0, 320*3+1, 240*3+1
  361. window_style dd WS_SKINNED_FIXED + WS_COORD_CLIENT + WS_CAPTION + \
  362.                 WS_BACKGROUND_NOREDRAW
  363. window_border_size dd WINDOW_BORDER_SIZE
  364. image dd 0
  365. line_shift dd 0
  366. ;palette_rotate_direction db 1, 0, 1, 0
  367. window_title db "Newton fractal",0
  368.  
  369. i_end:
  370. align 4
  371. proc_info process_information
  372.  
  373. transparent_cursor rd 32*32
  374. skin_height dd ?
  375. screensaver db ?
  376. params rb 0x400
  377. align 4
  378. rb 0x200
  379. e_end:
  380.