File: expr.t2

For general comments see here
LineAddressObject Code LabelF1N1BF2N2CommentsCheck
1 0  ; tape1.d/expr.t2
2 0  ;----------------
3 0  ; compile expression
4 0  ;
5 0  expression::; 
6 0  ;
7 0  =2455 
8 2455  .ent:; 
9 2455 0000000 o00 0   ; @2455
10 2455+0604626 lod .lnk   ;
11 2456   call     ; @2456
11+12456 7323731005012 lnk push.lnk:jmp push.ent 
12 2457 2210646537777 inc stkp/cls -1;
13 2458   pad     ;no-op @2458
13+12458 0000000 00 0    
14 2458+0604303 lod W2243   ;
15 2459 0010646400000 o00 stkp/sto 0;
16 2460 0021403004634 o00 W2240/jmp .SW-1; switch on ??? @2460
17 2461  ;
18 2461  .SW:; 
19 2461   call     ; +1 get new token
19+12461 7322411004503 lnk advance.lnk:jmp advance.ent 
20 2462 0600600 lod token   ; +2 get token, -> @2462
21 2462+1004643 jmp .sw1   ;
22 2463 0442151 inc stkp   ; +3
23 2463+1004641 jmp .sw2   ;
24 2464 0442151 inc stkp   ; +4 @2464
25 2464+1004721 jmp .loop   ;
26 2465  ;
27 2465 0604303.sw2:lod W2243   ; @2465
28 2465+0064324 and T_Mask   ;=0700000000000
29 2466 1044650 jz .1   ; @2466
30 2466+1004656 jmp .4   ;
31 2467  ;
32 2467  .sw1:; 
33 2467 0124340 sub K2b   ;=2 [if]
34 2467+1044764 jz .cond   ;->conditional expression
35 2468   call     ; test token @2468
35+12468 7323761004775 lnk TestOpd.lnk:jmp TestOpd.ent 
36 2469 1044650 jz .1   ; valid operand->
37 2469+ ;
38 2469+ .again:; 
39 2469+0600600 lod token   ;
40 2470   call     ; @2470
40+12470 7323731005012 lnk push.lnk:jmp push.ent 
41 2471   call     ; get term
41+12471 7323731004767 lnk term.lnk:jmp term.ent 
42 2472  .1:; 
43 2472   call     ; test token @2472
43+12472 7323761005054 lnk SimpleTerm.lnk:jmp SimpleTerm.ent 
44 2473 1144653 jz .3   ;simple ident or constant
45 2473+  pad     ;
45+12473+0000000 00 0    
46 2474  .2:; 
47 2474   call     ;get Primary @2474
47+12474 7322411004564 lnk Primary.lnk:jmp Primary.ent 
48 2475 1004721 jmp .loop   ;->
49 2475+ ;
50 2475+ .3:; 
51 2475+0603427 lod idptr   ;
52 2476   call     ; @2476
52+12476 7323731005012 lnk push.lnk:jmp push.ent 
53 2477   call     ; get next token
53+12477 7322411004503 lnk advance.lnk:jmp advance.ent 
54 2478  ;
55 2478  .4:; 
56 2478   call     ; check opr @2478
56+12478 7324375005100 lnk TestPrty.lnk:jmp TestPrty.ent 
57 2479 1144645 jz .again   ;OK, loop back
58 2479+  nop      
58+12479+1004660 jmp .1    
58+22480  .1:; 
59 2480 0602151 lod stkp   ; @2480
60 2480+0404306 sto W2246   ;
61 2481 0010646577777 o00 stkp/lod -1;
62 2482 1044700 jz .error   ; @2482
63 2482+0404305 sto W2245   ;
64 2483 0064324 and T_Mask   ;=0700000000000
65 2483+0404031 sto IdInfo   ;
66 2484 0010646577776 o00 stkp/lod -2; @2484
67 2485 1144715 jz .8   ;->
68 2485+0400004 sto 4   ;
69 2486 0010646577775 o00 stkp/lod -3; @2486
70 2487 1144715 jz .8   ;
71 2487+0404307 sto W2247   ;
72 2488 0064324 and T_Mask   ;=0700000000000 @2488
73 2488+0124320 sub IntBit   ;=0200000000000
74 2489 1125372 jn OutOper.err31a   ;
75 2489+0200004 exa 4   ;
76 2490 0124342 sub K27   ;=27 @2490
77 2490+1044714 jz .7   ;
78 2491 0600004 lod 4   ;
79 2491+1044701 jz .5   ; ->
80 2492 0544303 cls W2243   ; @2492
81 2492+0604031 lod IdInfo   ;
82 2493 0124315 sub procbit1   ;
83 2493+1044714 jz .7   ;
84 2494 0604305 lod W2245   ; @2494
85 2494+0064344 and W2276   ;
86 2495 1044706 jz .6   ;
87 2495+1104715 jmp .8   ;
88 2496  ;
89 2496  .error:; 
90 2496 1661044 lnk errlnk   ; @2496
91 2496+1004772 jmp error2   ;call error routine
92 2497  ;
93 2497  .5:; 
94 2497 0604340 lod K2b   ;=2 @2497
95 2497+0404303 sto W2243   ;
96 2498 0564306 o27 W2246   ; @2498
97 2498+0604031 lod IdInfo   ;
98 2499 0124315 sub procbit1   ;=0300000000000
99 2499+1024714 jn .7   ; ->
100 2500 0604307 lod W2247   ; @2500
101 2500+0064344 and W2276   ;
102 2501   jnz     ;
102+12501 1044706 jz .1    
102+22501+1004714 jmp expression.7    
102+32502  .1:; 
103 2502  .6:; 
104 2502 0021416604305 o00 W2243/lod W2245; @2502
105 2503 2000022600000 sto 4/lod 0;
106 2504 1540000 flt 4096   ; @2504
107 2504+  pad     ;
107+12504+0010000 00 0    
108 2505 0000022400000 o00 4/sto 0;
109 2506 0604322 lod TBool   ; @2506
110 2506+  pad      
110+12506+0000000 00 0    
111 2507 0021432477777 o00 W2246/ads -1;
112 2508  .7:; 
113 2508   call     ; @2508
113+12508 7323731005040 lnk GenLoad2.lnk:jmp GenLoad2.ent 
114 2509 1004723 jmp .9   ;
115 2509+ ;
116 2509+ .8:; 
117 2509+0604031 lod IdInfo   ;
118 2510 0124322 sub TBool   ; @2510
119 2510+1145372 jz OutOper.err31a   ;
120 2511   call     ;
120+12511 7323731005037 lnk GenLoad0.lnk:jmp GenLoad0.ent 
121 2512 1004723 jmp .9   ; @2512
122 2512+  pad      
122+12512+0000000 00 0    
123 2513  ;
124 2513  .loop:; 
125 2513   call     ;should we compile op or defer
125+12513 7324455005114 lnk TestDefer.lnk:jmp TestDefer.ent 
126 2514 1124736 jn .defer   ;->defer it @2514
127 2514+  pad     ;no-op
127+12514+0000000 00 0    
128 2515  ;
129 2515  ; previous operator needs to be generated
130 2515  ;
131 2515  .9:; 
132 2515   call     ;test arith op
132+12515 7323761005070 lnk TestArithOp.lnk:jmp TestArithOp.ent 
133 2516 1044735 jz .output   ;yes, process operator @2516
134 2516+  pad     ;no-op
134+12516+0000000 00 0    
135 2517 0010646577777 o00 stkp/lod -1;load type info
136 2518 0064345 and W2277   ;=0001774017777 mask seg/offset @2518
137 2518+1044730 jz .inacc   ;->operand in Acc?
138 2519 1004735 jmp .output   ;generate code for operator
139 2519+  pad      
139+12519+0000000 00 0    
140 2520  ;
141 2520  .inacc:; 
142 2520 0010646577776 o00 stkp/lod -2;get operator @2520
143 2521 1144752 jz .done   ;->none, expression done
144 2521+0124335 sub W2269   ;=22 [+]
145 2522   jnz     ;rest need action
145+12522 1044733 jz .1    
145+22522+1004735 jmp expression.output    
145+32523  .1:; 
146 2523 0010646577775 o00 stkp/lod -3;get other operand info
147 2524 1144752 jz .done   ;null, unary + @2524
148 2524+  nop     ;
148+12524+1004735 jmp .1    
148+22525  .1:; 
149 2525  ;
150 2525  .output:; 
151 2525   call     ;generate code for stacked ops @2525
151+12525 7325425005306 lnk OutOper.lnk:jmp OutOper.ent 
152 2526 1004721 jmp .loop   ; @2526
153 2526+ ;
154 2526+ ; operator to be deferred
155 2526+ ;
156 2526+ .defer:; 
157 2526+0600600 lod token   ;get operator
158 2527   call     ;push onto stack
158+12527 7323731005012 lnk push.lnk:jmp push.ent 
159 2528   call     ;advance, check valid start @2528
159+12528 7323731004767 lnk term.lnk:jmp term.ent 
160 2529   call     ;test for simple variable or constant
160+12529 7323761005054 lnk SimpleTerm.lnk:jmp SimpleTerm.ent 
161 2530 1024751 jn .10   ;no, complicated cases @2530
162 2530+0603427 lod idptr   ;
163 2531   call     ;
163+12531 7323731005012 lnk push.lnk:jmp push.ent 
164 2532   call     ; @2532
164+12532 7322411004503 lnk advance.lnk:jmp advance.ent 
165 2533   call     ;
165+12533 7324455005114 lnk TestDefer.lnk:jmp TestDefer.ent 
166 2534 1044723 jz .9   ; @2534
167 2534+  pad     ;
167+12534+0000000 00 0    
168 2535   call     ;save in temp location
168+12535 7323761005021 lnk SaveTemp.lnk:jmp SaveTemp.ent 
169 2536 1104645 jmp .again   ; @2536
170 2536+  pad     ;
170+12536+0000000 00 0    
171 2537  ;
172 2537  .10:; 
173 2537   call     ;store result in temp
173+12537 7323761005021 lnk SaveTemp.lnk:jmp SaveTemp.ent 
174 2538 1004652 jmp .2   ; @2538
175 2538+ ;
176 2538+ .done:; 
177 2538+0040000 o02 0   ;=1
178 2539 2710646600000 o27 stkp/lod 0;unstack one word
179 2540 0404305 sto W2245   ; @2540
180 2540+0040000 o02 0   ;=1
181 2541 2710646600000 o27 stkp/lod 0;unstack another word
182 2542 1144757 jz .skipz   ;-> @2542
183 2542+0040000 o02 0   ;=1
184 2543 0562151 o27 stkp   ;discard a word
185 2543+ .skipz:; 
186 2543+0040000 o02 0   ;=1
187 2544 2710646600000 o27 stkp/lod 0;unstack a third @2544
188 2545 0404626 sto expression.lnk   ;save it
189 2545+0604305 lod W2245   ;get 1st word
190 2546 2210646377777 inc stkp/sto -1; push it back on @2546
191 2547   ret     ;
191+12547 0023133000001 o00 expression.lnk/jmp 1 
192 2548  ;
193 2548  ; conditional expression
194 2548  ;
195 2548  .cond:; 
196 2548   call     ;compile conditional expression @2548
196+12548 7325115005224 lnk CondExp.lnk:jmp CondExp.ent 
197 2549 1104752 jmp .done   ;
198 2549+ ;
199 2549+  pad      
199+12549+0000000 00 0    
200 2550  ;--------------------------------------------------------------------
201 2550  ;
202 2550  term::; 
203 2550  ;
204 2550  =2551 
205 2551  .ent:; 
206 2551   call     ;get next token @2551
206+12551 7322411004503 lnk advance.lnk:jmp advance.ent 
207 2552   call     ;test valid start to operand @2552
207+12552 7323761004775 lnk TestOpd.lnk:jmp TestOpd.ent 
208 2553 1044773 jz .ret   ;OK, return
209 2553+1661044_err24:lnk errlnk   ;error 24: missing operand in exprn
210 2554  ;
211 2554  ; error routine
212 2554 0604340error2:lod K2b   ;=2
213 2554+1001070 jmp Error   ;error routine
214 2555  ;
215 2555  .ret:; 
216 2555   ret     ;
216+12555 0023733000001 o00 term.lnk/jmp 1 
217 2556  ;--------------------------------------------------------------------
218 2556  TestOpd::; 
219 2556  ;
220 2556  =2557 
221 2557  .ent:; 
222 2557 0600600 lod token   ;token @2557
223 2557+1045007 jz Relop.retOK   ;identifier->, OK
224 2558 1025007 jn Relop.retOK   ;constant->, OK @2558
225 2558+0124330 sub K37   ;=37 [NOT]
226 2559 1045007 jz Relop.retOK   ;unary operator, OK
227 2559+0124331 sub K10a   ;=10 =>>47 [(]
228 2560 1045007 jz Relop.retOK   ;nested expression, OK @2560
229 2560+0600600 lod token   ;reload token
230 2561  .tBool:; 
231 2561 0124312 sub K20   ;=20 [TRUE]
232 2561+1045007 jz Relop.retOK   ;boolean value, OK
233 2562 0124313 sub K1b   ;=1 =>>21 [FALSE] @2562
234 2562+1045007 jz Relop.retOK   ;boolean value, OK
235 2563 1105010 jmp Relop.retNoGo   ;return NoGo
236 2563+ ; -------------------------------------------------------------------
237 2563+ ;
238 2563+ Relop::; 
239 2563+ .ent:; 
240 2563+0600600 lod token   ;get token
241 2564 0164332 bus K52   ;=52 [GR] @2564
242 2564+1045007 jz .retOK   ;
243 2565 0124312 sub K20   ;=20 =>>32 [NOTEQ]
244 2565+1125010 jn .retNoGo   ;
245 2566 0164347 bus K4a   ;=4 @2566
246 2566+1125010 jn .retNoGo   ;
247 2567  ; fall through if NOTEQ,=,LESS,LESSEQ,GREQ
248 2567  .retOK:; 
249 2567 0623763000001 cla .lnk/jmp 1;return with acc=OK
250 2568   pad     ; @2568
250+12568 0000000 00 0    
251 2568+ ;
252 2568+ .retNoGo:; 
253 2568+0604321 lod False   ;sign bit
254 2569   ret     ;return with acc=NoGo
254+12569 0023763000001 o00 Relop.lnk/jmp 1 
255 2570  ;--------------------------------------------------------------------
256 2570  ;
257 2570  =2573 
258 2573  GetAddrExprn::; 
259 2573  ;
260 2573  .ent:; 
261 2573 0042161 o02 wsptr   ; increment @2573
262 2573+0402161 sto wsptr   ; and store
263 2574 0122147 sub W1127   ; @2574
264 2574+1125017 jn .1   ;
265 2575 0502147 ads W1127   ;
266 2575+ .1:; 
267 2575+0040000 o02 0   ;=1
268 2576 0162161 bus wsptr   ; decrement @2576
269 2576+1004773 jmp term.ret    
270 2577  ;--------------------------------------------------------------------
271 2577  ;
272 2577  SaveTemp::; 
273 2577  ;
274 2577  .ent:; 
275 2577 0010646577777 o00 stkp/lod -1;get operator from stack @2577
276 2578 0404305 sto W2245   ; @2578
277 2578+0544306 cls W2246   ;
278 2579 0064345 and W2277   ;=<00255:008191>
279 2579+1045031 jz .1   ;
280 2580 0010646577776 o00 stkp/lod -2;get required type from stack @2580
281 2581 0404305 sto W2245   ;
282 2581+0444306 inc W2246   ;
283 2582 0064345 and W2277   ;=<00255:008191> @2582
284 2582+1045031 jz .1   ;
285 2583 0010646577775 o00 stkp/lod -3;
286 2584 0404305 sto W2245   ; @2584
287 2584+0444306 inc W2246   ;
288 2585  .1:; 
289 2585 0602151 lod stkp   ;
290 2585+0524306 sbs W2246   ;
291 2586   call     ; @2586
291+12586 7323731005015 lnk GetAddrExprn.lnk:jmp GetAddrExprn.ent 
292 2587 0404031 sto IdInfo   ;
293 2587+0604305 lod W2245   ;get required type
294 2588 0064324 and T_Mask   ;=00700000000000 mask off extra bits @2588
295 2588+0104356 add TmpFlg   ;=040000 add in flag to indicate temporary
296 2589 0104031 add IdInfo   ;add segment/offset
297 2589+1005060 jmp .2   ;-->>
298 2590  ;
299 2590 0000000002000W2590:+1024; @2590
300 2591  ;--------------------------------------------------------------------
301 2591  =2608 
302 2608  .2:; 
303 2608 0021432337777 o00 W2246/stc -1;store info on stack @2608
304 2609   call     ;generate code to store acc in temp
304+12609 7320121004032 lnk gencode1.lnk:jmp gencode1.ent 
305 2610 0023763000001 o00 .lnk/jmp 1;return @2610
306 2611  ;--------------------------------------------------------------------