|
|
;****************************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
|