'   0 IDirectDraw2_QueryInterface(p, a, b)          (p)->lpVtbl->QueryInterface(p, a, b)          
'   1 IDirectDraw2_AddRef(p)                        (p)->lpVtbl->AddRef(p)                        
'   2 IDirectDraw2_Release(p)                       (p)->lpVtbl->Release(p)                       
'   3 IDirectDraw2_Compact(p)                       (p)->lpVtbl->Compact(p)                       
'   4 IDirectDraw2_CreateClipper(p, a, b, c)        (p)->lpVtbl->CreateClipper(p, a, b, c)        
'   5 IDirectDraw2_CreatePalette(p, a, b, c, d)     (p)->lpVtbl->CreatePalette(p, a, b, c, d)     
'   6 IDirectDraw2_CreateSurface(p, a, b, c)        (p)->lpVtbl->CreateSurface(p, a, b, c)        
'   7 IDirectDraw2_DuplicateSurface(p, a, b)        (p)->lpVtbl->DuplicateSurface(p, a, b)        
'   8 IDirectDraw2_EnumDisplayModes(p, a, b, c, d)  (p)->lpVtbl->EnumDisplayModes(p, a, b, c, d)  
'   9 IDirectDraw2_EnumSurfaces(p, a, b, c, d)      (p)->lpVtbl->EnumSurfaces(p, a, b, c, d)      
'  10 IDirectDraw2_FlipToGDISurface(p)              (p)->lpVtbl->FlipToGDISurface(p)              
'  11 IDirectDraw2_GetCaps(p, a, b)                 (p)->lpVtbl->GetCaps(p, a, b)                 
'  12 IDirectDraw2_GetDisplayMode(p, a)             (p)->lpVtbl->GetDisplayMode(p, a)             
'  13 IDirectDraw2_GetFourCCCodes(p, a, b)          (p)->lpVtbl->GetFourCCCodes(p, a, b)          
'  14 IDirectDraw2_GetGDISurface(p, a)              (p)->lpVtbl->GetGDISurface(p, a)              
'  15 IDirectDraw2_GetMonitorFrequency(p, a)        (p)->lpVtbl->GetMonitorFrequency(p, a)        
'  16 IDirectDraw2_GetScanLine(p, a)                (p)->lpVtbl->GetScanLine(p, a)                
'  17 IDirectDraw2_GetVerticalBlankStatus(p, a)     (p)->lpVtbl->GetVerticalBlankStatus(p, a)     
'  18 IDirectDraw2_Initialize(p, a)                 (p)->lpVtbl->Initialize(p, a)                 
'  19 IDirectDraw2_RestoreDisplayMode(p)            (p)->lpVtbl->RestoreDisplayMode(p)            
'  20 IDirectDraw2_SetCooperativeLevel(p, a, b)     (p)->lpVtbl->SetCooperativeLevel(p, a, b)     
'  21 IDirectDraw2_SetDisplayMode(p, a, b, c, d, e) (p)->lpVtbl->SetDisplayMode(p, a, b, c, d, e) 
'  22 IDirectDraw2_WaitForVerticalBlank(p, a, b)    (p)->lpVtbl->WaitForVerticalBlank(p, a, b)    
'  23 IDirectDraw2_GetAvailableVidMem(p, a, b, c)   (p)->lpVtbl->GetAvailableVidMem(p, a, b, c)   

' ****************************************************************************************
function iDirectDraw2Prototype() as hresult
  #ifdef DebugFatal
    printf(!"iDirectDraw2::#%i Function not implemented\n",IDIRECTDRAW2PROTOID)
    messagebox(null,"iDirectDraw2::#" & IDIRECTDRAW2PROTOID & " Function not implemented", _
    "DirectX",MB_SYSTEMMODAL or MB_ICONERROR)
  #endif  
  ExitProcess(1)
  return DDERR_UNSUPPORTED  
  
  asm
    .balign 32
    _IDirectDraw2ProtoTable_:  
    #macro ProtoNum(X)
    mov dword ptr [IDIRECTDRAW2PROTOID],X
    jmp iDirectDraw2Prototype
    .balign 32
    #endmacro
    ProtoNum(0)
    ProtoNum(1)
    ProtoNum(2)
    ProtoNum(3)
    ProtoNum(4)
    ProtoNum(5)
    ProtoNum(6)
    ProtoNum(7)
    ProtoNum(8)
    ProtoNum(9)
    ProtoNum(10)
    ProtoNum(11)
    ProtoNum(12)
    ProtoNum(13)
    ProtoNum(14)
    ProtoNum(15)
    ProtoNum(16)
    ProtoNum(17)
    ProtoNum(18)
    ProtoNum(19)
    ProtoNum(20)
    ProtoNum(21)
    ProtoNum(22)
    ProtoNum(23)
    ProtoNum(24)
    ProtoNum(25)
    ProtoNum(26)
    ProtoNum(27)
    ProtoNum(28)
    ProtoNum(29)
    ProtoNum(30)
    ProtoNum(31)
    ProtoNum(32)
  end asm  
  
end function
' ****************************************************************************************
UndefAll()
#define P1 IDIRECTDRAW2 as iDirectDraw2Object ptr
function iDirectDraw2_2_Release(P1) as hresult
  #ifdef MyDebugX
  Cout("IDirectDraw2.Release (2)" + chr$(13,10) + _
  " >> IDIRECTDRAW2: "+hex$(cast(uinteger,IDIRECTDRAW2),8))
  #endif
  Delete IDIRECTDRAW2  
  return DD_OK
end function
' ****************************************************************************************
UndefAll()
#define P1 IDIRECTDRAW2 as iDirectDraw2Object ptr
#define P2 lpDDSCaps as LPDDSCAPS
#define P3 lpdwTotal as LPDWORD
#define P4 lpdwFree as LPDWORD    
function iDirectDraw2_23_GetAvailableVidMem(P1,P2,P3,P4) as hresult
  #ifdef MyDebugX
  Cout("IDirectDraw2.GetAvailableVidMem (23)" + chr$(13,10) + _
  " >> IDIRECTDRAW2: "+hex$(cast(uinteger,IDIRECTDRAW2),8) + _
  " Caps: "+HexPtr(lpDDSCaps)+"  Total: "+HexPtr(lpdwTotal)+ "  Free: "+HexPtr(lpdwFree))
  #endif
  if lpDDSCaps = null then 
    ddrawError(DDERR_INVALIDCAPS)
  end if
    
  if lpdwTotal then *lpdwTotal = 16*(1024*1024)
  if lpdwFree then *lpdwTotal = 16*(1024*1024)
  return DD_OK
end function
' ****************************************************************************************
' ****************************************************************************************
sub iDirectDraw2Funcs(VTABLE() as any ptr)
  dim as any ptr PROTOTABLE
  asm mov dword ptr [PROTOTABLE], offset _IDirectDraw2ProtoTable_
  for CNT as integer = 0 to 32
    VTABLE(CNT) = PROTOTABLE+CNT*32
  next CNT  
  VTABLE(2) = @iDirectDraw2_2_Release
  VTABLE(23) = @iDirectDraw2_23_GetAvailableVidMem
end sub
