summaryrefslogtreecommitdiffstats
path: root/public/sdk/inc/callconv.inc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--public/sdk/inc/callconv.inc303
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