Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!






When Boredom Strikes

Posted by Washu, 04 June 2012 · 1,406 views

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, <arglist>
        txt CATSTR <arg>, <,>, txt
    ENDM

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

INVOKEC    MACRO comObject, methodNumber, args:VARARG
     LOCAL txt
     IFNB <args>
%       FOR arg, @ArgRev( <args> )
            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.




The last time I wrote assembler was for the 68000, therefore respect, you seem really bored ;-)
Pfft, macro assemblers.

Real men juggle their stack frames by hand.
Now you need to write an assembly program that when run emits a PE file that initializes D3D11 and then launches that executable.
Or you could do something useful with your time and work on SlimDX.
Psh, what would be the fun in that?

Recent Entries

Recent Comments

December 2014 »

S M T W T F S
 123456
78910111213
14151617181920
21222324 25 2627
28293031   
PARTNERS