the masm32 codes can't work.
.686
.model flat,stdcall
option casemap:none
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\macros\macros.asm
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
PintaObjeto PROTO
CenterScreen PROTO :HWND
Random PROTO
CreaPaleta PROTO
CreaBase PROTO
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
cdXPos EQU 0 ; X-upperleft of main window
cdYPos EQU 0 ; Y-upperleft of main window
cdXSize EQU 660 ; Anchura de la ventana principal
cdYSize EQU 500 ; Altura de la ventana principal
cdColFondo EQU COLOR_BTNFACE + 1
cdVIcono EQU IDI_APPLICATION ; Icono de la ventana, v閍se Resource.H
cdVCursor EQU IDC_ARROW ; Cursor para la ventana
cdVBarTipo EQU NULL ; Normal, con icono
cdVBtnTipo EQU 20000h+80000h+10000000h ; Botones min-max-cerrar, max desactivado
cdIdTimer EQU 1
DIB_RGB_COLORS EQU 0
cdROUGHNESS EQU 2
cdMINCOLOR EQU 1
cdMAXCOLOR EQU 192
cdPalSize EQU cdMAXCOLOR; + 1*4
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
stPaleta struc
Rojo db ?
Verde db ?
Azul db ?
Alfa db ?
stPaleta ends
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.DATA
NombreClase DB "PlasmaFractal", 0
MsgCabecera DB "Plasma Fractal - (c) www.abreojosensamblador.net", 0
MsgError DB 'Carga inicial fallida.',0
vdMovimiento db 0
pMainDIB DD 0
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.DATA?
wc WNDCLASSEX <>
ps PAINTSTRUCT <>
CommandLine DD ?
hMainWnd dd ?
vdSeed dd ?
hPen dd ?
hPenOld dd ?
vmBase db cdXSize * cdYSize dup(?)
miPaleta stPaleta (cdPalSize+1) dup(<?>)
bi BITMAPINFOHEADER <>
hHeap dd ?
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.CODE
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
LimpiaBase proc uses edi
lea edi, vmBase
mov ecx, cdXSize * cdYSize /4
mov eax, 0
rep stosd
ret
LimpiaBase endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaBmpInfoHead PROC
invoke RtlZeroMemory,addr bi,sizeof bi
mov bi.biSize,sizeof bi
mov bi.biWidth,cdXSize
mov eax,cdYSize
and eax,0ffffffffh
mov bi.biHeight,sizeof bi
mov bi.biPlanes,1
mov bi.biBitCount,32
mov bi.biCompression,0
ret
CreaBmpInfoHead ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
start:
invoke GetModuleHandle, NULL
mov wc.hInstance, EAX
invoke GetProcessHeap
mov hHeap,eax
invoke GetCommandLine
mov CommandLine, EAX
invoke WinMain, wc.hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke HeapFree,hHeap,HEAP_NO_SERIALIZE,pMainDIB
invoke ExitProcess, EAX
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WinMain PROC hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW OR CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
invoke GetStockObject, BLACK_BRUSH
mov wc.hbrBackground, eax ; Color de fondo de la ventana
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET NombreClase
invoke LoadIcon, NULL, cdVIcono
mov wc.hIcon, EAX
mov wc.hIconSm, EAX
invoke LoadCursor, NULL, cdVCursor
mov wc.hCursor, EAX
invoke RegisterClassEx, ADDR wc
test EAX, EAX
jz L_Error
invoke CreateWindowEx,cdVBarTipo,ADDR NombreClase,ADDR MsgCabecera,cdVBtnTipo,cdXPos,cdYPos,\
cdXSize,cdYSize,NULL,NULL,hInst,NULL
test EAX, EAX
jz L_Error
mov hwnd, EAX
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg, NULL, 0, 0
.break .IF (!EAX)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov EAX, msg.wParam
jmp L_Fin
L_Error:
invoke MessageBox, NULL,ADDR MsgError, NULL, MB_ICONERROR+MB_OK
L_Fin:
mov eax, msg.wParam
ret
WinMain ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WndProc PROC hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL bufDIBDC:HDC
LOCAL hMainDIB:dword
LOCAL hOldDIB:dword
mov eax, uMsg
.if eax == WM_DESTROY
invoke KillTimer,hWnd,cdIdTimer
invoke DeleteObject,hMainDIB
invoke DeleteDC,bufDIBDC
invoke DeleteObject,hOldDIB
invoke PostQuitMessage, NULL
.elseif eax == WM_CREATE
invoke CenterScreen,hWnd
invoke CreaBmpInfoHead
mov ecx,cdXSize
mov eax,cdYSize
mul ecx
invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY or HEAP_NO_SERIALIZE,eax
mov pMainDIB, eax
invoke GetTickCount
mov vdSeed, eax
invoke GetDC,hWnd
mov hdc,eax
invoke CreateCompatibleDC, hdc
mov bufDIBDC, eax
invoke CreateDIBSection,hdc,addr bi,DIB_RGB_COLORS,addr pMainDIB, NULL, NULL
mov hMainDIB, eax
invoke SelectObject, bufDIBDC, hMainDIB ; Select bitmap into DC
mov hOldDIB, eax
invoke ReleaseDC, hWnd, hdc ; Libera device context
invoke CreaPaleta
invoke LimpiaBase
invoke CreaBase
invoke SetTimer,hWnd,cdIdTimer,20,NULL
.elseif eax == WM_TIMER
mov ecx, cdMAXCOLOR
mov eax, dword ptr vdMovimiento
inc eax
div ecx
mov dword ptr vdMovimiento,edx ;要余数
invoke InvalidateRect,hWnd, NULL, NULL
.elseif eax == WM_PAINT
invoke BeginPaint,hWnd, addr ps
mov hdc, eax
invoke PintaObjeto
invoke BitBlt,hdc,0,0,cdXSize,cdYSize,bufDIBDC,0,0,SRCCOPY
invoke EndPaint,hWnd, addr ps
.elseif eax == WM_KEYDOWN
.if wParam == VK_ESCAPE
invoke KillTimer,hWnd,cdIdTimer
invoke PostQuitMessage, NULL
.endif
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WndProc ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
LeeColor proc uses ebx ecx, px, py
;;;;; Devolvemos el byte de color en eax
mov ecx, dword ptr [py]
mov ebx, ecx
shl ecx, 9
shl ebx, 7
add ebx, dword ptr [px]
mov al, byte ptr [vmBase + ebx]
and eax, 0FFh
ret
LeeColor endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
EscribeColor proc uses ebx px:dword, py:dword,pc:BYTE
;;;;; Guardamos el color en su matriz
; In: EAX byte de color
mov ecx, py
mov ebx, ecx
shl ecx, 9
shl ebx, 7
add ebx, ecx
add ebx, px
mov al,pc
mov byte ptr [vmBase + ebx], al
ret
EscribeColor endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
adjust proc uses ebx esi edi, xa, ya, x0, y0, xb, yb
;local pixel:DWORD;, average:DWORD
invoke LeeColor, x0, y0 ; Byte en AL
;or al, al
jnz @a_exit
mov eax, xa
sub eax, xb
jge @a_next1
neg eax
@a_next1:
mov ebx, eax
mov eax, ya
sub eax, yb
jge @a_next2
neg eax
@a_next2:
add ebx, eax ;d, ebx = abs(xa-xb) + abs(ya-yb)
invoke LeeColor,xa,ya ; Byte en AL
mov esi, eax
invoke LeeColor,xb,yb ; Byte en AL
add esi,eax
shl esi, 5 ; esi,average = ((i+j)<<5)
mov eax, 64 ; Rango del o aleatorio
call Random ; Lo calculamos
sub eax, 32
imul ebx
shl eax, 1 ; eax = (RAND(64)-32)*ebx*cdROUGHNESS
shr ecx, 6 ; Average / 64
add eax, esi ; pixel = eax + Average / 64
shr eax, 6 ; (((rand() % 64) - 32) * d * cdROUGHNESS + average)/64
cmp eax, cdMINCOLOR
jge @a_next3
mov eax, cdMINCOLOR
jmp @a_next4
@a_next3:
cmp eax, cdMAXCOLOR
jle @a_next4
mov eax, cdMAXCOLOR
@a_next4:
invoke EscribeColor,x0,y0,al
@a_exit:
ret
adjust endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
sub_divide proc uses ebx esi edi, x1:DWORD, y1:DWORD, x2:DWORD, y2:DWORD ; Las CC del recgulo de la pantalla
;local x:DWORD, y:DWORD
; Si x2-x1 < 2 && y2-y1 < 2 exit
mov eax, x2
sub eax, x1
cmp eax, 2
jl @sd_Fin
mov eax, y2
sub eax, y1
cmp eax, 2
jl @sd_Fin
@sd_Inicio:
mov esi, x2
add esi, x1
shr esi, 1 ; esi = x = (x1 + x2) / 2
mov edi, y2
add edi, y1
shr edi, 1 ;edi= y = (y1 + y2) / 2
invoke adjust,x1,y1,esi,y1,x2,y1
invoke adjust,x2,y1,x2,edi,x2,y2
invoke adjust,x1,y2,esi,y2,x2,y2
invoke adjust,x1,y1,x1,edi,x1,y2
invoke LeeColor,esi,edi ; Byte en AL
;or al, al
jnz @sd_Dividir
invoke LeeColor,x1,y1 ; Byte en AL
mov ebx, eax
invoke LeeColor,x2,y1 ; Byte en AL
add ebx, eax
invoke LeeColor,x2,y2 ; Byte en AL
add ebx, eax
invoke LeeColor,x1,y2 ; Byte en AL
add ebx, eax
shr ebx, 2
invoke EscribeColor,esi,edi,bl
@sd_Dividir:
invoke sub_divide,x1,y1,esi,edi
invoke sub_divide,esi,y1,x2,edi
invoke sub_divide,esi,edi,x2,y2
invoke sub_divide,x1,edi,esi,y2
@sd_Fin:
ret
sub_divide endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaBase proc
local i:byte
local j:byte
local k:byte
local m:byte
; Pintamos los pixel en las esquinas con colores aleatorios
mov eax, cdMAXCOLOR ; R aleatorio
call Random ; Lo calculamos
inc eax
mov i, al ; Esq superior izquierda
mov eax, cdMAXCOLOR ; Rango delo aleatorio
call Random ; Lo calculamos
inc eax
mov j, al ;
mov eax, cdMAXCOLOR ; Rango del o aleatorio
call Random ; Lo calculamos
inc eax
mov k, al ;
mov eax, cdMAXCOLOR ; Rango del ro aleatorio
call Random ; Lo calculamos
inc eax
mov m, al ;
invoke EscribeColor, 0, 0, i
invoke EscribeColor, cdXSize-1, 0, j
invoke EscribeColor, cdXSize-1,cdYSize-1,k
invoke EscribeColor, 0,cdYSize-1,m
invoke sub_divide, 0, 0, cdXSize-1, cdYSize-1
ret
CreaBase endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
PintaObjeto proc uses ebx esi edi
; Pintamos pixel en lugar y color aleatorios
mov eax, cdYSize
mov ecx, cdXSize
mul ecx
dec eax ;cdYSize*cdXSize - 1
mov ebx,eax
xor esi,esi ;k
.repeat
movzx eax,byte ptr [vmBase + ebx] ;m
add eax,dword ptr vdMovimiento ;m+vbMovimiento
mov ecx,cdMAXCOLOR
xor edx,edx
div ecx
inc edx ;m = (m + vbMovimiento) % (cdMAXCOLOR+0) + 1
mov al,miPaleta[edx].Azul ;c = miPaleta[m].Azul
mov cl,miPaleta[edx].Verde ;c += miPaleta[m].Verde << 8
shl cl,8
add al,cl
mov cl,miPaleta[edx].Rojo
shl cl,16
add al,cl ;c += miPaleta[m].Rojo << 16
lea edi,pMainDIB
add edi,esi
stosb ;*(pMainDIB + k) = c
inc esi
dec ebx
.until ebx>=0
ret
PintaObjeto endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaPaleta proc uses ebx esi edi
mov miPaleta.Rojo, 33*4
mov miPaleta.Verde, 10*4
mov miPaleta.Azul, 19*4
mov miPaleta.Alfa, 0
mov ah, 0
xor edi, edi ;i
.repeat
mov al, dl
shl al, 2 ; i*4
mov bl, 63*4 ; k
sub bl, al
mov [edi + 1 + miPaleta.Rojo], al
mov [edi + 1 + miPaleta.Verde], bl
mov [edi + 1 + miPaleta.Azul], 0
mov [edi + 1 + miPaleta.Alfa], 0
mov [edi + 65 + miPaleta.Rojo], bl
mov [edi + 65 + miPaleta.Verde], 0
mov [edi + 65 + miPaleta.Azul], al
mov [edi + 65 + miPaleta.Alfa], 0
mov [edi + 129 + miPaleta.Rojo], 0
mov [edi + 129 + miPaleta.Verde], al
mov [edi + 129 + miPaleta.Azul], bl
mov [edi + 129 + miPaleta.Alfa], 0
inc edi
.until edi >=64
ret
CreaPaleta endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Random proc uses ebx
mov ebx, eax
mov eax, vdSeed ;
xor edx, edx
mov ecx, 127773
div ecx
mov ecx, eax
mov eax, 16807
mul edx
mov edx, ecx
mov ecx, eax
mov eax, 2836
mul edx
sub ecx, eax
xor edx, edx
mov eax, ecx
mov vdSeed, ecx
div ebx ;[base]
mov eax, edx
ret
Random endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CenterScreen PROC USES esi edi hWnd:DWORD
LOCAL wRect:RECT
xor eax, eax
push eax
lea eax, DWORD PTR [ebp-16]
push eax
mov eax, hWnd
push eax
call GetWindowRect
mov esi, wRect.bottom
sub esi, wRect.top
push esi
shr esi, 1
mov edi, wRect.right
sub edi, wRect.left
push edi
shr edi, 1
mov eax, SM_CYSCREEN
push eax
call GetSystemMetrics
shr eax, 1
sub eax, esi
push eax
mov eax, SM_CXSCREEN
push eax
call GetSystemMetrics
shr eax, 1
sub eax, edi
push eax
mov eax, hWnd
push eax
call MoveWindow
ret
CenterScreen ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end start
Hmmm, this code is very familiar to me :bgrin:. I have no masm compiler available here, but I have the compiled Fasm version and it seems to work okay here, what happens with your version? I have noticed that you have changed ".386" by ".686", don't know if there are more changes.
Regards
hi,avcaballero
your graphic tutorial is very good. :t
the fasm code is not as good as that c code. it's always flickered.
although the masm32 code translated from c code can't work, but no crashed.
i don't know where is some errors.
Thank you, six_L. I noticed the flickering too, but only in WXP, in W7 (that was where I developped it) works fine. No much time to looking for an error for now, maybe someone else...
I have tested a little your code.
Take care of the div and mul operation,if edx not zero,you divide a qword not a dword.
Quote
invoke CreateCompatibleDC, hdc
mov HcompDC, eax ;must be in data if re-use in another event
hi,ToutEnMasm
thanks your response.
the attachment is working exe file.
.686
.model flat,stdcall
option casemap:none
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\masm32.inc
include \masm32\include\debug.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\debug.lib
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\macros\macros.asm
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
stPaleta struct
Azul db ?
Verde db ?
Rojo db ?
Alfa db ?
stPaleta ends
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
cdXPos EQU 0
cdYPos EQU 0
cdYSize EQU 600
cdXSize EQU 840
cdVIcono EQU IDI_APPLICATION
cdVCursor EQU IDC_ARROW
cdVBarTipo EQU NULL
cdVBtnTipo EQU WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU
cdIdTimer EQU 1212
cdMINCOLOR EQU 1
cdMAXCOLOR EQU 192
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WinMain PROTO :DWORD, :DWORD, :DWORD, :DWORD
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.DATA
NombreClase DB "Plasma Fractal", 0
MsgCabecera DB "Plasma Fractal - (c) abreojosensamblador.net", 0
wc WNDCLASSEX <>
MsgError DB 'Plasma Fractal inicial fallida.',0
LCDBITMAPINFO BITMAPINFOHEADER <0>
vdMovimiento db 0
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.DATA?
CommandLine DD ?
vdSeed dd ?
bufDIBDC dd ? ; HDC
bufBMP dd ? ; HBITMAP
hOldBmp dd ?
;
pMainDIB dd ?
hMainDIB dd ?
hOldDIB dd ?
hBackDC dd ?
;
miPaleta stPaleta 256 dup(<?>)
vmBase db cdXSize*cdYSize dup(?)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.CODE
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CenterScreen PROC USES ebx esi edi hWnd:DWORD
LOCAL wRect:RECT
invoke GetWindowRect,hWnd,addr wRect
mov esi, wRect.bottom
sub esi, wRect.top
mov edi, wRect.right
sub edi, wRect.left
invoke GetSystemMetrics,SM_CYSCREEN
shr eax, 1
mov ecx,esi
shr ecx,1
sub eax, ecx
mov ebx, eax
invoke GetSystemMetrics,SM_CXSCREEN
shr eax, 1
mov ecx,edi
shr ecx,1
sub eax, ecx
invoke MoveWindow,hWnd,eax,ebx,edi,esi,FALSE
ret
CenterScreen ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Random proc uses ebx dwNumMIN:dword,dwNumMAX:dword
mov ebx, dwNumMAX
mov eax, vdSeed
xor edx, edx
mov ecx, 127773
div ecx
mov ecx, eax
mov eax, 16807
mul edx
mov edx, ecx
mov ecx, eax
mov eax, 2836
mul edx
sub ecx, eax
xor edx, edx
mov eax, ecx
mov vdSeed, ecx
div ebx ;[base]
mov eax, edx
add eax, dwNumMIN
ret
Random endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
LimpiaBase proc uses ebx esi edi
lea edi, vmBase
mov esi, cdXSize * cdYSize / 4
xor ebx,ebx
.while ebx <=esi
xor eax,eax
mov [edi+ebx*4],eax
inc ebx
.endw
ret
LimpiaBase endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaBmpInfoHead PROC
invoke RtlZeroMemory,addr LCDBITMAPINFO,sizeof LCDBITMAPINFO
mov LCDBITMAPINFO.biSize,sizeof LCDBITMAPINFO
mov LCDBITMAPINFO.biWidth,cdXSize
mov eax,cdYSize
and eax,0ffffffffh
mov LCDBITMAPINFO.biHeight,eax
mov LCDBITMAPINFO.biPlanes,1
mov LCDBITMAPINFO.biBitCount,32
mov LCDBITMAPINFO.biCompression,0
ret
CreaBmpInfoHead ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
LeeColor proc px:dword, py:dword
;;;;; Devolvemos el byte de color en eax
mov eax, py
mov ecx, cdXSize
mul ecx
mov ecx, px
add eax,ecx ;py*cdXSize + px
lea ecx,vmBase
add ecx,eax
movzx eax, byte ptr [ecx]
ret
LeeColor endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
EscribeColor proc uses ebx px:dword, py:dword,pc:byte
;;;;; Devolvemos el byte de color en eax
mov eax, py
mov ecx, cdXSize
mul ecx
mov ecx, px
add eax,ecx ;py*cdXSize + px
lea ecx,vmBase
add ecx, eax
movzx eax,pc
mov [ecx], al
ret
EscribeColor endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
adjust proc uses ebx esi edi xa:dword, ya:dword, x0:dword, y0:dword, xb:dword, yb:dword
invoke LeeColor, x0, y0 ; Byte en AL
cmp eax,0
jnz @a_exit
mov eax, xa
sub eax, xb
test eax,eax
jge @a_next1
neg eax
@a_next1:
mov ebx, eax
mov eax, ya
sub eax, yb
test eax,eax
jge @a_next2
neg eax
@a_next2:
add ebx, eax ;d, ebx = abs(xa-xb) + abs(ya-yb)
invoke LeeColor,xa,ya ; Byte en AL
movzx esi, al
invoke LeeColor,xb,yb ; Byte en AL
movzx ecx, al
add esi,ecx
shl esi, 5 ; esi,average = ((i+j)<<5),esi=var_c
invoke Random,0,64 ; Lo calculamos
mov ecx,64
cdq
idiv ecx
sub edx, 32
imul edx,ebx ; *abs
shl edx, 1 ; eax = (RAND(64)-32)*ebx*cdROUGHNESS
add esi,edx ; pixel = eax + Average / 64
mov eax,esi
mov ecx,64
cdq
idiv ecx ; (((rand() % 64) - 32) * d * cdROUGHNESS + average)/64
cmp eax, cdMINCOLOR
jge @a_next3
mov eax, cdMINCOLOR
jmp @a_next4
@a_next3:
cmp eax, cdMAXCOLOR
jle @a_next4
mov eax, cdMAXCOLOR
@a_next4:
and eax,0ffh
invoke EscribeColor,x0,y0,al
@a_exit:
ret
adjust endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
sub_divide proc uses ebx esi edi x1:DWORD, y1:DWORD, x2:DWORD, y2:DWORD ; Las CC del recgulo de la pantalla
; Si x2-x1 < 2 && y2-y1 < 2 exit
mov eax, x2
mov ecx, x1
sub eax, ecx
cmp eax, 2
jge @sd_Inicio
mov eax, y2
mov ecx, y1
sub eax, ecx
cmp eax, 2
jge @sd_Inicio
jmp @sd_Fin
@sd_Inicio:
mov eax, x2
mov ecx, x1
add eax, ecx
sar eax, 1 ; esi = x = (x1 + x2) / 2
mov esi, eax
mov eax, y2
mov ecx, y1
add eax, ecx ;edi = y = (y1 + y2) / 2
sar eax, 1
mov edi, eax
invoke adjust,x1,y1,esi,y1,x2,y1 ; adjust(x1,y1,x,y1,x2,y1)
invoke adjust,x2,y1,x2,edi,x2,y2 ; adjust(x2,y1,x2,y,x2,y2)
invoke adjust,x1,y2,esi,y2,x2,y2 ; adjust(x1,y2,x,y2,x2,y2)
invoke adjust,x1,y1,x1,edi,x1,y2 ; adjust(x1,y1,x1,y,x1,y2)
invoke LeeColor,esi,edi ; Byte en AL
cmp eax,0
jnz @sd_Dividir
invoke LeeColor,x1,y1 ; Byte en AL
mov ebx, eax
invoke LeeColor,x2,y1 ; Byte en AL
add ebx, eax
invoke LeeColor,x2,y2 ; Byte en AL
add ebx, eax
invoke LeeColor,x1,y2 ; Byte en AL
add ebx, eax
mov eax,ebx
sar eax, 2
and eax,0ffh
invoke EscribeColor,esi,edi,al
@sd_Dividir:
invoke sub_divide,x1,y1,esi,edi ; sub_divide(x1,y1,x,y);
invoke sub_divide,esi,y1,x2,edi ; sub_divide(x,y1,x2,y);
invoke sub_divide,esi,edi,x2,y2 ; sub_divide(x,y,x2,y2);
invoke sub_divide,x1,edi,esi,y2 ; sub_divide(x1,y,x,y2);
@sd_Fin:
ret
sub_divide endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaBase proc
local i:byte
local j:byte
local k:byte
local m:byte
invoke Random,0,cdMAXCOLOR ; Lo calculamos
mov ecx, cdMAXCOLOR ; R aleatorio
cdq
idiv ecx
add edx,1
mov i, dl ; Esq superior izquierda
invoke Random,0,cdMAXCOLOR ; Lo calculamos
mov ecx, cdMAXCOLOR ; R aleatorio
cdq
idiv ecx
add edx,1
mov j, dl ;
invoke Random,0,cdMAXCOLOR ; Lo calculamos
mov ecx, cdMAXCOLOR ; R aleatorio
cdq
idiv ecx
add edx,1
mov k, dl ;
invoke Random,0,cdMAXCOLOR ; Lo calculamos
mov ecx, cdMAXCOLOR ; R aleatorio
cdq
idiv ecx
add edx,1
mov m, dl ;
invoke EscribeColor, 0, 0, i
invoke EscribeColor, cdXSize-1, 0, j
invoke EscribeColor, cdXSize-1,cdYSize-1,k
invoke EscribeColor, 0,cdYSize-1,m
invoke sub_divide, 0, 0, cdXSize-1, cdYSize-1
ret
CreaBase endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
PintaObjeto proc uses ebx esi edi
local var_pixel:dword
local var_m:byte
mov eax, cdYSize
mov ecx, cdXSize
xor edx,edx
mul ecx
dec eax ;cdYSize*cdXSize - 1
mov ebx,eax
xor esi,esi ;k
.repeat
lea eax,vmBase
add eax,ebx
movzx ecx, byte ptr [eax]
movzx edx, vdMovimiento
add ecx,edx ;m+vbMovimiento
mov eax,ecx
mov ecx,cdMAXCOLOR
cdq
idiv ecx
add edx,1
mov var_m,dl ;m = (m + vbMovimiento) % (cdMAXCOLOR+0) + 1
movzx eax,var_m
shl eax,2
mov ecx,offset miPaleta
add ecx,eax
movzx eax, byte ptr [ecx]
mov var_pixel,eax ;miPaleta[m].Azul
movzx eax,var_m
shl eax,2
mov ecx,offset miPaleta
add ecx,eax
add ecx,1
movzx eax, byte ptr [ecx] ;miPaleta[m].Verde
shl eax,8
mov ecx,var_pixel
add ecx,eax
mov var_pixel,ecx
movzx eax,var_m
shl eax,2
mov ecx,offset miPaleta
add ecx,eax
add ecx,2
movzx eax, byte ptr [ecx] ;miPaleta[m].Rojo
shl eax,16
mov ecx,var_pixel
add ecx,eax
mov var_pixel,ecx
mov ecx,pMainDIB
mov eax,esi
shl eax,2
add ecx,eax
mov eax,var_pixel
mov [ecx],eax ;*(pMainDIB + k) = c
inc esi
dec ebx
.until ebx<=0
ret
PintaObjeto endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaPaleta proc uses ebx esi edi
local var_c:byte
mov miPaleta[0].Rojo, 33*4
mov miPaleta[0].Verde, 10*4
mov miPaleta[0].Azul, 19*4
mov miPaleta[0].Alfa, 0
xor ebx, ebx ;i
.repeat
mov eax, ebx
shl eax, 2 ;i*4
mov ecx, 0FCh ; 63*4 ; k
sub ecx, eax ; 63*4 - i*4
and ecx, 0FFh
mov var_c, cl ;k
mov eax, ebx
add eax, 1
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
;add ecx, 0 ;0 miPaleta[i+1].Rojo
mov eax, ebx
shl eax, 2 ;i*4
mov [ecx], al
mov eax, ebx
add eax, 1
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 1 ;1 miPaleta[i+1].Verd
movzx eax, var_c ;k
mov [ecx], al
mov eax, ebx
add eax, 1
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 2 ;2 miPaleta[i+1].Azul
mov eax, 0
mov [ecx], al ;<0
mov eax, ebx
add eax, 1
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 3 ;3 miPaleta[i+1].Alfa
mov eax, 0
mov [ecx], al ;<0
;---------------------------------------------------------------
mov eax, ebx
add eax, 65
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
;add ecx, 0 ;0
movzx eax, var_c ;k
mov [ecx], al
mov eax, ebx
add eax, 65
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 1 ;1
mov eax, 0 ;<0
mov [ecx], al
mov eax, ebx
add eax, 65
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 2 ;2
mov eax, ebx
shl eax, 2 ;i*4
mov [ecx], al
mov eax, ebx
add eax, 65
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 3
mov eax, 0
mov [ecx], al ;<0
;---------------------------------------------------------------
mov eax, ebx
add eax, 129
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
;add ecx, 0 ;0
mov eax, 0
mov [ecx], al ;0
mov eax, ebx
add eax, 129
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 1 ;1
mov eax, ebx
shl eax, 2 ;i*4
mov [ecx], al
mov eax, ebx
add eax, 129
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 2 ;2
movzx eax, var_c ;k
mov [ecx], al
mov eax, ebx
add eax, 129
shl eax, 2
mov ecx, offset miPaleta
add ecx, eax
add ecx, 3 ;3
mov eax, 0
mov [ecx], al ;0
inc ebx
.until ebx >=64
ret
CreaPaleta endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
start:
invoke GetModuleHandle, NULL
mov wc.hInstance, EAX
invoke GetCommandLine
mov CommandLine, EAX
invoke WinMain, wc.hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, EAX
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WinMain PROC hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW OR CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
mov wc.hbrBackground, 0 ; Color de fondo de la ventana
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET NombreClase
invoke LoadIcon, NULL, cdVIcono
mov wc.hIcon, EAX
mov wc.hIconSm, EAX
invoke LoadCursor, NULL, cdVCursor
mov wc.hCursor, EAX
invoke RegisterClassEx, ADDR wc
test EAX, EAX
jz L_Error
invoke CreateWindowEx,cdVBarTipo,ADDR NombreClase,ADDR MsgCabecera,\
cdVBtnTipo,cdXPos, cdYPos, cdXSize, cdYSize,\
NULL,NULL,hInst,NULL
test EAX, EAX
jz L_Error
mov hwnd, EAX
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg, NULL, 0, 0
.break .if (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax, msg.wParam
jmp L_Fin
L_Error:
invoke MessageBox, NULL,ADDR MsgError, NULL, MB_ICONERROR+MB_OK
L_Fin:
mov eax, msg.wParam
ret
WinMain ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WndProc PROC hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL hFile:HANDLE
LOCAL dwByteswr:dword
mov eax,uMsg
.if eax == WM_DESTROY
invoke KillTimer,hWnd,cdIdTimer
invoke PostQuitMessage, NULL
.elseif eax == WM_CREATE
invoke CenterScreen, hWnd
invoke GetTickCount
mov vdSeed, eax
invoke CreaBmpInfoHead
invoke CreaPaleta
invoke LimpiaBase
invoke CreaBase
invoke SetTimer,hWnd, cdIdTimer, 20, NULL
.elseif eax == WM_TIMER
movzx eax, vdMovimiento
mov ecx, eax
add eax, 1
mov vdMovimiento, al
movzx eax, vdMovimiento
mov ecx, cdMAXCOLOR
cdq
idiv ecx
mov vdMovimiento,dl
invoke InvalidateRect,hWnd, NULL, NULL
.elseif eax == WM_PAINT
invoke BeginPaint,hWnd, addr ps
mov hdc, eax
invoke CreateCompatibleDC,hdc
mov bufDIBDC, eax
invoke CreateDIBSection, hdc, addr LCDBITMAPINFO, DIB_RGB_COLORS, addr pMainDIB, NULL, NULL
mov hMainDIB, eax
invoke SelectObject,bufDIBDC,hMainDIB ; Select bitmap into DC
mov hOldDIB, eax
invoke CreateCompatibleDC,hdc
mov hBackDC, eax
invoke CreateCompatibleBitmap,hdc,cdXSize,cdYSize
mov bufBMP, eax
invoke SelectObject,hBackDC,bufBMP
mov hOldBmp, eax
invoke PintaObjeto
invoke BitBlt,hBackDC, 0, 0, cdXSize, cdYSize,bufDIBDC, 0, 0, SRCCOPY
invoke BitBlt,hdc, 0, 0, cdXSize, cdYSize,hBackDC, 0, 0, SRCCOPY
invoke SelectObject,hBackDC,hOldBmp
invoke DeleteObject,bufBMP
invoke DeleteDC,hBackDC
invoke SelectObject,bufDIBDC,hOldDIB
invoke DeleteObject,hMainDIB
invoke DeleteDC,bufDIBDC
invoke EndPaint,hWnd, addr ps
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WndProc ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end start
EDIT:
got the above code to be worked.
Hello, six_L. Good job. Now it works in WXP. I will update my code according to it. Regards
hi,avcaballero
if changing color from blue, white,grey. which the parameters do i need to modify?
You have to change the palette
hi,avcaballero
thanks.
i'll try to test.
.686
.model flat,stdcall
option casemap:none
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\masm32.inc
include \masm32\include\debug.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\debug.lib
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\macros\macros.asm
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
stPaleta struct
red db ?
green db ?
blue db ?
alpha db ?
stPaleta ends
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
cdXPos EQU 0
cdYPos EQU 0
cdYSize EQU 320
cdXSize EQU 640
cdVIcono EQU IDI_APPLICATION
cdVCursor EQU IDC_ARROW
cdVBarTipo EQU NULL
cdVBtnTipo EQU WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU
cdIdTimer EQU 1212
cdMINCOLOR EQU 1
cdMAXCOLOR EQU 192
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WinMain PROTO :DWORD, :DWORD, :DWORD, :DWORD
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.DATA
NombreClase DB "Plasma Fractal", 0
MsgCabecera DB "Plasma Fractal - (c) abreojosensamblador.net", 0
wc WNDCLASSEX <>
MsgError DB 'Plasma Fractal inicial fallida.',0
LCDBITMAPINFO BITMAPINFOHEADER <0>
vdMovimiento db 0
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.DATA?
CommandLine DD ?
vdSeed dd ?
bufDIBDC dd ? ; HDC
bufBMP dd ? ; HBITMAP
hOldBmp dd ?
;
pMainDIB dd ?
hMainDIB dd ?
hOldDIB dd ?
hBackDC dd ?
;
miPaleta stPaleta cdMAXCOLOR+1 dup(<?>)
vmBase db cdXSize*cdYSize dup(?)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
.CODE
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CenterScreen PROC USES ebx esi edi hWnd:DWORD
LOCAL wRect:RECT
invoke GetWindowRect,hWnd,addr wRect
mov esi, wRect.bottom
sub esi, wRect.top
mov edi, wRect.right
sub edi, wRect.left
invoke GetSystemMetrics,SM_CYSCREEN
shr eax, 1
mov ecx,esi
shr ecx,1
sub eax, ecx
mov ebx, eax
invoke GetSystemMetrics,SM_CXSCREEN
shr eax, 1
mov ecx,edi
shr ecx,1
sub eax, ecx
invoke MoveWindow,hWnd,eax,ebx,edi,esi,FALSE
ret
CenterScreen ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Random proc uses ebx dwNumMIN:dword,dwNumMAX:dword
mov ebx, dwNumMAX
mov eax, vdSeed
xor edx, edx
mov ecx, 127773
div ecx
mov ecx, eax
mov eax, 16807
mul edx
mov edx, ecx
mov ecx, eax
mov eax, 2836
mul edx
sub ecx, eax
xor edx, edx
mov eax, ecx
mov vdSeed, ecx
div ebx ;[base]
mov eax, edx
add eax, dwNumMIN
ret
Random endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaBmpInfoHead PROC
invoke RtlZeroMemory,addr LCDBITMAPINFO,sizeof LCDBITMAPINFO
mov LCDBITMAPINFO.biSize,sizeof LCDBITMAPINFO
mov LCDBITMAPINFO.biWidth,cdXSize
mov eax,cdYSize
and eax,0ffffffffh
mov LCDBITMAPINFO.biHeight,eax
mov LCDBITMAPINFO.biPlanes,1
mov LCDBITMAPINFO.biBitCount,32
mov LCDBITMAPINFO.biCompression,0
ret
CreaBmpInfoHead ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
LeeColor proc px:dword, py:dword
;;;;; Devolvemos el byte de color en eax
mov eax, py
mov ecx, cdXSize
mul ecx
mov ecx, px
add eax,ecx ;py*cdXSize + px
lea ecx,vmBase
add ecx,eax
movzx eax, byte ptr [ecx]
ret
LeeColor endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
EscribeColor proc uses ebx px:dword, py:dword,pc:byte
;;;;; Devolvemos el byte de color en eax
mov eax, py
mov ecx, cdXSize
mul ecx
mov ecx, px
add eax,ecx ;py*cdXSize + px
lea ecx,vmBase
add ecx, eax
movzx eax,pc
mov [ecx], al
ret
EscribeColor endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
adjust proc uses ebx esi edi xa:dword, ya:dword, x0:dword, y0:dword, xb:dword, yb:dword
invoke LeeColor, x0, y0 ; Byte en AL
cmp eax,0
jnz @a_exit
mov eax, xa
sub eax, xb
test eax,eax
jge @a_next1
neg eax
@a_next1:
mov ebx, eax
mov eax, ya
sub eax, yb
test eax,eax
jge @a_next2
neg eax
@a_next2:
add ebx, eax ;d, ebx = abs(xa-xb) + abs(ya-yb)
invoke LeeColor,xa,ya ; Byte en AL
movzx esi, al
invoke LeeColor,xb,yb ; Byte en AL
movzx ecx, al
add esi,ecx
shl esi, 5 ; esi,average = ((i+j)<<5),esi=var_c
invoke Random,0,64 ; Lo calculamos
mov ecx,64
cdq
idiv ecx
sub edx, 32
imul edx,ebx ; *abs
shl edx, 1 ; eax = (RAND(64)-32)*ebx*cdROUGHNESS
add esi,edx ; pixel = eax + Average / 64
mov eax,esi
mov ecx,64
cdq
idiv ecx ; (((rand() % 64) - 32) * d * cdROUGHNESS + average)/64
cmp eax, cdMINCOLOR
jge @a_next3
mov eax, cdMINCOLOR
jmp @a_next4
@a_next3:
cmp eax, cdMAXCOLOR
jle @a_next4
mov eax, cdMAXCOLOR
@a_next4:
and eax,0ffh
invoke EscribeColor,x0,y0,al
@a_exit:
ret
adjust endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
sub_divide proc uses ebx esi edi x1:DWORD, y1:DWORD, x2:DWORD, y2:DWORD ; Las CC del recgulo de la pantalla
; Si x2-x1 < 2 && y2-y1 < 2 exit
mov eax, x2
mov ecx, x1
sub eax, ecx
cmp eax, 2
jge @sd_Inicio
mov eax, y2
mov ecx, y1
sub eax, ecx
cmp eax, 2
jge @sd_Inicio
jmp @sd_Fin
@sd_Inicio:
mov eax, x2
mov ecx, x1
add eax, ecx
sar eax, 1 ; esi = x = (x1 + x2) / 2
mov esi, eax
mov eax, y2
mov ecx, y1
add eax, ecx ;edi = y = (y1 + y2) / 2
sar eax, 1
mov edi, eax
invoke adjust,x1,y1,esi,y1,x2,y1 ; adjust(x1,y1,x,y1,x2,y1)
invoke adjust,x2,y1,x2,edi,x2,y2 ; adjust(x2,y1,x2,y,x2,y2)
invoke adjust,x1,y2,esi,y2,x2,y2 ; adjust(x1,y2,x,y2,x2,y2)
invoke adjust,x1,y1,x1,edi,x1,y2 ; adjust(x1,y1,x1,y,x1,y2)
invoke LeeColor,esi,edi ; Byte en AL
cmp eax,0
jnz @sd_Dividir
invoke LeeColor,x1,y1 ; Byte en AL
mov ebx, eax
invoke LeeColor,x2,y1 ; Byte en AL
add ebx, eax
invoke LeeColor,x2,y2 ; Byte en AL
add ebx, eax
invoke LeeColor,x1,y2 ; Byte en AL
add ebx, eax
mov eax,ebx
sar eax, 2
and eax,0ffh
invoke EscribeColor,esi,edi,al
@sd_Dividir:
invoke sub_divide,x1,y1,esi,edi ; sub_divide(x1,y1,x,y);
invoke sub_divide,esi,y1,x2,edi ; sub_divide(x,y1,x2,y);
invoke sub_divide,esi,edi,x2,y2 ; sub_divide(x,y,x2,y2);
invoke sub_divide,x1,edi,esi,y2 ; sub_divide(x1,y,x,y2);
@sd_Fin:
ret
sub_divide endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaBase proc
local i:byte
local j:byte
local k:byte
local m:byte
invoke Random,0,cdMAXCOLOR ; Lo calculamos
mov ecx, cdMAXCOLOR ; R aleatorio
cdq
idiv ecx
add edx,1
mov i, dl ; Esq superior izquierda
invoke Random,0,cdMAXCOLOR ; Lo calculamos
mov ecx, cdMAXCOLOR ; R aleatorio
cdq
idiv ecx
add edx,1
mov j, dl ;
invoke Random,0,cdMAXCOLOR ; Lo calculamos
mov ecx, cdMAXCOLOR ; R aleatorio
cdq
idiv ecx
add edx,1
mov k, dl ;
invoke Random,0,cdMAXCOLOR ; Lo calculamos
mov ecx, cdMAXCOLOR ; R aleatorio
cdq
idiv ecx
add edx,1
mov m, dl ;
invoke EscribeColor, 0, 0, i
invoke EscribeColor, cdXSize-1, 0, j
invoke EscribeColor, cdXSize-1,cdYSize-1,k
invoke EscribeColor, 0,cdYSize-1,m
invoke sub_divide, 0, 0, cdXSize-1, cdYSize-1
ret
CreaBase endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
PintaObjeto proc uses ebx esi edi
local var_pixel:dword
local var_m:byte
mov eax, cdYSize
mov ecx, cdXSize
xor edx,edx
mul ecx
dec eax ;cdYSize*cdXSize - 1
mov ebx,eax
xor esi,esi ;k
.repeat
lea eax,vmBase
add eax,ebx
movzx ecx, byte ptr [eax]
movzx edx, vdMovimiento
add ecx,edx ;m+vbMovimiento
mov eax,ecx
mov ecx,cdMAXCOLOR
cdq
idiv ecx
add edx,1
mov var_m,dl ;m = (m + vbMovimiento) % (cdMAXCOLOR+0) + 1
movzx eax,var_m
movzx eax, byte ptr miPaleta[eax*4].red
mov var_pixel,eax ;miPaleta[m].Azul
movzx eax,var_m
movzx eax, byte ptr miPaleta[eax*4].green ;miPaleta[m].Verde
shl eax,8
mov ecx,var_pixel
add ecx,eax
mov var_pixel,ecx
movzx eax,var_m
movzx eax, byte ptr miPaleta[eax*4].blue ;miPaleta[m].Rojo
shl eax,16
mov ecx,var_pixel
add ecx,eax
mov var_pixel,ecx
mov ecx,pMainDIB
mov eax,esi
shl eax,2
add ecx,eax
mov eax,var_pixel
mov [ecx],eax ;*(pMainDIB + k) = c
inc esi
dec ebx
.until ebx<=0
ret
PintaObjeto endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
CreaPaleta proc uses ebx esi edi
local var_c:byte
mov miPaleta[0].red, 0;33*4
mov miPaleta[0].green,0;10*4
mov miPaleta[0].blue, 255;19*4
xor ebx, ebx ;i
.repeat
mov eax, ebx
shl eax, 2 ; i*4
mov ecx, 0FCh ; 63*4 ; k
sub ecx, eax ; 63*4 - i*4
and ecx, 0FFh
mov var_c, cl ;k
;---------------------------------------------------------------
mov eax, ebx
shl eax, 2 ;i*4
.if eax >=128
mov miPaleta[ebx*4+4].red, al
.else
mov miPaleta[ebx*4+4].red, 128
.endif
mov eax, 0
mov miPaleta[ebx*4+4].green, al
mov eax, 0
mov miPaleta[ebx*4+4].blue, al
;---------------------------------------------------------------
mov eax, ebx
shl eax, 2 ;i*4
.if eax >=128
mov miPaleta[ebx*4+4*65].red, al
mov miPaleta[ebx*4+4*65].green,al
mov miPaleta[ebx*4+4*65].blue,al
.else
mov miPaleta[ebx*4+4*65].red, 128
mov miPaleta[ebx*4+4*65].green, 128
mov miPaleta[ebx*4+4*65].blue, 128
.endif
;---------------------------------------------------------------
movzx eax, var_c
.if eax >=128
mov miPaleta[ebx*4+4*129].red, al
mov miPaleta[ebx*4+4*129].green,al
mov miPaleta[ebx*4+4*129].blue,al
.else
mov miPaleta[ebx*4+4*129].red, 128
mov miPaleta[ebx*4+4*129].green, 128
mov miPaleta[ebx*4+4*129].blue, 128
.endif
;---------------------------------------------------------------
inc ebx
.until ebx >=64 ;256/4=64
ret
CreaPaleta endp
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
start:
invoke GetModuleHandle, NULL
mov wc.hInstance, EAX
invoke GetCommandLine
mov CommandLine, EAX
invoke WinMain, wc.hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, EAX
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WinMain PROC hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW OR CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
mov wc.hbrBackground, 0 ; Color de fondo de la ventana
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET NombreClase
invoke LoadIcon, NULL, cdVIcono
mov wc.hIcon, EAX
mov wc.hIconSm, EAX
invoke LoadCursor, NULL, cdVCursor
mov wc.hCursor, EAX
invoke RegisterClassEx, ADDR wc
test EAX, EAX
jz L_Error
invoke CreateWindowEx,cdVBarTipo,ADDR NombreClase,ADDR MsgCabecera,\
cdVBtnTipo,cdXPos, cdYPos, cdXSize, cdYSize,\
NULL,NULL,hInst,NULL
test EAX, EAX
jz L_Error
mov hwnd, EAX
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg, NULL, 0, 0
.break .if (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax, msg.wParam
jmp L_Fin
L_Error:
invoke MessageBox, NULL,ADDR MsgError, NULL, MB_ICONERROR+MB_OK
L_Fin:
mov eax, msg.wParam
ret
WinMain ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
WndProc PROC hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL hFile:HANDLE
LOCAL dwByteswr:dword
mov eax,uMsg
.if eax == WM_DESTROY
invoke KillTimer,hWnd,cdIdTimer
invoke PostQuitMessage, NULL
.elseif eax == WM_CREATE
invoke CenterScreen, hWnd
invoke GetTickCount
mov vdSeed, eax
invoke CreaBmpInfoHead
invoke CreaPaleta
invoke RtlZeroMemory,addr vmBase,sizeof vmBase
invoke CreaBase
invoke SetTimer,hWnd, cdIdTimer, 50, NULL
.elseif eax == WM_TIMER
movzx eax, vdMovimiento
mov ecx, eax
add eax, 1
mov vdMovimiento, al
movzx eax, vdMovimiento
mov ecx, cdMAXCOLOR
cdq
idiv ecx
mov vdMovimiento,dl
invoke InvalidateRect,hWnd, NULL, NULL
.elseif eax == WM_PAINT
invoke BeginPaint,hWnd, addr ps
mov hdc, eax
invoke CreateCompatibleDC,hdc
mov bufDIBDC, eax
invoke CreateDIBSection, hdc, addr LCDBITMAPINFO, DIB_RGB_COLORS, addr pMainDIB, NULL, NULL
mov hMainDIB, eax
invoke SelectObject,bufDIBDC,hMainDIB ; Select bitmap into DC
mov hOldDIB, eax
invoke CreateCompatibleDC,hdc
mov hBackDC, eax
invoke CreateCompatibleBitmap,hdc,cdXSize,cdYSize
mov bufBMP, eax
invoke SelectObject,hBackDC,bufBMP
mov hOldBmp, eax
invoke PintaObjeto
invoke BitBlt,hBackDC, 0, 0, cdXSize, cdYSize,bufDIBDC, 0, 0, SRCCOPY
invoke BitBlt,hdc, 0, 0, cdXSize, cdYSize,hBackDC, 0, 0, SRCCOPY
invoke SelectObject,hBackDC,hOldBmp
invoke DeleteObject,bufBMP
invoke DeleteDC,hBackDC
invoke SelectObject,bufDIBDC,hOldDIB
invoke DeleteObject,hMainDIB
invoke DeleteDC,bufDIBDC
invoke EndPaint,hWnd, addr ps
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WndProc ENDP
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end start
untill now there are not the blue sky and the white clouds effect.