News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

PlasmaFractal

Started by six_L, October 28, 2014, 12:21:07 AM

Previous topic - Next topic

six_L

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
Say you, Say me, Say the codes together for ever.

avcaballero

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

six_L

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.
Say you, Say me, Say the codes together for ever.

avcaballero

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...

TouEnMasm

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
Fa is a musical note to play with CL

six_L

#5
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.
Say you, Say me, Say the codes together for ever.

avcaballero

Hello, six_L. Good job. Now it works in WXP. I will update my code according to it. Regards

six_L

hi,avcaballero
if changing color from blue, white,grey. which the parameters do i need to modify?
Say you, Say me, Say the codes together for ever.

avcaballero

You have to change the palette

six_L

#9
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.
Say you, Say me, Say the codes together for ever.