NT4/public/sdk/inc/callconv.inc
2020-09-30 17:12:29 +02:00

304 lines
6.5 KiB
PHP

;****************************CallConv.Inc************************************
;
; Copyright (c) 1990-1995, Microsoft Corp. All rights reserved.
;
;****************************************************************************
;****************************Public Macro************************************
;
; ComposeInst Inst,p1,p2,p3,p4,p5,p6,p7,p8,p9
;
; This macro simply concatenates all arguments into one string.
;
;
;****************************************************************************
ComposeInst macro Inst,p1,p2,p3,p4,p5,p6,p7,p8,p9
&Inst p1&p2&p3&p4&p5&p6&p7&p8&p9
endm
;****************************Public Macro************************************
;
; CountArg cCount,ArgList
;
; This macro count the number of arguments in the ArgList and returns
; the value in cCount.
;
;
;****************************************************************************
CountArg macro cCount,ArgList
cCount = 0
irp arg,<ArgList>
cCount = cCount+1
endm
endm
;****************************Public Macro************************************
;
; RevPush ArgList,cCount
;
; This macro pushes the arguments in ArgList in the reverse order
; and returns the number of arguments in cCount.
;
;
;****************************************************************************
RevPush macro ArgList,cCount
Local index,x
CountArg cCount,<ArgList>
index = cCount
rept cCount
x = 0
irp arg,<ArgList>
x = x+1
ife index-x
push arg
exitm
endif
endm
index = index-1
endm
endm
;****************************Public Macro************************************
;
; The following sections contain calling-convention related macros for:
;
; PUBLICP Func,N
; to define a public label
;
; EXTRNP Func,N,Thunk
; to define a external near label
;
; LABELP Func,N
; to label an address as a routine entry point
;
; stdPROC Func,N,ArgList
; to declare a routine header
;
; ProcName Name,Func,N
; to rename a function Func to Name. Using it in conjunction with
; normal function declaration (with the new name) will solve an error
; caused by a long parameter list routine that exhausts page width.
;
; stdRET Func
; to return from Func routines (declared with stdPROC or ProcName.)
;
; stdENDP Func
; to declare the end of routine (declared with stdPROC or ProcName.)
;
; endMod Func
; to declare the end of module with an entry point at Func (declared
; with stdPROC or ProcName.)
;
; stdCall Func,ArgList
; to call to a routine--Func--with the arguments pushed on the stack
;
; MovAddr dest,Func,n
; to move the address of the routine--Func--into dest.
;
; Note that for the standard calling convention all the function names,
; Func, are automatically converted to Func@N where N is the number of
; bytes (decimal) in the argument list.
;
;
;****************************************************************************
if @Version GE 600
option nokeyword:<stdcall>
endif
PUBLICP macro Func,N
ifb <N>
public Func&@0
else
PUBLICP2 Func,%(N*4)
endif
endm
PUBLICP2 macro Func,N
public Func&@&N
endm
EXTRNP macro Func,N,Thunk,FastCall
ifb <N>
IFNDEF Func&@0
extrn Func&@0:NEAR
ENDIF
else
ifb <FastCall>
ifb <Thunk>
EXTRNP2 Func,%(N*4)
else
EXTRNTHUNK Func,%(N*4)
endif
else
cFCall&@&Func equ (N*4)
ifb <Thunk>
EXTRNP2 &@&Func,%(N*4)
else
EXTRNTHUNK &@&Func,%(N*4)
endif
endif
endif
endm
EXTRNP2 macro Func,N
IFNDEF Func&@&N
extrn Func&@&N:NEAR
ENDIF
endm
EXTRNTHUNK macro Func,N
IFNDEF __imp_&Func&@&N
extrn __imp_&Func&@&N:DWORD
ENDIF
endm
LABELP macro Func,N
ifb <N>
Func&@0 label near
else
LABELP2 Func,%(N*4)
endif
endm
LABELP2 macro Func,N
Func&@&N label near
endm
ProcName macro Name,Func,N
ifb <N>
cByte&Func equ 0
Name equ <Func&@0>
else
cByte&Func equ N
Name equ <Func&@&N>
endif
endm
stdPROC macro Func,N,ArgList
ProcName Func,Func,%(N*4)
Func proc ArgList
endm
cPublicProc macro Func,N,ArgList
align dword
PUBLICP Func,N
ifb <N>
stdPROC Func,0,<ArgList>
else
stdPROC Func,N,<ArgList>
endif
endm
ProcNameF macro Name,Func,N,M
cByte&Func equ M
cFCall&Func equ N
Name equ <Func&@&N>
endm
stdPROCF macro Func,N,ArgList
if N gt 2
ProcNameF Func,Func,%(N*4),%((N-2)*4)
else
ProcNameF Func,Func,%(N*4),0
endif
Func proc ArgList
endm
cPublicFastCall macro Func,N,ArgList
align dword
PUBLICP &@&Func,N
ifb <N>
stdPROCF &@&Func,0,<ArgList>
else
stdPROCF &@&Func,N,<ArgList>
endif
endm
fstRET macro Func
ret cByte&@&Func
endm
stdRET macro Func
ret cByte&Func
endm
cPublicFpo macro FpoLocals, FpoParams
.FPO ( FpoParams, FpoLocals, 0, 0, 0, 0 )
endm
fstENDP macro Func
&@&Func endp
endm
stdENDP macro Func
Func endp
endm
endMod macro Func
end Func
endm
stdCallCall macro Func,N
IFDEF __imp_&Func&@&N
call dword ptr [__imp_&Func&@&N]
ELSE
call Func&@&N
ENDIF
endm
stdCall macro Func,ArgList
Local Bytes
RevPush <ArgList>,Bytes
Bytes = Bytes*4
stdCallCall Func,%(Bytes)
endm
fstCall macro Func,ArgList
Local Bytes
RevPush <ArgList>,Bytes
Bytes = Bytes*4
if Bytes eq 0
stdCallCall &@&Func,%cFCall&@&Func
else
; must have 2 register params
stdCallCall &@&Func,%(Bytes+8)
endif
endm
MovAddr macro dest,addr,n
ComposeInst <mov >,dest,<,offset FLAT:>,addr,<@>,n
endm