; GUI #
include win64a.inc
RGBQUAD STRUCT
rgbBlue BYTE ?
rgbGreen BYTE ?
rgbRed BYTE ?
rgbReserved BYTE ?
RGBQUAD ENDS
BITMAPINFO STRUCT
bmiHeader BITMAPINFOHEADER <>
bmiColors RGBQUAD <>
BITMAPINFO ENDS
cdXPos equ 131
cdYPos equ 217
cdYSize equ 430
cdXSize equ 640
.data
ClassName db 'Fir Tree Fractal',0
bi BITMAPINFO <<28h,640,-430,1,32,0,0,0,0,0,0>>
bufDIBDC dq ?
pMainDIB dq ?
const1 dq 1.0
const40 dq 40.0
const320 dq 320.0
const365 dq 365.0
.code
WinMain proc
local msg:MSG
xor ebx,ebx
mov esi,IMAGE_BASE
mov edi,offset ClassName
push rbx ;hIconSm
push rdi ;lpszClassName
push rbx ;lpszMenuName
push COLOR_WINDOWTEXT; hbrBackground
push rbx ;hCursor
push rbx ;hIcon
push rsi ;hInstance
push rbx ;cbClsExtra & cbWndExtra
pushaddr WndProc ;lpfnWndProc
push sizeof WNDCLASSEX ;cbSize & style
invoke RegisterClassExA,esp
push rbx
push rsi ;rsi=400000h
push rbx
push rbx
push cdYSize
push cdXSize
push cdYPos
push cdXPos
sub esp,20h
invoke CreateWindowExA,0,edi,edi,WS_VISIBLE
lea edi,msg
@@: invoke GetMessageA,edi,0,0,0
cmp [rdi].MSG.wParam,VK_ESCAPE;user press 'Esc'?
je wmDESTROY
invoke DispatchMessageA,edi
jmp @b
WinMain endp
WndProc proc hWnd:QWORD,Msg:QWORD,wParam:QWORD,lParam:QWORD
local ps:PAINTSTRUCT
local hdc:qword
local hOldBmp:qword
local hGDITmp:qword
local hOldDIB:qword
local hBackDC:qword
local hMainDIB:qword
local bufBMP:qword
local i:dword
local a:dword
local b:dword
local c:dword
local d:dword
local f:dword
local NewX:qword
local NewY:qword
local XCC:qword
local YCC:qword
mov hWnd,rcx
cmp edx, WM_DESTROY
jz wmDESTROY
cmp edx, WM_PAINT
jz wmPAINT
cmp edx, WM_CREATE
jz wmCREATE
leave
jmp NtdllDefWindowProc_
; ---------------------------------------------------------------------------
wmDESTROY::invoke SelectObject,hBackDC,hOldBmp
mov hGDITmp,rax
invoke DeleteObject,bufBMP
invoke DeleteDC,hBackDC
invoke SelectObject,bufDIBDC,hOldDIB
mov hGDITmp,rax
invoke DeleteDC,bufDIBDC
invoke DeleteObject,hMainDIB
invoke DestroyWindow,hWnd
invoke RtlExitUserProcess,NULL
; ---------------------------------------------------------------------------
wmPAINT:lea edx,ps
invoke BeginPaint
mov hdc,rax
mov qword ptr[rsp+40h],SRCCOPY; rop
xor edx,edx ; x
mov [rsp+38h],rdx ; y1
mov [rsp+30h],rdx ; x1
mov rax,bufDIBDC ; hdcSrc
mov [rsp+28h],rax
mov qword ptr[rsp+20h],cdYSize
invoke BitBlt,hdc,,0,cdXSize
lea edx,ps
invoke EndPaint,hWnd
jmp wmBYE
; ---------------------------------------------------------------------------
wmCREATE:invoke GetDC
mov hdc,rax
invoke CreateCompatibleDC,eax
mov bufDIBDC,rax
mov [rsp+28h],rbx
mov [rsp+20h],rbx
mov r9d,offset pMainDIB
mov edx,offset bi
invoke CreateDIBSection,hdc,,DIB_RGB_COLORS
mov hMainDIB,rax
invoke SelectObject,bufDIBDC,eax
mov rax,hOldDIB
invoke ReleaseDC,hWnd,hdc
;Init--------------------------------------------------------
; a b c d e f p
; 0.1000 0.0000 0.0000 0.1600 0.0 0.0 0.01*10000= 100
; 0.8500 0.0000 0.0000 0.8500 0.0 1.6 0.85*10000=8500
;-0.1667 -0.2887 0.2887 -0.1667 0.0 1.6 0.07*10000= 700
;-0.1667 0.2887 -0.2887 -0.1667 0.0 1.6 0.07*10000= 700
mov XCC,rbx
mov YCC,rbx
mov i,60000
bucle: invoke rand
mov ecx,10000
cdq
idiv ecx
cmp edx,100 ;p1
ja @f
movr a,0.1;a = 0.1
mov b,ebx; b = 0
mov c,ebx; c = 0
movr d,0.16
mov f,ebx; f = 0
jmp fin
@@: cmp edx,800 ;p1+p4=100+700=800
ja @f
movr a,-0.1667
movr b, 0.2887
movr c,-0.2887
movr d,-0.1667
movr f,1.6
jmp fin
@@: cmp edx,1500 ;p1+p4+p3=800+700=1500
ja @f
movr a,-0.1667
movr b,-0.2887
movr c,0.2887
movr d,-0.1667
movr f,1.6
jmp fin
@@: movr a,0.8500
mov b,ebx
mov c,ebx
movr d,0.85
movr f,1.60 ; f = 1.60
fin: cvtss2sd xmm0,a ;xmm0 = a
mulsd xmm0,XCC ;xmm0 = a * XCC
cvtss2sd xmm1,b ;xmm1 = b
mulsd xmm1,YCC ;xmm1 = b * YCC
addsd xmm0,xmm1 ;xmm0 = a * XCC + b * YCC
movq NewX,xmm0 ;NewX = a * XCC + b * YCC
mulsd xmm0,const40 ;xmm0 = NewX * 40
cvtss2sd xmm1,c ;xmm1 = c
mulsd xmm1,XCC ;xmm1 = c * XCC
cvtss2sd xmm2,d ;xmm2 = d
mulsd xmm2,YCC ;xmm2 = d * YCC
addsd xmm1,xmm2 ;xmm1 = c * XCC + d * YCC
cvtss2sd xmm2,f
addsd xmm1,xmm2 ;xmm1 = c * XCC + d * YCC + f
movq NewY,xmm1 ;NewY = c * XCC + d * YCC + f
movq YCC,xmm1 ;YCC = NewY
addsd xmm0,const320;xmm0 = NewX * 40 + cdXSize/2
cvtsd2si ecx,xmm0 ;x = (int) (NewX*40+cdXSize/2)
cmp ecx,cdXSize
jae @f
movq xmm0,const1 ;xmm0 = 1
subsd xmm0,NewY ;xmm0 = 1 - NewY
mulsd xmm0,const40 ;xmm0 = (1 - NewY)*40
addsd xmm0,const365;xmm0 = (1 - NewY)*40 + cdYSize - 35
cvtsd2si eax,xmm0; y = (int) ((1-NewY)*40+cdYSize-35)
cmp eax,cdYSize
jae @f
imul eax,2560
add rax,pMainDIB
mov dword ptr [rax+rcx*4],0FF00h ;*(pMainDIB + (y<<9)+(y<<7)+x) = Green color;
@@: movsd xmm0,NewX ;XCC = NewX
movd XCC,xmm0
dec i
jnz bucle
wmBYE: leave
retn
WndProc endp
end