;---------------------------------------;
; DDRAW Plasma Demo ;
; ;
; Author : X-Calibre ;
; ASM version : Ewald Snel ;
; Copyright (C) 1999, Diamond Crew ;
; ;
; https://here.is/diamond/ ;
;---------------------------------------;
EXCLUSIVE equ 1
; View with TAB size 4
TITLE WIN32ASM EXAMPLE
.486
.MODEL FLAT, STDCALL
option casemap :none
;-----------------------------------------------------------;
; WIN32ASM / DDRAW PLASMA DEMO ;
;-----------------------------------------------------------;
.nolist
.nocref
WIN32_LEAN_AND_MEAN equ 1
COBJMACROS equ 1
INCLUDE windows.inc
INCLUDE ddraw.inc
.list
.cref
INCLUDELIB gdi32.lib
INCLUDELIB kernel32.lib
INCLUDELIB user32.lib
INCLUDELIB ddraw.lib
nextFrame PROTO
initPlasma PROTO
RETURN MACRO arg
IFNB <arg>
mov eax, arg
ENDIF
ret
ENDM
LRETURN MACRO arg
IFNB <arg>
mov eax, arg
ENDIF
leave
ret
ENDM
FATAL MACRO msg
LOCAL @@msg
.DATA
@@msg db msg, 0
.CODE
INVOKE MessageBox, hWnd, ADDR @@msg, ADDR szDisplayName, MB_OK
INVOKE ExitProcess, 0
ENDM
.DATA?
hWnd HWND ? ; surface window
lpDD LPDIRECTDRAW ? ; DDraw object
lpDDSPrimary LPDIRECTDRAWSURFACE ? ; DDraw primary surface
ddsd DDSURFACEDESC <?>; DDraw surface descriptor
ddscaps DDSCAPS <?>; DDraw capabilities
palette dd 256 dup (?)
table dd 512 dup (?)
.DATA
ddwidth EQU 800 ; display mode width
ddheight EQU 600 ; display mode height
ddbpp EQU 32 ; display mode color depth
BYTESPIXEL equ 4
phaseA dd 0
phaseB dd 0
factor1 EQU -1
factor2 EQU 1
factor3 EQU 1
factor4 EQU -1
red REAL4 300.0
green REAL4 320.0
blue REAL4 340.0
scale1 REAL4 2.0
scale2 REAL4 127.5
scale3 REAL4 256.0
szClassName db "DDRAW Plasma Demo", 0 ; class name
szDisplayName EQU <szClassName> ; window name
wc WNDCLASSEX < sizeof WNDCLASSEX, CS_HREDRAW or CS_VREDRAW, offset WndProc, 0, 0, , 0, 0, , 0, offset szClassName, 0 >
.CODE
start:
INVOKE GetModuleHandle, NULL
INVOKE WinMain, eax, NULL, NULL, SW_SHOWDEFAULT
INVOKE ExitProcess, eax
;-----------------------------------------------------------;
; Calculate Next Plasma Frame ;
;-----------------------------------------------------------;
nextFrame PROC
push ebx
push esi
push edi
mov ecx, ddheight ; # of scanlines
mov edi, [ddsd.lpSurface] ; pixel output
@@scanline:
push ecx
push edi
mov esi, [phaseA]
mov edx, [phaseB]
sub esi, ecx
and edx, 0FFh
and esi, 0FFh
mov edx, [table][4*edx][256*4]
mov esi, [table][4*esi] ; [x] + table0[a + y]
sub edx, ecx ; [y] + table1[b]
mov ecx, ddwidth ; [x] --> pixel counter
@@pixel:
and esi, 0FFh
and edx, 0FFh
mov eax, [table][4*esi]
mov ebx, [table][4*edx][256*4]
add eax, ebx
add esi, factor3
shr eax, 1
add edx, factor4
and eax, 0FFh
add edi, BYTESPIXEL
mov eax, [palette][4*eax]
dec ecx
mov [edi][-BYTESPIXEL], eax
jnz @@pixel
pop edi
pop ecx
add edi, [ddsd.lPitch] ; inc. display position
dec ecx
jnz @@scanline
add [phaseA], factor1
add [phaseB], factor2
pop edi
pop esi
pop ebx
ret
nextFrame ENDP
;-----------------------------------------------------------;
; Initalize Plasma Tables ;
;-----------------------------------------------------------;
initPlasma PROC
LOCAL @@i :DWORD
LOCAL @@r :DWORD
LOCAL @@g :DWORD
LOCAL @@b :DWORD
LOCAL temp :DWORD
mov [@@i], 0
.WHILE @@i < 256
mov edx, [@@i]
; Calculate table0 value
fldpi
fimul [@@i]
fmul [scale1]
fdiv [scale3]
fsin
fmul [scale2]
fadd [scale2]
fistp [table][4*edx]
; Calculate table1 value
fldpi
fimul [@@i]
fmul [scale1]
fdiv [scale3]
fcos
fmul [scale2]
fadd [scale2]
fldpi
fmulp st(1), st
fmul [scale1]
fdiv [scale3]
fsin
fmul [scale2]
fadd [scale2]
fistp [table][4*edx][4*256]
; Calculate palette value
xor eax, eax
FOR comp, <red, green, blue>
fldpi
fimul [@@i]
fmul [scale1]
fdiv [comp]
fcos
fmul [scale2]
fadd [scale2]
fistp [temp]
shl eax, 8
or eax, [temp]
ENDM
mov [palette][4*edx] , eax
inc [@@i]
.ENDW
ret
initPlasma ENDP
;-----------------------------------------------------------;
; WinMain ( entry point ) ;
;-----------------------------------------------------------;
WinMain PROC hInst :HINSTANCE,
hPrevInst :HINSTANCE,
CmdLine :LPSTR,
CmdShow :DWORD
LOCAL msg :MSG
; Fill WNDCLASSEX structure with required variables
mov eax, [hInst]
mov [wc.hInstance], eax
INVOKE GetStockObject, BLACK_BRUSH
mov [wc.hbrBackground], eax
INVOKE RegisterClassEx, ADDR wc
; Create window at following size
if EXCLUSIVE
INVOKE CreateWindowEx, 0, ADDR szClassName, ADDR szDisplayName, WS_POPUP, 0, 0, ddwidth, ddheight, NULL, NULL, hInst, NULL
else
INVOKE CreateWindowEx, 0, ADDR szClassName, ADDR szDisplayName, WS_POPUP, 100, 100, ddwidth, ddheight, NULL, NULL, hInst, NULL
endif
mov [hWnd], eax
INVOKE SetFocus, hWnd
if EXCLUSIVE
INVOKE ShowCursor, 0
endif
; Initialize display
INVOKE DirectDrawCreate, NULL, ADDR lpDD, NULL
.IF eax != DD_OK
FATAL "Couldn't init DirectDraw"
.ENDIF
if EXCLUSIVE
INVOKE IDirectDraw_SetCooperativeLevel(lpDD, hWnd, DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN)
else
INVOKE IDirectDraw_SetCooperativeLevel(lpDD, hWnd, DDSCL_NORMAL)
endif
.IF eax != DD_OK
FATAL "Couldn't set DirectDraw cooperative level"
.ENDIF
if EXCLUSIVE
INVOKE IDirectDraw_SetDisplayMode(lpDD, ddwidth, ddheight, ddbpp)
.IF eax != DD_OK
FATAL "Couldn't set display mode"
.ENDIF
endif
mov [ddsd.dwSize], sizeof DDSURFACEDESC
mov [ddsd.dwFlags], DDSD_CAPS
mov [ddsd.ddsCaps.dwCaps], DDSCAPS_PRIMARYSURFACE
INVOKE IDirectDraw_CreateSurface(lpDD, ADDR ddsd, ADDR lpDDSPrimary, NULL)
.IF eax != DD_OK
FATAL "Couldn't create primary surface"
.ENDIF
INVOKE ShowWindow, hWnd, CmdShow
call initPlasma
; Loop until PostQuitMessage is sent
.WHILE 1
INVOKE PeekMessage, ADDR msg, NULL, 0, 0, PM_REMOVE
.IF eax != 0
.IF msg.message == WM_QUIT
INVOKE PostQuitMessage, msg.wParam
.BREAK
.ELSE
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.ENDIF
.ELSE
INVOKE GetFocus
.IF eax == hWnd
mov [ddsd.dwSize], sizeof DDSURFACEDESC
mov [ddsd.dwFlags], DDSD_PITCH
.WHILE 1
INVOKE IDirectDrawSurface_Lock(lpDDSPrimary, NULL, ADDR ddsd, DDLOCK_WAIT, NULL)
.BREAK .IF eax == DD_OK
.IF (eax == DDERR_SURFACELOST)
INVOKE IDirectDrawSurface_Restore(lpDDSPrimary)
.ELSE
FATAL "Couldn't lock surface"
.ENDIF
.ENDW
INVOKE IDirectDraw_WaitForVerticalBlank(lpDD, DDWAITVB_BLOCKBEGIN, NULL)
call nextFrame
INVOKE IDirectDrawSurface_Unlock(lpDDSPrimary, ddsd.lpSurface)
.ENDIF
.ENDIF
.ENDW
if EXCLUSIVE
INVOKE IDirectDraw_RestoreDisplayMode(lpDD)
.IF eax != DD_OK
FATAL "Couldn't restore displaymode"
.ENDIF
endif
INVOKE DestroyWindow, hWnd
.IF eax == NULL
FATAL "Couldn't destroy window"
.ENDIF
.IF lpDD != NULL
.IF lpDDSPrimary != NULL
INVOKE IDirectDrawSurface_Release(lpDDSPrimary)
mov [lpDDSPrimary], NULL
.ENDIF
INVOKE IDirectDraw_Release(lpDD)
mov [lpDD], NULL
.ENDIF
ret
WinMain ENDP
;-----------------------------------------------------------;
; Window Proc ( handle events ) ;
;-----------------------------------------------------------;
WndProc PROC hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
.IF uMsg == WM_KEYDOWN
.IF wParam == VK_ESCAPE
INVOKE PostQuitMessage, NULL
RETURN 0
.ENDIF
.ELSEIF uMsg == WM_DESTROY
INVOKE PostQuitMessage, NULL
RETURN 0
.ENDIF
INVOKE DefWindowProc, hWin, uMsg, wParam, lParam
ret
WndProc ENDP
END start
|