2 ; Macroinstructions for defining and calling procedures
\r
4 macro stdcall proc,[arg] ; directly call STDCALL procedure
\r
13 macro invoke proc,[arg] ; indirectly call STDCALL procedure
\r
22 macro ccall proc,[arg] ; directly call CDECL procedure
\r
28 size@ccall = size@ccall+4
\r
36 macro cinvoke proc,[arg] ; indirectly call CDECL procedure
\r
42 size@ccall = size@ccall+4
\r
50 macro proc [args] ; define procedure
\r
52 match name params, args>
\r
53 \{ define@proc name,<params \} }
\r
55 prologue@proc equ prologuedef
\r
57 macro prologuedef procname,flag,parmbytes,localbytes,reglist
\r
59 loc = (localbytes+3) and (not 3)
\r
60 parmbase@proc equ ebp+8
\r
61 localbase@proc equ ebp-loc
\r
62 if parmbytes | localbytes
\r
69 irps reg, reglist \{ push reg \} }
\r
71 epilogue@proc equ epiloguedef
\r
73 macro epiloguedef procname,flag,parmbytes,localbytes,reglist
\r
74 { irps reg, reglist \{ reverse pop reg \}
\r
75 if parmbytes | localbytes
\r
86 macro define@proc name,statement
\r
87 { local params,flag,regs,parmbytes,localbytes,current
\r
90 match =stdcall args, statement \{ params equ args
\r
92 match =stdcall, statement \{ params equ
\r
94 match =c args, statement \{ params equ args
\r
96 match =c, statement \{ params equ
\r
98 match =params, params \{ params equ statement
\r
100 match =uses reglist=,args, params \{ regs equ reglist
\r
102 match =regs =uses reglist, regs params \{ regs equ reglist
\r
104 match =regs, regs \{ regs equ \}
\r
105 match prologue:reglist, prologue@proc:<regs> \{ prologue name,flag,parmbytes,localbytes,reglist \}
\r
106 virtual at parmbase@proc
\r
107 match =,args, params \{ defargs@proc args \}
\r
108 match =args@proc args, args@proc params \{ defargs@proc args \}
\r
109 parmbytes = $-(parmbase@proc)
\r
111 name # % = parmbytes/4
\r
115 \{ virtual at localbase@proc+current
\r
116 macro label def \\{ match . type,def> \\\{ deflocal@proc .,label,<type \\\} \\}
\r
117 struc db [val] \\{ \common deflocal@proc .,db,val \\}
\r
118 struc du [val] \\{ \common deflocal@proc .,du,val \\}
\r
119 struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
\r
120 struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
\r
121 struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
\r
122 struc dt [val] \\{ \common deflocal@proc .,dt,val \\}
\r
123 struc dq [val] \\{ \common deflocal@proc .,dq,val \\}
\r
124 struc rb cnt \\{ deflocal@proc .,rb cnt, \\}
\r
125 struc rw cnt \\{ deflocal@proc .,rw cnt, \\}
\r
126 struc rp cnt \\{ deflocal@proc .,rp cnt, \\}
\r
127 struc rd cnt \\{ deflocal@proc .,rd cnt, \\}
\r
128 struc rt cnt \\{ deflocal@proc .,rt cnt, \\}
\r
129 struc rq cnt \\{ deflocal@proc .,rq cnt, \\} \}
\r
132 restruc db,du,dw,dp,dd,dt,dq
\r
133 restruc rb,rw,rp,rd,rt,rq
\r
134 current = $-(localbase@proc)
\r
137 \{ match any, operand \\{ retn operand \\}
\r
138 match , operand \\{ match epilogue:reglist, epilogue@proc:<regs> \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
\r
140 \{ localbytes = current
\r
141 match close:reglist, close@proc:<regs> \\{ close name,flag,parmbytes,localbytes,reglist \\}
\r
144 macro defargs@proc [arg]
\r
148 local ..arg,current@arg
\r
149 match argname:type, arg
\r
150 \{ current@arg equ argname
\r
155 else if dqword eq type
\r
157 else if tbyte eq type
\r
159 else if qword eq type | pword eq type
\r
164 match =current@arg,current@arg
\r
165 \{ current@arg equ arg
\r
169 args@proc equ current@arg
\r
171 restore current@arg
\r
175 macro deflocal@proc name,def,[val] { name def val }
\r
177 macro deflocal@proc name,def,[val]
\r
179 match vars, all@vars \{ all@vars equ all@vars, \}
\r
180 all@vars equ all@vars name
\r
184 match =?, val \{ ..tmp equ \}
\r
185 match any =?, val \{ ..tmp equ \}
\r
186 match any (=?), val \{ ..tmp equ \}
\r
187 match =label, def \{ ..tmp equ \}
\r
188 match tmp : value, ..tmp : val
\r
189 \{ tmp: end virtual
\r
190 initlocal@proc ..var,def value
\r
193 match first rest, ..var, \{ name equ first \} }
\r
195 struc label type { label . type }
\r
197 macro initlocal@proc name,def
\r
200 size@initlocal = $ - name
\r
202 position@initlocal = 0
\r
203 while size@initlocal > position@initlocal
\r
206 if size@initlocal - position@initlocal < 2
\r
207 current@initlocal = 1
\r
208 load byte@initlocal byte from name+position@initlocal
\r
209 else if size@initlocal - position@initlocal < 4
\r
210 current@initlocal = 2
\r
211 load word@initlocal word from name+position@initlocal
\r
213 current@initlocal = 4
\r
214 load dword@initlocal dword from name+position@initlocal
\r
217 if current@initlocal = 1
\r
218 mov byte [name+position@initlocal],byte@initlocal
\r
219 else if current@initlocal = 2
\r
220 mov word [name+position@initlocal],word@initlocal
\r
222 mov dword [name+position@initlocal],dword@initlocal
\r
224 position@initlocal = position@initlocal + current@initlocal
\r
228 { purge ret,locals,endl
\r
232 match all,args@proc \{ restore all \}
\r
234 match all,all@vars \{ restore all \} }
\r
239 forward done@local equ
\r
240 match varname[count]:vartype, var
\r
241 \{ match =BYTE, vartype \\{ varname rb count
\r
242 restore done@local \\}
\r
243 match =WORD, vartype \\{ varname rw count
\r
244 restore done@local \\}
\r
245 match =DWORD, vartype \\{ varname rd count
\r
246 restore done@local \\}
\r
247 match =PWORD, vartype \\{ varname rp count
\r
248 restore done@local \\}
\r
249 match =QWORD, vartype \\{ varname rq count
\r
250 restore done@local \\}
\r
251 match =TBYTE, vartype \\{ varname rt count
\r
252 restore done@local \\}
\r
253 match =DQWORD, vartype \\{ label varname dqword
\r
255 restore done@local \\}
\r
256 match =QQWORD, vartype \\{ label varname qqword
\r
258 restore done@local \\}
\r
259 match =XWORD, vartype \\{ label varname xword
\r
261 restore done@local \\}
\r
262 match =YWORD, vartype \\{ label varname yword
\r
264 restore done@local \\}
\r
265 match , done@local \\{ virtual
\r
268 rb count*sizeof.\#vartype
\r
269 restore done@local \\} \}
\r
270 match :varname:vartype, done@local:var
\r
271 \{ match =BYTE, vartype \\{ varname db ?
\r
272 restore done@local \\}
\r
273 match =WORD, vartype \\{ varname dw ?
\r
274 restore done@local \\}
\r
275 match =DWORD, vartype \\{ varname dd ?
\r
276 restore done@local \\}
\r
277 match =PWORD, vartype \\{ varname dp ?
\r
278 restore done@local \\}
\r
279 match =QWORD, vartype \\{ varname dq ?
\r
280 restore done@local \\}
\r
281 match =TBYTE, vartype \\{ varname dt ?
\r
282 restore done@local \\}
\r
283 match =DQWORD, vartype \\{ label varname dqword
\r
285 restore done@local \\}
\r
286 match =QQWORD, vartype \\{ label varname qqword
\r
288 restore done@local \\}
\r
289 match =XWORD, vartype \\{ label varname xword
\r
291 restore done@local \\}
\r
292 match =YWORD, vartype \\{ label varname yword
\r
294 restore done@local \\}
\r
295 match , done@local \\{ varname vartype
\r
296 restore done@local \\} \}
\r
299 restore done@local \}
\r