1. Edit procedure check exception 12 (overflow stack)
[kolibrios.git] / programs / proc32.inc
blob762826cbbb1f9f32b075b2da7c6b0b50ced0dfae
1 \r
2 ; Macroinstructions for defining and calling procedures\r
3 \r
4 macro stdcall proc,[arg]                ; directly call STDCALL procedure\r
5  { common\r
6     if ~ arg eq\r
7    reverse\r
8     pushd arg\r
9    common\r
10     end if\r
11     call proc }\r
13 macro invoke proc,[arg]                 ; indirectly call STDCALL procedure\r
14  { common\r
15     if ~ arg eq\r
16    reverse\r
17      pushd arg\r
18    common\r
19     end if\r
20     call [proc] }\r
22 macro ccall proc,[arg]                  ; directly call CDECL procedure\r
23  { common\r
24     size@ccall = 0\r
25     if ~ arg eq\r
26    reverse\r
27     pushd arg\r
28     size@ccall = size@ccall+4\r
29    common\r
30     end if\r
31     call proc\r
32     if size@ccall\r
33     add esp,size@ccall\r
34     end if }\r
36 macro cinvoke proc,[arg]                ; indirectly call CDECL procedure\r
37  { common\r
38     size@ccall = 0\r
39     if ~ arg eq\r
40    reverse\r
41     pushd arg\r
42     size@ccall = size@ccall+4\r
43    common\r
44     end if\r
45     call [proc]\r
46     if size@ccall\r
47     add esp,size@ccall\r
48     end if }\r
50 macro proc [args]                       ; define procedure\r
51  { common\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
58  { local loc\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
63     push ebp\r
64     mov ebp,esp\r
65     if localbytes\r
66      sub esp,loc\r
67     end if\r
68    end if\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
76     leave\r
77    end if\r
78    if flag and 10000b\r
79     retn\r
80    else\r
81     retn parmbytes\r
82    end if }\r
84 close@proc equ\r
86 macro define@proc name,statement\r
87  { local params,flag,regs,parmbytes,localbytes,current\r
88    if used name\r
89    name:\r
90    match =stdcall args, statement \{ params equ args\r
91                                      flag = 11b \}\r
92    match =stdcall, statement \{ params equ\r
93                                 flag = 11b \}\r
94    match =c args, statement \{ params equ args\r
95                                flag = 10001b \}\r
96    match =c, statement \{ params equ\r
97                           flag = 10001b \}\r
98    match =params, params \{ params equ statement\r
99                             flag = 0 \}\r
100    match =uses reglist=,args, params \{ regs equ reglist\r
101                                         params equ args \}\r
102    match =regs =uses reglist, regs params \{ regs equ reglist\r
103                                              params equ \}\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
110    end virtual\r
111    name # % = parmbytes/4\r
112    all@vars equ\r
113    current = 0\r
114    macro locals\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
130    macro endl\r
131    \{ purge label\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
135       end virtual \}\r
136    macro ret operand\r
137    \{ match any, operand \\{ retn operand \\}\r
138       match , operand \\{ match epilogue:reglist, epilogue@proc:<regs> \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}\r
139    macro finish@proc\r
140    \{ localbytes = current\r
141       match close:reglist, close@proc:<regs> \\{ close name,flag,parmbytes,localbytes,reglist \\}\r
142       end if \} }\r
144 macro defargs@proc [arg]\r
145  { common\r
146     if ~ arg eq\r
147    forward\r
148      local ..arg,current@arg\r
149      match argname:type, arg\r
150       \{ current@arg equ argname\r
151          label ..arg type\r
152          argname equ ..arg\r
153          if qqword eq type\r
154            dd ?,?,?,?,?,?,?,?\r
155          else if dqword eq type\r
156            dd ?,?,?,?\r
157          else if tbyte eq type\r
158            dd ?,?,?\r
159          else if qword eq type | pword eq type\r
160            dd ?,?\r
161          else\r
162            dd ?\r
163          end if \}\r
164      match =current@arg,current@arg\r
165       \{ current@arg equ arg\r
166          arg equ ..arg\r
167          ..arg dd ? \}\r
168    common\r
169      args@proc equ current@arg\r
170    forward\r
171      restore current@arg\r
172    common\r
173     end if }\r
175 macro deflocal@proc name,def,[val] { name def val }\r
177 macro deflocal@proc name,def,[val]\r
178  { common\r
179     match vars, all@vars \{ all@vars equ all@vars, \}\r
180     all@vars equ all@vars name\r
181    forward\r
182     local ..var,..tmp\r
183     ..var def val\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
191         virtual at tmp\}\r
192    common\r
193     match first rest, ..var, \{ name equ first \} }\r
195 struc label type { label . type }\r
197 macro initlocal@proc name,def\r
198  { virtual at name\r
199     def\r
200     size@initlocal = $ - name\r
201    end virtual\r
202    position@initlocal = 0\r
203    while size@initlocal > position@initlocal\r
204     virtual at name\r
205      def\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
212      else\r
213       current@initlocal = 4\r
214       load dword@initlocal dword from name+position@initlocal\r
215      end if\r
216     end virtual\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
221     else\r
222      mov dword [name+position@initlocal],dword@initlocal\r
223     end if\r
224     position@initlocal = position@initlocal + current@initlocal\r
225    end while }\r
227 macro endp\r
228  { purge ret,locals,endl\r
229    finish@proc\r
230    purge finish@proc\r
231    restore regs@proc\r
232    match all,args@proc \{ restore all \}\r
233    restore args@proc\r
234    match all,all@vars \{ restore all \} }\r
236 macro local [var]\r
237  { common\r
238     locals\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
254                                   rq count*2\r
255                                   restore done@local \\}\r
256        match =QQWORD, vartype \\{ label varname qqword\r
257                                   rq count*4\r
258                                   restore done@local \\}\r
259        match =XWORD, vartype \\{ label varname xword\r
260                                  rq count*2\r
261                                  restore done@local \\}\r
262        match =YWORD, vartype \\{ label varname yword\r
263                                  rq count*4\r
264                                  restore done@local \\}\r
265        match , done@local \\{ virtual\r
266                                varname vartype\r
267                               end 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
284                                   dq ?,?\r
285                                   restore done@local \\}\r
286        match =QQWORD, vartype \\{ label varname qqword\r
287                                   dq ?,?,?,?\r
288                                   restore done@local \\}\r
289        match =XWORD, vartype \\{ label varname xword\r
290                                  dq ?,?\r
291                                  restore done@local \\}\r
292        match =YWORD, vartype \\{ label varname yword\r
293                                  dq ?,?,?,?\r
294                                  restore done@local \\}\r
295        match , done@local \\{ varname vartype\r
296                               restore done@local \\} \}\r
297     match ,done@local\r
298     \{ var\r
299        restore done@local \}\r
300    common\r
301     endl }\r