windows-nt/Source/XPSP1/NT/drivers/published/ddk/inc/stdcall.w
2020-09-26 16:20:57 +08:00

369 lines
7.2 KiB
OpenEdge ABL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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