When Boredom Strikes

Published June 05, 2012
Advertisement
Washu does crazy things. In this case I wrote this up...


.586
.model flat, stdcall
option casemap :none

@ArgRev MACRO arglist:REQ
LOCAL txt, arg
txt TEXTEQU <>
% FOR arg,
txt CATSTR , <,>, txt
ENDM

txt SUBSTR txt, 1, @SizeStr( %txt ) - 1
txt CATSTR , txt, >
EXITM txt
ENDM

INVOKEC MACRO comObject, methodNumber, args:VARARG
LOCAL txt
IFNB
% FOR arg, @ArgRev( )
push arg
ENDM
ENDIF
mov ecx, dword ptr [comObject]
push ecx
mov eax, [ecx]
mov edx, dword ptr [eax + methodNumber];
call edx
ENDM

RELEASE MACRO comObject
LOCAL skip
cmp comObject, 0
jz skip
INVOKEC comObject, IUnknown_Release
skip:
ENDM

DEFINEGUID MACRO name, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11
name DD _1
DW _2
DW _3
DB _4
DB _5
DB _6
DB _7
DB _8
DB _9
DB _10
DB _11
ENDM

ExitProcess PROTO stdcall :DWORD
MessageBoxA PROTO stdcall :DWORD, :DWORD, :DWORD, :DWORD
RegisterClassExA PROTO stdcall :DWORD
GetModuleHandleA PROTO stdcall :DWORD
DefWindowProcA PROTO stdcall :DWORD, :DWORD, :DWORD, :DWORD
CreateWindowExA PROTO stdcall :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
PostQuitMessage PROTO stdcall :DWORD
ShowWindow PROTO stdcall :DWORD, :DWORD
UpdateWindow PROTO stdcall :DWORD
PeekMessageA PROTO stdcall :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
TranslateMessage PROTO stdcall :DWORD
DispatchMessageA PROTO stdcall :DWORD
D3D11CreateDeviceAndSwapChain PROTO stdcall :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD

POINT STRUC 4
x DWORD ?
y DWORD ?
POINT ENDS

MSG STRUC 4
hwnd DWORD ?
message DWORD ?
wparam WORD ?
lparam DWORD ?
time DWORD ?
point POINT <>
MSG ENDS

WNDCLASSEX STRUC 4
cbSize DWORD SIZEOF(WNDCLASSEX)
style DWORD CW_VREDRAW OR CW_HREDRAW OR CW_OWNDC
lpfnWndProc DWORD WndProc
cbClsExtra DWORD 0
cbWndExtra DWORD 0
hInstance DWORD ?
hIcon DWORD 0
hCursor DWORD 0
hbrBackground DWORD COLOR_BACKGROUND
lpszMenuName DWORD 0
lpszClassName DWORD className
hIconSm DWORD 0
WNDCLASSEX ENDS

DXGI_RATIONAL STRUC 4
numerator DWORD ?
denominator DWORD ?
DXGI_RATIONAL ENDS

DXGI_MODE_DESC STRUC 4
w DWORD 800
h DWORD 600
refreshRate DXGI_RATIONAL <1, 60>
format DWORD DXGI_FORMAT_R8G8B8A8_UNORM
scanLineOrder DWORD 0
scaling DWORD 0
DXGI_MODE_DESC ENDS

DXGI_SWAP_CHAIN_DESC STRUC 4
bufferDesc DXGI_MODE_DESC <>
sampleDesc DXGI_RATIONAL <1, 0>
usage DWORD 20h OR 40h
bufferCount DWORD 2
window DWORD ?
windowed DWORD 1
swapEffect DWORD 0
flags DWORD 0
DXGI_SWAP_CHAIN_DESC ENDS

MB_OK EQU 0
SW_SHOW EQU 5
CW_VREDRAW EQU 1
CW_HREDRAW EQU 2
CW_OWNDC EQU 20h
COLOR_BACKGROUND EQU 1
WS_OVERLAPPED EQU 00000000h
WS_MINIMIZEBOX EQU 00020000h
WS_MAXIMIZEBOX EQU 00020000h
WS_SYSMENU EQU 00080000h
WS_THICKFRAME EQU 00040000h
WS_CAPTION EQU 00C00000h
WS_OVERLAPPEDWINDOW EQU WS_OVERLAPPED OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX OR WS_SYSMENU OR WS_THICKFRAME OR WS_CAPTION
WM_QUIT EQU 0012h

D3D_DRIVER_TYPE_UNKNOWN EQU 0
D3D_DRIVER_TYPE_HARDWARE EQU ( D3D_DRIVER_TYPE_UNKNOWN + 1 )
D3D11_CREATE_DEVICE_SINGLETHREADED EQU 1
D3D_FEATURE_LEVEL_11_0 EQU 0b000h
DXGI_FORMAT_R8G8B8A8_UNORM EQU 28

IUnknown_QueryInterface EQU 0h
IUnknown_AddRef EQU 4h
IUnknown_Release EQU 8h

IDXGISwapChain_GetBuffer EQU 24h
IDXGISwapChain_Present EQU 20h

ID3D11Device_CreateRTView EQU 24h

ID3D11Context_ClearRTView EQU 0C8h

.data
msgTitle DB "Oh shit son!", 0
regFail DB "Failed to register window class.", 0
cwFail DB "Failed to create window.", 0
showFail DB "Failed to show window.", 0
updateFail DB "Failed to update window.", 0
d3d11Fail1 DB "Failed to create D3D11 device.", 0
d3d11Fail2 DB "Failed to get back buffer from swap chain.", 0
d3d11Fail3 DB "Failed to create render target.", 0

messageIdx DD regFail, cwFail, showFail, updateFail, d3d11Fail1, d3d11Fail2, d3d11Fail3

className DB "TestClass", 0
windowTitle DB "My Window", 0
wndClass WNDCLASSEX <>
swapDesc DXGI_SWAP_CHAIN_DESC <>
featureLvl DD D3D_FEATURE_LEVEL_11_0
swapChain DD 0
device DD 0
newFeatLvl DD 0
context DD 0

blackColor DD 0, 0, 0, 0
backBuffer DD 0
view DD 0
DEFINEGUID ID3D11Texture2D_GUID, 6f15aaf2h, 0d208h, 04e89h, 09ah, 0b4h, 048h, 095h, 035h, 0d3h, 04fh, 09Ch

.code
WndProc PROC stdcall hwnd:DWORD, msg:DWORD, wparam:WORD, lparam:DWORD
cmp msg, 2
jnz done
INVOKE PostQuitMessage, 0
xor eax, eax
ret
done:
INVOKE DefWindowProcA, hwnd, msg, wparam, lparam
ret;
WndProc ENDP

main PROC
LOCAL hwnd:DWORD
LOCAL hmodule:DWORD
LOCAL msg:MSG

INVOKE GetModuleHandleA, 0
mov hmodule, eax
mov wndClass.hInstance, eax

INVOKE RegisterClassExA, ADDR wndClass
cmp eax, 0
mov eax, 0
jz error

INVOKE CreateWindowExA, 0, ADDR className, ADDR windowTitle, WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, 0, 0, hmodule, 0
mov hwnd, eax
cmp eax, 0
mov eax, 1
jz error

INVOKE ShowWindow, hwnd, SW_SHOW
INVOKE UpdateWindow, hwnd
cmp eax, 0
mov eax, 3
jz error

mov eax, hwnd
mov swapDesc.window, eax

INVOKE D3D11CreateDeviceAndSwapChain, 0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, ADDR featureLvl, 1, 7, ADDR swapDesc, ADDR swapChain, ADDR device, ADDR newFeatLvl, ADDR context
cmp eax, 0
mov eax, 4
jnz error

lea eax, [backBuffer]
INVOKEC swapChain, IDXGISwapChain_GetBuffer, 0, OFFSET ID3D11Texture2D_GUID, eax
cmp eax, 0
mov eax, 5
jnz error

lea eax, [view]
INVOKEC device, ID3D11Device_CreateRTView, dword ptr [backBuffer], 0, eax
cmp eax, 0
mov eax, 6
jnz error

gameLoop:
msgLoop:
INVOKE PeekMessageA, ADDR msg, 0, 0, 0, 1
cmp eax, 0
jz gameNext
cmp msg.message, WM_QUIT
jz done
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessageA, ADDR msg
jmp msgLoop
gameNext:
INVOKEC context, ID3D11Context_ClearRTView, view, OFFSET blackColor
INVOKEC swapChain, IDXGISwapChain_Present, 0, 0
jmp gameLoop

done:
RELEASE view
RELEASE backBuffer
RELEASE swapChain
RELEASE device
RELEASE context
INVOKE ExitProcess, eax
ret
error:
mov eax, messageIdx[eax*4]
INVOKE MessageBoxA, 0, eax, ADDR msgTitle, MB_OK
RELEASE view
RELEASE backBuffer
RELEASE swapChain
RELEASE device
RELEASE context
INVOKE ExitProcess, eax
main ENDP
END main


If you're asking yourself "Is that a Win32 application that creates a D3D11 device, clears the render target, and then presents it?" Then yes. It is.
0 likes 5 comments

Comments

Ashaman73
The last time I wrote assembler was for the 68000, therefore respect, you seem really bored ;-)
June 05, 2012 05:32 AM
ApochPiQ
Pfft, macro assemblers.

Real men juggle their stack frames by hand.
June 05, 2012 07:31 AM
Mike.Popoloski
Now you need to write an assembly program that when run emits a PE file that initializes D3D11 and then launches that executable.
June 05, 2012 11:59 PM
jpetrie
Or you could do something useful with your time and work on SlimDX.
June 06, 2012 04:11 PM
Washu
Psh, what would be the fun in that?
June 06, 2012 06:29 PM
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!
Advertisement