diff options
Diffstat (limited to 'public/sdk/inc/callconv.inc')
-rw-r--r-- | public/sdk/inc/callconv.inc | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/public/sdk/inc/callconv.inc b/public/sdk/inc/callconv.inc new file mode 100644 index 000000000..86ca9c629 --- /dev/null +++ b/public/sdk/inc/callconv.inc @@ -0,0 +1,303 @@ +;****************************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 |