windows-nt/Source/XPSP1/NT/drivers/published/ddk/inc/stdcall.w

369 lines
7.2 KiB
OpenEdge ABL
Raw Normal View History

2020-09-26 03:20:57 -05:00
;****************************Public Macro************************************
;
; ComposeInst Inst,p1,p2,p3,p4,p5,p6,p7,p8,p9
;
; This macro simply concatenates all arguments into one string.
;
; History:
; Thu 15-Aug-1991 16:21:14 -by- Viroon Touranachun [viroont]
; Created
;
;****************************************************************************
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.
;
; History:
; Thu 15-Aug-1991 16:21:14 -by- Viroon Touranachun [viroont]
; Created
;
;****************************************************************************
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.
;
; History:
; Thu 15-Aug-1991 16:21:14 -by- Viroon Touranachun [viroont]
; Created
;
;****************************************************************************
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
; to define a external near label
;
; LABELP Func,N
; to label an address as a routine entry point
;
; cProc 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.
;
; cRet Func
; to return from Func routines (declared with cProc or ProcName.)
;
; endProc Func
; to declare the end of routine (declared with cProc or ProcName.)
;
; endMod Func
; to declare the end of module with an entry point at Func (declared
; with cProc or ProcName.)
;
; cCall Func,ArgList
; to call to a routine--Func--with the arguments pushed on the stack
;
; ptrCall Func,ArgList
; to call through a pointer 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 in the argument list.
;
; History:
; Thu 15-Aug-1991 16:21:14 -by- Viroon Touranachun [viroont]
; Created
;
;****************************************************************************
IFNDEF DOS_PLATFORM
IFNDEF STD_CALL
;****************************************************************************
;
; This section is used exclusively for C calling convention.
;
;****************************************************************************
PUBLICP macro Func,N
public &Func
endm
EXTRNP macro Func,N
extrn &Func:NEAR
endm
LABELP macro Func,N
&Func LABEL NEAR
endm
ProcName macro Name,Func,N
&Name EQU <&Func>
endm
cProc macro Func,N,ArgList
ProcName xxx&Func,Func,N
xxx&Func proc &ArgList
endm
cRet macro Func
ret
endm
endProc macro Func
xxx&Func endp
endm
endMod macro Func
end xxx&Func
endm
ptrCall macro Func,ArgList
Local Bytes
RevPush <ArgList>,Bytes
Bytes = Bytes*4
call &Func
if Bytes GT 0
add esp,Bytes
endif
endm
cCall macro Func,ArgList
Local Bytes
RevPush <ArgList>,Bytes
Bytes = Bytes*4
call &Func
if Bytes GT 0
add esp,Bytes
endif
endm
MovAddr macro dest,addr,n
mov dest,offset FLAT:&addr
endm
ENDIF ; STD_CALL
ELSE
IFNDEF STD_CALL
;****************************************************************************
;
; This section is used exclusively for Pascal calling convention.
;
;****************************************************************************
PUBLICP macro Func,N
public &Func
endm
EXTRNP macro Func,N
extrn &Func:NEAR
endm
LABELP macro Func,N
&Func LABEL NEAR
endm
ProcName macro Name,Func,N
&Name EQU <&Func>
endm
cProc macro Func,N,ArgList
ProcName xxx&Func,Func,N
xxx&Func proc &ArgList
endm
cRet macro Func
ret
endm
endProc macro Func
xxx&Func endp
endm
endMod macro Func
end xxx&Func
endm
cCall macro Func,ArgList
irp arg,<ArgList>
push arg
endm
call &Func
endm
MovAddr macro dest,addr,n
mov dest,offset FLAT:&addr
endm
ENDIF : ~STD_CALL
ENDIF ; DOS_PLATFORM
IFDEF STD_CALL
;****************************************************************************
;
; This section is used exclusively for the standard calling convention.
;
;****************************************************************************
PUBLICP macro Func,N
ifb <N>
public &Func&@0
else
public &Func&@&N
endif
endm
EXTRNP macro Func,N
ifb <N>
extrn &Func&@0:NEAR
else
extrn &Func&@&N:NEAR
endif
endm
LABELP macro Func,N
ifb <N>
&Func&@0 LABEL NEAR
else
&Func&@&N LABEL NEAR
endif
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
cProc macro Func,N,ArgList
ProcName xxx&Func,Func,N
xxx&Func proc &ArgList
endm
cRet macro Func
ret cByte&Func
endm
endProc macro Func
xxx&Func endp
endm
endMod macro Func
end xxx&Func
endm
ptrCall macro Func,ArgList
Local Bytes
RevPush <ArgList>,Bytes
call &Func
endm
cCall macro Func,ArgList
Local Bytes
RevPush <ArgList>,Bytes
Bytes = Bytes*4
ComposeInst <call>,&Func,<@>,%(Bytes)
endm
MovAddr macro dest,addr,n
ComposeInst <mov >,dest,<,offset FLAT:>,addr,<@>,n
endm
ENDIF ;STD_CALL