File: proccall.t2

For general comments see here
LineAddressObject Code LabelF1N1BF2N2CommentsCheck
1 0  ; tape1.d/proccall.t2
2 0  ;--------------------
3 0  ;
4 0  ; local override name
5 0  dicpt1=W3231; 
6 0  ;
7 0  =3254 
8 3254  CallProc::; 
9 3254  .ent:; 
10 3254   jnz     ;no need to call advance, skip @3254
10+13254 1046267 jz .1    
10+23254+1006270 jmp CallProc.1    
10+33255  .1:; 
11 3255   call     ;process next token
11+13255 7322411004503 lnk advance.lnk:jmp advance.ent 
12 3256  .1:; 
13 3256 1006351 jmp .2   ;-->>patched bit @3256
14 3256+ =3305 
15 3305  .2:; 
16 3305 0600600 lod token   ;token
17 3305+1046575 jz _err41   ;identifier ->
18 3306 0606233 lod .lnk   ;return address @3306
19 3306+1106270 jmp .3   ;-->>
20 3307  =3256+ 
21 3256+ .3:; 
22 3256+0206234 exa W3228   ;swap return address
23 3257   call     ;and push to stack
23+13257 7323731005012 lnk push.lnk:jmp push.ent 
24 3258 0606235 lod dicent   ; @3258
25 3258+0106236 add argno   ;
26 3259   call     ;
26+13259 7323731005012 lnk push.lnk:jmp push.ent 
27 3260 1006343 jmp .4   ;-->> @3260
28 3260+ =3299 
29 3299  .4:; 
30 3299 0602161 lod wsptr   ;
31 3299+0202165 exa Link15b   ;
32 3300   call     ; @3300
32+13300 7323731005012 lnk push.lnk:jmp push.ent 
33 3301 1106274 jmp .5   ;-->>
34 3301+ =3260+ 
35 3260+ .5:; 
36 3260+0603430 lod W1816   ;procptr?
37 3261 2031166577776 sto dicent/lod -2;temp id ptr
38 3262 0066246 and W3238   ;=03776000000000 number of args @3262
39 3262+1146332 jz .6   ;no arguments, skip
40 3263 1006456 jmp .args   ;->compile arguments
41 3263+ ;
42 3263+ =3290+ 
43 3290+ .6:; 
44 3290+0602234 lod Bit32   ;=00020000000000
45 3291 0031166057777 o00 dicent/and -1;
46 3292 1046312 jz .7   ; @3292
47 3292+  nop     ;
47+13292+1006335 jmp .1    
47+23293  .1:; 
48 3293   call     ;invoke procedure/function
48+13293 7307175006363 lnk GenCall.lnk:jmp GenCall.ent 
49 3294 0603536 lod GPs+57   ;=GP7F 9,00 @3294
50 3294+  nop     ;
50+13294+1006337 jmp .1    
50+23295  .1:; 
51 3295   call     ;
51+13295 7320121004033 lnk gencode.lnk:jmp gencode.ent 
52 3296 1006312 jmp .7   ;-->> @3296
53 3296+ ;
54 3296+  pad      
54+13296+0000000 00 0    
55 3297  =3274 
56 3274  .7:; 
57 3274 1006372 jmp .8   ; @3274
58 3274+ ;
59 3274+  pad     ;
59+13274+0000000 00 0    
60 3275  ;--------------------------------
61 3275  =3275 
62 3275  ;
63 3275  ;
64 3275  .3275:; 
65 3275 0031166577777 o00 dicent/lod -1;
66 3276 0062234 and Bit32   ;=00020000000000 @3276
67 3276+1046320 jz .done   ;
68 3277   call     ;
68+13277 7320121106345 lnk L3301P.lnk:jmp L3301P.ent 
69 3278   call     ;generate call instructions @3278
69+13278 7307175006363 lnk GenCall.lnk:jmp GenCall.ent 
70 3279   call     ;
70+13279 7320121006347 lnk L3303.lnk:jmp L3303.ent 
71 3280  .done:; 
72 3280 0010646577777 o00 stkp/lod -1; @3280
73 3281 0402165 sto Link15b   ;
74 3281+1006341 jmp .d1   ;-->>
75 3282  =3297 
76 3297  .d1:; 
77 3297 0010646577776 o00 stkp/lod -2;
78 3298 0406236 sto argno   ; @3298
79 3298+1006322 jmp .d2   ;-->>
80 3299  =3282 
81 3282  .d2:; 
82 3282 0062222 and K8191   ; @3282
83 3282+0406235 sto dicent   ;
84 3283 0566236 o27 argno   ;
85 3283+0042205 o02 K2a   ;
86 3284 2710646600000 o27 stkp/lod 0; @3284
87 3285 0206234 exa W3228   ;
88 3285+  nop     ;
88+13285+1006326 jmp .1    
88+23286  .1:; 
89 3286 2031157000001 sto .lnk/jmp 1;return +1 @3286
90 3287  ;--------------------------------------------------------------------
91 3287  ;
92 3287  .d3:call     ;
92+13287 7307175006363 lnk GenCall.lnk:jmp GenCall.ent 
93 3288 0603536 lod GPs+57   ;=04000044000007 @3288
94 3288+  nop     ;
94+13288+1006331 jmp .1    
94+23289  .1:; 
95 3289   call     ;
95+13289 7320121004033 lnk gencode.lnk:jmp gencode.ent 
96 3290 1006311 jmp .C4   ;->L3344 @3290
97 3290+ ;
98 3290+ =3304 
99 3304 1661044_err09:lnk errlnk   ;error 9: recursive proc with name param @3304
100 3304+1001070 jmp Error   ;call error routine
101 3305  ;
102 3305  ;
103 3305  =3322 
104 3322  ;
105 3322 0031166577777.8:o00 dicent/30 -1;
106 3323 0401422 sto GenAdr   ;
107 3323+0546233 cls Link31   ;
108 3324 0062236 and Bit33   ; @3324
109 3324+1146375 jz .A1   ;
110 3325 0446233 inc Link31   ;
111 3325+ .A1:; 
112 3325+0601422 lod GenAdr   ;
113 3326 0066253 and TMMflg   ; @3326
114 3326+1046407 jz .A4   ;
115 3327 0601422 lod GenAdr   ;
116 3327+0062222 and K8191   ;
117 3328   call     ; @3328
117+13328 7320121004032 lnk gencode1.lnk:jmp gencode1.ent 
118 3329 1006406 jmp .A3    
119 3329+ ;
120 3329+ .A2:; 
121 3329+0604123 lod W2131   ;=<00 0:73 6>
122 3330   call     ;align to full word, then gen @3330
122+13330 7307175001665 lnk GenSkpInst.lnk:jmp GenSkpInst.ent 
123 3331 0606233 lod Link31   ;
124 3331+0401422 sto GenAdr   ;
125 3332 0604120 lod W2128   ; @3332
126 3332+0104122 add K6a   ;=6
127 3333   call     ;
127+13333 7307175001640 lnk GenInst.lnk:jmp GenInst.ent 
128 3334  .A3:; 
129 3334 1006313 jmp .3275   ; @3334
130 3334+ ;
131 3334+  pad      
131+13334+0000000 00 0    
132 3335  ;
133 3335  .A4:; 
134 3335 0031166577776 00 dicent/lod -2;
135 3336 0506233 ads Link31   ; @3336
136 3336+1106401 jmp .A2   ;
137 3337  ;
138 3337  =3344 
139 3344  ;
140 3344  .B0:; 
141 3344 0031166577776 o00 dicent/lod -2;get proc info @3344
142 3345 0066246 and W3238   ;=03776000000000 mask out param count
143 3345+1220034 srl 28   ; >>28 shift into position
144 3346 0426233 stn Link31   ;store (negated) for counting @3346
145 3346+  nop     ;
145+13346+1006423 jmp .1    
145+23347  .1:; 
146 3347  .B1:; 
147 3347 0010646577777 o00 stkp/lod -1;get
148 3348 0406237 sto dicpt1   ; @3348
149 3348+0062236 and Bit33   ;=0040000000000 is it call by name?
150 3349 1046445 jz .B2   ;->no, just load value
151 3349+0602205 lod K2a   ;
152 3350 2710646600000 o27 stkp/lod 0;drop stack, load arg address @3350
153 3351 0401422 sto GenAdr   ;
154 3351+0606254 lod W3244   ;=00000001000006
155 3352   call     ;put info into constant table @3352
155+13352 7307445001712 lnk PutInst.lnk:jmp PutInst.ent 
156 3353 0606237 lod dicpt1   ;
157 3353+  nop     ;
157+13353+1006432 jmp .1    
157+23354  .1:; 
158 3354   call     ;make next inst refer to const @3354
158+13354 7307445001761 lnk NopRef.lnk:jmp NopRef.ent 
159 3355 0606255 lod W3245   ;=00000000600004
160 3355+  nop     ;
160+13355+1006434 jmp .1    
160+23356  .1:; 
161 3356   call     ;load formal param @3356
161+13356 7307175001640 lnk GenInst.lnk:jmp GenInst.ent 
162 3357  ;
163 3357  .doit:; 
164 3357 0031166577777 o00 dicent/lod -1;get address of proc data
165 3358 0404031 sto IdInfo   ;save it for later @3358
166 3358+0066253 and TMMflg   ;=00010000000000 Bit31
167 3359 1146440 jz .doit1   ;->
168 3359+0602212 lod B19.28   ;=00001777000000 <00255/400>
169 3360 0464031 ans IdInfo   ; @3360
170 3360+ .doit1:; 
171 3360+0646233 lis Link31   ;arg number (negated)
172 3361 0564031 o27 IdInfo   ;index into formals
173 3361+0603445 lod GPs+0   ;=GP1F 20,0
174 3362   call     ;store as formal param @3362
174+13362 7320121004033 lnk gencode.lnk:jmp gencode.ent 
175 3363 0606233 lod Link31   ;check count
176 3363+1026423 jn .B1   ;->still some to do
177 3364 1006312 jmp .7   ;finished, go generate call @3364
178 3364+  pad     ;
178+13364+0000000 00 0    
179 3365  ;
180 3365  .B2:; 
181 3365   call     ;
181+13365 7323731005037 lnk GenLoad0.lnk:jmp GenLoad0.ent 
182 3366 0040000 o02 0   ;=1 @3366
183 3366+0562151 o27 stkp   ;delete one stack entry
184 3367 0606237 lod dicpt1   ;
185 3367+0066253 and TMMflg   ;=00010000000000 (Bit 31)
186 3368 1046454 jz .B3   ;-> @3368
187 3368+0606237 lod dicpt1   ;
188 3369 0062215 and realbit   ;=0300000000000
189 3369+0404306 sto W2246   ;
190 3370 0603450 lod GPs+3   ;=GPs+85 (1914) @3370
191 3370+  nop     ;
191+13370+1006453 jmp .1    
191+23371  .1:; 
192 3371   call     ;
192+13371 7320121004033 lnk gencode.lnk:jmp gencode.ent 
193 3372  .B3:; 
194 3372 0031166600000 o00 dicent/lod 0;
195 3373 0126265 sub checkb   ;='CHECKB'
196 3373+1006353 jmp .B4   ;->
197 3374  =3307 
198 3307  ;
199 3307  ; (just checked id against checkb)
200 3307  .B4:; 
201 3307 1046357 jz .chk1   ;-> checkb
202 3307+0121454 sub K7   ;=7
203 3308 1046357 jz .chk1   ;-> checki @3308
204 3308+0121451 sub K9   ;=9
205 3309 1046357 jz .chk1   ;-> checkr
206 3309+0122207 sub K1c   ;=1
207 3310 1050607 jz .chk2   ;-> checks @3310
208 3310+1006435 jmp .doit   ;-> not a check? call
209 3311  ;
210 3311  .chk1:; 
211 3311 1600000 kbd 0   ;
212 3311+0062225 and Bbit   ;=<000/000>
213 3312 1046320 jz .done   ;ignore call @3312
214 3312+1006435 jmp .doit   ;compile it
215 3313  ;
216 3313  =4487 
217 4487  .chk2:; 
218 4487 1600000 kbd 0   ;
219 4487+0062225 and Bbit   ;=<000/000>
220 4488 1150603 jz .chk3   ; @4488
221 4488+1006435 jmp .doit   ;
222 4489  ;
223 4489  =4483+ 
224 4483+ .chk3:; 
225 4483+0601525 lod L853   ;
226 4484 0341477 stc putcode.ent   ; @4484
227 4484+0607035 lod W3613   ;
228 4485 0342145 stc ObjPC   ;
229 4485+0607036 lod W3614   ;
230 4486 0341426 stc W790   ; @4486
231 4486+1006320 jmp .done   ;
232 4487  ;
233 4487  ;
234 4487  =3374 
235 3374  ; procedure call should have arguments, check for them
236 3374  .args:; 
237 3374 0600600 lod token   ;token @3374
238 3374+0122204 sub K47a   ;=47 [(]
239 3375 1046460 jz .arg1   ;-> parameter list
240 3375+1006575 jmp _err41   ;
241 3376  ;
242 3376  ; looks OK so far
243 3376  .arg1:; 
244 3376 0606252 lod Argno1   ;1*BIT29 @3376
245 3376+0406236 sto argno   ;argno
246 3377  .arg2:; 
247 3377 0606235 lod dicent   ;address of dic entry
248 3377+0426237 stn dicpt1   ;store negated
249 3378 0606236 lod argno   ;argno*BIT29 @3378
250 3378+ .arg3:; 
251 3378+0126262 sub Argno6   ;=6 * BIT29
252 3379 1026465 jn .arg4   ;->ok, this word
253 3379+1046465 jz .arg4   ;->ok, ditto
254 3380 0446237 inc dicpt1   ;decrement address (negated) @3380
255 3380+1106462 jmp .arg3   ;and try again
256 3381  ;
257 3381  .arg4:; 
258 3381 0106262 add Argno6   ;=6 * BIT29 add back last one
259 3381+0406240 sto Pinfo   ;save sextet number
260 3382 3131176577775 lcs dicpt1/lod -3;complement address, load params @3382
261 3383 0206240 exa Pinfo   ;swap with sextet number
262 3383+1246263 mul W3251   ;=014000 6*Bit11
263 3384 1006471 jmp .arg5   ;-->> @3384
264 3384+  pad      
264+13384+0000000 00 0    
265 3385  ;
266 3385  .arg5:; 
267 3385 1031203317772 exa Pinfo/sll -6;swap with param word, shift to top
268 3386 0062243 and MskArgTp   ;=03740000000000 extract type @3386
269 3386+0406240 sto Pinfo   ;and save it
270 3387 0066251 and W3241   ;=03040000000000
271 3387+1146476 jz .arg6   ;->simple variable, call by value
272 3388 1320001 sll 1   ;test bit 38 (procbit) @3388
273 3388+1026543 jn .argerr   ;set->procedure argument
274 3389 1320001 sll 1   ;test bit 37 (arrbit)
275 3389+1126566 jn .argarr   ;set->array argument
276 3390 1106621 jmp .argnm   ;call by name argument @3390
277 3390+ ;
278 3390+ ; from 3387+
279 3390+ .arg6:; 
280 3390+0606240 lod Pinfo   ;reload save type info
281 3391 1220041 srl 33   ; >>33
282 3391+0062210 and K7a   ;=07
283 3392 1631177006534 stc dicpt1/jmp .argsw;switch on type @3392
284 3393  ;--------------------------------
285 3393  ; return here after arg has been processed
286 3393  ;
287 3393  .argdone:; 
288 3393 0040600 o02 token   ;token+1
289 3393+0122201 sub K42   ;=42 [,]+1
290 3394 1046505 jz .argcomma   ;-> @3394
291 3394+0122210 sub K7a   ;=7 [)]+1
292 3395 1046507 jz .argrpar   ;->
293 3395+1006575 jmp _err41   ;error in param list
294 3396  ;
295 3396  .3396:; 
296 3396   call     ; @3396
296+13396 7306371006514 lnk SkipPLC.lnk:jmp SkipPLC.ent 
297 3397  ;
298 3397  .argcomma:; 
299 3397 0606252 lod Argno1   ;
300 3397+0506236 ads argno    
301 3398 1006461 jmp .arg2   ; @3398
302 3398+  pad      
302+13398+0000000 00 0    
303 3399  ;
304 3399  ; from 3395, ) at end of param list
305 3399  ;
306 3399  .argrpar:; 
307 3399 0031166577776 o00 dicent/lod -2;
308 3400 0066246 and W3238   ;=03776000000000 @3400
309 3400+0126236 sub argno   ;=0002000000000
310 3401   jnz     ;
310+13401 1046512 jz .1    
310+23401+1006504 jmp CallProc.3396    
310+33402  .1:; 
311 3402   call     ; @3402
311+13402 7322411004503 lnk advance.lnk:jmp advance.ent 
312 3403 1106277 jmp .C1   ;-->>
313 3403+  pad      
313+13403+0000000 00 0    
314 3404  =3263+ 
315 3263+ ;
316 3263+ ; all argument are now compiled and address info is on stack, thunks (where needed)
317 3263+ ; have also been generated. All that remains is to copy the arguments into
318 3263+ ; the formals and invoke the procedure/function
319 3263+ ;
320 3263+ .C1:; 
321 3263+0606247 lod W3239   ;=00070000000000
322 3264 0031166057777 o00 dicent/and -1; @3264
323 3265 0126253 sub TMMflg   ;=00010000000000
324 3265+1026311 jn .C4   ;->
325 3266 1146304 jz .C2   ; @3266
326 3266+0126250 sub W3240   ;=00030000000000
327 3267 1046307 jz .C3   ;
328 3267+1026327 jn .d3   ;
329 3268 1006350 jmp _err09   ; @3268
330 3268+ ;
331 3268+ .C2:; 
332 3268+0040000 o02 0   ;
333 3269 2710646600000 o27 stkp/lod 0;
334 3270 0404031 sto IdInfo   ; @3270
335 3270+1006361 jmp .C2a   ;
336 3271  =3313 
337 3313  .C2a:; 
338 3313   call     ;
338+13313 7323761005051 lnk FreeTemp.lnk:jmp FreeTemp.ent 
339 3314 1006312 jmp .7   ; @3314
340 3314+  pad      
340+13314+0000000 00 0    
341 3315  ;
342 3315  =3271 
343 3271  .C3:; 
344 3271 0031166577776 o00 dicent/lod -2;
345 3272   call     ; @3272
345+13272 7320121006411 lnk PrepCall.lnk:jmp PrepCall.ent 
346 3273  .C4:; 
347 3273 1006420 jmp .B0   ;->
348 3273+  pad      
348+13273+0000000 00 0    
349 3274  =3420 
350 3420  .argsw:; 
351 3420 4032614000000 jmp .argerr:o00 0;+0 no explicit type @3420
352 3421 4032724000000 jmp .argboo:o00 0;+1 boolean
353 3422 4032700000000 jmp .argint:o00 0;+2 integer
354 3423 4032650000000 jmp .argrl:o00 0;+3 real
355 3424 4433104000000 jmp .argnm:o00 0;+4 array @3424
356 3425 4433104000000 jmp .argnm:o00 0;+5 switch
357 3426 4033060000000 jmp .argstr:o00 0;+6 string
358 3427   ; 
359 3427  .argerr:;+7 label 
360 3427  _err44:; 
361 3427 1661044 lnk errlnk   ;error 44: non-allowable parameter @3427
362 3427+1001070 jmp Error   ;call error handler
363 3428  ;
364 3428  .strarg:; 
365 3428   call     ;compile string, leave ptr on stk @3428
365+13428 7331155006764 lnk CompStrPtr.lnk:jmp CompStrPtr.ent 
366 3429 0140000 cla 0   ;
367 3429+  nop     ;
367+13429+1006546 jmp .1    
367+23430  .1:; 
368 3430   call     ; @3430
368+13430 7323731005012 lnk push.lnk:jmp push.ent 
369 3431   call     ;compile code to load string ptr
369+13431 7323761005021 lnk SaveTemp.lnk:jmp SaveTemp.ent 
370 3432   call     ; @3432
370+13432 7322411004503 lnk advance.lnk:jmp advance.ent 
371 3433 1006501 jmp .argdone   ;
372 3433+  pad     ;
372+13433+0000000 00 0    
373 3434  ;
374 3434  .argrl:; 
375 3434   call     ;compile address expression @3434
375+13434 7326171000000 lnk GetValue.lnk:jmp GetValue.ent 
376 3435 0010646577777 o00 stkp/lod -1;load address from stack
377 3436 0062215 and realbit   ;check type @3436
378 3436+0122215 sub realbit   ;should be real
379 3437 1046576 jz .argmatch   ;OK, no problem
380 3437+ ;
381 3437+ ; handle case when real/int mismatch
382 3437+ ;
383 3437+ .argri:; 
384 3437+0606253 lod TMMflg   ;=00100000000000 Bit31
385 3438 0010646477777 o00 stkp/ads -1;add to stacked info @3438
386 3439 1006576 jmp .argmatch   ;
387 3439+  pad     ;
387+13439+0000000 00 0    
388 3440  ;
389 3440  .argint:; 
390 3440   call     ;compile expression in store @3440
390+13440 7326171000000 lnk GetValue.lnk:jmp GetValue.ent 
391 3441 0010646577777 o00 stkp/lod -1;
392 3442 0062215 and realbit   ;=0300000000000 @3442
393 3442+0122214 sub intbit   ;=0200000000000
394 3443 1046576 jz .argmatch   ;->
395 3443+1106555 jmp .argri   ;
396 3444  =3445 
397 3445  .argboo:; 
398 3445   call     ;
398+13445 7326605006214 lnk L3212.lnk:jmp L3212.ent 
399 3446 1006576 jmp .argmatch   ; @3446
400 3446+ ;
401 3446+ .argarr:; 
402 3446+0543427 cls idptr   ;
403 3447   call     ;
403+13447 7322411004503 lnk advance.lnk:jmp advance.ent 
404 3448 0603427 lod idptr   ; @3448
405 3448+0062202 and arrbit   ;
406 3449 1146612 jz _err43a   ;expected string or array
407 3449+ .strvar:; 
408 3449+0603427 lod idptr   ;
409 3450   call     ; @3450
409+13450 7323731006564 lnk MaskPush.lnk:jmp MaskPush.ent 
410 3451   call     ;
410+13451 7322411004503 lnk advance.lnk:jmp advance.ent 
411 3452 1006576 jmp .argmatch   ; @3452
412 3452+  pad     ;
412+13452+0000000 00 0    
413 3453  ;
414 3453  _err41:; 
415 3453 1661044 lnk errlnk   ;error 41: in procedure call:
416 3453+  ;a) missing ( for param list, or 
417 3453+  ;b) missing , or ) after actual param 
418 3453+1002262 jmp Error2   ;call error routine at 1202
419 3454  ;
420 3454  .argmatch:; 
421 3454 0031166577777 o00 dicent/lod -1; @3454
422 3455 0062234 and Bit32   ;=0020000000000
423 3455+1046501 jz .argdone   ;->
424 3456 0010646577777 o00 stkp/lod -1; @3456
425 3457 0406241 sto W3233   ;
426 3457+0064356 and TmpFlg   ;=040000
427 3458   jnz     ;
427+13458 1046603 jz .1    
427+23458+1006501 jmp CallProc.argdone    
427+33459  .1:; 
428 3459   call     ;
428+13459 7323731005037 lnk GenLoad0.lnk:jmp GenLoad0.ent 
429 3460 0606241 lod W3233   ; @3460
430 3460+0066253 and TMMflg   ;=00010000000000
431 3461 1046611 jz .am1   ;
432 3461+0606241 lod W3233   ;
433 3462 0062215 and realbit   ;=00300000000000 @3462
434 3462+0404306 sto W2246   ;
435 3463 0603450 lod GPs+3   ;=GPs+85 GP3 1
436 3463+  pad     ;
436+13463+0000000 00 0    
437 3464   call     ; @3464
437+13464 7320121004033 lnk gencode.lnk:jmp gencode.ent 
438 3465  .am1:; 
439 3465   call     ;
439+13465 7323761005021 lnk SaveTemp.lnk:jmp SaveTemp.ent 
440 3466 1006501 jmp .argdone   ; @3466
441 3466+ ;
442 3466+ _err43a:; 
443 3466+0602231 lod K11   ;
444 3467 1661044_err43:lnk errlnk   ;error 43: expected array or strin param
445 3467+1001070 jmp Error   ;call error routine
446 3468  ;
447 3468  .argstr:; 
448 3468   call     ;
448+13468 7322411004503 lnk advance.lnk:jmp advance.ent 
449 3469 0600600 lod token   ;
450 3469+0126256 sub K49   ;=49 (literal string start)
451 3470 1046544 jz .strarg   ;compile string @3470
452 3470+0603427 lod idptr   ;
453 3471 0062221 and typbits   ;=03700000000000
454 3471+0126264 sub TStr   ;=00600000000000 string
455 3472 1146571 jz .strvar   ;string variable @3472
456 3472+1106612 jmp _err43a   ;expected string or array
457 3473   pad     ;
457+13473 0000000 00 0    
458 3473+ ;
459 3473+ ; array or switch parameter
460 3473+ .argnm:; 
461 3473+0603471 lod GPs+20   ;= GP9F 00 plant jump around
462 3474   call     ; @3474
462+13474 7320121004033 lnk gencode.lnk:jmp gencode.ent 
463 3475   call     ;align to fullword
463+13475 7307255001654 lnk putNop.lnk:jmp putNop.ent 
464 3476   calln ,   ;call push(ObjPC) @3476
464+13476 7323731106720 lnk push.lnk:jmp CallProc.PushPC 
465 3477   call     ;compile variable address
465+13477 7323731005015 lnk GetAddrExprn.lnk:jmp GetAddrExprn.ent 
466 3478   calln ,   ;call push(Acc+Bit33) @3478
466+13478 7323731106731 lnk push.lnk:jmp CallProc.Push33 
467 3479 0606240 lod Pinfo   ;
468 3479+0064324 and T_Mask   ;=00700000000000
469 3480 0126257 sub Bit36   ;=00400000000000 Array Type @3480
470 3480+  jnn     ;array,switch,string,label->
470+13480+1126631 jn .1    
470+23481 1006733 jmp CallProc.G3    
470+33481+ .1:; 
471 3481+0543427 cls idptr   ; @3481+
472 3482   call     ; @3482
472+13482 7322411004503 lnk advance.lnk:jmp advance.ent 
473 3483 0603427 lod idptr   ;
474 3483+1010560 jmp .argnm1   ;-->>
475 3484  =4464 
476 4464  .argnm1:; 
477 4464 1026634 jn .argnm2   ; @4464
478 4464+1006636 jmp .argnm3   ;
479 4465  =3484 
480 3484  .argnm2:; 
481 3484 0066260 and W3248   ;=03430000000000 @3484
482 3484+1046637 jz .argnm4   ;->
483 3485 0122202 sub arrbit   ;
484 3485+1146700 jz .argnm17   ;
485 3486  .argnm3:; 
486 3486 0602205 lod K2a   ;=2 @3486
487 3486+1006647 jmp .argnm8   ;
488 3487  ;
489 3487  .argnm4:; 
490 3487 0603427 lod idptr   ;
491 3487+0062215 and realbit   ;=00300000000000
492 3488 0102236 add Bit33   ;=00040000000000 indicate cbn @3488
493 3488+0126240 sub Pinfo   ;
494 3489   jnz     ;mismatch
494+13489 1046642 jz .1    
494+23489+1006636 jmp CallProc.argnm3    
494+33490  .1:; 
495 3490   call     ; @3490
495+13490 7322411004503 lnk advance.lnk:jmp advance.ent 
496 3491 0040600 o02 token   ;token+1
497 3491+0122201 sub K42   ;=42->[,]+1
498 3492 1146725 jz .comma   ;comma, param complete @3492
499 3492+0122210 sub K7a   ;=49->[)]+1
500 3493 1146725 jz .comma   ;may be comma or close
501 3493+0603427 lod idptr   ;
502 3494 0404303 sto W2243   ; @3494
503 3494+ .argnm5:; 
504 3494+1010756 jmp .argnm6   ;-->>
505 3495  =4590 
506 4590  .argnm6:; 
507 4590 0404031 sto IdInfo   ; @4590
508 4590+0064367 and Bit33a   ;=0040000000000
509 4591 1050765 jz .argnm7   ;
510 4591+0603514 lod GPs+39   ;
511 4592   call     ; @4592
511+14592 7320121004033 lnk gencode.lnk:jmp gencode.ent 
512 4593 0603515 lod GPs+40   ;
513 4593+  nop     ;
513+14593+1010762 jmp .1    
513+24594  .1:; 
514 4594   call     ; @4594
514+14594 7320121004033 lnk gencode.lnk:jmp gencode.ent 
515 4595 0604315 lod procbit1   ;
516 4595+0464303 ans W2243   ;
517 4596 0604347 lod K4a   ;=4 @4596
518 4596+1006647 jmp .argnm8   ;
519 4597  ;
520 4597  .argnm7:; 
521 4597 0604341 lod K3a   ; @4597
522 4597+1006647 jmp .argnm8   ;-->>
523 4598  =3495 
524 3495  ;
525 3495  .argnm8:; 
526 3495 0404300 sto W2240   ;
527 3495+0606240 lod Pinfo   ;
528 3496 0062215 and realbit   ; @3496
529 3496+0122214 sub intbit   ;
530 3497 1046673 jz .argnm15   ;
531 3497+1026677 jn .argnm16   ;
532 3498 1006653 jmp .argnm9   ;-->> @3498
533 3498+  pad     ;
533+13498+0000000 00 0    
534 3499  ;
535 3499  .argnm9:; 
536 3499   call     ;
536+13499 7323131004627 lnk expression.lnk:jmp expression.ent 
537 3500 0010646577777 o00 stkp/lod -1; @3500
538 3501 0404306 sto W2246   ;
539 3501+0122215 sub realbit   ;
540 3502 1046660 jz .argnm11   ; @3502
541 3502+ .argnm10:; 
542 3502+0603450 lod GPs+3   ;=GPs+85 -> GP3 1,GP0F 65,4096
543 3503   call     ;
543+13503 7320121004033 lnk gencode.lnk:jmp gencode.ent 
544 3504  .argnm11:; 
545 3504 0040000 o02 0   ; @3504
546 3504+0562151 o27 stkp   ;
547 3505 0606261 lod W3249   ;=<00 4 / 00 13>
548 3505+0344031 stc IdInfo   ;
549 3506   call     ; @3506
549+13506 7320121004032 lnk gencode1.lnk:jmp gencode1.ent 
550 3507 0606261 lod W3249   ;=<00 4 / 00 13>
551 3507+1006665 jmp .argnm13   ;
552 3508  ;
553 3508  .argnm12:; 
554 3508   pad     ; @3508
554+13508 0000000 00 0    
555 3508+0603427 lod idptr   ;get address of variable
556 3509  .argnm13:; 
557 3509   call     ;gen code to load the variables address
557+13509 7307175006413 lnk LdVarAddr.lnk:jmp LdVarAddr.ent 
558 3510  .argnm14:; 
559 3510 0602161 lod wsptr   ; @3510
560 3510+0122207 sub K1c   ;=1
561 3511   call     ;
561+13511 7320121106723 lnk ExitThunk.lnk:jmp ExitThunk.ent 
562 3512 0603474 lod GPs+23   ;=GP12F 00 patch jump around @3512
563 3512+  nop     ; ..
563+13512+1006671 jmp .1    
563+23513  .1:; 
564 3513   call     ; thunk.
564+13513 7320121004033 lnk gencode.lnk:jmp gencode.ent 
565 3514 1006501 jmp .argdone   ;finished @3514
566 3514+  pad      
566+13514+0000000 00 0    
567 3515  ;
568 3515  .argnm15:; 
569 3515   call     ;
569+13515 7323131004627 lnk expression.lnk:jmp expression.ent 
570 3516 0010646577777 o00 stkp/lod -1; @3516
571 3517 0404306 sto W2246   ;
572 3517+0122214 sub intbit   ;
573 3518 1046660 jz .argnm11   ; @3518
574 3518+1106656 jmp .argnm10   ;
575 3519  ;
576 3519  .argnm16:; 
577 3519   call     ;
577+13519 7326605005553 lnk compbool.lnk:jmp compbool.ent 
578 3520 1006660 jmp .argnm11   ; @3520
579 3520+ ;
580 3520+ .argnm17:; 
581 3520+0603427 lod idptr   ;
582 3521 0064324 and T_Mask   ;=00700000000000
583 3521+0102236 add Bit33   ;
584 3522 0126240 sub Pinfo   ; @3522
585 3522+  jnz     ;
585+13522+1146703 jz .1    
585+23523 1006636 jmp CallProc.argnm3    
585+33523+ .1:; 
586 3523+0606240 lod Pinfo   ;
587 3524   call     ; @3524
587+13524 7323731005012 lnk push.lnk:jmp push.ent 
588 3525   call     ;call 2649
588+13525 7324375005131 lnk Subscript.lnk:jmp Subscript.ent 
589 3526 0040600 o02 token   ; @3526
590 3526+0122201 sub K42   ;=42
591 3527 1046711 jz .argnm18   ;
592 3527+0122210 sub K7a   ;
593 3528   jnz     ;
593+13528 1046711 jz .1    
593+23528+1006713 jmp CallProc.argnm19    
593+33529  .1:; 
594 3529  .argnm18:; 
595 3529 0040000 o02 0   ;
596 3529+0562151 o27 stkp   ;
597 3530 1006666 jmp .argnm14   ; @3530
598 3530+  pad     ;
598+13530+0000000 00 0    
599 3531  ;
600 3531  .argnm19:; 
601 3531   call     ;
601+13531 7323761005021 lnk SaveTemp.lnk:jmp SaveTemp.ent 
602 3532 0040000 o02 0   ; @3532
603 3532+  nop     ;
603+13532+1006715 jmp .1    
603+23533  .1:; 
604 3533 2710646600000 o27 stkp/lod 0;
605 3534 0102224 add Bit19   ;=00000001000000 @3534
606 3534+0404303 sto W2243   ;
607 3535 0064324 and T_Mask   ;=00700000000000
608 3535+0406240 sto Pinfo   ;
609 3536 1106646 jmp .argnm5   ; @3536
610 3536+ ;
611 3536+ .PushPC:; 
612 3536+0602145 lod ObjPC   ;
613 3537 1005012 jmp push.ent   ;
614 3537+ ;
615 3537+  pad     ;
615+13537+0000000 00 0    
616 3538  ;
617 3538  .G1:; 
618 3538   call     ;get label or exprn @3538
618+13538 7334161007042 lnk DesigExprn.lnk:jmp DesigExprn.ent 
619 3539 1006666 jmp .argnm14   ;
620 3539+ =3541+ 
621 3541+ .comma:; 
622 3541+0603427 lod idptr   ;
623 3542 0404031 sto IdInfo   ; @3542
624 3542+0062236 and Bit33   ;
625 3543 1046664 jz .argnm12   ;
626 3543+0603514 lod GPs+39   ;=GP1M 00, GP0 73,0, GP1F 40
627 3544   call     ; @3544
627+13544 7320121004033 lnk gencode.lnk:jmp gencode.ent 
628 3545 1006666 jmp .argnm14   ;
629 3545+ ;
630 3545+ =3547 
631 3547  .G3:; 
632 3547 0031166577777 o00 dicent/lod -1;
633 3548 0404031 sto IdInfo   ; @3548
634 3548+0062236 and Bit33   ;
635 3549 1146741 jz .G4   ;argument a procedure call->
636 3549+  nop     ;
636+13549+1006736 jmp .1    
636+23550  .1:; 
637 3550   call     ; @3550
637+13550 7307255001654 lnk putNop.lnk:jmp putNop.ent 
638 3551 0603563 lod GPs+78   ;=GP1 73, GP2F 6,40 unwind stack
639 3551+  pad     ; to change level to that of
639+13551+0000000 00 0    
640 3552   call     ; calling procedure @3552
640+13552 7320121004033 lnk gencode.lnk:jmp gencode.ent 
641 3553 1106746 jmp .G5   ;->
642 3553+ ;
643 3553+ .G4:; 
644 3553+0602234 lod Bit32   ;=00020000000000
645 3554 0031166057777 o00 dicent/and -1; @3554
646 3555 1146746 jz .G5   ;
647 3555+  pad     ;
647+13555+0000000 00 0    
648 3556   call     ; @3556
648+13556 7307175006363 lnk GenCall.lnk:jmp GenCall.ent 
649 3557   call     ;
649+13557 7320121006347 lnk L3303.lnk:jmp L3303.ent 
650 3558   nop     ; @3558
650+13558 1106746 jmp .1    
650+23558+ .1:; 
651 3558+ .G5:; 
652 3558+0604302 lod W2242   ;
653 3559 1046722 jz .G1   ;->
654 3559+0122207 sub K1c   ;=1
655 3560 1146751 jz .G6   ; @3560
656 3560+0603566 lod GPs+81   ;=GP2 53,30, GP7F 10,00
657 3561 1006752 jmp .G7   ;
658 3561+ ;
659 3561+ .G6:; 
660 3561+0603527 lod GPs+50   ;=GP2 26,30, GP7F 10,00 @3561+
661 3562  .G7:; 
662 3562   call     ;generate unsave code @3562
662+13562 7320121004033 lnk gencode.lnk:jmp gencode.ent 
663 3563 1006722 jmp .G1   ;
664 3563+  pad     ;
664+13563+0000000 00 0    
665 3564  ;-------------------------------------------------------------------
666 3564  ; interface to gencode
667 3564  ; generate code to return from Thunk
668 3564  ;
669 3564  =3539+ 
670 3539+ ExitThunk.ent:; 
671 3539+0404031 sto IdInfo   ;
672 3540 0402161 sto wsptr   ; @3540
673 3540+0603516 lod GPs+41   ;=GP1M 00,GP0F 44,1
674 3541 1004033 jmp gencode.ent   ;
675 3541+ ;--------------------------------------------------------------------
676 3541+ =3545+ 
677 3545+ ; interface to push
678 3545+ ;
679 3545+ .Push33:; 
680 3545+0102236 add Bit33   ;
681 3546 1005012 jmp push.ent   ; @3546
682 3546+  pad     ;
682+13546+0000000 00 0    
683 3547  ;--------------------------------------------------------------------
684 3547  =3444 
685 3444  ; interface to push, mask value first
686 3444  ;
687 3444  MaskPush.ent:; 
688 3444 0062244 and M1188   ;=0001777017777 @3444
689 3444+1005012 jmp push.ent   ;
690 3445  ;--------------------------------------------------------------------
691 3445  =3419 
692 3419  ;interface to getchar
693 3419  getcharb.ent:; 
694 3419 0600574 lod currchar   ; @3419
695 3419+1000605 jmp getchara.ent   ;
696 3420  ;--------------------------------------------------------------------
697 3420  =3404 
698 3404  ;
699 3404  ;interface to getchar - param list delimiter skipping
700 3404  ;
701 3404  SkipPLC.ent:; 
702 3404   call     ; @3404
702+13404 7303015006533 lnk getcharb.lnk:jmp getcharb.ent 
703 3405 4032535006520 jmp .skipa:jmp .skipp;
704 3406 4032511006522 jmp _err42:jmp _err42; @3406
705 3407 4032511006527 jmp _err42:jmp .skipa;
706 3408  ;
707 3408  .skipp:; 
708 3408 0740574 lzs currchar   ;get current character
709 3408+0100575 add ipshift   ;add shift
710 3409 0121444 sub K12   ;=12 [:]
711 3409+1046523 jz .skipq   ;OK, colon is allowed
712 3410  _err42:; 
713 3410 1661044 lnk errlnk   ;error 42: error in param delim @3410
714 3410+1001070 jmp Error   ;error handler
715 3411  ;
716 3411  .skipq:; 
717 3411   call     ;get next char, should be '('
717+13411 7305105001222 lnk gettoken.lnk:jmp gettoken.ent 
718 3412 0600600 lod token   ; @3412
719 3412+0122204 sub K47a   ;=47, [(]
720 3413 0006373040001 o00 putcode.lnk/jz 1;return +1
721 3414 1006522 jmp _err42   ; @3414
722 3414+  pad      
722+13414+0000000 00 0    
723 3415  ;
724 3415  ; note: jmp getchar.ent would be just as effective and save 4 words!
725 3415  .skipa:; 
726 3415   call     ;letter, skip @3415
726+13415 7303015000604 lnk getchar.lnk:jmp getchar.ent 
727 3416 4032535006520 jmp .skipa:jmp .skipp; @3416
728 3417 4032511006522 jmp _err42:jmp _err42;
729 3418 4032511006527 jmp _err42:jmp .skipa; @3418
730 3419  ;--------------------------------------------------------------------
731 3419  =3337 
732 3337  ;interface to gencode
733 3337  ;
734 3337  PrepCall.ent:; 
735 3337   call     ;load proc info address
735+13337 7307175006413 lnk LdVarAddr.lnk:jmp LdVarAddr.ent 
736 3338 0603532 lod GPs+53   ;=GP7F 7,00 call Setup @3338
737 3338+1004033 jmp gencode.ent   ; generate call to prepare proc
738 3339  ;--------------------------------------------------------------------
739 3339  =3339 
740 3339  ;
741 3339  LdVarAddr.ent:; 
742 3339 0401422 sto GenAdr   ;store value for below @3339
743 3339+0602200 lod K8a   ;=8
744 3340   call     ; @3340
744+13340 7306371001526 lnk putOpcd.lnk:jmp putOpcd.ent 
745 3341 0602226 lod K6   ;=6 generate address, in GenAdr
746 3341+  nop     ;
746+13341+1006416 jmp .1    
746+23342  .1:; 
747 3342   call     ; @3342
747+13342 7307445001712 lnk PutInst.lnk:jmp PutInst.ent 
748 3343 0606255 lod W3245   ;=<00 0 : 30 4> inst ref, op=30
749 3343+1001640 jmp GenInst.ent   ;
750 3344  ;--------------------------------------------------------------------
751 3344  ;
752 3344  =3315 
753 3315  ; compile code for invoke procedure (73 xx:40 yy)
754 3315  ;
755 3315  GenCall.ent:; 
756 3315 0031166577777 o00 dicent/lod -1; @3315
757 3316 0062244 and M1188   ; @3316
758 3316+0406233 sto Link31   ;
759 3317 0162165 bus Link15b   ;
760 3317+0102225 add Bbit   ;=<000/000>
761 3318   call     ; @3318
761+13318 7307445001761 lnk NopRef.lnk:jmp NopRef.ent 
762 3319 0606233 lod Link31   ;
763 3319+  nop     ;
763+13319+1006370 jmp .1    
763+23320  .1:; 
764 3320   call     ; @3320
764+13320 7307445001761 lnk NopRef.lnk:jmp NopRef.ent 
765 3321 0606255 lod W3245   ;
766 3321+1001640 jmp GenInst.ent   ;
767 3322  ;--------------------------------------------------------------------
768 3322  =3301+ 
769 3301+ ; interfaces to gencode
770 3301+ ;
771 3301+ L3301P.ent:; 
772 3301+0606261 lod W3249   ;=<00 4 / 00 13>
773 3302 0344031 stc IdInfo   ;store, set acc=0 @3302
774 3302+1004032 jmp gencode1.ent   ;generate store
775 3303  ;--------------------------------------------------------------------
776 3303  L3303.ent:; 
777 3303 0603537 lod GPs+58   ;=<40 10 : 00 7> GP7F 10,00 @3303
778 3303+1004033 jmp gencode.ent   ;
779 3304  ;--------------------------------------------------------------------