0,0 → 1,379 |
; |
; Newton fractal demo |
; |
; 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' |
|
WS_DRAW_NOTHING = 0x0100_0000 |
WS_SKINNED_FIXED = 0x0400_0000 |
WS_BACKGROUND_NOREDRAW = 0x4000_0000 |
WS_COORD_CLIENT = 0x2000_0000 |
WS_CAPTION = 0x1000_0000 |
|
CS_MOVABLE = 0 |
|
WINDOW_STATE_ROLLED_UP = 4 |
|
WINDOW_BORDER_SIZE = 5 |
|
;COUNT = 16 |
COUNT = 100 |
|
struct TSize |
SizeY dw ? |
SizeX dw ? |
ends |
|
struct TBox |
X dd ? |
Y dd ? |
SizeX dd ? |
SizeY dd ? |
ends |
|
struct Complex |
X dd ? |
Y dd ? |
ends |
|
|
proc get_newton_fractal uses ebx edi, _width, _height |
locals |
Pow2_Z_X dd ? |
Pow2_D_X dd ? |
Pow2_T_Y dd ? |
Pow2_T_X dd ? |
P dd ? |
N dd ? |
YMax dd ? |
XMax dd ? |
Y dd ? |
X dd ? |
D Complex |
T Complex |
Z Complex |
Buf dd ? |
ImgH dd ? |
ImgW dd ? |
endl |
mov eax, [_width] |
mov [ImgW], eax |
shr eax, 1 |
mov [XMax], eax |
|
mov eax, [_height] |
mov [ImgH], eax |
shr eax, 1 |
mov [YMax], eax |
|
mov eax, [ImgH] |
dec eax |
imul eax, [ImgW] |
mov [line_shift], eax |
|
; allocate buffer for image |
mov ecx, [ImgW] |
imul ecx, [ImgH] |
mcall 68, 12, |
mov [Buf], eax |
|
mov edi, [Buf] |
mov eax, [YMax] |
neg eax |
mov [Y], eax |
.next_line: |
mov eax, [XMax] |
neg eax |
mov [X], eax |
.next_pixel: |
mov [N], 0 |
fild [X] |
fdiv [Float_250] |
fstp [Z.X] |
fild [Y] |
fdiv [Float_250] |
fstp [Z.Y] |
mov eax, [Z.X] |
mov ecx, [Z.Y] |
mov [D.X], eax |
mov [D.Y], ecx |
@@: |
fld [Z.X] |
fmul st0, st0 |
fstp [Pow2_Z_X] |
fld [Z.Y] |
fmul st0, st0 |
fadd [Pow2_Z_X] |
fcomp [Max] |
fnstsw ax |
;.Break .If !(ah & 1) ; >= Max |
test ah, 1 |
jz @f |
fld [D.X] |
fmul st0, st0 |
fstp [Pow2_D_X] |
fld [D.Y] |
fmul st0, st0 |
fadd [Pow2_D_X] |
fcomp [Min] |
fnstsw ax |
;.Break .If ah & 1 ; <= Min |
test ah, 1 |
jnz @f |
mov eax, [Z.X] |
mov ecx, [Z.Y] |
mov [T.X], eax |
mov [T.Y], ecx |
|
fld [T.X] |
fmul st0, st0 ; Pow2_T_X = T.X * T.X |
fstp [Pow2_T_X] |
|
fld [T.Y] |
fmul st0, st0 |
fst [Pow2_T_Y] ; Pow2_T_Y = T.Y * T.Y |
fadd [Pow2_T_X] |
fmul st0, st0 |
fstp [P] ; P = (Pow2_T_X + Pow2_T_Y) * (Pow2_T_X + Pow2_T_Y) |
|
fld [Pow2_T_X] |
fsub [Pow2_T_Y] |
fld [Float_3] |
fmul [P] |
fxch st1 |
fdivrp ; Z.X = (Pow2_T_X - Pow2_T_Y) / (3 * P) + 2 * T.X / 3 |
fld [Float_2] |
fmul [T.X] |
fdiv [Float_3] |
fxch st1 |
faddp |
fstp [Z.X] |
|
fld [P] |
fsub [T.X] |
fdiv [P] |
fmul [T.Y] ; Z.Y = (P - T.X) / P * 2 * T.Y / 3 |
fmul [Float_2] |
fdiv [Float_3] |
fstp [Z.Y] |
|
fld [T.X] |
fsub [Z.X] |
fabs |
fstp [D.X] |
|
fld [T.Y] |
fsub [Z.Y] |
fabs |
fstp [D.Y] |
|
inc [N] |
cmp [N], COUNT |
jbe @b |
@@: |
mov eax, [N] |
mov ecx, palette_colors |
xor edx, edx |
div ecx |
|
; Set next pixel |
mov [edi], dl |
mov eax, [line_shift] |
mov [edi+eax], dl |
inc edi |
mov eax, [X] |
inc eax |
mov [X], eax |
cmp eax, [XMax] |
jnz .next_pixel |
|
mov eax, [ImgW] |
add eax, eax |
sub [line_shift], eax |
mov eax, [Y] |
inc eax |
mov [Y], eax |
cmp eax, 0 |
jle .next_line |
.done: |
mov eax, [Buf] |
ret |
endp |
|
|
start: |
mcall 68, 11 |
cmp dword[params], '@ss' |
setz [screensaver] |
jnz .windowed |
; fullscreen |
mcall 14 |
movzx ecx, ax |
shr eax, 16 |
mov [Window.SizeX], eax |
mov [Window.SizeY], ecx |
xor [window_style], WS_SKINNED_FIXED + WS_DRAW_NOTHING |
mov [window_border_size], 0 |
mov [skin_height], 0 |
|
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 |
|
mov ebx, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE |
jmp .common |
.windowed: |
mcall 48, 4 |
mov [skin_height], eax |
bt eax, 0 |
sbb [Window.SizeY], 0 |
mcall 14 |
movzx ecx, ax |
shr eax, 16 |
sub eax, [Window.SizeX] |
sub ecx, [Window.SizeY] |
shr eax, 1 |
shr ecx, 1 |
mov [Window.X], eax |
mov [Window.Y], ecx |
|
mov ebx, EVM_REDRAW + EVM_KEY + EVM_BUTTON |
.common: |
mcall 40 |
|
mov ebx, [Window.SizeX] |
inc ebx |
sub ebx, [window_border_size] |
sub ebx, [window_border_size] |
mov ecx, [Window.SizeY] |
inc ecx |
sub ecx, [skin_height] |
sub ecx, [window_border_size] |
stdcall get_newton_fractal, ebx, ecx |
mov [image], eax |
|
.still: |
; mcall 11 |
; dec eax |
; jz .redraw |
; jns .exit |
; mcall 5, 10 |
mcall 10 |
dec eax |
jnz .exit |
.redraw: |
mcall 12, 1 |
mcall 0, <[Window.X],[Window.SizeX]>, <[Window.Y],[Window.SizeY]>, [window_style], 0, window_title |
mcall 9, proc_info, -1 |
test [proc_info.wnd_state], WINDOW_STATE_ROLLED_UP |
jnz .no_draw |
inc [proc_info.client_box.width] |
inc [proc_info.client_box.height] |
mcall 65, [image], <[proc_info.client_box.width],[proc_info.client_box.height]>, 0, 8, palette, 0 |
; call rotate_palette |
.no_draw: |
mcall 12, 2 |
jmp .still |
.exit: |
mcall -1 |
|
|
proc rotate_palette |
mov esi, palette |
mov edi, esi |
mov ecx, palette_colors |
.next_color: |
mov ebx, 2 |
lodsd |
.next_channel: |
cmp [palette_rotate_direction+ebx], 1 |
jnz .down |
.up: |
add al, 1 |
jnc .ok |
btc word[palette_rotate_direction+ebx], 0 |
sub al, 1 |
.down: |
sub al, 1 |
jnc .ok |
btc word[palette_rotate_direction+ebx], 0 |
add al, 2 |
.ok: |
ror eax, 8 |
dec ebx |
jns .next_channel |
ror eax, 8 |
stosd |
dec ecx |
jnz .next_color |
ret |
endp |
|
palette: |
dd 0x00C5037D, 0x006D398B, 0x00454E99, 0x002A71AF, \ |
0x000696BB, 0x00008F5A, 0x008DBB25, 0x00F3E500, \ |
0x00FCC609, 0x00F28E1C, 0x00E96220, 0x00E32322 |
palette_colors = ($-palette)/4 |
|
; dd 0x00C21460, 0x008601AF, 0x004424D6, 0x000247FE, \ |
; 0x00347C98, 0x0066B032, 0x00B2D732, 0x00FEFE33, \ |
; 0x00FCCC1A, 0x00FB9902, 0x00FC600A, 0x00FE2712 |
|
; dd 0x00C21460, 0x008601AF, 0x004424D6, 0x00347C98, \ |
; 0x0066B032, 0x00B2D732, 0x00FCCC1A, 0x00FB9902, \ |
; 0x00FC600A |
|
; dd 0x00C21460, 0x004424D6, 0x00347C98, 0x0066B032, \ |
; 0x00B2D732, 0x00FEFE33, 0x00FCCC1A, 0x00FC600A, \ |
; 0x00FE2712 |
|
; dd 0x00FE2712, 0x00FC600A, 0x00FCCC1A, 0x00FEFE33, \ |
; 0x00B2D732, 0x0066B032, 0x00347C98, 0x004424D6, \ |
; 0x00C21460 |
|
; dd 0x00347C98, 0x004424D6, 0x00C21460, 0x00FE2712, \ |
; 0x00FC600A, 0x00FCCC1A, 0x00FEFE33, 0x00B2D732, \ |
; 0x0066B032 |
|
Float_250 dd 250.0 |
Float_3 dd 3.0 |
Float_2 dd 2.0 |
|
;Max dd 10000.0 |
;Min dd 0.0001 |
Max dd 10000000.0 |
Min dd 0.0000001 |
|
Window TBox 0, 0, 320*3+1, 240*3+1 |
window_style dd WS_SKINNED_FIXED + WS_COORD_CLIENT + WS_CAPTION + \ |
WS_BACKGROUND_NOREDRAW |
window_border_size dd WINDOW_BORDER_SIZE |
image dd 0 |
line_shift dd 0 |
;palette_rotate_direction db 1, 0, 1, 0 |
window_title db "Newton fractal",0 |
|
i_end: |
align 4 |
proc_info process_information |
|
transparent_cursor rd 32*32 |
skin_height dd ? |
screensaver db ? |
params rb 0x400 |
align 4 |
rb 0x200 |
e_end: |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |