; Win32 programming headers (ASCII)
include 'macro\struct.inc'
include 'macro\proc32.inc'
include 'macro\com32.inc'
include 'macro\import32.inc'
include 'macro\export.inc'
include 'macro\resource.inc'
include 'macro\if.inc'
include 'macro\sysmacros.inc'

;include '%fasminc%\win32a.inc'
;include '%fasminc%\equates\kernel32.inc' ;kernel32.dll
;include '%fasminc%\equates\gdi32.inc'    ;gdi32.dll
;include '%fasminc%\equates\user32.inc'   ;user32.dll
;include '%fasminc%\equates\comctl32.inc' ;comctl32.dll
;include '%fasminc%\equates\comdlg32.inc' ;comdlg32.dll
;include '%fasminc%\equates\shell32.inc'  ;shell32.dll
;include '%fasminc%\equates\ole32.inc'    ;ole32.dll
;include '%fasminc%\equates\oleaut32.inc' ;oleaut32.dll
;include '%fasminc%\equates\urlmon.inc'   ;urlmon.dll
;include '%fasminc%\equates\exdisp.inc'   ;
;include '%fasminc%\equates\winmm.inc'    ;winmm.dll
;include '%fasminc%\equates\uxtheme.inc'  ;uxtheme.dll, dwmapi.dll
;include '%fasminc%\equates\vfw.inc'      ;msvfw32.dll, avifil32.dll, avicap32.dll
;include '%fasminc%\equates\gdiplus.inc'  ;gdiplus.dll
;include '%fasminc%\equates\wsock2.inc'   ;wsock32.dll
;include '%fasminc%\equates\shlwapi.inc'  ;shlwapi.dll
;include '%fasminc%\equates\wincrypt.inc' ;advapi32.dll
;include '%fasminc%\equates\winspool.inc' ;localspl.dll
;include '%fasminc%\equates\wininet.inc'  ;wininet.dll <> winhttp.dll
;include '%fasminc%\equates\winioctl.inc' ;kernel32.dll
;include '%fasminc%\equates\richedit.inc' ;riched20.dll
;include '%fasminc%\equates\shlobj.inc'   ;mpr.dll

;include '%fasminc%\macro\turboasmdd.inc'
;include '%fasminc%\equates\opengl32.inc' ;opengl32.dll; glu32.dll; glut32.dll
;include '%fasminc%\equates\directx\ddraw.inc' ;ddraw.dll'
;include '%fasminc%\equates\directx\dinput8.inc' ;dinput8.dll
;include '%fasminc%\equates\directx\d3d9.inc'  ;d3d9.dll
;include '%fasminc%\equates\directx\d3dx9.inc' ;d3dx9_xx.dll
;include '%fasminc%\equates\directx\dsound8.inc' ;dsound8.dll
;include '%fasminc%\equates\directx\mappydx7.inc' ;mappydx7.dll
;include '%fasminc%\equates\directx\fmod374.inc' ;fmod.dll *
;include '%fasminc%\equates\directx\ddrawvideo.inc' ;msvfw32.dll

struc TCHAR [val] { common match any, val \{ . db val \}
			   match , val \{ . db ? \} }

macro allow_nesting
{ macro pushd value
  \{ match ,value \\{
      pushx equ \\}
     match =pushx =invoke proc,pushx value \\{
      allow_nesting
      invoke proc
      purge pushd,invoke,stdcall,cinvoke,ccall
      push eax
      pushx equ \\}
     match =pushx =stdcall proc,pushx value \\{
      allow_nesting
      stdcall proc
      purge pushd,invoke,stdcall,cinvoke,ccall
      push eax
      pushx equ \\}
     match =pushx =cinvoke proc,pushx value \\{
      allow_nesting
      cinvoke proc
      purge pushd,invoke,stdcall,cinvoke,ccall
      push eax
      pushx equ \\}
     match =pushx =ccall proc,pushx value \\{
      allow_nesting
      ccall proc
      purge pushd,invoke,stdcall,cinvoke,ccall
      push eax
      pushx equ \\}
     match =pushx,pushx \\{
      pushd <value>
      pushx equ \\}
     restore pushx \}
  macro invoke proc,[arg]
  \{ \common count@stdcall = 0
	     if ~ arg eq
     \forward count@stdcall = count@stdcall+1
	      match =double value, arg \\{ count@stdcall = count@stdcall+1 \\}
     \common end if
	     if defined proc \# %
	      if count@stdcall <> proc \# %
	       display "Error: invalid count of parameters for ",\`proc,".",0Dh,0Ah
	       ;err
	      end if
	     end if
     \reverse pushd <arg>
     \common call [proc] \}
  macro stdcall proc,[arg]
  \{ \common count@stdcall = 0
	     if ~ arg eq
     \forward count@stdcall = count@stdcall+1
	      match =double value, arg \\{ count@stdcall = count@stdcall+1 \\}
     \common end if
	     if defined proc \# %
	      if count@stdcall <> proc \# %
	       display "Error: invalid count of parameters for ",\`proc,".",0Dh,0Ah
	       ;err
	      end if
	     end if
     \reverse pushd <arg>
     \common call proc \}
  macro cinvoke proc,[arg]
  \{ \common \local size
	     size = 0
	     if ~ arg eq
     \reverse pushd <arg>
	      size = size+4
	      match =double any,arg \\{ size = size+4 \\}
     \common end if
	     call [proc]
	     if size
	     add esp,size
	     end if \}
  macro ccall proc,[arg]
  \{ \common \local size
	     size = 0
	     if ~ arg eq
     \reverse pushd <arg>
	      size = size+4
	      match =double any,arg \\{ size = size+4 \\}
     \common end if
	     call proc
	     if size
	     add esp,size
	     end if \} }

macro pushd value
{ match first=,more, value \{ \local ..continue
   call ..continue
   db value,0
   ..continue:
   pushd equ \}
  match pushd =addr var,pushd value \{ \local ..opcode,..address
   virtual at 0
    label ..address at var
    mov eax,dword [..address]
    load ..opcode from 0
   end virtual
   if ..opcode = 0A1h
    push var
   else
    lea edx,[..address]
    push edx
   end if
   pushd equ \}
  match pushd =double [var],pushd value \{
   push dword [var+4]
   push dword [var]
   pushd equ \}
  match pushd =double =ptr var,pushd value \{
   push dword [var+4]
   push dword [var]
   pushd equ \}
  match pushd =double num,pushd value \{ \local ..high,..low
   virtual at 0
    dq num
    load ..low dword from 0
    load ..high dword from 4
   end virtual
   push ..high
   push ..low
   pushd equ \}
  match pushd,pushd \{ \local ..continue
   if value eqtype ''
    call ..continue
    db value,0
    ..continue:
   else
    push value
   end if
   pushd equ \}
  restore pushd }

allow_nesting

include 'pcount\kernel32.inc'
include 'pcount\user32.inc'
include 'pcount\gdi32.inc'
include 'pcount\advapi32.inc'
include 'pcount\comctl32.inc'
include 'pcount\comdlg32.inc'
include 'pcount\shell32.inc'
include 'pcount\wsock32.inc'
include 'pcount\gdiplus.inc'
include 'pcount\winmm.inc'
include 'pcount\oleaut32.inc'
include 'pcount\ole32.inc'
include 'pcount\winspool.inc'
include 'pcount\wininet.inc'
include 'pcount\opengl32.inc'
;include 'pcount\glaux.inc'
include 'pcount\glu32.inc'
include 'pcount\glut32.inc'
include 'pcount\TurboAsmDD.inc'

macro .data { section '.data' data readable writeable }
macro .code { section '.code' code readable executable }
macro .bss  { section '.bss' data readable writeable }
