Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

DirectDraw & FPU

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vladimir Shulakov
    replied
    '------------------------------------------------------------------------------
    '
    ' DDRAW.INC -- DirectDraw Include for PB/DLL 5.0 Release 1 **ALPHA**
    ' [ddraw.h]
    ' Copyright 1999 sublevel6.
    ' Portions copyright Microsoft.
    '
    ' Release date: Tuesday, June 29, 1999
    ' Homepage: http://www.force927.com/sublevel6
    ' E-Mail: [email protected] (to all members)
    ' [email protected] (to Dinky)
    ' [email protected] (to rYme)
    '------------------------------------------------------------------------------
    %PBDDAPI = 1

    $IF NOT %DEF(%DIRECTDRAW_VERSION)
    %DIRECTDRAW_VERSION = &H0500
    $ENDIF


    ' To reduce the size of the compiled EXE you can disable support
    ' for some of the DirectDraw Interfaces by defining the following
    ' constants in your code:

    ' %PBDD_NODD = 1 ' Disable support for IDirectDraw (why?)
    ' %PBDD_NODDCLIPPER = 1 ' Disable support for IDirectDrawClipper
    ' %PBDD_NODDCOLORCONTROL = 1 ' Disable support for IDirectDrawColorControl
    ' %PBDD_NODDPALETTE = 1 ' Disable support for IDirectDrawPalette
    ' %PBDD_NODDSURFACE = 1 ' Disable support for IDirectDrawSurface


    ' GUIDs
    GLOBAL CLSID_DirectDraw AS STRING * 16 ' {D7B70EE0-4340-11CF-B063-0020AFC2CD35}
    GLOBAL CLSID_DirectDrawClipper AS STRING * 16 ' {593817A0-7DB3-11CF-A2DE-00AA00b93356}
    GLOBAL IID_IDirectDraw AS STRING * 16 ' {6C14DB80-A733-11CE-A521-0020AF0BE560}
    GLOBAL IID_IDirectDraw2 AS STRING * 16 ' {B3A6F3E0-2B43-11CF-A2DE-00AA00B93356}
    GLOBAL IID_IDirectDrawSurface AS STRING * 16 ' {6C14DB81-A733-11CE-A521-0020AF0BE560}
    GLOBAL IID_IDirectDrawSurface2 AS STRING * 16 ' {57805885-6eec-11cf-9441-a82303c10e27}
    GLOBAL IID_IDirectDrawSurface3 AS STRING * 16 ' {DA044E00-69B2-11D0-A1D5-00AA00B8DFBB}
    GLOBAL IID_IDirectDrawPalette AS STRING * 16 ' {6C14DB84-A733-11CE-A521-0020AF0BE560}
    GLOBAL IID_IDirectDrawClipper AS STRING * 16 ' {6C14DB85-A733-11CE-A521-0020AF0BE560}
    GLOBAL IID_IDirectDrawColorControl AS STRING * 16 ' {4B9F0EE0-0D7E-11D0-9B06-00A0C903A3B8}


    %DD_OK = &H0
    %DDENUMRET_OK = &H1
    %DDENUMRET_CANCEL = &H0
    %DDENUM_ATTACHEDSECONDARYDEVICES = &H1
    %DDENUM_DETACHEDSECONDARYDEVICES = &H2
    %DDENUM_NONDISPLAYDEVICES = &H4
    %DDCREATE_HARDWAREONLY = &H1
    %DDCREATE_EMULATIONONLY = &H2
    %DD_ROP_SPACE = &H8
    %DDSD_CAPS = &H1
    %DDSD_HEIGHT = &H2
    %DDSD_WIDTH = &H4
    %DDSD_PITCH = &H8
    %DDSD_BACKBUFFERCOUNT = &H20
    %DDSD_ZBUFFERBITDEPTH = &H40
    %DDSD_ALPHABITDEPTH = &H80
    %DDSD_LPSURFACE = &H800
    %DDSD_PIXELFORMAT = &H1000
    %DDSD_CKDESTOVERLAY = &H2000
    %DDSD_CKDESTBLT = &H4000
    %DDSD_CKSRCOVERLAY = &H8000
    %DDSD_CKSRCBLT = &H10000
    %DDSD_MIPMAPCOUNT = &H20000
    %DDSD_REFRESHRATE = &H40000
    %DDSD_LINEARSIZE = &H80000
    %DDSD_ALL = &Hff9ee
    %DDCOLOR_BRIGHTNESS = &H1
    %DDCOLOR_CONTRAST = &H2
    %DDCOLOR_HUE = &H4
    %DDCOLOR_SATURATION = &H8
    %DDCOLOR_SHARPNESS = &H10
    %DDCOLOR_GAMMA = &H20
    %DDCOLOR_COLORENABLE = &H40
    %DDSCAPS_RESERVED1 = &H1
    %DDSCAPS_ALPHA = &H2
    %DDSCAPS_BACKBUFFER = &H4
    %DDSCAPS_COMPLEX = &H8
    %DDSCAPS_FLIP = &H10
    %DDSCAPS_FRONTBUFFER = &H20
    %DDSCAPS_OFFSCREENPLAIN = &H40
    %DDSCAPS_OVERLAY = &H80
    %DDSCAPS_PALETTE = &H100
    %DDSCAPS_PRIMARYSURFACE = &H200
    %DDSCAPS_PRIMARYSURFACELEFT = &H400
    %DDSCAPS_SYSTEMMEMORY = &H800
    %DDSCAPS_TEXTURE = &H1000
    %DDSCAPS_3DDEVICE = &H2000
    %DDSCAPS_VIDEOMEMORY = &H4000
    %DDSCAPS_VISIBLE = &H8000
    %DDSCAPS_WRITEONLY = &H10000
    %DDSCAPS_ZBUFFER = &H20000
    %DDSCAPS_OWNDC = &H40000
    %DDSCAPS_LIVEVIDEO = &H80000
    %DDSCAPS_HWCODEC = &H100000
    %DDSCAPS_MODEX = &H200000
    %DDSCAPS_MIPMAP = &H400000
    %DDSCAPS_RESERVED2 = &H800000
    %DDSCAPS_ALLOCONLOAD = &H4000000
    %DDSCAPS_VIDEOPORT = &H8000000
    %DDSCAPS_LOCALVIDMEM = &H10000000
    %DDSCAPS_NONLOCALVIDMEM = &H20000000
    %DDSCAPS_STANDARDVGAMODE = &H40000000
    %DDSCAPS_OPTIMIZED = &H80000000
    %DDCAPS_3D = &H1
    %DDCAPS_ALIGNBOUNDARYDEST = &H2
    %DDCAPS_ALIGNSIZEDEST = &H4
    %DDCAPS_ALIGNBOUNDARYSRC = &H8
    %DDCAPS_ALIGNSIZESRC = &H10
    %DDCAPS_ALIGNSTRIDE = &H20
    %DDCAPS_BLT = &H40
    %DDCAPS_BLTQUEUE = &H80
    %DDCAPS_BLTFOURCC = &H100
    %DDCAPS_BLTSTRETCH = &H200
    %DDCAPS_GDI = &H400
    %DDCAPS_OVERLAY = &H800
    %DDCAPS_OVERLAYCANTCLIP = &H1000
    %DDCAPS_OVERLAYFOURCC = &H2000
    %DDCAPS_OVERLAYSTRETCH = &H4000
    %DDCAPS_PALETTE = &H8000
    %DDCAPS_PALETTEVSYNC = &H10000
    %DDCAPS_READSCANLINE = &H20000
    %DDCAPS_STEREOVIEW = &H40000
    %DDCAPS_VBI = &H80000
    %DDCAPS_ZBLTS = &H100000
    %DDCAPS_ZOVERLAYS = &H200000
    %DDCAPS_COLORKEY = &H400000
    %DDCAPS_ALPHA = &H800000
    %DDCAPS_COLORKEYHWASSIST = &H1000000
    %DDCAPS_NOHARDWARE = &H2000000
    %DDCAPS_BLTCOLORFILL = &H4000000
    %DDCAPS_BANKSWITCHED = &H8000000
    %DDCAPS_BLTDEPTHFILL = &H10000000
    %DDCAPS_CANCLIP = &H20000000
    %DDCAPS_CANCLIPSTRETCHED = &H40000000
    %DDCAPS_CANBLTSYSMEM = &H80000000
    %DDCAPS2_CERTIFIED = &H1
    %DDCAPS2_NO2DDURING3DSCENE = &H2
    %DDCAPS2_VIDEOPORT = &H4
    %DDCAPS2_AUTOFLIPOVERLAY = &H8
    %DDCAPS2_CANBOBINTERLEAVED = &H10
    %DDCAPS2_CANBOBNONINTERLEAVED = &H20
    %DDCAPS2_COLORCONTROLOVERLAY = &H40
    %DDCAPS2_COLORCONTROLPRIMARY = &H80
    %DDCAPS2_CANDROPZ16BIT = &H100
    %DDCAPS2_NONLOCALVIDMEM = &H200
    %DDCAPS2_NONLOCALVIDMEMCAPS = &H400
    %DDCAPS2_NOPAGELOCKREQUIRED = &H800
    %DDCAPS2_WIDESURFACES = &H1000
    %DDCAPS2_CANFLIPODDEVEN = &H2000
    %DDCAPS2_CANBOBHARDWARE = &H4000
    %DDCAPS2_COPYFOURCC = &H8000
    %DDFXALPHACAPS_BLTALPHAEDGEBLEND = &H1
    %DDFXALPHACAPS_BLTALPHAPIXELS = &H2
    %DDFXALPHACAPS_BLTALPHAPIXELSNEG = &H4
    %DDFXALPHACAPS_BLTALPHASURFACES = &H8
    %DDFXALPHACAPS_BLTALPHASURFACESNEG = &H10
    %DDFXALPHACAPS_OVERLAYALPHAEDGEBLEND = &H20
    %DDFXALPHACAPS_OVERLAYALPHAPIXELS = &H40
    %DDFXALPHACAPS_OVERLAYALPHAPIXELSNEG = &H80
    %DDFXALPHACAPS_OVERLAYALPHASURFACES = &H100
    %DDFXALPHACAPS_OVERLAYALPHASURFACESNEG = &H00000200
    %DDFXCAPS_BLTARITHSTRETCHY = &H20
    %DDFXCAPS_BLTARITHSTRETCHYN = &H10
    %DDFXCAPS_BLTMIRRORLEFTRIGHT = &H40
    %DDFXCAPS_BLTMIRRORUPDOWN = &H80
    %DDFXCAPS_BLTROTATION = &H100
    %DDFXCAPS_BLTROTATION90 = &H200
    %DDFXCAPS_BLTSHRINKX = &H400
    %DDFXCAPS_BLTSHRINKXN = &H800
    %DDFXCAPS_BLTSHRINKY = &H1000
    %DDFXCAPS_BLTSHRINKYN = &H2000
    %DDFXCAPS_BLTSTRETCHX = &H4000
    %DDFXCAPS_BLTSTRETCHXN = &H8000
    %DDFXCAPS_BLTSTRETCHY = &H10000
    %DDFXCAPS_BLTSTRETCHYN = &H20000
    %DDFXCAPS_OVERLAYARITHSTRETCHY = &H40000
    %DDFXCAPS_OVERLAYARITHSTRETCHYN = &H8
    %DDFXCAPS_OVERLAYSHRINKX = &H80000
    %DDFXCAPS_OVERLAYSHRINKXN = &H100000
    %DDFXCAPS_OVERLAYSHRINKY = &H200000
    %DDFXCAPS_OVERLAYSHRINKYN = &H400000
    %DDFXCAPS_OVERLAYSTRETCHX = &H800000
    %DDFXCAPS_OVERLAYSTRETCHXN = &H1000000
    %DDFXCAPS_OVERLAYSTRETCHY = &H2000000
    %DDFXCAPS_OVERLAYSTRETCHYN = &H4000000
    %DDFXCAPS_OVERLAYMIRRORLEFTRIGHT = &H8000000
    %DDFXCAPS_OVERLAYMIRRORUPDOWN = &H10000000
    %DDSVCAPS_ENIGMA = &H1
    %DDSVCAPS_FLICKER = &H2
    %DDSVCAPS_REDBLUE = &H4
    %DDSVCAPS_SPLIT = &H8
    %DDPCAPS_4BIT = &H1
    %DDPCAPS_8BITENTRIES = &H2
    %DDPCAPS_8BIT = &H4
    %DDPCAPS_INITIALIZE = &H8
    %DDPCAPS_PRIMARYSURFACE = &H10
    %DDPCAPS_PRIMARYSURFACELEFT = &H20
    %DDPCAPS_ALLOW256 = &H40
    %DDPCAPS_VSYNC = &H80
    %DDPCAPS_1BIT = &H100
    %DDPCAPS_2BIT = &H200
    %DDBD_1 = &H4000
    %DDBD_2 = &H2000
    %DDBD_4 = &H1000
    %DDBD_8 = &H800
    %DDBD_16 = &H400
    %DDBD_24 = &H200
    %DDBD_32 = &H100
    %DDCKEY_COLORSPACE = &H1
    %DDCKEY_DESTBLT = &H2
    %DDCKEY_DESTOVERLAY = &H4
    %DDCKEY_SRCBLT = &H8
    %DDCKEY_SRCOVERLAY = &H10
    %DDCKEYCAPS_DESTBLT = &H1
    %DDCKEYCAPS_DESTBLTCLRSPACE = &H2
    %DDCKEYCAPS_DESTBLTCLRSPACEYUV = &H4
    %DDCKEYCAPS_DESTBLTYUV = &H8
    %DDCKEYCAPS_DESTOVERLAY = &H10
    %DDCKEYCAPS_DESTOVERLAYCLRSPACE = &H20
    %DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV = &H40
    %DDCKEYCAPS_DESTOVERLAYONEACTIVE = &H80
    %DDCKEYCAPS_DESTOVERLAYYUV = &H100
    %DDCKEYCAPS_SRCBLT = &H200
    %DDCKEYCAPS_SRCBLTCLRSPACE = &H400
    %DDCKEYCAPS_SRCBLTCLRSPACEYUV = &H800
    %DDCKEYCAPS_SRCBLTYUV = &H1000
    %DDCKEYCAPS_SRCOVERLAY = &H2000
    %DDCKEYCAPS_SRCOVERLAYCLRSPACE = &H4000
    %DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV = &H8000
    %DDCKEYCAPS_SRCOVERLAYONEACTIVE = &H10000
    %DDCKEYCAPS_SRCOVERLAYYUV = &H20000
    %DDCKEYCAPS_NOCOSTOVERLAY = &H40000
    %DDPF_ALPHAPIXELS = &H1
    %DDPF_ALPHA = &H2
    %DDPF_FOURCC = &H4
    %DDPF_PALETTEINDEXED4 = &H8
    %DDPF_PALETTEINDEXEDTO8 = &H10
    %DDPF_PALETTEINDEXED8 = &H20
    %DDPF_RGB = &H40
    %DDPF_COMPRESSED = &H80
    %DDPF_RGBTOYUV = &H100
    %DDPF_YUV = &H200
    %DDPF_ZBUFFER = &H400
    %DDPF_PALETTEINDEXED1 = &H800
    %DDPF_PALETTEINDEXED2 = &H1000
    %DDPF_ZPIXELS = &H2000
    %DDENUMSURFACES_ALL = &H1
    %DDENUMSURFACES_MATCH = &H2
    %DDENUMSURFACES_NOMATCH = &H4
    %DDENUMSURFACES_CANBECREATED = &H8
    %DDENUMSURFACES_DOESEXIST = &H10
    %DDSDM_STANDARDVGAMODE = &H1
    %DDEDM_REFRESHRATES = &H1
    %DDEDM_STANDARDVGAMODES = &H2
    %DDSCL_FULLSCREEN = &H1
    %DDSCL_ALLOWREBOOT = &H2
    %DDSCL_NOWINDOWCHANGES = &H4
    %DDSCL_NORMAL = &H8
    %DDSCL_EXCLUSIVE = &H10
    %DDSCL_ALLOWMODEX = &H40
    %DDSCL_SETFOCUSWINDOW = &H80
    %DDSCL_SETDEVICEWINDOW = &H100
    %DDSCL_CREATEDEVICEWINDOW = &H200
    %DDBLT_ALPHADEST = &H1
    %DDBLT_ALPHADESTCONSTOVERRIDE = &H2
    %DDBLT_ALPHADESTNEG = &H4
    %DDBLT_ALPHADESTSURFACEOVERRIDE = &H8
    %DDBLT_ALPHAEDGEBLEND = &H10
    %DDBLT_ALPHASRC = &H20
    %DDBLT_ALPHASRCCONSTOVERRIDE = &H40
    %DDBLT_ALPHASRCNEG = &H80
    %DDBLT_ALPHASRCSURFACEOVERRIDE = &H100
    %DDBLT_ASYNC = &H200
    %DDBLT_COLORFILL = &H400
    %DDBLT_DDFX = &H800
    %DDBLT_DDROPS = &H1000
    %DDBLT_KEYDEST = &H2000
    %DDBLT_KEYDESTOVERRIDE = &H4000
    %DDBLT_KEYSRC = &H8000
    %DDBLT_KEYSRCOVERRIDE = &H10000
    %DDBLT_ROP = &H20000
    %DDBLT_ROTATIONANGLE = &H40000
    %DDBLT_ZBUFFER = &H80000
    %DDBLT_ZBUFFERDESTCONSTOVERRIDE = &H100000
    %DDBLT_ZBUFFERDESTOVERRIDE = &H200000
    %DDBLT_ZBUFFERSRCCONSTOVERRIDE = &H400000
    %DDBLT_ZBUFFERSRCOVERRIDE = &H800000
    %DDBLT_WAIT = &H1000000
    %DDBLT_DEPTHFILL = &H2000000
    %DDBLTFAST_NOCOLORKEY = &H0
    %DDBLTFAST_SRCCOLORKEY = &H1
    %DDBLTFAST_DESTCOLORKEY = &H2
    %DDBLTFAST_WAIT = &H10
    %DDFLIP_WAIT = &H1
    %DDFLIP_EVEN = &H2
    %DDFLIP_ODD = &H4
    %DDOVER_ALPHADEST = &H1
    %DDOVER_ALPHADESTCONSTOVERRIDE = &H2
    %DDOVER_ALPHADESTNEG = &H4
    %DDOVER_ALPHADESTSURFACEOVERRIDE = &H8
    %DDOVER_ALPHAEDGEBLEND = &H10
    %DDOVER_ALPHASRC = &H20
    %DDOVER_ALPHASRCCONSTOVERRIDE = &H40
    %DDOVER_ALPHASRCNEG = &H80
    %DDOVER_ALPHASRCSURFACEOVERRIDE = &H100
    %DDOVER_HIDE = &H200
    %DDOVER_KEYDEST = &H400
    %DDOVER_KEYDESTOVERRIDE = &H800
    %DDOVER_KEYSRC = &H1000
    %DDOVER_KEYSRCOVERRIDE = &H2000
    %DDOVER_SHOW = &H4000
    %DDOVER_ADDDIRTYRECT = &H8000
    %DDOVER_REFRESHDIRTYRECTS = &H10000
    %DDOVER_REFRESHALL = &H20000
    %DDOVER_DDFX = &H80000
    %DDOVER_BOB = &H200000
    %DDOVER_OVERRIDEBOBWEAVE = &H400000
    %DDOVER_INTERLEAVED = &H800000
    %DDOVER_BOBHARDWARE = &H1000000
    %DDLOCK_SURFACEMEMORYPTR = &H0
    %DDLOCK_WAIT = &H1
    %DDLOCK_EVENT = &H2
    %DDLOCK_READONLY = &H10
    %DDLOCK_WRITEONLY = &H20
    %DDLOCK_NOSYSLOCK = &H800
    %DDBLTFX_ARITHSTRETCHY = &H1
    %DDBLTFX_MIRRORLEFTRIGHT = &H2
    %DDBLTFX_MIRRORUPDOWN = &H4
    %DDBLTFX_NOTEARING = &H8
    %DDBLTFX_ROTATE180 = &H10
    %DDBLTFX_ROTATE270 = &H20
    %DDBLTFX_ROTATE90 = &H40
    %DDBLTFX_ZBUFFERRANGE = &H80
    %DDBLTFX_ZBUFFERBASEDEST = &H100
    %DDOVERFX_ARITHSTRETCHY = &H1
    %DDOVERFX_MIRRORLEFTRIGHT = &H2
    %DDOVERFX_MIRRORUPDOWN = &H4
    %DDWAITVB_BLOCKBEGIN = &H1
    %DDWAITVB_BLOCKBEGINEVENT = &H2
    %DDWAITVB_BLOCKEND = &H4
    %DDGFS_CANFLIP = &H1
    %DDGFS_ISFLIPDONE = &H2
    %DDGBS_CANBLT = &H1
    %DDGBS_ISBLTDONE = &H2
    %DDENUMOVERLAYZ_BACKTOFRONT = &H0
    %DDENUMOVERLAYZ_FRONTTOBACK = &H1
    %DDOVERZ_SENDTOFRONT = &H0
    %DDOVERZ_SENDTOBACK = &H1
    %DDOVERZ_MOVEFORWARD = &H2
    %DDOVERZ_MOVEBACKWARD = &H3
    %DDOVERZ_INSERTINFRONTOF = &H4
    %DDOVERZ_INSERTINBACKOF = &H5

    %DDERR_ALREADYINITIALIZED = &H88760005
    %DDERR_CANNOTATTACHSURFACE = &H8876000a
    %DDERR_CANNOTDETACHSURFACE = &H88760014
    %DDERR_CURRENTLYNOTAVAIL = &H88760028
    %DDERR_EXCEPTION = &H88760037
    %DDERR_GENERIC = &H80004005
    %DDERR_HEIGHTALIGN = &H8876005a
    %DDERR_INCOMPATIBLEPRIMARY = &H8876005f
    %DDERR_INVALIDCAPS = &H88760064
    %DDERR_INVALIDCLIPLIST = &H8876006e
    %DDERR_INVALIDMODE = &H88760078
    %DDERR_INVALIDOBJECT = &H88760082
    %DDERR_INVALIDPARAMS = &H80070057
    %DDERR_INVALIDPIXELFORMAT = &H88760091
    %DDERR_INVALIDRECT = &H88760096
    %DDERR_LOCKEDSURFACES = &H887600a0
    %DDERR_NO3D = &H887600aa
    %DDERR_NOALPHAHW = &H887600b4
    %DDERR_NOCLIPLIST = &H887600cd
    %DDERR_NOCOLORCONVHW = &H887600d2
    %DDERR_NOCOOPERATIVELEVELSET = &H887600d4
    %DDERR_NOCOLORKEY = &H887600d7
    %DDERR_NOCOLORKEYHW = &H887600dc
    %DDERR_NODIRECTDRAWSUPPORT = &H887600de
    %DDERR_NOEXCLUSIVEMODE = &H887600e1
    %DDERR_NOFLIPHW = &H887600e6
    %DDERR_NOGDI = &H887600f0
    %DDERR_NOMIRRORHW = &H887600fa
    %DDERR_NOTFOUND = &H887600ff
    %DDERR_NOOVERLAYHW = &H88760104
    %DDERR_NORASTEROPHW = &H88760118
    %DDERR_NOROTATIONHW = &H88760122
    %DDERR_NOSTRETCHHW = &H88760136
    %DDERR_NOT4BITCOLOR = &H8876013c
    %DDERR_NOT4BITCOLORINDEX = &H8876013d
    %DDERR_NOT8BITCOLOR = &H88760140
    %DDERR_NOTEXTUREHW = &H8876014a
    %DDERR_NOVSYNCHW = &H8876014f
    %DDERR_NOZBUFFERHW = &H88760154
    %DDERR_NOZOVERLAYHW = &H8876015e
    %DDERR_OUTOFCAPS = &H88760168
    %DDERR_OUTOFMEMORY = &H8007000e
    %DDERR_OUTOFVIDEOMEMORY = &H8876017c
    %DDERR_OVERLAYCANTCLIP = &H8876017e
    %DDERR_OVERLAYCOLORKEYONLYONEACTIVE = &H88760180
    %DDERR_PALETTEBUSY = &H88760183
    %DDERR_COLORKEYNOTSET = &H88760190
    %DDERR_SURFACEALREADYATTACHED = &H8876019a
    %DDERR_SURFACEALREADYDEPENDENT = &H887601a4
    %DDERR_SURFACEBUSY = &H887601ae
    %DDERR_CANTLOCKSURFACE = &H887601b3
    %DDERR_SURFACEISOBSCURED = &H887601b8
    %DDERR_SURFACELOST = &H887601c2
    %DDERR_SURFACENOTATTACHED = &H887601cc
    %DDERR_TOOBIGHEIGHT = &H887601d6
    %DDERR_TOOBIGSIZE = &H887601e0
    %DDERR_TOOBIGWIDTH = &H887601ea
    %DDERR_UNSUPPORTED = &H80004001
    %DDERR_UNSUPPORTEDFORMAT = &H887601fe
    %DDERR_UNSUPPORTEDMASK = &H88760208
    %DDERR_VERTICALBLANKINPROGRESS = &H88760219
    %DDERR_WASSTILLDRAWING = &H8876021c
    %DDERR_XALIGN = &H88760230
    %DDERR_INVALIDDIRECTDRAWGUID = &H88760231
    %DDERR_DIRECTDRAWALREADYCREATED = &H88760232
    %DDERR_NODIRECTDRAWHW = &H88760233
    %DDERR_PRIMARYSURFACEALREADYEXISTS = &H88760234
    %DDERR_NOEMULATION = &H88760235
    %DDERR_REGIONTOOSMALL = &H88760236
    %DDERR_CLIPPERISUSINGHWND = &H88760237
    %DDERR_NOCLIPPERATTACHED = &H88760238
    %DDERR_NOHWND = &H88760239
    %DDERR_HWNDSUBCLASSED = &H8876023a
    %DDERR_HWNDALREADYSET = &H8876023b
    %DDERR_NOPALETTEATTACHED = &H8876023c
    %DDERR_NOPALETTEHW = &H8876023d
    %DDERR_BLTFASTCANTCLIP = &H8876023e
    %DDERR_NOBLTHW = &H8876023f
    %DDERR_NODDROPSHW = &H88760240
    %DDERR_OVERLAYNOTVISIBLE = &H88760241
    %DDERR_NOOVERLAYDEST = &H88760242
    %DDERR_INVALIDPOSITION = &H88760243
    %DDERR_NOTAOVERLAYSURFACE = &H88760244
    %DDERR_EXCLUSIVEMODEALREADYSET = &H88760245
    %DDERR_NOTFLIPPABLE = &H88760246
    %DDERR_CANTDUPLICATE = &H88760247
    %DDERR_NOTLOCKED = &H88760248
    %DDERR_CANTCREATEDC = &H88760249
    %DDERR_NODC = &H8876024a
    %DDERR_WRONGMODE = &H8876024b
    %DDERR_IMPLICITLYCREATED = &H8876024c
    %DDERR_NOTPALETTIZED = &H8876024d
    %DDERR_UNSUPPORTEDMODE = &H8876024e
    %DDERR_NOMIPMAPHW = &H8876024f
    %DDERR_INVALIDSURFACETYPE = &H88760250
    %DDERR_NOOPTIMIZEHW = &H88760258
    %DDERR_NOTLOADED = &H88760259
    %DDERR_NOFOCUSWINDOW = &H8876025a
    %DDERR_DCALREADYCREATED = &H8876026c
    %DDERR_NONONLOCALVIDMEM = &H88760276
    %DDERR_CANTPAGELOCK = &H88760280
    %DDERR_CANTPAGEUNLOCK = &H88760294
    %DDERR_NOTPAGELOCKED = &H887602a8
    %DDERR_MOREDATA = &H887602b2
    %DDERR_VIDEONOTACTIVE = &H887602b7
    %DDERR_DEVICEDOESNTOWNSURFACE = &H887602bb
    %DDERR_NOTINITIALIZED = &H800401f0

    ' DDCOLORKEY Structure
    TYPE DDCOLORKEY
    dwColorSpaceLowValue AS DWORD
    dwColorSpaceHighValue AS DWORD
    END TYPE


    ' DDBLTFX Structure
    UNION DDBFUnion1
    dwZDestConst AS DWORD
    lpDDSZBufferDest AS LONG
    END UNION

    UNION DDBFUnion2
    dwZSrcConst AS DWORD
    lpDDSZBufferSrc AS LONG
    END UNION

    UNION DDBFUnion3
    dwAlphaDestConst AS DWORD
    lpDDSAlphaDest AS LONG
    END UNION

    UNION DDBFUnion4
    dwAlphaSrcConst AS DWORD
    lpDDSAlphaSrc AS LONG
    END UNION

    UNION DDBFUnion5
    dwFillColor AS DWORD
    dwFillDepth AS DWORD
    dwFillPixel AS DWORD
    lpDDSPattern AS LONG
    END UNION

    TYPE DDBLTFX
    dwSize AS DWORD
    dwDDFX AS DWORD
    dwROP AS DWORD
    dwDDROP AS DWORD
    dwRotationAngle AS DWORD
    dwZBufferOpCode AS DWORD
    dwZBufferLow AS DWORD
    dwZBufferHigh AS DWORD
    dwZBufferBaseDest AS DWORD
    dwZDestConstBitDepth AS DWORD
    Union1 AS DDBFUnion1
    dwZSrcConstBitDepth AS DWORD
    Union2 AS DDBFUnion2
    dwAlphaEdgeBlendBitDepth AS DWORD
    dwAlphaEdgeBlend AS DWORD
    dwReserved AS DWORD
    dwAlphaDestConstBitDepth AS DWORD
    Union3 AS DDBFUnion3
    dwAlphaSrcConstBitDepth AS DWORD
    Union4 AS DDBFUnion4
    Union5 AS DDBFUnion5
    ddckDestColorkey AS DDCOLORKEY
    ddckSrcColorkey AS DDCOLORKEY
    END TYPE


    ' DDCAPS Structure
    TYPE DDSCAPS
    dwCaps AS DWORD
    END TYPE


    ' DDCAPS_DX3 Structure
    '$IF %DIRECTDRAW_VERSION >= &H0500
    TYPE DDCAPS_DX3
    dwSize AS DWORD
    dwCaps AS DWORD
    dwCaps2 AS DWORD
    dwCKeyCaps AS DWORD
    dwFXCaps AS DWORD
    dwFXAlphaCaps AS DWORD
    dwPalCaps AS DWORD
    dwSVCaps AS DWORD
    dwAlphaBltConstBitDepths AS DWORD
    dwAlphaBltPixelBitDepths AS DWORD
    dwAlphaBltSurfaceBitDepths AS DWORD
    dwAlphaOverlayConstBitDepths AS DWORD
    dwAlphaOverlayPixelBitDepths AS DWORD
    dwAlphaOverlaySurfaceBitDepths AS DWORD
    dwZBufferBitDepths AS DWORD
    dwVidMemTotal AS DWORD
    dwVidMemFree AS DWORD
    dwMaxVisibleOverlays AS DWORD
    dwCurrVisibleOverlays AS DWORD
    dwNumFourCCCodes AS DWORD
    dwAlignBoundarySrc AS DWORD
    dwAlignSizeSrc AS DWORD
    dwAlignBoundaryDest AS DWORD
    dwAlignSizeDest AS DWORD
    dwAlignStrideAlign AS DWORD
    dwRops(%DD_ROP_SPACE) AS DWORD
    ddsCaps AS DDSCAPS
    dwMinOverlayStretch AS DWORD
    dwMaxOverlayStretch AS DWORD
    dwMinLiveVideoStretch AS DWORD
    dwMaxLiveVideoStretch AS DWORD
    dwMinHwCodecStretch AS DWORD
    dwMaxHwCodecStretch AS DWORD
    dwReserved1 AS DWORD
    dwReserved2 AS DWORD
    dwReserved3 AS DWORD
    dwSVBCaps AS DWORD
    dwSVBCKeyCaps AS DWORD
    dwSVBFXCaps AS DWORD
    dwSVBRops(%DD_ROP_SPACE) AS DWORD
    dwVSBCaps AS DWORD
    dwVSBCKeyCaps AS DWORD
    dwVSBFXCaps AS DWORD
    dwVSBRops(%DD_ROP_SPACE) AS DWORD
    dwSSBCaps AS DWORD
    dwSSBCKeyCaps AS DWORD
    dwSSBCFXCaps AS DWORD
    dwSSBRops(%DD_ROP_SPACE) AS DWORD
    dwMaxVideoPorts AS DWORD
    dwCurrVideoPorts AS DWORD
    dwSVBCaps2 AS DWORD
    dwNLVBCaps AS DWORD
    dwNLVBCaps2 AS DWORD
    dwNLVBCKeyCaps AS DWORD
    dwNLVBFXCaps AS DWORD
    dwNLVBRops(%DD_ROP_SPACE) AS DWORD
    dwReserved4 AS DWORD
    dwReserved5 AS DWORD
    dwReserved6 AS DWORD
    END TYPE
    '$ENDIF


    ' DDCAPS Structure
    TYPE DDCAPS
    dwSize AS DWORD
    dwCaps AS DWORD
    dwCaps2 AS DWORD
    dwCKeyCaps AS DWORD
    dwFXCaps AS DWORD
    dwFXAlphaCaps AS DWORD
    dwPalCaps AS DWORD
    dwSVCaps AS DWORD
    dwAlphaBltConstBitDepths AS DWORD
    dwAlphaBltPixelBitDepths AS DWORD
    dwAlphaBltSurfaceBitDepths AS DWORD
    dwAlphaOverlayConstBitDepths AS DWORD
    dwAlphaOverlayPixelBitDepths AS DWORD
    dwAlphaOverlaySurfaceBitDepths AS DWORD
    dwZBufferBitDepths AS DWORD
    dwVidMemTotal AS DWORD
    dwVidMemFree AS DWORD
    dwMaxVisibleOverlays AS DWORD
    dwCurrVisibleOverlays AS DWORD
    dwNumFourCCCodes AS DWORD
    dwAlignBoundarySrc AS DWORD
    dwAlignSizeSrc AS DWORD
    dwAlignBoundaryDest AS DWORD
    dwAlignSizeDest AS DWORD
    dwAlignStrideAlign AS DWORD
    dwRops(%DD_ROP_SPACE) AS DWORD
    ddsCaps AS DDSCAPS
    dwMinOverlayStretch AS DWORD
    dwMaxOverlayStretch AS DWORD
    dwMinLiveVideoStretch AS DWORD
    dwMaxLiveVideoStretch AS DWORD
    dwMinHwCodecStretch AS DWORD
    dwMaxHwCodecStretch AS DWORD
    dwReserved1 AS DWORD
    dwReserved2 AS DWORD
    dwReserved3 AS DWORD
    dwSVBCaps AS DWORD
    dwSVBCKeyCaps AS DWORD
    dwSVBFXCaps AS DWORD
    dwSVBRops(%DD_ROP_SPACE) AS DWORD
    dwVSBCaps AS DWORD
    dwVSBCKeyCaps AS DWORD
    dwVSBFXCaps AS DWORD
    dwVSBRops(%DD_ROP_SPACE) AS DWORD
    dwSSBCaps AS DWORD
    dwSSBCKeyCaps AS DWORD
    dwSSBCFXCaps AS DWORD
    dwSSBRops(%DD_ROP_SPACE) AS DWORD
    '$IF %DIRECTDRAW_VERSION >= &H0500
    dwMaxVideoPorts AS DWORD
    dwCurrVideoPorts AS DWORD
    dwSVBCaps2 AS DWORD
    dwNLVBCaps AS DWORD
    dwNLVBCaps2 AS DWORD
    dwNLVBCKeyCaps AS DWORD
    dwNLVBFXCaps AS DWORD
    dwNLVBRops(%DD_ROP_SPACE) AS DWORD
    '$ELSE
    dwReserved4 AS DWORD
    dwReserved5 AS DWORD
    dwReserved6 AS DWORD
    '$ENDIF
    END TYPE


    ' DDPIXELFORMAT Structure
    UNION DDPFDepth
    dwRGBBitCount AS DWORD
    dwYUVBitCount AS DWORD
    dwZBufferBitDepth AS DWORD
    dwAlphaBitDepth AS DWORD
    END UNION

    UNION DDPFMask1
    dwRBitMask AS DWORD
    dwYBitMask AS DWORD
    END UNION

    UNION DDPFMask2
    dwGBitMask AS DWORD
    dwUBitMask AS DWORD
    END UNION

    UNION DDPFMask3
    dwBBitMask AS DWORD
    dwVBitMask AS DWORD
    END UNION

    UNION DDPFMask4
    dwRGBAlphaBitMask AS DWORD
    dwYUVAlphaBitMask AS DWORD
    dwRGBZBitMask AS DWORD
    dwYUVZBitMask AS DWORD
    END UNION

    TYPE DDPIXELFORMAT
    dwSize AS DWORD
    dwFlags AS DWORD
    dwFourCC AS DWORD
    Depth AS DDPFDepth
    Mask1 AS DDPFMask1
    Mask2 AS DDPFMask2
    Mask3 AS DDPFMask3
    Mask4 AS DDPFMask4
    END TYPE


    ' DDOVERLAYFX Structure
    UNION DDOFUnion1
    dwAlphaDestConst AS DWORD
    lpDDSAlphaDest AS LONG
    END UNION

    UNION DDOFUnion2
    dwAlphaSrcConst AS DWORD
    lpDDSAlphaSrc AS LONG
    END UNION

    TYPE DDOVERLAYFX
    dwSize AS DWORD
    dwAlphaEdgeBlendBitDepth AS DWORD
    dwAlphaEdgeBlend AS DWORD
    dwReserved AS DWORD
    dwAlphaDestConstBitDepth AS DWORD
    Union1 AS DDOFUnion1
    dwAlphaSrcConstBitDepth AS DWORD
    Union2 AS DDOFUnion2
    dckDestColorkey AS DDCOLORKEY
    dckSrcColorkey AS DDCOLORKEY
    dwDDFX AS DWORD
    dwFlags AS DWORD
    END TYPE


    ' DDBLTBATCH Structure
    TYPE DDBLTBATCH
    lprDest AS RECT
    lpDDSSrc AS LONG
    lprSrc AS LONG
    dwFlags AS DWORD
    lpDDBltFx AS DDBLTFX
    END TYPE;


    ' DDBLTFX Structure
    UNION DDBFUnion1
    dwZDestConst AS DWORD
    lpDDSZBufferDest AS LONG
    END UNION

    UNION DDBFUnion2
    dwZSrcConst AS DWORD
    lpDDSZBufferSrc AS LONG
    END UNION

    UNION DDBFUnion3
    dwAlphaSrcConst AS DWORD
    lpDDSAlphaSrc AS LONG
    END UNION

    UNION DDBFUnion4
    dwFillColor AS DWORD
    dwFillDepth AS DWORD
    dwFillPixel AS DWORD
    lpDDSPattern AS LONG
    END UNION

    TYPE DDBLTFX
    dwSize AS DWORD
    dwDDFX AS DWORD
    dwROP AS DWORD
    dwDDROP AS DWORD
    dwRotationAngle AS DWORD
    dwZBufferOpCode AS DWORD
    dwZBufferLow AS DWORD
    dwZBufferHigh AS DWORD
    dwZBufferBaseDest AS DWORD
    dwZDestConstBitDepth AS DWORD
    Union1 AS DDBFUnion1
    dwZSrcConstBitDepth AS DWORD
    Union2 AS DDBFUnion2
    dwAlphaEdgeBlendBitDepth AS DWORD
    dwAlphaEdgeBlend AS DWORD
    dwReserved AS DWORD
    dwAlphaDestConstBitDepth AS DWORD
    dwAlphaDestConst AS DWORD
    lpDDSAlphaDest AS LONG
    dwAlphaSrcConstBitDepth AS DWORD
    Union3 AS DDBFUnion3
    Union4 AS DDBFUnion4
    ddckDestColorkey AS DDCOLORKEY
    ddckSrcColorkey AS DDCOLORKEY
    END TYPE


    ' DDSURFACEDESC Structure
    UNION DDSDUnion1
    lPitch AS LONG
    dwLinearSize AS DWORD
    END UNION

    UNION DDSDUnion2
    dwMipMapCount AS DWORD
    dwZBufferBitDepth AS DWORD
    dwRefreshRate AS DWORD
    END UNION

    TYPE DDSURFACEDESC
    dwSize AS DWORD
    dwFlags AS DWORD
    dwHeight AS DWORD
    dwWidth AS DWORD
    Union1 AS DDSDUnion1
    dwBackBufferCount AS DWORD
    Union2 AS DDSDUnion2
    dwAlphaBitDepth AS DWORD
    dwReserved AS DWORD
    lpSurface AS LONG
    ddckCKDestOverlay AS DDCOLORKEY
    ddckCKDestBlt AS DDCOLORKEY
    ddckCKSrcOverlay AS DDCOLORKEY
    ddckCKSrcBlt AS DDCOLORKEY
    ddpfPixelFormat AS DDPIXELFORMAT
    ddsCaps AS DDSCAPS
    END TYPE


    ' DDCOLORCONTROL Structure
    TYPE DDCOLORCONTROL
    dwSize AS DWORD
    dwFlags AS DWORD
    lBrightness AS LONG
    lContrast AS LONG
    lHue AS LONG
    lSaturation AS LONG
    lSharpness AS LONG
    lGamma AS LONG
    lColorEnable AS LONG
    dwReserved1 AS DWORD
    END TYPE


    ' Callback functions
    ' FUNCTION DDEnumModesCallback(lpDDSurfaceDesc AS DDSURFACEDESC, lpContext AS LONG) AS LONG
    ' FUNCTION DDEnumModesCallbackEx(lpGUID AS STRING * 16, lpDriverDescription AS ASCIIZ, lpDriverName AS ASCIIZ, BYVAL lpContext AS LONG, BYVAL hm AS LONG) AS LONG
    ' FUNCTION DDEnumSurfacesCallback(BYVAL lpDDSurface AS LONG, lpDDSurfaceDesc AS DDSURFACEDESC, BYVAL lpContext AS lONG) AS LONG


    'DECLARE FUNCTION DDDirectDrawCreate LIB "DDRAW.DLL" ALIAS "DirectDrawCreate" (lpGUID AS STRING * 16, lpDD AS LONG, pUnkOuter AS LONG) AS LONG
    DECLARE FUNCTION DDDirectDrawCreate LIB "DDRAW.DLL" ALIAS "DirectDrawCreate" (DWORD, DWORD, DWORD) AS LONG
    DECLARE FUNCTION DDDirectDrawCreateClipper LIB "DDRAW.DLL" ALIAS "DirectDrawCreateClipper" (BYVAL dwFlags AS DWORD, lpDDClipper AS LONG, pUnkOuter AS LONG) AS LONG
    DECLARE FUNCTION DDDirectDrawEnumerate LIB "DDRAW.DLL" ALIAS "DirectDrawEnumerate" (BYVAL lpCallback AS LONG, BYVAL lpContext AS LONG) AS LONG
    DECLARE FUNCTION DDDirectDrawEnumerateEx LIB "DDRAW.DLL" ALIAS "DirectDrawEnumerateEx" (BYVAL lpCallback AS LONG, BYVAL lpContext AS LONG, BYVAL dwFlags AS LONG) AS LONG


    ' Not sure if these work...
    SUB DDInitializeGUIDs()
    CLSID_DirectDraw = CHR$(&HE0,&H0E,&HB7,&HD7, &H40,&H43, &HCF,&H11, &HB0,&H63, &H00,&H20,&HAF,&HC2,&HCD,&H35)
    CLSID_DirectDrawClipper = CHR$(&HA0,&H17,&H38,&H59, &HB3,&H7D, &HCF,&H11, &HA2,&HDE, &H00,&HAA,&H00,&HB9,&H33,&H56)
    IID_IDirectDraw = CHR$(&H80,&HDB,&H14,&H6C, &H33,&HA7, &HCE,&H11, &HA5,&H21, &H00,&H20,&HAF,&H0B,&HE5,&H60)
    IID_IDirectDraw2 = CHR$(&HE0,&HF3,&HA6,&HB3, &H43,&H2B, &HCF,&H11, &HA2,&HDE, &H00,&HAA,&H00,&HB9,&H33,&H56)
    IID_IDirectDrawSurface = CHR$(&H81,&HDB,&H14,&H6C, &H33,&HA7, &HCE,&H11, &HA5,&H21, &H00,&H20,&HAF,&H0B,&HE5,&H60)
    IID_IDirectDrawSurface2 = CHR$(&H85,&H58,&H80,&H57, &HEC,&H6E, &HCF,&H11, &H94,&H41, &HA8,&H23,&H03,&HC1,&H0E,&H27)
    IID_IDirectDrawSurface3 = CHR$(&H00,&H4E,&H04,&HDA, &HB2,&H69, &HD0,&H11, &HA1,&HD5, &H00,&HAA,&H00,&HB8,&HDF,&HBB)
    IID_IDirectDrawPalette = CHR$(&H84,&HDB,&H14,&H6C, &H33,&HA7, &HCE,&H11, &HA5,&H21, &H00,&H20,&HAF,&H0B,&HE5,&H60)
    IID_IDirectDrawClipper = CHR$(&H85,&HDB,&H14,&H6C, &H33,&HA7, &HCE,&H11, &HA5,&H21, &H00,&H20,&HAF,&H0B,&HE5,&H60)
    IID_IDirectDrawColorControl = CHR$(&HE0,&H0E,&H9F,&H4B, &H7E,&H0D, &HD0,&H11, &H9B,&H06, &H00,&HA0,&HC9,&H03,&HA3,&HB8)
    END SUB


    ' ===========================================================================================
    ' IUnknown Methods
    ' ===========================================================================================


    FUNCTION DDIQueryInterface(BYVAL lpIUnknown AS LONG, riid AS STRING * 16, ppvObj AS LONG) AS LONG
    ! push ppvObj
    ! lea edx, riid
    ! push edx
    ! mov ecx, lpIUnknown
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDIAddRef(BYVAL lpIUnknown AS LONG) AS LONG
    ! mov ecx, lpIUnknown
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H04]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDIRelease(BYVAL lpIUnknown AS LONG) AS LONG
    ! mov ecx, lpIUnknown
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H08]
    ! mov FUNCTION[0], eax
    END FUNCTION

    ' ===========================================================================================
    ' DirectDraw Methods
    ' ===========================================================================================

    $IF NOT %DEF(%PBDD_NODD)
    FUNCTION DDCompact(BYVAL lpDD AS LONG) AS LONG
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H0C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDCreateClipper(BYVAL lpDD AS LONG, BYVAL dwFlags AS DWORD, lpDDClipper AS LONG, pUnkOuter AS LONG) AS LONG
    ! push pUnkOuter
    ! push lpDDClipper
    ! push dwFlags
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H10]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDCreatePalette(BYVAL lpDD AS LONG, lpColorTable AS PALETTEENTRY PTR, lpDDPalette AS LONG, pUnkOuter AS LONG) AS LONG
    ! push pUnkOuter
    ! push lpDDPalette
    ! push lpColorTable
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H14]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDCreateSurface(BYVAL lpDD AS LONG, lpDDSurfaceDesc AS DDSURFACEDESC PTR, lpDDSurface AS LONG) AS LONG
    ! push lpDDSurface
    ! push lpDDSurfaceDesc
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H18]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDDuplicateSurface(BYVAL lpDD AS LONG, BYVAL lpDDSurface AS LONG, lpDupDDSurface AS LONG) AS LONG
    ! push lpDupDDSurface
    ! push lpDDSurface
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H1C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDEnumDisplayModes(BYVAL lpDD AS LONG, BYVAL dwFlags AS DWORD, lpDDSurfaceDesc AS DDSURFACEDESC PTR, BYVAL lpContext AS LONG, BYVAL lpEnumModesCallback AS LONG) AS LONG
    ! push lpEnumModesCallback
    ! push lpContext
    ! push lpDDSurfaceDesc
    ! push dwFlags
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H20]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDEnumSurfaces(BYVAL lpDD AS LONG, BYVAL dwFlags AS DWORD, lpDDSurfaceDesc AS DDSURFACEDESC PTR, BYVAL lpContext AS LONG, BYVAL lpEnumModesCallback AS LONG) AS LONG
    ! push lpEnumModesCallback
    ! push lpContext
    ! push lpDDSurfaceDesc
    ! push dwFlags
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H24]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDFlipToGDISurface(BYVAL lpDD AS LONG) AS LONG
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H28]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDGetCaps(BYVAL lpDD AS LONG, lpDDDriverCaps AS DDCAPS PTR, lpDDHELCaps AS DDCAPS PTR) AS LONG
    ! push lpDDHELCaps
    ! push lpDDDriverCaps
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H2C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDGetDisplayMode(BYVAL lpDD AS LONG, lpDDSurfaceDesc AS DDSURFACEDESC PTR) AS LONG
    ! push lpDDSurfaceDesc
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H30]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDGetFourCCCodes(BYVAL lpDD AS LONG, lpNumCodes AS DWORD, lpCodes AS DWORD) AS LONG
    ! push lpCodes
    ! push lpNumCodes
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H34]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDGetGDISurface(BYVAL lpDD AS LONG, lpGDIDDSSurface AS LONG) AS LONG
    ! push lpGDIDDSSurface
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H38]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDGetMonitorFrequency(BYVAL lpDD AS LONG, lpdwFrequency AS DWORD) AS LONG
    ! push lpdwFrequency
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H3C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDGetScanLine(BYVAL lpDD AS LONG, lpdwScanLine AS DWORD) AS LONG
    ! push lpdwScanLine
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H40]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDGetVerticalBlankStatus(BYVAL lpDD AS LONG, lpbIsInVB AS LONG) AS LONG
    ! push lpbIsInVB
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H44]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDInitialize(BYVAL lpDD AS LONG, lpGUID AS STRING * 16) AS LONG
    ! lea edx, lpGUID
    ! push edx
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H48]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDRestoreDisplayMode(BYVAL lpDD AS LONG) AS LONG
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H4C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSetCooperativeLevel(BYVAL lpDD AS LONG, BYVAL hWnd AS LONG, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! push hWnd
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H50]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSetDisplayMode(BYVAL lpDD AS LONG, BYVAL dwWidth AS DWORD, BYVAL dwHeight AS DWORD, BYVAL dwBpp AS DWORD) AS LONG
    ! push dwBpp
    ! push dwHeight
    ! push dwWidth
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H54]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDWaitForVerticalBlank(BYVAL lpDD AS LONG, BYVAL dwFlags AS DWORD, BYVAL hEvent AS LONG) AS LONG
    ! push hEvent
    ! push dwFlags
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H58]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDGetAvailableVidMem(BYVAL lpDD AS LONG, lpDDSCaps AS DWORD, lpdwTotal AS DWORD, lpdwFree AS DWORD) AS LONG
    ! push lpdwFree
    ! push lpdwTotal
    ! push lpDDSCaps
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H5C]
    ! mov FUNCTION[0], eax
    END FUNCTION
    $ENDIF

    ' ===========================================================================================
    ' DirectDraw Palette Methods
    ' ===========================================================================================

    $IF NOT %DEF(%PBDD_NODDPALETTE)
    FUNCTION DDPGetCaps(BYVAL lpDDPalette AS LONG, lpdwCaps AS DWORD) AS LONG
    ! push lpdwCaps
    ! mov ecx, lpDDPalette
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H0C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDPGetEntries(BYVAL lpDDPalette AS LONG, BYVAL dwFlags AS DWORD, BYVAL dwBase AS DWORD, BYVAL dwNumEntries AS DWORD, lpEntries AS PALETTEENTRY PTR) AS LONG
    ! push lpEntries
    ! push dwNumEntries
    ! push dwBase
    ! push dwFlags
    ! mov ecx, lpDDPalette
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H10]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDPInitialize(BYVAL lpDD AS LONG, BYVAL dwFlags AS DWORD, lpDDColorTable AS PALETTEENTRY PTR) AS LONG
    ! push lpDDColorTable
    ! push dwFlags
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H14]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDPSetEntries(BYVAL lpDDPalette AS LONG, BYVAL dwFlags AS DWORD, BYVAL dwStartingEntry AS DWORD, BYVAL dwCount AS DWORD, lpEntries AS PALETTEENTRY PTR) AS LONG
    ! push lpEntries
    ! push dwCount
    ! push dwStartingEntry
    ! push dwFlags
    ! mov ecx, lpDDPalette
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H18]
    ! mov FUNCTION[0], eax
    END FUNCTION
    $ENDIF

    ' ===========================================================================================
    ' DirectDraw Clipper Methods
    ' ===========================================================================================

    $IF NOT %DEF(%PBDD_NODDCLIPPER)
    FUNCTION DDCGetClipList(BYVAL lpDDClipper AS LONG, lpRect AS RECT PTR, lpClipList AS RGNDATA PTR, lpdwSize AS DWORD) AS LONG
    ! push lpdwSize
    ! push lpClipList
    ! push lpRect
    ! mov ecx, lpDDClipper
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H0C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDCGetHWnd(BYVAL lpDDClipper AS LONG, lphWnd AS LONG) AS LONG
    ! push lphWnd
    ! mov ecx, lpDDClipper
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H10]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDCInitialize(BYVAL lpDD AS LONG, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H14]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDCIsClipListChanged(BYVAL lpDDClipper AS LONG, lpbChanged AS LONG) AS LONG
    ! push lpbChanged
    ! mov ecx, lpDDClipper
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H18]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDCSetClipList(BYVAL lpDDClipper AS LONG, lpClipList AS RGNDATA PTR, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! push lpClipList
    ! mov ecx, lpDDClipper
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H1C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDCSetHWnd(BYVAL lpDDClipper AS LONG, BYVAL dwFlags AS DWORD, BYVAL hWnd AS LONG) AS LONG
    ! push hWnd
    ! push dwFlags
    ! mov ecx, lpDDClipper
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H20]
    ! mov FUNCTION[0], eax
    END FUNCTION
    $ENDIF

    ' ===========================================================================================
    ' DirectDraw Surface Methods
    ' ===========================================================================================

    $IF NOT %DEF(%PBDD_NODDSURFACE)
    FUNCTION DDSAddAttachedSurface(BYVAL lpDDSurface AS LONG, BYVAL lpDDDestSurface AS LONG) AS LONG
    ! push lpDDDestSurface
    ! push lpDDDestSurface
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H0C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSAddOverlayDirtyRect(BYVAL lpDDSurface AS LONG, lpRect AS RECT PTR) AS LONG
    ! push lpRect
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H10]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSBlt(BYVAL lpDDSurface AS LONG, lpDestRect AS RECT PTR, BYVAL lpDDSrcSurface AS LONG, lpSrcRect AS RECT PTR, BYVAL dwFlags AS DWORD, lpDDBltFx AS DDBLTFX PTR) AS LONG
    ! push lpDDBltFx
    ! push dwFlags
    ! push lpSrcRect
    ! push lpDDSrcSurface
    ! push lpDestRect
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H14]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSBltBatch(BYVAL lpDDSurface AS LONG, lpDDBltBatch AS DDBLTBATCH PTR, BYVAL dwCount AS DWORD, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! push dwCount
    ! push lpDDBltBatch
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H18]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSBltFast(BYVAL lpDDSurface AS LONG, BYVAL dwX AS DWORD, BYVAL dwY AS DWORD, BYVAL lpDDSrcSurface AS LONG, lpSrcRect AS RECT PTR, BYVAL dwTrans AS DWORD) AS LONG
    ! push dwTrans
    ! push lpSrcRect
    ! push lpDDSrcSurface
    ! push dwY
    ! push dwX
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H1C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSDeleteAttachedSurface(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD, BYVAL lpDDAttachedSurface AS LONG) AS LONG
    ! push lpDDAttachedSurface
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H20]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSEnumAttachedSurfaces(BYVAL lpDDSurface AS LONG, BYVAL lpContext AS LONG, BYVAL lpEnumSurfacesCallback AS LONG) AS LONG
    ! push lpEnumSurfacesCallback
    ! push lpContext
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H24]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSEnumOverlayZOrders(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD, BYVAL lpContext AS LONG, BYVAL lpfnCallback AS LONG) AS LONG
    ! push lpfnCallback
    ! push lpContext
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H28]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSFlip(BYVAL lpDDSurface AS LONG, BYVAL lpDDSurfaceTargetOverride AS LONG, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! push lpDDSurfaceTargetOverride
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H2C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetAttachedSurface(BYVAL lpDDSurface AS LONG, lpDDSCaps AS DDSCAPS PTR, lpDDAttachedSurface AS LONG) AS LONG
    ! push lpDDAttachedSurface
    ! push lpDDSCaps
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H30]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetBltStatus(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H34]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetCaps(BYVAL lpDDSurface AS LONG, lpDDSCaps AS DDSCAPS PTR) AS LONG
    ! push lpDDSCaps
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H38]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetClipper(BYVAL lpDDSurface AS LONG, lpDDClipper AS LONG) AS LONG
    ! push lpDDClipper
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H3C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetColorKey(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD, lpDDColorKey AS DDCOLORKEY PTR) AS LONG
    ! push lpDDColorKey
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H40]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetDC(BYVAL lpDDSurface AS LONG, hDC AS LONG) AS LONG
    ! push hDC
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H44]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetFlipStatus(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H48]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetOverlayPosition(BYVAL lpDDSurface AS LONG, lplX AS LONG, lplY AS LONG) AS LONG
    ! push lplY
    ! push lplX
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H4C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetPalette(BYVAL lpDDSurface AS LONG, lpDDPalette AS LONG) AS LONG
    ! push lpDDPalette
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H50]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetPixelFormat(BYVAL lpDDSurface AS LONG, lpDDPixelFormat AS DDPIXELFORMAT PTR) AS LONG
    ! push lpDDPixelFormat
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H54]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetSurfaceDesc(BYVAL lpDDSurface AS LONG, lpDDSurfaceDesc AS DDSURFACEDESC PTR) AS LONG
    ! push lpDDSurfaceDesc
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H58]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSInitialize(BYVAL lpDD AS LONG, lpDDSurfaceDesc AS DDSURFACEDESC PTR) AS LONG
    ! push lpDDSurfaceDesc
    ! mov ecx, lpDD
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H5C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSIsLost(BYVAL lpDDSurface AS LONG) AS LONG
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H60]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSLock(BYVAL lpDDSurface AS LONG, lpDestRect AS RECT PTR, lpDDSurfaceDesc AS DDSURFACEDESC PTR, BYVAL dwFlags AS DWORD, BYVAL hEvent AS LONG) AS LONG
    ! push hEvent
    ! push dwFlags
    ! push lpDDSurfaceDesc
    ! push lpDestRect
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H64]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSReleaseDC(BYVAL lpDDSurface AS LONG, BYVAL hDC AS LONG) AS LONG
    ! push hDC
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H68]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSRestore(BYVAL lpDDSurface AS LONG) AS LONG
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H6C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSSetClipper(BYVAL lpDDSurface AS LONG, BYVAL lpDDClipper AS LONG) AS LONG
    ! push lpDDClipper
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H70]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSSetColorKey(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD, lpDDColorKey AS DDCOLORKEY PTR) AS LONG
    ! push lpDDColorKey
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H74]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSSetOverlayPosition(BYVAL lpDDSurface AS LONG, BYVAL lX AS LONG, BYVAL lY AS LONG) AS LONG
    ! push lY
    ! push lX
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H78]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSSetPalette(BYVAL lpDDSurface AS LONG, BYVAL lpDDPalette AS LONG) AS LONG
    ! push lpDDPalette
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H7C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSUnlock(BYVAL lpDDSurface AS LONG, BYVAL lpSurfaceData AS LONG) AS LONG
    ! push lpSurfaceData
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H80]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSUpdateOverlay(BYVAL lpDDSurface AS LONG, lpSrcRect AS RECT PTR, BYVAL lpDDDestSurface AS LONG, lpDestRect AS RECT PTR, BYVAL dwFlags AS DWORD, lpDDOverlayFx AS DDOVERLAYFX PTR) AS LONG
    ! push lpDDOverlayFx
    ! push dwFlags
    ! push lpDestRect
    ! push lpDDDestSurface
    ! push lpSrcRect
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H84]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSUpdateOverlayDisplay(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H88]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSUpdateOverlayZOrder(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD, BYVAL lpDDSReference AS LONG) AS LONG
    ! push lpDDSReference
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H8C]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSGetDDInterface(BYVAL lpDDSurface AS LONG, lpDD AS LONG) AS LONG
    ! push lpDD
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H90]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSPageLock(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H94]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSPageUnlock(BYVAL lpDDSurface AS LONG, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H98]
    ! mov FUNCTION[0], eax
    END FUNCTION


    FUNCTION DDSSetSurfaceDesc(BYVAL lpDDSurface AS LONG, lpddsd AS DDSURFACEDESC PTR, BYVAL dwFlags AS DWORD) AS LONG
    ! push dwFlags
    ! push lpddsd
    ! mov ecx, lpDDSurface
    ! push ecx
    ! mov ecx, dword ptr[ecx]
    ! call dword ptr[ecx+&H9C]
    ! mov FUNCTION[0], eax
    END FUNCTION
    $ENDIF


    ------------------

    Leave a comment:


  • Vladimir Shulakov
    started a topic DirectDraw & FPU

    DirectDraw & FPU

    'The example demonstrates use DDRAW with FPU
    '
    'I have not carried out optimization of a code - this is a crude code
    'This code has reminded me about old kind DOS
    'DisplayMode is 320x200x32 ~ &FFFFFFFF
    '
    'DDRAW.INC You can take in - http://ryme.future.easyspace.com/
    '
    'I have made change of a movement ON a vertical.
    'You has an opportunity TO make it also ON a horizontal.
    ' --------------------------- V.Shulakov ---------------------------


    #COMPILE EXE
    #OPTION VERSION4
    #DIM ALL
    #INCLUDE "WIN32API.INC"
    #INCLUDE "DDRAW.INC"


    %NULL_PAINT = &h00000000
    %BLUE_PAINT = &h000099ff
    %YELL_PAINT = &h00ffff00


    DECLARE SUB NEXTFLAG()

    GLOBAL ddsd AS DDSURFACEDESC
    GLOBAL fk AS SINGLE '
    GLOBAL lpDDSPrimary AS LONG
    GLOBAL ddscaps AS DDSCAPS
    GLOBAL LPDD AS DWORD
    GLOBAL DDWIDTH AS LONG
    GLOBAL DDHEIGHT AS LONG
    '__________________________________ START ___________________________________
    '
    FUNCTION WINMAIN (BYVAL hInst AS LONG, _
    BYVAL hPrevInst AS LONG, _
    CmdLine AS ASCIIZ PTR, _
    BYVAL CmdShow AS LONG) EXPORT AS LONG


    LOCAL Msg AS tagMsg
    LOCAL wndclass AS WndClassEx
    GLOBAL hWnd AS LONG
    LOCAL szClassName AS ASCIIZ * 80
    LOCAL szDisplayName AS ASCIIZ * 80
    LOCAL TMP AS LONG
    GLOBAL GPTR AS LONG

    DIM G(1:200,1:90) AS GLOBAL LONG

    GPTR = VARPTR(G(1,1))
    ddwidth = 320
    ddheight = 200
    fk = 0.031
    szClassName = "DDraw FPU Demo"
    szDisplayName = szClassName
    wndclass.cbSize = SIZEOF(WndClass)
    wndclass.style = %CS_HREDRAW OR %CS_VREDRAW
    wndclass.lpfnWndProc = CODEPTR( WndProc )
    wndclass.cbClsExtra = 0
    wndclass.cbWndExtra = 0
    wndclass.hInstance = hinst
    wndclass.hIcon = 0
    wndclass.hCursor = 0
    wndclass.hbrBackground = GetStockObject( %white_BRUSH )
    wndclass.lpszMenuName = %NULL
    wndclass.lpszClassName = VARPTR( szClassName )
    wndclass.hIconSm = 0


    RegisterClassEx wndclass

    HWND=CreateWindowEx(0,szClassName,_
    szDisplayName,_
    %WS_POPUP,_
    0, 0, ddwidth, ddheight,_
    BYVAL %NULL, BYVAL %NULL,_
    hInst, BYVAL %NULL)
    ShowWindow hWnd, %SW_SHOWNORMAL
    SetFocus hWnd
    ShowCursor 0
    '_________________________________________________________________
    '
    IF %DD_OK<>DDDirectDrawCreate(BYVAL %NULL,lpDD,BYVAL %NULL) THEN
    ! JMP FATAL
    END IF
    IF %DD_OK<>DDSetCooperativeLevel(lpDD, hWnd, _
    %DDSCL_EXCLUSIVE OR %DDSCL_FULLSCREEN) THEN
    ! JMP FATAL
    END IF
    IF %DD_OK<>DDSetDisplayMode( lpDD, ddwidth, ddheight, 32) THEN
    ! JMP FATAL
    END IF
    ddsd.dwSize=SIZEOF(DDSD)
    ddsd.dwFlags=%DDSD_CAPS
    ddsd.ddsCaps.dwCaps=%DDSCAPS_PRIMARYSURFACE
    IF %DD_OK<>DDCreateSurface(lpDD, ddsd, lpDDSPrimary) THEN
    ! JMP FATAL
    END IF
    '_________________________________________________________________
    '
    WHILE -1
    IF 0<>PeekMessage(msg, BYVAL %NULL, 0, 0, %PM_REMOVE) THEN
    IF msg.message = %WM_QUIT THEN
    PostQuitMessage msg.wParam
    EXIT LOOP
    ELSE
    TranslateMessage msg
    DispatchMessage msg
    END IF
    ELSE
    IF GetFocus = hWnd THEN
    ddsd.dwSize= SIZEOF(DDSD) '(DDSURFACEDESC)
    ddsd.dwFlags=%DDSD_PITCH

    WHILE -1
    TMP=DDSLock(lpDDSPrimary, BYVAL %NULL, ddsd, %DDLOCK_WAIT, BYVAL %NULL)
    IF TMP = %DD_OK THEN
    EXIT LOOP
    ELSEIF TMP = %DDERR_SURFACELOST THEN
    DDSRestore lpDDSPrimary
    END IF
    WEND
    DDWaitForVerticalBlank lpDD, %DDWAITVB_BLOCKBEGIN, BYVAL %NULL
    STATIC L AS LONG
    IF L=0 THEN
    ! call NEXTframe
    ! mov L,1
    ELSE
    ! call NEXTFLAG
    END IF
    DDSUNLOCK lpDDSPrimary, ddsd.lpSurface
    ELSE
    ! mov L,0
    END IF
    END IF
    WEND
    FATAL: '*************************************************************
    IF lpDD <> %NULL THEN
    IF lpDDSPrimary <> %NULL THEN
    DDIRelease lpDDSPrimary
    lpDDSPrimary = %NULL
    END IF
    DDIRelease lpDD
    lpDD = %NULL
    END IF
    FUNCTION= msg.wParam
    END FUNCTION
    '_____________________________________________________________________________________
    ' Window Proc
    '_____________________________________________________________________________________
    '
    FUNCTION WndProc (BYVAL hWin AS LONG, BYVAL uMsg AS LONG, _
    BYVAL wParam AS LONG, BYVAL lParam AS LONG) EXPORT AS LONG

    IF uMsg = %WM_KEYDOWN THEN
    IF wParam = %VK_ESCAPE THEN
    PostQuitMessage 0
    FUNCTION=0
    EXIT FUNCTION
    END IF
    ELSEIF uMsg = %WM_DESTROY THEN
    PostQuitMessage 0
    FUNCTION=0
    EXIT FUNCTION
    END IF

    FUNCTION = DefWindowProc(hWin, uMsg, wParam, lParam)

    END FUNCTION
    '____________________________________________________________
    '
    SUB nextFrame
    #REGISTER NONE
    LOCAL col AS LONG
    LOCAL j AS LONG
    LOCAL i AS LONG
    ! PUSHAD
    ! mov eax,ddsd[36]
    ! mov esi,eax ; ' htmp=ddsd.lpSurface
    ! mov col,201
    ! xor edx,edx
    mf0:
    ! inc edx
    ! dec col
    ! mov eax,esi
    ! mov edi,eax
    ! xor ecx,ecx
    mf1:
    ! inc ecx
    ! mov eax,230
    ! sub eax,col
    ! mov ebx,edi
    ! mov [ebx],eax ; ' BLUE
    ! INC edi
    ! mov eax,230
    ! sub eax,col
    ! mov ebx,edi
    ! mov [ebx],eax ; ' GREEN
    ! INC edi
    ! mov ebx,edi
    ! xor eax,eax
    ! mov [ebx],eax ; ' RED
    ! INC edi
    ! mov ebx,edi
    ! xor eax,eax
    ! mov [ebx],eax ; ' REZiNTEN -----
    ! INC edi
    ! cmp ecx,320
    ! jne mf1 ;--------------------->
    ! mov eax,ddsd[16]
    ! add esi,eax ; ' htmp=htmp+ddsd.Union1.lPitch
    ! cmp edx,200
    ! jne mf0 ;--------------------->
    ! mov J,0
    mfr2: 'for j
    ! mov I,0
    mfr1: 'for i
    ! cmp J,11
    ! jl ML1
    ! cmp J,80
    ! jg ML1
    ! cmp I,11
    ! jl ML1
    ! cmp I,190
    ! jg ML1
    ! cmp J,46
    ! jl ML2
    ! jmp ML3
    ML1:
    ! mov eax,J
    ! mov ebx,800
    ! mul ebx
    ! mov edx,eax
    ! mov ebx,I
    ! shl ebx,2
    ! add edx,ebx
    ! add edx,GPTR
    ! mov esi,%NULL_PAINT
    ! mov [edx],esi
    ! jmp ML0
    ML2:
    ! mov eax,j
    ! mov ebx,800
    ! mul ebx
    ! mov edx,eax
    ! mov ebx,I
    ! shl ebx,2
    ! add edx,ebx
    ! add edx,GPTR
    ! mov esi,%BLUE_PAINT
    ! mov [edx],esi
    ! jmp ML0
    ML3:
    ! mov eax,j
    ! mov ebx,800
    ! mul ebx
    ! mov edx,eax
    ! mov ebx,I
    ! shl ebx,2
    ! add edx,ebx
    ! add edx,GPTR
    ! mov esi,%YELL_PAINT
    ! mov [edx],esi
    ML0:
    ! inc I
    ! cmp I,200
    ! jl mfr1
    ! inc J
    ! cmp J,90
    ! jl mfr2
    ! POPAD
    END SUB
    '_________________________________________________________
    '
    SUB NEXTFLAG
    #REGISTER NONE
    LOCAL i AS LONG 'for i~
    LOCAL J AS LONG 'for j~
    STATIC K AS SINGLE 'FPU tmp
    STATIC J1 AS SINGLE 'FPU tmp
    STATIC H AS LONG
    STATIC H1 AS LONG
    LOCAL col AS LONG 'COLOR--
    LOCAL ftmp AS LONG 'FPU tmp
    LOCAL fi AS LONG 'FPU tmp
    ! PUSHAD
    ! mov eax,ddsd[16] ;ddsd.Union1.lPitch
    ! mov ebx,45
    ! mul ebx
    ! add eax,ddsd[36] ;ddsd.lpSurface
    ! mov esi,eax ;htmp
    ! mov FI,10
    ! mov I,0
    mfrp1: 'for i 200
    ! inc I
    ! fld K
    ! fadd FK
    ! fst K
    ! fcos
    ! fimul FI
    ! fist H
    ! fst J1
    ! mov ftmp,4
    ! fimul ftmp
    ! fist H1
    ! add H1,40
    ! fninit
    ! mov eax,ddsd[16]
    ! mul H
    ! mov ebx,eax
    ! mov eax,I
    ! shl eax,2
    ! add eax,240
    ! add eax,esi
    ! add eax,ebx
    ! mov edi,eax
    ! mov COL,201
    ! mov J,0
    mfrp2: 'for j 90
    ! inc J
    ! INC H
    ! DEC COL

    ! mov eax,J
    ! dec eax
    ! mov ebx,800
    ! mul ebx
    ! mov edx,eax
    ! mov ebx,I
    ! dec ebx
    ! shl ebx,2
    ! add edx,ebx
    ! add edx,GPTR
    ! mov eax,[edx]
    ! cmp eax,0 ;cmp<>0
    ! jz m_null
    ! mov al,[edx]
    ! cmp al,0
    ! jz mb1
    ! sub al,H1
    mb1:
    ! mov [edi],al
    ! mov al,[edx+1]
    ! cmp al,0
    ! jz mb2
    ! sub al,H1
    mb2:
    ! mov [edi+1],al
    ! mov al,[edx+2]
    ! cmp al,0
    ! jz mb3
    ! sub al,H1
    mb3:
    ! mov [edi+2],al
    ! mov al,[edx+3]
    ! cmp al,0
    ! jz mb4
    ! sub al,H1
    mb4:
    ! mov [edi+3],al
    ! jmp m_finish
    m_null: 'frame colored fill
    ! mov al,H
    ! add al,74
    ! mov [edi],al ; 'BLUE 155 << 177 >--
    ! mov [edi+1],al ; 'GREEN
    ! xor al,al
    ! mov [edi+2],al ; 'RED
    ! mov [edi+3],al ; 'INTENS
    m_finish:
    ! mov eax,ddsd[16]
    ! add edi,eax
    ! cmp J,90
    ! jl mfrp2 ;--------------------->
    ! cmp I,200
    ! jl mfrp1 ;--------------------->
    ! POPAD
    END SUB
    '___________________________________________________________________
    '
    ' end end end end end end end end end end end end end end end end
    '___________________________________________________________________
    '




    ------------------
Working...
X