1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
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
|