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