File: putcode.t2

For general comments see here
LineAddressObject Code LabelF1N1BF2N2CommentsCheck
1 0  ; tape1.d/putcode.t2
2 0  ;-------------------
3 0  putcode::; 
4 0  =831 
5 831  ;
6 831  ; PCdata is in 780, part word in 781, shift in 782
7 831  ;
8 831  .ent:; 
9 831 0701416 las PCshift   ;shift count @831
10 831+0401417 sto PCwk2   ;
11 832 1101501.pat:jmp .1   ;skip or return 00 830/jmp 1 @832
12 832+0000000 o00 0   ;
13 833 1101501 jmp .1   ;no-op
14 833+0601414.1:lod PCdata   ;
15 834 0006077320000 o00 PCwk2/sll 0; shift left @834
16 835 0501415 ads work1   ;
17 835+0601416 lod PCshift   ;shift count
18 836 0121440 sub K39   ;=39 @836
19 836+1021534 jn .4   ; ok, not yet full ->
20 837 0601425 lod errsw   ;ocode output to paper tape?
21 837+1041514 jz .2   ;->punch to p/t
22 838 0601440 lod K39   ;=39 @838
23 838+0561416 o27 PCshift   ;shift count
24 839 0621417 lcs PCwk2   ;
25 839+0601414 lod PCdata   ;
26 840 0006077220047 o00 PCwk2/srl 39; @840
27 841 0201415 exa work1   ;
28 841+0501420 ads PCchk   ;add into sum-check
29 842   call     ; store word in code area @842
29+1842 7306145002002 lnk L1026.lnk:jmp L1026.ent 
30 843  .ret:; 
31 843   ret     ;
31+1843 0006373000001 o00 putcode.lnk/jmp 1 
32 844  ;
33 844  ; punch ocode word to paper tape
34 844  .2:; 
35 844 0601441 lod K5   ; @844
36 844+0561416 o27 PCshift   ;shift count
37 845 0621417 lcs PCwk2   ;
38 845+0601414 lod PCdata   ;
39 846 0006077220005 o00 PCwk2/srl 5; @846
40 847  .3:; 
41 847 0201415 exa work1   ;
42 847+0061442 and K31   ;=31
43 848 2006077700000 sto PCwk2/otp 0; punch ocode to p/t @848
44 849 0501420 ads PCchk   ;add into sum-check
45 849+ .3a:; 
46 849+0601416 lod PCshift   ;shift count @849+
47 850 0121441 sub K5   ;=5 @850
48 850+1021513 jn .ret   ;return
49 851 0401416 sto PCshift   ;shift count
50 851+0601415 lod work1   ;
51 852 1220005 srl 5   ; @852
52 852+1001517 jmp .3   ;loop back
53 853  ;
54 853 3406070401417L853:las PCshift:sto PCwk2;data for patching entry
55 854  ;-------------------------------------------------------------------
56 854  ; putOpcd: output ocode key (5-bit value)
57 854  ;
58 854  putOpcd.ent:; 
59 854 0401414 sto PCdata   ;
60 854+0601443 lod K5a   ;=5
61 855 1001477 jmp .ent   ; enter putcode proper
62 855+ ;
63 855+ putAddr.ent:; 
64 855+0061450 and N2bits   ;
65 856 0401414 sto PCdata   ; @856
66 856+0041444 o02 K12   ;=12
67 857 1001477 jmp .ent   ;
68 857+ ;------------------------------------
69 857+ putcode6.ent:; 
70 857+0040000 o02 0   ;=1
71 858 1001613 jmp L907   ;->907 @858
72 858+ ;------------------------------------
73 858+ ; put full word to ocode stream
74 858+ ; word in ACC
75 858+ ;
76 858+ putFwd.ent:; 
77 858+0401414 sto PCdata   ; @858+
78 859 0601440 lod K39   ;=39 number of bits to put
79 859+1001477 jmp .ent   ; enter putcode proper
80 860  ;--------------------------------------
81 860 0601425.4:lod errsw   ; ocode to paper tape? @860
82 860+1141521 jz .3a   ;
83 861 1001513 jmp .ret   ;return to caller
84 861+ ;
85 861+0000000 o00 0   ; @861+
86 862  ;-------------------------------------------------------------------
87 862  ; initialise working variables for putcode
88 862  ;
89 862  InitPutCode.ent:; 
90 862 0541415 cls work1   ; @862
91 862+0541416 cls PCshift   ;shift count
92 863 0541424 cls W788   ;
93 863+0541426 cls W790   ;
94 864 0541616 cls W910   ; @864
95 864+0541617 cls W911   ;
96 865 0541420 cls PCchk   ;clear sum-check
97 865+0601425 lod errsw   ;
98 866 1041565 jz .ptap1   ; @866
99 866+0601471 lod EndCode   ;data to be output 5:13,5:15
100 867 0401414 sto PCdata   ;store for putcode
101 867+0041451 o02 K9   ;=9+1=>10
102 868 1001477.868:jmp .ent   ;add 10-bit data to ocode @868
103 868+ ;
104 868+ =885 
105 885  ;
106 885  .ptap1:; 
107 885 0601440 lod K39   ;=39
108 885+0421422 stn GenAdr   ;set count=-39
109 886 1700000.lp1:otp 0   ;blank tape (40 blanks) @886
110 886+0641422 lis GenAdr   ;count
111 887 1021566 jn .lp1   ;repeat
112 887+1700017 otp 15   ;output ocode key=15 (end of program marker)
113 888 0041444 o02 K12   ;=12+1=>13 @888
114 888+1001526 jmp putOpcd.ent   ;output ocode key=13 (check sumcheck)
115 889  ;---------------------------------------------------------------------------
116 889  ; ClosePC: close the ocode stream at end of compilation
117 889  ; write sumcheck and padding
118 889  ;
119 889  =868+ 
120 868+ ;
121 868+ ClosePC::; 
122 868+ ;
123 868+0000000 o00 0   ;unused? @868+
124 869 0000000 o00 0   ;unused??
125 869+ ;
126 869+0601420.ent:lod PCchk   ;get sumcheck value
127 870   call     ;output to ocode stream @870
127+1870 7306371101532 lnk putFwd.lnk:jmp putFwd.ent 
128 871 0601457 lod K22   ;=22 ocode key for sumcheck
129 871+0000000 o00 0   ;
130 872   call     ;output key @872
130+1872 7306371001526 lnk putOpcd.lnk:jmp putOpcd.ent 
131 873 0601425 lod errsw   ;is output to paper tape?
132 873+1041560 jz .1   ;yes, only pad to 5 bits
133 874 0601440 lod K39   ;=39 @874
134 874+0121416 sub PCshift   ;shift count - number of spare bits
135 875 0401422 sto GenAdr   ;save for below
136 875+0541414 cls PCdata   ;write zero bits
137 876   call     ;write padding bits to fill word @876
137+1876 7306371001477 lnk putcode.lnk:jmp putcode.ent 
138 877 0601422 lod GenAdr   ;length of padding
139 877+0000000 o00 0   ;
140 878   call     ;write word to core/tape/film @878
140+1878 7306145002002 lnk L1026.lnk:jmp L1026.ent 
141 879  .ret:ret     ;
141+1879 0006117000001 o00 ClosePC.lnk/jmp 1 
142 880  ;
143 880  ; pad to paper tape
144 880  ;
145 880 0601441.1:lod K5   ;=5 @880
146 880+0121416 sub PCshift   ;shift count
147 881 0401422 sto GenAdr   ;save padding length
148 881+0541414 cls PCdata   ;clear data
149 882   call     ;write padding @882
149+1882 7306371001477 lnk putcode.lnk:jmp putcode.ent 
150 883 0006113700000 o00 GenAdr/otp 0;add padd length
151 884 1700037 otp 31   ;letter shift/marker @884
152 884+1001557 jmp .ret   ;
153 885  ;
154 885  ;-------------------------------------------------------------------
155 885  ;
156 885  =889 
157 889  ;
158 889  GenFinish::; 
159 889  .1:call     ; @889
159+1889 7307175001622 lnk SetCodePtr.lnk:jmp SetCodePtr.ent 
160 890 0000000 o00 0   ;
161 890+0601452 lod K3   ;=3
162 891 0401430 sto W792   ;
163 891+0602145 lod ObjPC   ;program counter
164 892   call     ; @892
164+1892 7307175001630 lnk GenSetBase.lnk:jmp GenSetBase.ent 
165 893 0601617 lod W911   ;display size
166 893+0401414 sto PCdata   ;
167 894 0041454 o02 K7   ;=7+1=>8 @894
168 894+  nop     ;
168+1894+1001577 jmp .1    
168+2895  .1:; 
169 895   call     ;output display size
169+1895 7306371001477 lnk putcode.lnk:jmp putcode.ent 
170 896 0601424 lod W788   ;patch list size @896
171 896+0061450 and N2bits   ;
172 897 0401414 sto PCdata   ;
173 897+0041454 o02 K7   ;=7+1=>8
174 898   call     ;output patch list size @898
174+1898 7306371001477 lnk putcode.lnk:jmp putcode.ent 
175 899   nop     ;
175+1899 1101603 jmp .1    
175+2899+ .1:; 
176 899+0602147 lod W1127   ;Data Size
177 900   call     ; @900
177+1900 7306371101527 lnk putAddr.lnk:jmp putAddr.ent 
178 901 0602143 lod W1123   ;
179 901+0102145 add ObjPC   ;program counter
180 902   call     ; @902
180+1902 7306371101527 lnk putAddr.lnk:jmp putAddr.ent 
181 903 0601447 lod K17   ;=17
182 903+  nop     ;
182+1903+1001610 jmp .1    
182+2904  .1:; 
183 904   call     ;output SetProgSize key @904
183+1904 7306371001526 lnk putOpcd.lnk:jmp putOpcd.ent 
184 905   call     ;close down ocode stream
184+1905 7306115101545 lnk ClosePC.lnk:jmp ClosePC.ent 
185 906 0010613000001 o00 Link15d/jmp 1; @906
186 907  ;-----------------
187 907  ;
188 907  L907:; 
189 907 0761616.907:o37 W910   ; @907
190 907+0121617 sub W911   ;
191 908 1021615 jn L909   ;
192 908+0501617 ads W911   ;
193 909  L909:; 
194 909 0041451.909:o02 K9   ;=9
195 909+1001526 jmp putOpcd.ent   ;->
196 910  ;-----------------------------------------------------
197 910 0000000000000W910:+0; @910
198 911 0000000000001W911:+1; @911
199 912  ;
200 912  ; no refs
201 912  ;
202 912  ;L912:
203 912 0541616 cls W910   ; @912
204 912+0541617 cls W911   ;
205 913 1001544 jmp putcode.868   ;
206 913+ ;
207 913+0000000 o00 0   ;
208 914  ;-------------------------------------------------------------------
209 914  SetCodePtr::; 
210 914  =914 
211 914  ;
212 914  ; Output Set Code Ptr ocode items
213 914  .ent:; 
214 914   call     ;round off last word @914
214+1914 7307255001654 lnk putNop.lnk:jmp putNop.ent 
215 915 0602145 lod ObjPC   ;program counter
216 915+0121461 sub K1   ;
217 916   call     ;output type 1 entry for code size
217+1916 7307445001761 lnk NopRef.lnk:jmp NopRef.ent 
218 917 0041455 o02 K15a   ;=15+1=>16 type 16 ocode entry @917
219 917+0000000 o00 0    
220 918  L918:; 
221 918  .918:call     ;output key=16/17 @918
221+1918 7306371001526 lnk putOpcd.lnk:jmp putOpcd.ent 
222 919  .ret:ret     ;return
222+1919 0007177000001 o00 SetCodePtr.lnk/jmp 1 
223 920  ;
224 920  ;-------------------------------------------------------------------
225 920  GenSetBase::; 
226 920  ; output SetBase ocode item, acc contains value, W792 contains
227 920  ; base id.
228 920  ;
229 920  .ent:; 
230 920   call     ; @920
230+1920 7307445001761 lnk NopRef.lnk:jmp NopRef.ent 
231 921 0601430 lod W792   ;
232 921+0121424 sub W788   ;
233 922 1121633 jn .923P   ; @922
234 922+0501424 ads W788   ;
235 923 0000000 o00 0   ;
236 923+0601430.923P:lod W792   ;
237 924 0401414 sto PCdata   ; @924
238 924+0041454 o02 K7   ;
239 925   call     ;
239+1925 7306371001477 lnk putcode.lnk:jmp putcode.ent 
240 926 0041447 o02 K17   ;=17 set ocode key for PutOpcd @926
241 926+1001626 jmp L918   ;join previous code for output
242 927  ;--------------------------------------------------------------
243 927  ; return address moved higher to avoid fwd refs
244 927  =928 
245 928  GenInst::; 
246 928  ;
247 928  ; instruction information in Acc, call PutInst, then update things
248 928  ; such as even/odd address flag. If instruction includes B-bit
249 928  ; make sure aligned correctly to start, and output ocode to add
250 928  ; B-bit into final code.
251 928  ;
252 928  .ent:; 
253 928 0401423 sto Link9   ; @928
254 928+0061456 and B20   ;=0000002000000 test if B-bit set
255 929 1141642 jz GenInst1.ent   ; if zero -> no
256 929+1001666 jmp .950   ; ->make sure we're at an even address
257 930  ; ; returns to GenInst1.ent
258 930  ;
259 930 0000000 o00 0   ; @930
260 930+ ;
261 930+ GenInst1.ent:; 
262 930+0601423 lod Link9   ;reload saved info @930+
263 931   call     ;output it
263+1931 7307445001712 lnk PutInst.lnk:jmp PutInst.ent 
264 932 0601453.1:lod B39   ;=04000000000000
265 932+0701426 las W790   ;toggle W790 (odd-even inst flag)
266 933 1021652 jn .2   ;top half, no need to test for B-modify
267 933+0601423 lod Link9   ;reload saved instruction
268 934 0061456 and B20   ;=0000002000000 is B-bit set @934
269 934+1041651 jz .ret   ;no, skip
270 935 0041467 o02 K24   ;=24+1=>25
271 935+0000000 o00 0   ;
272 936   call     ;generate opcd(25) to set B-bit @936
272+1936 7306371001526 lnk putOpcd.lnk:jmp putOpcd.ent 
273 937  ; from 934+
274 937  .ret:ret     ; @937
274+1937 0007177000001 o00 GenInst.lnk/jmp 1 
275 938  ;-----------------
276 938 0442145.2:inc ObjPC   ;program counter
277 938+1001651 jmp .ret   ;
278 939  ;---------------------------------------------------------------
279 939  ;
280 939  putNop::; 
281 939  ;
282 939  ;
283 939  ;-----------------
284 939  ; if (W790 < 0), output a type 8 entry to ocode stream
285 939  ; clearing W790. Otherwise just return. Effect is to force
286 939  ; next instruction to top half of word
287 939  ;
288 939  =940 
289 940  .ent:; 
290 940 0741426 lzs W790   ; @940
291 940+1121656 jn .1   ;->
292 941  .ret:ret     ;
292+1941 0007257000001 o00 putNop.lnk/jmp 1 
293 942  ;
294 942 0000000 o00 0   ;
295 942+ ;
296 942+0041454.1:o02 K7   ;=7+1 => 8 @942+
297 943   call     ;output type 8 opcode
297+1943 7306371001526 lnk putOpcd.lnk:jmp putOpcd.ent 
298 944 0442145 inc ObjPC   ;?
299 944+1001655 jmp .ret   ;->return
300 945  ;-------------------------------------------------------------------
301 945  ; output ocode to patch a jump into the switch lists
302 945  ; Acc contains destination address info
303 945  ;
304 945  LabRef:; 
305 945   call     ;generate reference address
305+1945 7307445001761 lnk NopRef.lnk:jmp NopRef.ent 
306 946 0601444 lod K12   ;=12 (patch switch list)
307 946+0000000 o00 0   ;
308 947   call     ;output ocode operator @947
308+1947 7306371001526 lnk putOpcd.lnk:jmp putOpcd.ent 
309 948 1001651 jmp GenInst.ret   ;and return
310 948+ ;
311 948+0000000 o00 0   ;
312 949  ;-------------------------------------------------------------------
313 949  GenInst::; 
314 949  GenSkpInst.ent:; 
315 949 0401423 sto Link9   ; @949
316 949+0000000 o00 0   ;
317 950  .950:call     ; @950
317+1950 7307255001654 lnk putNop.lnk:jmp putNop.ent 
318 951 1101642 jmp GenInst1.ent   ;
319 951+ ;
320 951+0000000 o00 0   ;
321 952  ;----------------------------------------------------
322 952  ;
323 952  L952::; 
324 952  ; output half-word instruction (passed in Acc) ??
325 952  ;
326 952  .ent:; 
327 952 0401422 sto GenAdr   ; @952
328 952+0401423 sto Link9   ;
329 953   call     ;
329+1953 7307445001755 lnk L1005.lnk:jmp L1005.ent 
330 954   ret     ; @954
330+1954 0007257000001 o00 L952.lnk/jmp 1 
331 955  ;
332 955  ;-------------------------------------------------------------------
333 955  ;
334 955  L958::; 
335 955  ;
336 955  L955:; 
337 955 0000000000000W955:+0; @955
338 956 0000000000000W956:+0; @956
339 957  ;
340 957  ; output full word as two instructions - assume B-bit not set!
341 957  ; aligns object code to full word first
342 957  ;
343 957  =958 
344 958  .ent:; 
345 958 0401674 sto W956   ;save word @958
346 958+0000000 o00 0   ;
347 959   call     ;align if needed
347+1959 7307255001654 lnk putNop.lnk:jmp putNop.ent 
348 960 0601674 lod W956   ;reload word @960
349 960+1220024 srl 20   ;shift top half down
350 961   call     ;and output it
350+1961 7307175001705 lnk L965.lnk:jmp L965.ent 
351 962 0601674 lod W956   ;reload word again @962
352 962+0061470 and W824   ;=0x7FFFF mask out bottom half
353 963   call     ;output that
353+1963 7307175001705 lnk L965.lnk:jmp L965.ent 
354 964   ret     ; @964
354+1964 0007367000001 o00 L958.lnk/jmp 1 
355 965  ;-------------------------------------------------------------------
356 965  L965::; 
357 965  ;
358 965  .ent:; 
359 965   call     ; @965
359+1965 7307255001670 lnk L952.lnk:jmp L952.ent 
360 966 1001644 jmp GenInst.1   ;
361 966+ ;
362 966+0000000 o00 0   ;
363 967  ; no refs
364 967  ;
365 967 0601466 lod K19   ; @967
366 967+1001477 jmp putcode.ent   ;
367 968  ; no refs
368 968  ;
369 968 0041454 o02 K7   ;=7 @968
370 968+1001673 jmp L955   ; ??? data area ???
371 969  ;--------------------------------------------------------------
372 969  ; output an instruction to ocode stream,
373 969  ; opcode + flags are in Acc,
374 969  PutInst::; 
375 969  ;
376 969  =970 
377 970  .ent:; 
378 970 0401423 sto Link9   ;save instruction+flags @970
379 970+0061454 and K7   ;=7
380 971 2000023001763 sto 4/jmp .sw;switch
381 972  ;
382 972  =1011 
383 1011  ; switch list used above (971) moved nearer to in-line
384 1011  .sw:; 
385 1011 0041454 o02 K7   ;=7+1=>8 +0 @1011
386 1011+1001721 jmp .977   ;put opcode 8 (NULL)
387 1012 0041443 o02 K5a   ;=5+1=>6 +1 @1012
388 1012+1001723 jmp .979   ; cond jump (pop)
389 1013 0601454 lod K7   ;=7 +2 @1013
390 1013+1101723 jmp .979P   ; cond jump (nopop)
391 1014 0601451 lod K9   ;=9 +3 @1014
392 1014+1001721 jmp .977   ;put opcode (else jump)
393 1015 0601467 lod K24   ;=24 +4 @1015
394 1015+1001714 jmp .972   ;instruction reference
395 1016 0601423 lod Link9   ;saved instn +5 @1016
396 1016+1001727 jmp .983   ;
397 1017 0601422 lod GenAdr   ;address +6 @1017
398 1017+1101730 jmp .984P   ;
399 1018 0041457 o02 K22   ;=22+1=>23 +7 @1018
400 1018+1001714 jmp .972    
401 1019  ;--------------------------------
402 1019  =972 
403 972  ;
404 972  ; types 4 + 7 entries comes here with Acc= 24 + 23 (instruction reference, table ref)
405 972  ; also some type 6 can come here with Acc=5 (constant reference)
406 972  ;
407 972 0401427.972:sto W791   ;save opcode @972
408 972+0601423 lod Link9   ;get instruction
409 973 1220015 srl 13   ;shift opcode down
410 973+0061460 and K63   ;=63 mask it out
411 974 0401414 sto PCdata   ;and save it for putcode @974
412 974+0041443 o02 K5a   ;=5+1=>6 bits for opcode
413 975  ; everything else with operands comes in here
414 975  .975:call     ;output data
414+1975 7306371001477 lnk putcode.lnk:jmp putcode.ent 
415 976 0601427 lod W791   ;re-load saved opcode @976
416 976+0000000 o00 0   ;
417 977  ; types 0 + 3 come here with Acc=8 + 9 respectively (null, elsejump)
418 977  .977:call     ;output opcode
418+1977 7306371001526 lnk putOpcd.lnk:jmp putOpcd.ent 
419 978   ret     ;return @978
419+1978 0007447000001 o00 PutInst.lnk/jmp 1 
420 979  ;
421 979  ; type 1 comes here with Acc=6 (cond jump pop)
422 979 0441616.979:inc W910   ;
423 979+ ; type 2 comes here with Acc=7 (cond jump nopop)
424 979+0401427.979P:sto W791   ;save opcode
425 980 0601423 lod Link9   ;get instruction @980
426 980+1220015 srl 13   ;shift opcode down
427 981 0061452 and K3   ;=3 mask off condition bits
428 981+0401414 sto PCdata   ;store data
429 982 0041461 o02 K1   ;=1+1=>2 bits needed @982
430 982+1001717 jmp .975   ;generate modifier bits, then opcode
431 983  ; type 5 comes here
432 983 1220024.983:srl 20   ;shift instn down
433 983+0401422 sto GenAdr   ;save it for later
434 984 1001755 jmp L1005.ent   ;??
435 984+ ;
436 984+ ; type 6 comes here
437 984+ .984P:; 
438 984+0061462 and B1920   ;=0000003000000 <000/400> @984+
439 985 1041733 jz .987   ; zero->
440 985+0000000 o00 0   ; no-op
441 986 0601422 lod GenAdr   ;reload GenAdr @986
442 986+1001737 jmp .991   ;
443 987  ;
444 987 0601422.987:lod GenAdr   ;reload GenAdr
445 987+0061450 and N2bits   ;mask address part
446 988 2000022600000 sto 4/lod 0;fetch item at address @988
447 989   call     ;process it
447+1989 7306371001773 lnk putcode5.lnk:jmp putcode5.ent 
448 990 0601443 lod K5a   ;=5 @990
449 990+1001714 jmp .972   ;handle as a constant reference
450 991  ;
451 991  .991:; 
452 991 0061463 and B2128   ;=0001774000000 <001023:000> @991
453 991+1041755 jz .1005   ; zero ->
454 992 1220024 srl 20   ; shift right @992
455 992+1101756 jmp .1006P   ;->
456 993  ;
457 993  .993:; 
458 993 0541427 cls W791   ;clear 791 @993
459 993+0601452 lod K3   ;=3
460 994   call     ;putcode(3) output relocation id
460+1994 7306371001477 lnk putcode.lnk:jmp putcode.ent 
461 995 0601422.995:lod GenAdr   ; @995
462 995+0061450 and N2bits   ;=0017777
463 996 0401414 sto PCdata   ;save data for putcode @996
464 996+0062253 and B6.13   ;=0017740 mask to see if 5 bits is enough
465 997 1041751 jz .1001   ;yes, use short form @997
466 997+0041461 o02 K1   ;=1+1=>2
467 998 0501427.998:ads W791   ;change opcode +2 @998
468 998+0601423.998P:lod Link9   ;reload instruction
469 999 0061465 and F2mask   ;=<:77 0> @999
470 999+0501414 ads PCdata   ;add to address
471 1000 0601466 lod K19   ;19 bits in total @1000
472 1000+1001717 jmp .975   ;write to ocode stream
473 1001  ; use short form ocode entry (1,3)
474 1001  ;
475 1001 0040000.1001:o02 0   ;=1 @1001
476 1001+0501427 ads W791   ;change opcode by +1
477 1002 0601423.1002:lod Link9   ;get instruction @1002
478 1002+0061465 and F2mask   ;=<:77 0>
479 1003 1220010 srl 8   ; >> 8
480 1003+0501414 ads PCdata   ;add to address (<32)
481 1004 0602231 lod K11   ;6+5 bits @1004
482 1004+1001717 jmp .975   ;and write to ocode stream
483 1005  ;
484 1005  L1005.ent:; 
485 1005 0041461.1005:o02 K1   ;=2 large reloc @1005
486 1005+0401427 sto W791   ;store key for putcode
487 1006 1001743 jmp .995   ; @1006
488 1006+ ;
489 1006+ ; process relocation id
490 1006+ .1006P:; 
491 1006+0401414 sto PCdata   ; @1006+
492 1007 0061464 and K4088   ;=07770 check if 3 bits enough
493 1007+1041741 jz .993   ; zero ->yes, use short ocode
494 1008 0041454 o02 K7   ;=7+1=8 @1008
495 1008+1001776 jmp .1022   ;output 8-bit reloc id
496 1009  ;
497 1009  ; generate No-op reference <00 addr>, address info in Acc
498 1009  ;
499 1009  NopRef.ent:; 
500 1009 0541423.1009:cls Link9   ;make instn <00 0>
501 1009+0401422 sto GenAdr   ;save address info
502 1010 1001771 jmp .sw+6   ;enter PutInst at type 6 @1010
503 1010+ ;
504 1010+0000000 o00 0   ;
505 1011  ;--------------------------------------------------------------------
506 1011  ;
507 1011  =1019 
508 1019  putcode5.ent:; 
509 1019 1041774 jz .1020   ; @1019
510 1019+1101532 jmp putFwd.ent   ;output full-word to ocode
511 1020  ;
512 1020 0601452.1020:lod K3   ;=3 small absolute value @1020
513 1020+0401427 sto W791   ;store key
514 1021 0541414 cls PCdata   ;set data=0
515 1021+1001752 jmp .1002   ;write it
516 1022  ;--------------------------------------------------------------------
517 1022  .1022:call     ; @1022
517+11022 7306371001477 lnk putcode.lnk:jmp putcode.ent 
518 1023 0601466 lod K19   ;set key=19, extra large reloc
519 1023+0401427 sto W791   ;
520 1024 0601422 lod GenAdr   ;load address bits @1024
521 1024+0061450 and N2bits   ;mask to 13 bits
522 1025 0401414 sto PCdata   ;store for putcode
523 1025+1101746 jmp .998P   ;do it
524 1026  ;--------------------------------------------------------------------
525 1026  ; output word of ocode, to tape or core
526 1026  ;
527 1026  L1026::; 
528 1026  ;
529 1026  .ent:; 
530 1026 0201437 exa W799   ; incore? @1026
531 1026+1142066 jz L1077.1078P   ;->yes
532 1027   call     ; output to film?
532+11027 7306151102065 lnk L1077.lnk:jmp L1077.ent 
533 1028   ret     ; @1028
533+11028 0006147000001 o00 L1026.lnk/jmp 1 
534 1029  ;--------------------------------------------------------------------
535 1029  L1029.ent:; 
536 1029 0602160 lod dicpt   ; @1029
537 1029+0124304 sub constptr   ;
538 1030 1122007 jn .1031P   ; @1030
539 1030+0604304 lod constptr   ;
540 1031 1002010 jmp .1032   ;
541 1031+ ;
542 1031+0602160.1031P:lod dicpt   ;
543 1032  ;
544 1032 0122151.1032:sub stkp   ; @1032
545 1032+1042061 jz .1073   ;
546 1033 1220001 srl 1   ;
547 1033+1042061 jz .1073   ;
548 1034 0102151 add stkp   ; @1034
549 1034+0401432 sto Link10a   ;
550 1035 0202151 exa stkp   ;
551 1035+0401433 sto Link10b   ;
552 1036  .1036:; 
553 1036 0006156600000 o00 Link10b/lod 0; @1036
554 1037 0006152400000 o00 Link10a/sto 0;
555 1038 0040000 o02 0   ; @1038
556 1038+0561432 o27 Link10a   ;
557 1039 0761433 o37 Link10b   ;
558 1039+0167525 bus stkbase   ;
559 1040 1022014 jn .1036   ; @1040
560 1040+0041432 o02 Link10a   ;
561 1041 0407525 sto stkbase   ;
562 1041+1002036 jmp .1054   ;
563 1042  ;
564 1042 0041421.1042:o02 W785   ; @1042
565 1042+0167525 bus stkbase   ;
566 1043 1042064 jz .1076   ;
567 1043+0121445 sub K120   ;=120
568 1044 1122025 jn .1045P   ; @1044
569 1044+0041440 o02 K39   ;
570 1045 1002027 jmp .1047   ;
571 1045+ ;
572 1045+ .1045P:; 
573 1045+0101445 add K120   ;=120
574 1046 1220002 srl 2   ; @1046
575 1046+1042064 jz .1076    
576 1047  L1047:; 
577 1047  .1047:; 
578 1047 1010653 jmp L4523    
579 1047+ ;
580 1047+ L1047P:; 
581 1047+ .1047P:; 
582 1047+0401432 sto Link10a   ;
583 1048 0207525 exa stkbase   ; @1048
584 1048+0401433 sto Link10b   ;
585 1049  .1049:; 
586 1049 2206156577777 inc Link10b/lod -1;
587 1050 2206152377777 inc Link10a/sto -1; @1050
588 1051 0601433 lod Link10b   ;
589 1051+0122151 sub stkp   ;
590 1052 1022031 jn .1049   ; @1052
591 1052+0601432 lod Link10a   ;
592 1053 0402151 sto stkp   ;
593 1053+  nop     ;
593+11053+1002036 jmp .1    
593+21054  .1:; 
594 1054  .1054:ret     ; @1054
594+11054 0006147000001 o00 L1026.lnk/jmp 1 
595 1055  ;
596 1055  ;--------------------------------------------------------------------
597 1055  L1055:; 
598 1055  ; initialise paper tape output, first output 40 blanks to ptp
599 1055  ;
600 1055 0601440.1055:lod K39   ;=+39 @1055
601 1055+0421432 stn Link10a   ;
602 1056 1700000.1056:otp 0   ;punch blank tape @1056
603 1056+0641432 lis Link10a   ;count
604 1057 1022040 jn .1056   ;loop back until done
605 1057+ ;
606 1057+0741415 lzs work1   ;set to zero
607 1058 0401432 sto Link10a   ; @1058
608 1058+0741416 lzs PCshift   ;shift count
609 1059 0401433 sto Link10b   ;
610 1059+0044334 o02 W2268   ;
611 1060 0421420 stn PCchk   ; @1060
612 1060+0541425 cls errsw   ;
613 1061 0607532 lod FreeMemPtr   ;
614 1061+0401434 sto Work1   ;
615 1062 0006162600000.1062:o00 Work1/lod 0; @1062
616 1063   call     ;
616+11063 7306371101532 lnk putFwd.lnk:jmp putFwd.ent 
617 1064 0441434 inc Work1   ; @1064
618 1064+0601434 lod Work1   ;
619 1065 0121421 sub W785   ;
620 1065+1022046 jn .1062   ;
621 1066 0601432 lod Link10a   ; @1066
622 1066+0401414 sto PCdata   ;
623 1067 0601433 lod Link10b   ;
624 1067+  nop     ;
624+11067+1002054 jmp .1    
624+21068  .1:; 
625 1068  .1068:call     ; @1068
625+11068 7306371001477 lnk putcode.lnk:jmp putcode.ent 
626 1069 0607522 lod eotflg   ;
627 1069+1102062 jmp .1074P   ;
628 1070  ;
629 1070  L1026::; 
630 1070  ;
631 1070  L1070.ent:; 
632 1070 0601425 lod errsw   ; @1070
633 1070+1142057 jz .1071P   ;
634 1071 1002072 jmp L1077.1082   ;
635 1071+ ;
636 1071+ .1071P:; 
637 1071+0602211 lod K4   ;=4
638 1072  _err49:; 
639 1072 1661044 lnk errlnk   ;error 49: program too large or complex @1072
640 1072+1001070 jmp Error   ;call error routine
641 1073  ;--------------------------------------------------------------------
642 1073  .1073:; 
643 1073 0601476 lod putcode.lnk   ;
644 1073+0407522 sto eotflg   ;
645 1074 1002064 jmp .1076   ; @1074
646 1074+ ;
647 1074+0401476.1074P:sto putcode.lnk   ;
648 1075 0607532 lod FreeMemPtr   ; @1075
649 1075+1102027 jmp .1047P   ;
650 1076  ;
651 1076 0601436.1076:lod W798   ; @1076
652 1076+1042037 jz .1055   ;
653 1077 1002140 jmp .1120   ;
654 1077+ ;
655 1077+ L1077::; 
656 1077+ ;
657 1077+ .ent:; 
658 1077+0201437 exa W799   ; recover word @1077+
659 1078 1002100 jmp WrtFilmWd.ent   ;->write to film @1078
660 1078+ ;--------------------------------------------------------------------
661 1078+0201437.1078P:exa W799   ; recover word
662 1079 2206106377777 inc W785/sto -1; store code word
663 1080 0601421 lod W785   ; get pointer @1080
664 1080+0127525 sub stkbase   ; compare against limit
665 1081 1022036 jn L1026.1054   ; if OK, ->return
666 1081+1002005 jmp L1029.ent    
667 1082  ;--------------------------------------------------------------------
668 1082 0601437.1082:lod W799   ; film switch @1082
669 1082+1042022 jz L1026.1042   ; core output
670 1083 1002060 jmp _err49   ; program too large or complex
671 1083+ ;
672 1083+0000000 o00 0    
673 1084  ;-------------------------------------------------------------------
674 1084  WrtFilmBlk.ent:; 
675 1084  ;
676 1084 0006363742001.1084:o00 W828/o76 1025;prepare to write @1084
677 1085 0036553760000 o00 FreeMemPtr/o77 0; write block
678 1086 1722003 o75 1027   ;read last block address @1086
679 1086+0101475 add W829   ;=4095
680 1087 0401435 sto Work2   ;
681 1087+1002106 jmp .1094   ;
682 1088  ;------------------------------------------------------
683 1088  ; add word to film buffer, if buffer full, write to film
684 1088  ;
685 1088  WrtFilmWd.ent:; 
686 1088 0006162400000 o00 Work1/sto 0;add to buffer @1088
687 1089 0641434 lis Work1   ;increment and get buffer pointer
688 1089+0127532 sub FreeMemPtr   ;buffer base
689 1090 0121460 sub K63   ;=63 @1090
690 1090+1022111 jn .1097   ;not full->
691 1091 0006363742001 o00 W828/o76 1025;prepare to write to film
692 1092 0036553760000 o00 FreeMemPtr/o77 0; write the block @1092
693 1093 0040000 o02 0   ;=1
694 1093+0561435 o27 Work2   ;decrement block number
695 1094  .1094:; 
696 1094 0006363742002 o00 W828/o76 1026;prepare to search @1094
697 1095 0006167760000 o00 Work2/o77 0; do search
698 1096 0607532 lod FreeMemPtr   ;block address @1096
699 1096+0401434 sto Work1   ;store in pointer
700 1097  .1097:; 
701 1097   ret      
701+11097 0006153000001 o00 L1077.lnk/jmp 1 
702 1098  ;--------------------------------
703 1098  .1098:; 
704 1098 1042135 jz .1117   ; @1098
705 1098+ .1098P:; 
706 1098+0601472 lod W826   ;'no han'
707 1099 1714035 otp TP+CR   ;6k+CR
708 1099+1714036 otp TP+LF   ;6k+LF
709 1100   call     ; lnk 795 :jmp 4292 @1100
709+11100 7306155010304 lnk dispwdc.lnk:jmp dispwdc.ent 
710 1101 0601473 lod W826+1   ;'dler '
711 1101+0541020 cls W528   ;indicate continue after KbWait
712 1102   call     ; lnk 795 :jmp 4292 @1102
712+11102 7306155010304 lnk dispwdc.lnk:jmp dispwdc.ent 
713 1103 1661044 lnk errlnk   ;
714 1103+1001056 jmp KbWait   ;call error handler
715 1104 0006363742001 o00 W828/o76 1025;prepare to write @1104
716 1105 0061461 and K1   ; handler not available
717 1105+1042123 jz .1107   ;
718 1106  .1106:; 
719 1106 1002037 jmp L1055   ;initialise paper tape output @1106
720 1106+ ;
721 1106+0000000 o00 0    
722 1107  ;--------------------------------------------------------------------
723 1107  .1107:; 
724 1107 0006363742001 o00 W828/o76 1025;prepare to write
725 1108 0062211 and K4   ;=4 write enable bit @1108
726 1108+1042122 jz .1106   ;not enabled, use ptp
727 1109  L1109:; 
728 1109  .1109:call     ;call 1084
728+11109 7306151002074 lnk WrtFilmBlk.lnk:jmp WrtFilmBlk.ent 
729 1110 1661437 lnk W799   ;set film switch @1110
730 1110+0041460 o02 K63   ;=63
731 1111 0107532 add FreeMemPtr   ;
732 1111+0401433 sto Link10b   ;
733 1112  L1112:; 
734 1112 2206156577777.1112:inc Link10b/lod -1; @1112
735 1113   call     ;
735+11113 7306151002100 lnk WrtFilmWd.lnk:jmp WrtFilmWd.ent 
736 1114 0601433 lod Link10b   ; @1114
737 1114+0121421 sub W785   ;
738 1115 1022130 jn L1112   ;
739 1115+0041460 o02 K63   ;=63
740 1116 0107532 add FreeMemPtr   ; @1116
741 1116+1102027 jmp L1047P   ;
742 1117  ;
743 1117 0006363742001.1117:o00 W828/o76 1025;prepare to write to film
744 1118 0062211 and K4   ;=4, write enabled? @1118
745 1118+1142112 jz .1098P   ;no,
746 1119 1002125 jmp L1109   ;
747 1119+ ;
748 1119+0000000 o00 0   ;
749 1120  ;
750 1120  L1026::; 
751 1120  ;
752 1120 0006363742001.1120:o00 W828/o76 1025;prepare to write to film
753 1121 0061461 and K1   ; handler not available
754 1121+1002112 jmp L1077.1098   ;
755 1122  ;--------------------------------------------------------------------