Hola Alfonso!
Fractal Tree
asm-file; masm windows gui #
.686
.model flat
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
includelib msvcrt.lib
include windows.inc
extern _imp__BeginPaint@8:dword
extern _imp__BitBlt@36:dword
extern _imp__CreateWindowExA@48:dword
extern _imp__CreateCompatibleDC@4:dword
extern _imp__CreateDIBSection@24:dword
extern _imp__DefWindowProcA@16:dword
extern _imp__DispatchMessageA@4:dword
extern _imp__DeleteObject@4:dword
extern _imp__DeleteDC@4:dword
extern _imp__DestroyWindow@4:dword
extern _imp__EndPaint@8:dword
extern _imp__ExitProcess@4:dword
extern _imp__GetDC@4:dword
extern _imp__GetMessageA@16:dword
extern _imp__GetTickCount@0:dword
extern _imp__rand:dword
extern _imp__RegisterClassA@4:dword
extern _imp__ReleaseDC@8:dword
extern _imp__SelectObject@8:dword
cdXPos equ 131
cdYPos equ 217
cdYSize equ 400
cdXSize equ 640 ;cdYSize*1.6
c1 equ 27
c2 equ 6
c3 equ 3
stPaleta struct
Azul db ?
Verde db ?
Rojo db ?
Alfa db ?
stPaleta ends
.code
start: xor ebx,ebx
mov edi,offset wTitle
mov esi,400000h
push edi
push ebx
push BLACK_PEN
push 10011h
push ebx
push esi
push ebx
push ebx
push offset WndProc
push ebx
push esp
call _imp__RegisterClassA@4
push ebx
push esi
push ebx
push ebx
push cdYSize
push cdXSize
push cdYPos
push cdXPos
push WS_OVERLAPPEDWINDOW + WS_VISIBLE
push edi; szWinTitle
push edi; lpszClassName
push ebx
call _imp__CreateWindowExA@48
mov ebp,esp
message_loop: push ebx
push ebx
push ebx
push ebp
call _imp__GetMessageA@16
cmp [ebp+MSG.wParam],1Bh;press "Esc"?
jz wmDESTROY
push ebp
call _imp__DispatchMessageA@4 ;return control to Windows
jmp short message_loop
WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
local ps:PAINTSTRUCT
local hdc:dword
local hOldBmp:dword
local hGDITmp:dword
local hOldDIB:dword
local hBackDC:dword
local hMainDIB:dword
local bufBMP:dword
mov eax,uMsg
dec eax;cmp eax,WM_CREATE
jz wmCREATE
dec eax;cmp eax,WM_DESTROY
jz wmDESTROY
sub eax,WM_PAINT-WM_DESTROY
jz wmPAINT
leave
jmp _imp__DefWindowProcA@16
wmDESTROY::push hOldBmp
push hBackDC
call _imp__SelectObject@8
mov hGDITmp, eax
push bufBMP
call _imp__DeleteObject@4
push hBackDC
call _imp__DeleteDC@4
push hOldDIB
push bufDIBDC
call _imp__SelectObject@8
mov hGDITmp,eax
push bufDIBDC
call _imp__DeleteDC@4
push hMainDIB
call _imp__DeleteObject@4
push hWnd
call _imp__DestroyWindow@4
push ebx ; nExitCode
call _imp__ExitProcess@4
wmCREATE:push hWnd
call _imp__GetDC@4
mov hdc, eax
push eax ; HDC
call _imp__CreateCompatibleDC@4
mov bufDIBDC,eax
push ebx
push ebx
push offset pMainDIB
push ebx;DIB_RGB_COLORS
push offset bi
push hdc
call _imp__CreateDIBSection@24
mov hMainDIB,eax
push eax; hMainDIB
push bufDIBDC
call _imp__SelectObject@8
mov eax,hOldDIB
push hdc
push hWnd
call _imp__ReleaseDC@8; // Libera device context
;Initialization
;Create Paleta---------------------------------
; Verde normal
mov miPaleta[2*4].Azul,23h
mov miPaleta[2*4].Verde,0ADh
mov miPaleta[2*4].Rojo,30h
; Marrуn
mov miPaleta[6*4].Azul,0Bh
mov miPaleta[6*4].Verde,1Dh
mov miPaleta[6*4].Rojo,3Fh
; Verde oscuro
mov miPaleta[8*4].Azul,2Dh
mov miPaleta[8*4].Verde,77h
mov miPaleta[8*4].Rojo,11h
; Verde claro
mov miPaleta[10*4].Azul,88h
mov miPaleta[10*4].Verde,0FFh
mov miPaleta[10*4].Rojo,9Ch
;------------------------------------------------
push 150
push 270
push cdYSize-1
push (cdXSize/2)
call Fractal_Tree
jmp wmBYE
wmPAINT:lea eax,ps
push eax
push hWnd
call _imp__BeginPaint@8
push SRCCOPY
push ebx;0
push ebx;0
push bufDIBDC
push cdYSize
push cdXSize
push ebx;0
push ebx;0
push eax;hdc
call _imp__BitBlt@36
lea eax,ps
push eax
push hWnd
call _imp__EndPaint@8
wmBYE: ret
WndProc endp
Fractal_Tree proc x:dword,y:dword,angle:dword,len:dword
local color:dword
local u1:dword
local a1:dword
local p:dword
local i:dword
local y1:dword
local x1:dword
cmp len, 5
jl locret_402029
fild angle
fmul deg2rad
fsincos
fimul len
fiadd x
fistp x1 ; x1 = x + len * cos(angle*deg2rad)
fimul len
fiadd y
fistp y1 ; y1 = y + len * sin(angle*deg2rad)
cmp len,95 ; if (len > 95)
jle @f
mov p, 95 ;p = 95
jmp loc_4019C1
@@: mov eax, len ;else p = len;
mov p, eax
loc_4019C1: mov eax, p
mov ecx, 5
cdq
idiv ecx
mov ecx, offset mColores[0]
add ecx, eax
movzx eax, byte ptr [ecx]
mov i, eax ;i = mColores[p/5]
call _imp__rand
and eax,1 ;if ((rand() % 2) == 0) {
jnz setcolor
mov eax, i
cmp al,mColores[0] ;if (i == mColores[0])
jnz @f
movzx eax, byte ptr mColores[1]
mov i, eax ;i = mColores[1]
jmp setcolor
@@: mov eax,i ;else
cmp al,mColores[1] ;if (i == mColores[1])
jnz setcolor
movzx eax,mColores[0];i = mColores[0]
mov i, eax
setcolor: mov eax,i
lea edx,miPaleta[eax*4].Rojo
movzx ecx,byte ptr [edx]
shl ecx,16
lea edx,miPaleta[eax*4].Verde
mov ch,[edx]
lea edx,miPaleta[eax*4].Azul
mov cl,[edx]
mov color,ecx;color = miPaleta[i].Azul + (miPaleta[i].Verde<<8) + (miPaleta[i].Rojo<<16)
;mov eax, i
cmp al,mColores[0]
jz @f
cmp al,mColores[1]
jnz loc_401B65;if ( (i == mColores[0]) || (i == mColores[1]) ) {
@@: mov i,ebx
loc_401AA0: cmp i,c3 ;for (i = 0; i <= c3; i++) {
ja loc_401C47
mov eax, x
add eax,i
sub eax,1
mov u1,eax ;u1 = x+i-c3/2
cmp eax,cdXSize
jae @f
cmp y,cdYSize
jae @f
cmp x1,cdXSize
jae @f
cmp y1,cdYSize
jae @f ;if (u1 < cdXSize && u1 > 0 && y < cdYSize && y > 0 && x1 < cdXSize && x1 > 0 && y1 < cdYSize && y1 > 0)
push color
push y1
push x1
push y
push u1
call DIBLine ;DIBLine (u1,y,x1,y1, color, pMainDIB)
@@: inc i
jmp short loc_401AA0
;} else {
loc_401B65: mov i,ebx ;for (i = 0; i <= p/c2; i++) {
loc_401B6D: mov eax, p
mov ecx, c2
cdq
idiv ecx
cmp i, eax
ja loc_401C47
mov eax, x
add eax, i
push eax
mov eax, p
mov ecx,c2*2; 12
cdq
idiv ecx
pop ecx
sub ecx, eax
mov u1, ecx ;u1 = x+i-p/(c2*2)
cmp u1,cdXSize
jae @f
cmp y,cdYSize
jae @f
cmp x1,cdXSize
jae @f
cmp y1,cdYSize
jae @f ;if (u1 < cdXSize && u1 > 0 && y < cdYSize && y > 0 && x1 < cdXSize && x1 > 0 && y1 < cdYSize && y1 > 0)
push color
push y1
push x1
push y
push u1
call DIBLine ;DIBLine (u1,y,x1,y1, color, pMainDIB)
@@: inc i
jmp loc_401B6D
loc_401C47: mov i,ebx ;for (i = 0; i <= 3 - (rand()%3); i++) {
loc_401C4F: call _imp__rand
mov ecx, c3
cdq
idiv ecx
mov eax, c3
sub eax, edx
cmp i, eax
jg locret_402029
call _imp__rand
push eax
mov eax, len
mov ecx, c2
cdq
idiv ecx
mov ecx, len
sub ecx, eax
pop eax
cdq
idiv ecx
mov eax, len
mov ecx, c2
push edx
cdq
idiv ecx
pop ecx
add ecx, eax
mov p, ecx ;p = rand() % (len - len / 6) + len / 6
call _imp__rand
mov ecx,55
cdq
idiv ecx
mov eax, angle
sub eax, edx
mov a1, eax;a1 = angle - (rand() % 55)
fild angle
fmul deg2rad
fsincos
fimul p
fiadd x
fistp x1 ; x1 = x + p * cos(angle*deg2rad)
fimul p
fiadd y
fistp y1 ; y1 = y + p * sin(angle*deg2rad)
mov eax, len
cmp eax,100
jle @f;loc_401DFB ;if (len > 100)
call _imp__rand
mov ecx,15
cdq
idiv ecx
mov eax,100
jmp a2
@@: call _imp__rand
mov ecx,15
cdq
idiv ecx
mov eax, len
a2: sub eax, edx
sub eax,c1
push eax
call _imp__rand
mov ecx,c1
cdq
idiv ecx
pop eax
add eax, edx
push eax
push a1
push y1
push x1
call Fractal_Tree ;Fractal_Tree(x1,y1,a1,100-(rand()%15)-c1+(rand()%c1))
loc_401E40: call _imp__rand
push eax
mov eax, len
mov ecx, c2
cdq
idiv ecx
mov ecx, len
sub ecx, eax
pop eax
cdq
idiv ecx
mov eax, len
mov ecx, c2
push edx
cdq
idiv ecx
pop ecx
add ecx, eax
mov p, ecx
call _imp__rand
mov ecx,55
cdq
idiv ecx
mov eax, angle
add eax, edx
mov a1, eax
;----------------------------------------------------------------
fild angle
fmul deg2rad
fsincos
fimul p
fiadd x
fistp x1 ; x1 = x + p * cos(angle*deg2rad)
fimul p
fiadd y
fistp y1 ; y1 = y + p * sin(angle*deg2rad)
;-----------------------------------------------------------------
call _imp__rand
cmp len, 100 ; if (len > 100)
jle @f
mov ecx,15
cdq
idiv ecx
mov eax, 100; Fractal_Tree(x1,y1,a1,100-(rand()%15)-c1+(rand()%c1));
jmp a0
@@: mov ecx, 15
cdq
idiv ecx
mov eax, len
a0: sub eax, edx
sub eax,c1
push eax
call _imp__rand
mov ecx,c1
cdq
idiv ecx
pop eax
add eax, edx
push eax
push a1
push y1
push x1
call Fractal_Tree ; Fractal_Tree(x1,y1,a1,len-(rand()%15)-c1+(rand()%c1));
inc i
jmp loc_401C4F
locret_402029: leave
retn 10h
Fractal_Tree endp
;----------------------------------------------
DIBLine proc u1:dword,y:dword,x1:dword,y1:dword,color:dword
local var_1C:dword
local var_18:dword
local var_14:dword
local var_10:dword
local var_C:dword
local var_8:dword
local var_4:dword
mov eax,y
cmp eax,y1
jnz @f
push color
push x1
push y
push u1
call sub_401121
jmp exit
@@: mov eax, u1
cmp eax, x1
jnz @f
push color
push y1
push y
push u1
call sub_4011A8
jmp exit
@@: mov eax, x1
sub eax, u1
mov var_4, eax
cmp eax, ebx
jge @f
neg var_4
@@: mov eax, y1
sub eax, y
mov var_8, eax
cmp eax, ebx
jge @f
neg var_8
@@: mov eax, u1
cmp x1,eax
sbb ecx,ecx
or ecx,1
mov var_C,ecx
mov eax, y
cmp y1,eax
sbb ecx,ecx
or ecx,1
mov var_10,ecx
mov eax, var_4
sub eax, var_8
mov var_14, eax
loc_401334: mov ecx, y
shl ecx, 7
mov eax, ecx
shl eax, 2
add eax, ecx
add eax, u1
mov var_1C, eax
shl eax, 2
mov ecx, pMainDIB
add ecx, eax
mov eax, color
mov [ecx], eax
mov eax, u1
cmp eax, x1
jnz @f
mov eax, y
cmp eax, y1
jz exit
@@: mov eax, var_14
shl eax, 1
mov var_18, eax
xor eax,eax
sub eax, var_8
cmp var_18, eax
jle @f
mov eax, var_14
sub eax, var_8
mov var_14, eax
mov eax, u1
add eax, var_C
mov u1, eax
@@: mov eax, u1
cmp eax, x1
jnz @f
mov eax, y
cmp eax, y1
jnz @f
mov ecx, y
shl ecx, 7
mov eax, ecx
shl eax, 2
add eax, ecx
add eax, u1
mov var_1C, eax
shl eax, 2
mov ecx, pMainDIB
add ecx, eax
mov eax, color
mov [ecx], eax
jmp exit
@@: mov eax, var_18
cmp eax, var_4
jge loc_401334
mov eax, var_4
add var_14,eax
mov eax,var_10
add y,eax
jmp loc_401334
exit: ret
DIBLine endp
;----------------------------------------------------------------------
sub_401121 proc u1:dword,y:dword,x1:dword,color:dword
local var_8:dword
local var_4:dword
mov eax, u1
cmp eax, x1
jle @f
lea eax, x1
push eax
lea eax, u1
push eax
call sub_401000
@@: mov ecx, y
shl ecx, 7
mov eax, ecx
shl eax, 2
add eax, ecx
add eax, u1
mov var_8,eax
mov var_4,ebx
@@: mov eax, x1
sub eax, u1
cmp var_4, eax
jg @f
mov eax, var_8
add eax,var_4
mov ecx, pMainDIB
lea ecx,[ecx+eax*4]
mov eax, color
mov [ecx], eax
inc var_4
jmp @b
@@: leave
retn 10h
sub_401121 endp
;----------------------------------------------------------------------
sub_4011A8 proc u1:dword,y:dword,y1:dword,color:dword
local var_8:dword
local var_4:dword
mov eax,y
cmp eax,y1
jle @f
lea eax,y1
push eax
lea eax,y
push eax
call sub_401000
@@: mov ecx,y
shl ecx,7
mov eax,ecx
shl eax,2
add eax,ecx
mov ecx,u1
add eax,ecx
mov var_8,eax
mov var_4,ebx
@@: mov eax,y1
sub eax,y
cmp var_4,eax
jg @f
mov eax,var_8
mov ecx,pMainDIB
lea ecx,[ecx+eax*4]
mov eax,color
mov [ecx],eax
add var_8,cdXSize
inc var_4
jmp @b
@@: leave
retn 10h
sub_4011A8 endp
;---------------------------------------------------------------------
sub_401000 proc arg_0:dword,arg_4:dword
local var_4:dword
mov eax, arg_0
mov ecx, [eax]
mov var_4, ecx
mov eax, arg_0
mov ecx, arg_4
mov edx, [ecx]
mov [eax], edx
mov eax, arg_4
mov ecx, var_4
mov [eax], ecx
leave
retn 8
sub_401000 endp
;----------------------------------------------------------------------
.data
miPaleta stPaleta <0>,<0>,<0>,<0>,<0>,<0>,<0>,<0>,<0>,<0>,<0>
wTitle db "Fractal Tree - (c) abreojosensamblador.net",0
bi BITMAPINFOHEADER <sizeof BITMAPINFOHEADER,cdXSize,-cdYSize,1,32,0>
bufDIBDC dd ?
pMainDIB dd 0
mColores db 2,10,10,8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6
deg2rad dq 0.01745329251994329576923690768
end start
bat-filecls
set filename=FTreeWM01
if exist %filename%.exe del %filename%.exe
if exist %filename%.com del %filename%.com
if exist %filename%.dll del %filename%.dll
set masm_path=c:\masm32
if exist %filename%.rc (
%masm_path%\bin\rc /v %1.rc
%masm_path%\bin\cvtres /machine:ix86 %1.res
%masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm || exit
%masm_path%\bin\link /SUBSYSTEM:WINDOWS ^
/LIBPATH:%masm_path%\lib /NOLOGO %1.obj %filename%.res || exit
del %filename%.res
) else (
%masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm || exit
%masm_path%\bin\PoLink /SUBSYSTEM:WINDOWS ^
/LIBPATH:%masm_path%\lib /NOLOGO %filename%.obj
)
if exist %filename%.map del %filename%.map
if exist %filename%.obj del %filename%.obj
if exist %filename%.ilc del %filename%.ilc
if exist %filename%.ild del %filename%.ild
if exist %filename%.ilf del %filename%.ilf
if exist %filename%.ils del %filename%.ils
if exist %filename%.tds del %filename%.tds
exit