; Magic for proc32.inc: prologue/epilogue for esp-based addressing
; fpo stands from Frame Pointer Omission
macro fpo_prologue procname,flag,parmbytes,localbytes,reglist
{
local loc,regcount
    loc = (localbytes+3) and (not 3)
    regcount = 0
    irps reg, reglist
    \{
        regcount = regcount+1
        push    reg
    \}
    if loc
        sub     esp, loc
    end if
    parmbase@proc equ esp+4+loc+regcount*4
    localbase@proc equ esp
    fpo_localsize = loc
    fpo_delta = 0
}
macro fpo_epilogue procname,flag,parmbytes,localbytes,reglist
{
    if fpo_localsize
        add     esp, fpo_localsize
    end if
    irps reg, reglist \{ reverse pop reg \}
    if flag and 10000b
        retn
    else
        retn    parmbytes
    end if
}
macro deflocal@proc name,def,[val]
{
   common
    deflocal@proc name#_unique_suffix,def,val
    all@vars equ all@vars,name
    name equ name#_unique_suffix+fpo_delta
}
macro defargs@proc [arg]
{
   common
    rawargs equ
    srcargs equ arg
   forward
    rawargs equ rawargs,arg#_unique_suffix
   common
    match =,tmp,rawargs \{
    defargs@proc tmp
    uniqargs equ args@proc
    restore args@proc
    args@proc equ uniqargs,srcargs
    \}
   forward
    arg equ arg#_unique_suffix+fpo_delta
}
macro stdcall proc,[arg]                ; directly call STDCALL procedure
{  common
        fpo_delta_base = fpo_delta
    if ~ arg eq
   reverse
        pushd   arg
        fpo_delta = fpo_delta + 4
   common
    end if
        call    proc
        fpo_delta = fpo_delta_base
}
macro ccall proc,[arg]                  ; directly call CDECL procedure
{  common
        fpo_delta_base = fpo_delta
        size@ccall = 0
    if ~ arg eq
   reverse
        pushd   arg
        fpo_delta = fpo_delta + 4
        size@ccall = size@ccall+4
   common
    end if
        call    proc
    if size@ccall
        add     esp, size@ccall
    end if
        fpo_delta = fpo_delta_base
}
fpo_delta = 0