Kidsgrove Algol Compiler - Brick 00
This assembler listing has hot links for all references to subroutines.
You can click on the routine name in code such as JS.pproc;
and jump to the routine.
When you have seen enough of it, you can use the back button to carry on where you left off.
Started
Loaded 51098 bytes for KAB00.k4
Reached end of file
=============== Second pass
===========================
!begin
/ KAB00 replacement
/ There is documentation at the end of this source file marked by a line of equals signs
/ This module starts the compiler, and forms a permanently resident subroutine
/ for control of I/O -- see documentation at the end
/ Can be entered via OUT 1 with the value of Z38 in N1
Z0 = 11103: / Z11 should be accessed as F.Z0-11
Z50 = Z0-50:
Z38 = Z0-38: / see z38tab label
/ TRACE / D1 TINT;B100
/ TABLES / D2 TINT;B040
/ ORIG-SW / D3 TINT;B020 indicates use of original software for assembly
/ TEXT / D4 TINT;B010
/ NO-OPT / D5 TINT;B004
/ NO-TEST / D6 TINT;B002
/ NO-WARN / D7 TINT;B001
/ L+G / D8 TINT;B200000
/ KALGOL / D9 TINT;B100000
/ WALGOL / D10 TINT;B40000
/ USERCODE / D11 TINT;B20000
/ FORTRAN / D12 TINT;B10000
/ UC/RLB / D13 TINT;B4000
/ KAL4 / D14 TINT;B2000
/ D15 / D15 TINT;B1000
/ D16 / D16 TINT;B400
/ -------------------------------------------------------------------
prog=0: /form B-block
0/0: 200 262 374|000 000 000 J.main; =H0;
1/0: 000 000 000|000 053 140 =H0; =H11104;
2/0: 034 053 102 256 030 220 =#07025502 53414220;
3/0: 102 112 036 173 134 365 =P 0DH--USU;
4/0: 200 321 244|200 321 244 prog=4: JS.crash; JS.crash; /restart
bsz = 256: / defines size of MT blocks - comments assume 512
/ this feature is now obsolete, but retained for compatibility with old format system tape
/ -------------------------------------------------------------------
prog=8:
10/0: 000 000 000 000 001 261 = Q 0/0/chan+6; / pointer to channel 6 for use by brick83()
11/0: 000 000 000 000 000 000 ch4back: = 0; / NZ indicates that channel 4 is backwards
12/0: 000 000 000 000 000 000 ch4end: = 0; / block no at end of channel 4 - set by interchange
13/0: 000 000 000 000 000 000 par1: = 0;
14/0: 000 000 000 000 000 000 resms: = 0; // These are the result most-sig asnd least-sig halves ...
15/0: 000 000 000 000 000 000 resls: = 0; // ... , but also used as flags to cause writes etc
16/0: 000 000 000 000 000 000 w1: =0; / handy working locations analagous to W1 in KAB00
17/0: 000 000 000 000 000 000 channo: =0; / N.B. channel 8 is denoted by 0 in par1 - see R8P1 in KAB01
20/0: 000 000 000 000 000 000 kq14: =0;
21/0: 000 000 000 000 000 000 kq13: =0;
22/0: 377 377 377 377 377 377 = -1; / 32 -ve numbers to stop KAB99 from trying to deallocate == must be word 18
23/0: 377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377
= -1; = -1; = -1; = -1; = -1; = -1; = -1;
32/0: 377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377
= -1; = -1; = -1; = -1; = -1; = -1; = -1; = -1;
42/0: 377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377
= -1; = -1; = -1; = -1; = -1; = -1; = -1; = -1;
52/0: 377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377|377 377 377 377 377 377
= -1; = -1; = -1; = -1; = -1; = -1; = -1; = -1;
62/0: 000 000 000 000 000 000 *mthead: =0; / set NZ to force skip over
/ standard header introduced for first prog on tape - Oct 2020.
diagbuff:
63/0: 000 000 000 000 000 000 = 0; / stream no
64/0: 064 332 263 225 164 000 = #1515526345272000; / *a *a JSE70 *s;
65/0: 000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|001 347 200 377 377 377|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|377 377 377 377 377 377|000 000 000 000 007 135
= 0; = 0; = 0; = #00363600 77777777; = 0; = 0; = 0; =-1; = #3535;
76/0: 000 000 000 063 000 075 out8wd: = Q0/diagbuff/prog-1;
77/0: 001 004 020 101 004 017 = #0020202020202017;
100/0: 040 202 010 040 202 001 = #1010101010101001;
101/0: 251 004 020 101 003 320 linkwd: = #5220202020201720;
102/0: 050 242 212 050 242 212 rad10: = #1212121212121212;
103/0: 002 053 053 001 004 020 blkwd: = #42545300202020;
104/0: 377 377 377 377 344 000 tester: = #77777777 77762000;
/ do not know exactly what occupied the space up to 70
/ seems that these words are never referenced
/ though there is reference to E48 in KAB01 source
// this is OUT70 for for reverse engineering KAB00 JSE70
// bottom 16 bits of N1 (i.e. M part) are function number -- bottom 6 bits are almost always the channel number
// Copy-typed documentation from Science Museum in out70.c
// Main if statement below shows known options, note 121... has two params and seems to be double-buffered open
// C and I parts of N1 are lo and hi addresses of buffer area.
// This is used at location 70 to implement JSE70, after which
// return from JSE70 is via EXIT2, and leaves one result (usually) which is a Q-store word to step through the buffer
// Some functions leave no rsult which is indicated by resls -ve
// EXIT1 is failure exit and appears not to return a value
// There is an additional OUT 70 for diagnostic purposes. which is over and above the original JSE70 provision
// N1 is in Q-store format: Q lo / hi / 0
// and it prints store from lo to hi inclusive.
// N2 is in Q-store format: Q ignored / lab / n
// where lab is the label of the store section, e.g. YX, V, Y, Z, H
// and n is the number within the section at which is starts. (Z-stores number backwards)
!begin
prog=70: / entry to PANACEA
/ start with loading diagnostic info into buffer
106/0: 042|164 101|167 041|300 000 077|300 000 100|066|067|011|301 000 065
DUP; SHL+32; SHC+16; F.out8wd+1; F.out8wd+2; CAB; FRB; OR; S.diagbuff+2;
110/5: 042|164 301|300 000 077|300 000 100|066|067|011|301 000 066 DUP; SHL-32; F.out8wd+1; F.out8wd+2; CAB; FRB; OR; S.diagbuff+3;
113/2: 042|164 041|164 301|300 000 077|300 000 100|066|067|011|301 000 067
DUP; SHL+16; SHL-32; F.out8wd+1; F.out8wd+2; CAB; FRB; OR; S.diagbuff+4;
116/1: 041|033|042|301 000 071|042|301 000 072|301 000 073 ZERO; NOT; DUP; S.diagbuff+6; DUP; S.diagbuff+7; S.diagbuff+8;
120/2: 304 007 236|164 031|164 365|301 000 070 SET#3636; SHL+12; SHL-6; S.diagbuff+5;
122/0: 041|223 300 126 ZERO; JEJ.ej; / might have been JE70
122/4: 052|300 000 100|041|173 000|042|174 000|166 347|012 ERASE; F.out8wd+2; ZERO;; FLINK; DUP; SLINK; SHLD-13; PERM;
124/5: 167 033|067|164 015|011|300 000 101|011 SHC+13; FRB; SHL+6; OR; F.linkwd; OR;
126/3: 301 000 064 ej:S.diagbuff+1; / to print link -- end of diagnostic output prep
127/0: 042|304 000 074|054|304 000 004|015|224 140 265 DUP; SET#74; AND; SET4; NEV; J=Z.usemt; / just do channels 4, 5, 6 and 7
131/0: 042|304 000 077|054|304 000 021|220 020 244 DUP; SET#77; AND; SET17; J=.ch17; / also try channel 17 now
132/5: 041|220 020 163 ZERO; J=.ch0; / the mysterious channel 0
133/3: 304 000 003|015|224 140 265 SET3; NEV; J=Z.usemt; / also try channel 3 now
134/4: 042|304 336 010|015|164 101|220 141 173 DUP; SET#157010; NEV; SHL+32; J=Z.brickch; / brick change
136/2: 042|304 177 374|054|304 000 100|015|224 140 265 DUP; SET#77774; AND; SET#100; NEV; J=Z.usemt; / only used for devices 1 and 2 in KAB99
140/2: 304 000 106|200 220 000 SET70; OUT; / otherwise use OUT 70 - should never happen
141/2: 300 001 274|301 000 004 F.k4; S.4;
142/2: 202 360 001 EXIT.1;
142/5: 017 *; / word align
143/0: 002 374 045 270 000 000 popen: =P *sOPEN *3s;
144/0: 002 073 057 316 120 000 pclose: =P *sCLOSE *2s;
145/0: 003 051 141 220 000 000 pread: =P *sREAD *3s;
146/0: 003 174 251 322 120 000 pwrite: =P *sWRITE *2s;
147/0: 002 233 264 227 040 000 pinter: =P *sINTER *2s;
150/0: 002 070 256 000 000 000 pcbn: =P *sCBN *4s;
151/0: 002 111 166 272 360 000 pdevno: =P *sDEVNO *2s;
152/0: 002 111 166 323 220 000 pdevty: =P *sDEVTY *2s;
153/0: 002 050 143 255 350 300 pbackc: =P *sBACK-C *s;
154/0: 002 050 143 255 351 100 pbacke: =P *sBACK-E *s;
155/0: 003 072 351 300 000 000 pskip: =P *sSKIP *3s;
156/0: 003 014 251 273 100 000 pprint: =P *sPRINT *2s;
157/0: 002 310 236 216 300 000 plbclose: =P *sLB-CL *2s;
160/0: 002 152 156 220 000 000 pfind: =P *sFIND *3s;
161/0: 002 150 151 260 000 000 pfail: =P *sFAIL *3s;
162/0: 000 017 300 377 377 377 fmask: = #00007700 77777777;
163/0: 052 ch0: ERASE; / channel 0 (or 8) system tape
163/1: 042|167 341|170 376 DUP; SHC-16; SQ15;
!begin
164/0: 171 356|301 000 020 FQ14; S.kq14; / preserve Q-stores used
164/5: 151 016 MFRQ0/14; / set channel number to 0
165/1: 171 370|304 337 000|015|205 140 174 FC15; SET#157400; NEV; JNEZ.tryopen;
166/4: 300 000 160|301 000 070 F.pfind; S.diagbuff+5; / FIND -- position channel 0 to read specified item
167/4: 167 041|170 362 SHC+16; SM15; / address of search string
170/2: 100 360|300 000 162|054|301 000 072|110 360|301 000 073 FMM15/0; F.fmask; AND; S.diagbuff+7; FMMN15/0; S.diagbuff+8;
/ don't always print 0702 might upset ee9
172/4: 110 360|100 360|166 255|052 FMMN15/0; FMM15/0; SHLD-42; ERASE;
173/5: 200 321 126 JS.seekch0;
174/2: 201 261 110 J.prtprt; / bit naughty, but avoids overwrite of search string if nest not empty
174/5: 052 tryopen: ERASE; / remove original parameter
175/0: 171 370|304 242 100|015|200 140 202 FC15; SET#121100; NEV; JNEZ.tryread;
176/3: 052 ERASE; / remove second buffer parameter
176/4: 300 000 143|301 000 070 F.popen; S.diagbuff+5;
177/4: 154 017|171 376|301 001 253 CFRQ0/15; FQ15; S.chan;
200/5: 171 364|170 363|200 261 075 FI15; SRM15; J.q15res; / empty buffer so it will call read next
tryread:
202/0: 171 370|304 340 000|015|204 140 211 FC15; SET#160000; NEV; JNEZ.tryclose;
203/3: 300 000 145|301 000 070 F.pread; S.diagbuff+5;
204/3: 300 001 253|170 376 F.chan; SQ15; / N.B. I cannot remember why the device is stored as channel 8
205/2: 300 001 263|164 301|170 370 F.chan+8; SHL-32; SC15; / but I think that it relates to a time when open and close 0 were like other channels
206/3: 124 360|121 360 MFRQ15; PARQ15;
207/1: 300 001 253|164 341|170 363 F.chan; SHL-16; SRM15; / address of buffer
210/2: 304 000 040|170 370 SET32; SC15; / data blocks are always 32 words on channel 0
211/1: 200 261 075 J.q15res;
tryclose: / close only comes after reading library material
211/4: 171 370|304 140 000|015|204 140 214 FC15; SET#060000; NEV; JNEZ.trydvno;
213/1: 300 000 144|301 000 070 F.pclose; S.diagbuff+5;
/ F.chan+8; SQ15; MRWDQ15; / don't rewind the system tape
214/1: 202 261 075 J.nores;
trydvno:
214/4: 171 370|304 000 100|015|201 140 220 FC15; SET#0100; NEV; JNEZ.tryfail;
216/1: 300 000 151|301 000 070 F.pdevno; S.diagbuff+5;
217/1: 300 001 263|202 261 075 F.chan+8; J.nores; / return device for channel 0 -- see comment above
tryfail:
220/1: 171 370|304 000 200|015|203 141 062 FC15; SET#0200; NEV; JNEZ.nokando;
221/4: 300 000 161|301 000 070 F.pfail; S.diagbuff+5;
222/4: 300 000 240|171 362|067 F.radix; FM15; FRB; / failure number
223/4: 304 002 374|042|170 363|041|103 360 SET.buff; DUP; SRM15; ZERO; SMMQ15/0;
225/1: 300 000 161|103 360|170 364 F.pfail; SMMQ15/0; SI15;
226/2: 300 000 241|011|042|101 360 F.chars; OR; DUP; SMM15/0;
227/3: 171 376|304 000 010|200 220 000 FQ15; SET8; OUT;
230/5: 033|027|033|027|101 360 NOT; NEG; NOT; NEG; SMM15/0;
231/5: 304 000 030|301 002 374 SET#30; S.buff;
232/5: 171 376|304 000 010|200 220 000 FQ15; SET8; OUT;
234/1: 202 321 075|136 010|056 JS.nores; MRWDQ0; +; / so that exit.1 comes back here
235/1: 304 014 055 SET#6055; / call brick PM
235/4: 170 364|304 336 010|170 362 SI15; SET#157010; SM15;
236/5: 171 376|200 260 106 FQ15; J.70;
/// F.pmid+1; F.pmid; SET1; OUT;
237/4: 017|017|050 242 212 004 242 201 *radix: = #1212121201121201;
241/0: 001 004 020 075 004 000 chars: = #0020202017202000;
242/0: 034 053 102 256 030 260 pmid: = #0702550253414260;
243/0: 265 347 236 171 347 236 = #5536363636363636;
!end
244/0: 052 ch17: ERASE; / operation on ABS printer -- channel 17
!begin
244/1: 171 356|301 000 020 FQ14; S.kq14; / preserve Q-stores used
245/0: 171 336|301 000 021 FQ13; S.kq13;
245/5: 167 341|170 376 SHC-16; SQ15; / Shifted parameter word to Q15 so that I15 and M15 are lo and hi
tryprint:
246/3: 171 370|304 270 321|015|201 140 256 FC15; SET#134321; NEV; JNEZ.tryopen;
250/0: 300 000 156|301 000 070 F.pprint; S.diagbuff+5;
251/0: 171 362|171 364|042|170 343|036 FM15; FI15; DUP; SRM14; -;
/ NOT; NEG; / there is doubt as to whether we need this
252/2: 170 350 SC14; / see http://kdf9.settle.dtdns.net/KDF9/Blythe2/p46.jpg
252/4: 204 321 301 JS.abstolp;
253/1: 304 000 003|170 342|041|033|301 000 014 SET3; SM14; ZERO; NOT; S.resms;
254/5: 300 000 021|170 336 F.kq13; SQ13;
255/4: 200 261 064 J.windup;
tryopen:
256/1: 171 370|304 375 377|054 FC15; SET#176777; AND;
257/1: 304 240 021|015|205 140 264 SET#120021; NEV; JNEZ.notyetimp; / test for open chan 17
260/2: 300 000 143|304 014 000|011|301 000 070 F.popen; SET#6000; OR; S.diagbuff+5;
262/0: 171 370|167 355 FC15; SHC-10; / -ve if single buffered
262/4: 304 002 374|200 321 275 SET.opbuff; JS.startlp; / set printer buffer pointers
263/4: 201 041 110 JGEZ.prtprt; / J if single buffered
264/1: 052|201 261 110 ERASE; J.prtprt; / remove extra buffer parameter
notyetimp:
264/5: 200 321 244|136 010 JS.crash; MRWDQ0;
!end
usemt: // version using channels on emulated MT rather than OUT 70
265/4: 171 356|301 000 020 FQ14; S.kq14;
266/3: 041|301 000 014|041|301 000 015 ZERO; S.resms; ZERO; S.resls;
267/5: 042|304 000 037|054|170 342 DUP; SET#37; AND; SM14; / channel number
271/0: 042|301 000 016|167 341|170 376|171 370|301 000 013 DUP; S.w1; SHC-16; SQ15; FC15; S.par1;
/ test for WRITE
273/1: 171 370|304 376 001|054|304 340 001|015 FC15; SET#0177001; AND; SET#0160001; NEV; / write to channel -- odd numbered channel
274/5: 201 140 317|300 000 146|301 000 070 JNEZ.notwrite; F.pwrite; S.diagbuff+5;
276/2: 202 320 300 JS.mtwrite;
276/5: 304 377 375|301 000 014|200 261 064 SET-3; S.resms; J.windup;
mtwrite: / subroutne to set block size (only needed on channel 5) and write to MT
300/2: 171 370|304 000 100|054|200 140 303 FC15; SET#100; AND; JNEZ.partblk;
301/5: 300 341 253|033|027|170 362 FM14.chan; NOT; NEG; SM15; / set HWM to the top
partblk:
wrclose: / subroutne to deal with final block
303/0: 171 342|304 000 005|015|202 140 313 FM14; SET5; NEV; JNEZ.notw5;
304/3: 171 362|042|300 341 253|164 341|170 362|171 362 FM15; DUP; FM14.chan; SHL-16; SM15; FM15; / N1 start of block, N2 end of data M15 = N1
306/3: 036|027|033|101 360 -; NEG; NOT; SMM15/0; / no of useful words in block
/ did we actually need to clear down the end of the block
307/2: 042|170 363|300 341 253|033|027|065|036|170 370 DUP; SRM15; FM14.chan; NOT; NEG; REV; -; SC15; / Perhaps we should
311/2: 242 360 313 JCZ15.nofill;
311/5: 017|041|103 360|017|017|017|177 360 *ZERO; SMMQ15/0; *JCNZS15; / short loop not really an economy on emulation
nofill:
notw5:
313/2: 300 341 253|170 376|244 360 316 FM14.chan; SQ15; JCZ15.xh; / C15 will be zero for channel 3
314/4: 130 360|121 360 MWQ15; PARQ15;
315/2: 300 341 264|033|027|301 341 264 FM14.cbn; NOT; NEG; SM14.cbn;
316/4: 200 360 000 xh: EXITH;
notwrite: / test for READ
317/1: 171 370|304 376 001|054|304 340 000|015 FC15; SET#0177001; AND; SET#0160000; NEV; / read from channel -- even numbered channel
320/5: 202 140 334|300 000 145|301 000 070 JNEZ.notread; F.pread; S.diagbuff+5;
322/2: 300 341 253|170 376 FM14.chan; SQ15;
323/1: 171 342|300 000 011|015|221 140 330 FM14; F.ch4back; NEV; J=Z.backread;
324/4: 124 360|121 360 MFRQ15; PARQ15;
325/2: 300 341 264|033|027|301 341 264 FM14.cbn; NOT; NEG; SM14.cbn;
326/4: 304 377 376|301 000 014|200 261 064 SET-2; S.resms; J.windup;
backread: / backwards read only on channel 4
330/1: 126 360|121 360 MBRQ15; PARQ15;
/ SET#7171; FQ15; SHLD+16; SET70; OUT; / diagnostic commented out
330/5: 300 341 264|027|033|301 341 264 FM14.cbn; NEG; NOT; SM14.cbn;
332/1: 100 360|042|170 370|027|172 362|144 360 FMM15/0; DUP; SC15; NEG; S+M15; IONE15; / scan data word is result
333/5: 200 261 075 J.q15res;;
notread: / test for INITIATE (= OPEN)
334/2: 171 370|304 374 000|054|304 240 000|015 FC15; SET#0176000; AND; SET#0120000; NEV; / (par1&0176000) == 0120000 initiate channel
336/0: 204 140 373|300 000 143|301 000 070 JNEZ.notopen; F.popen; S.diagbuff+5;
337/3: 171 370|167 355|205 040 340|052 FC15; SHC-10; JGEZ.prog+0s4; ERASE; / remove unwanted param for double I/O
340/5: 300 341 253|041|166 041|170 370|261 360 344 FM14.chan; ZERO; SHLD+16; SC15; JCNZ15.mtok;/ check if tape already claimed
342/4: 041|304 000 004|200 220 000|170 370 ZERO; SET4; OUT; SC15; / claim a new work tape
// SET#50; FM14; / SET3; J=.notyetimp;
// +; SHL+16; SET.chan; DUP; SHL+16; OR; SET8; +; SHL+16; SET70; OUT;
mtok:
344/1: 171 376|301 341 253 FQ15; SM14.chan; / set up channel control word
345/0: 220 140 346|200 321 244 J=Z.prog+1; JS.crash; / illegal if channel already open
346/0: 300 000 013|304 360 200|054|304 240 200|015|202 140 361 F.par1; SET#0170200; AND; SET#0120200; NEV; JNEZ.fwd; / J if not backwards
350/2: 304 000 004|301 000 011 SET4; S.ch4back; / indicates backwards reading on ch 4
/ if ( par1 == 0121204 ) // backwards read from current position on channel 4
351/2: 300 000 013|304 242 204|015|203 140 354 F.par1; SET#0121204; NEV; JNEZ.tryend; / J if not chan 4 backwards from current
353/0: 300 000 153|301 000 070 F.pbackc; S.diagbuff+5;
354/0: 200 261 075 J.q15res;
tryend:
/ if ( par1 == 0121704 ) // backwards read from end on channel 4
354/3: 300 000 013|304 243 304|015|203 141 062 F.par1; SET#0121704; NEV; JNEZ.nokando; / J if not chan 4 backwards
356/1: 300 000 154|301 000 070 F.pbacke; S.diagbuff+5;
357/1: 300 000 012|300 341 264|015 F.ch4end; FM14.cbn; NEV;
360/2: 223 140 372 J=Z.currr; / not yet implemented if not already at at end
360/5: 203 261 062 J.nokando;
fwd: / sprintf(sbuff, "Open channel %d (double)", chan);
361/2: 041|033|301 000 014 ZERO; NOT; S.resms;
362/1: 171 342|304 000 021|015|222 141 075 FM14; SET17; NEV; J=Z.nores; / J if channel 17 - no result
363/4: 300 000 013|304 000 101|054|027|033|222 140 371 F.par1; SET#101; AND; NEG; NOT; J=Z.curr; / J if current position
365/4: 041|301 341 264 ZERO; SM14.cbn; / number of block behind tape head
366/2: 136 370 MRWDQ15;
366/4: 152 376|304 000 002|170 364|304 000 001|170 362 IFRQ15/14; SET2; SI15; SET1; SM15; / needs block size in increment for DH's tape emulation
370/4: 134 360|121 360 MFSKQ15; PARQ15; / skip label block
371/2: 171 342|167 377|220 041 064 curr: FM14; SHC-1; JLTZ.windup; / same as for write on a write channel
372/3: 171 364|170 363|200 261 075 currr: FI15; SRM15; J.q15res; / deliver 0 in C result to indicate empty buffer on read
notopen: / test for CLOSE READ
373/4: 171 370|304 376 001|054|304 140 000|015 FC15; SET#0177001; AND; SET#0060000; NEV; / ( (par1&0177000) == 0060000 ) // close read channel
375/2: 201 141 003|300 000 144|301 000 070 JNEZ.notrclose; F.pclose; S.diagbuff+5;
376/5: 300 341 253|164 301|167 341|301 341 253 FM14.chan; SHL-32; SHC-16; SM14.chan;
400/3: 171 342|304 000 004|015|202 141 075 FM14; SET4; NEV; JNEZ.nores;
402/0: 041|301 000 011|202 261 075 ZERO; S.ch4back; J.nores; / ensure that the next open is not backwards by accident
notrclose: / test for CLOSE WRITE
403/1: 171 370|304 376 001|054|304 140 001|015 FC15; SET#0177001; AND; SET#0060001; NEV; / ( (par1&0177000) == 0060000 ) // close write channel
404/5: 204 141 015|300 000 144|301 000 070 JNEZ.notclose; F.pclose; S.diagbuff+5;
406/2: 171 342|304 000 003|015|205 141 010 FM14; SET3; NEV; JNEZ.notlp; / j if not printer
407/5: 201 321 277|203 261 013 JS.closelp; J.donotwrite;
notlp:
410/5: 300 341 253|164 341|171 362|015 FM14.chan; SHL-16; FM15; NEV; / test for empty buffer
412/1: 164 101|223 141 013 SHL+32; J=Z.donotwrite; / test to see if no data currently in buffer
413/0: 200 320 303 JS.wrclose; / write final block
donotwrite:
413/3: 300 341 253|167 041|164 101|301 341 253|202 261 075 FM14.chan; SHC+16; SHL+32; SM14.chan; J.nores; / mark channel as closed
notclose: / test for INTERCHANGE
415/4: 171 370|304 377 370|054|042|304 010 000|015 FC15; SET#0177770; AND; DUP; SET#04000; NEV; / ( (par1&0177770) == 04000 // interchange sussed out from the code
417/3: 222 141 021 J=Z.interch;
420/0: 304 344 000|015 SET#0162000; NEV; / (par1&0177770) == 0162000 ) // interchange according to the PANACEA documentation
420/4: 203 141 031|041 JNEZ.notintch; ZERO;
421/2: 052|300 000 147|301 000 070 interch: ERASE; F.pinter; S.diagbuff+5;
422/3: 300 341 253|300 341 254|301 341 253|301 341 254 FM14.chan; FM14.chan+1; SM14.chan; SM14.chan+1;
424/3: 300 341 264|300 341 265|301 341 264|301 341 265 FM14.cbn; FM14.cbn+1; SM14.cbn; SM14.cbn+1;
426/3: 171 342|304 000 004|015|202 141 075 FM14; SET4; NEV; JNEZ.nores;
430/0: 300 341 264|301 000 012 FM14.cbn; S.ch4end; / remember end of channel 4
431/0: 202 261 075 J.nores;
notintch: / test for DEVICENO (undocumented)
431/3: 171 370|304 377 300|054|304 000 100|015 FC15; SET#0177700; AND; SET#0100; NEV; / ( (par1&0177700) == 0100 )
433/1: 204 141 035|300 000 151|301 000 070 JNEZ.notdevno; F.pdevno; S.diagbuff+5; / undocumented, but it seems that it delivers MT unit number in D0-15
434/4: 300 341 253|202 261 075 FM14.chan; J.nores;
notdevno: / test for CBN current block number
435/4: 171 370|304 377 370|054|304 110 000|015 FC15; SET#0177770; AND; SET#044000; NEV; / ( (par1&0177770) == 044000 ) // current block number ???
437/2: 205 141 041|300 000 150|301 000 070 JNEZ.notcbn; F.pcbn; S.diagbuff+5;
440/5: 300 341 264|202 261 075 FM14.cbn; J.nores;
notcbn: / test for SKIP on channel 4
441/5: 171 370|304 152 004|015|200 141 054 FC15; SET#065004; NEV; JNEZ.try303; / skip to absolute block no on channel 4
443/2: 300 000 155|301 000 070 F.pskip; S.diagbuff+5;
444/2: 171 362|027|033 FM15; NEG; NOT; / CBN is no of block just read
445/0: 300 341 253|170 376|304 001 000|170 364 FM14.chan; SQ15; SET256; SI15; / block size in I15 -- kludge for DH's emulator
446/4: 042|300 341 264|065|301 341 264 DUP; FM14.cbn; REV; SM14.cbn; / set new position
450/0: 036|042|170 362|042|224 041 052 -; DUP; SM15; DUP; JLTZ.bsk; / J if not forward
451/2: 222 141 075 J=Z.nores; / do nothing if we are already in the right place
451/5: 134 360|202 261 075 MFSKQ15; J.nores;
452/4: 027|170 362|136 360|202 261 075 bsk: NEG; SM15; MBSKQ15; J.nores;
try303: / test for request to know device type for channel 3
454/0: 171 370|304 000 303|015|203 141 057 FC15; SET#0303; NEV; JNEZ.try61407;
455/3: 300 000 152|301 000 070 F.pdevty; S.diagbuff+5;
456/3: 304 000 001|202 261 075 SET1; J.nores; / channel 3 is always on the printer
try61407: / write last block and close channel 7 only in KAB99
457/3: 171 370|304 143 007|015|203 141 062 FC15; SET#61407; NEV; JNEZ.nokando;
461/0: 300 000 157|301 000 070 F.plbclose; S.diagbuff+5;
462/0: 203 261 013 J.donotwrite; / this is only used at the very end and is basically ignored
/ things not yet implemented
462/3: 202 321 075|136 010|056|200 360 000 nokando: JS.nores; MRWDQ0; +; EXITH; / print diagnostics and return failure
windup: / deliver result, etc
464/0: 300 000 015|033|300 000 014|054|202 041 075 F.resls; NOT; F.resms; AND; JGEZ.nores;
465/5: 300 341 253|042|167 341|042|170 363 FM14.chan; DUP; SHC-16; DUP; SRM15;
467/2: 036|033|027|170 370 -; NOT;NEG; SC15; / only works for chan 6 and 7
470/1: 171 342|304 000 005|015|205 141 072 FM14; SET5; NEV; JNEZ.notch5;
471/4: 140 360|143 360|200 261 075 M+I15; DC15; J.q15res; / space for block size word
notch5:
472/5: 171 342|304 000 004|015|200 141 075 FM14; SET4; NEV; JNEZ.q15res; / not channel 4
474/2: 102 360|170 370 FMMQ15/0; SC15; / pick size word from start of block
q15res:
475/0: 171 376 FQ15;
475/2: 300 000 070 nores: F.diagbuff+5; / exit leaving no result
475/5: 171 342|011|304 000 020|011 FM14; OR; SET#20; OR; / path for failure exit
477/0: 301 000 070 S.diagbuff+5; / channel no in diagnostic
/ diagnostic
477/3: 221 241 110 JEN.prtprt;
500/0: 042|164 301|300 000 077|300 000 100|066|067|011|301 000 071 DUP; SHL-32; F.out8wd+1; F.out8wd+2; CAB; FRB; OR; S.diagbuff+6;
502/3: 042|164 041|164 301|300 000 077|300 000 100|066|067|011|301 000 072
DUP; SHL+16; SHL-32; F.out8wd+1; F.out8wd+2; CAB; FRB; OR; S.diagbuff+7;
505/2: 042|167 341|164 301|300 000 077|300 000 100|066|067|011|301 000 073
DUP; SHC-16; SHL-32; F.out8wd+1; F.out8wd+2; CAB; FRB; OR; S.diagbuff+8;
prtprt:
510/1: 320 013 071|164 003|204 041 124 F.Z38; SHL+1; JGEZ.nodiag0; / jump past the ERASE
511/3: 300 000 102|300 341 264|067|300 000 103|011|301 000 074 F.rad10; FM14.cbn; FRB; F.blkwd; OR; S.diagbuff+9; / print block number
513/5: 300 341 253|164 025|164 255|304 360 020|011|301 000 075 FM14.chan; SHL+10; SHL-42; SET#170020; OR; S.diagbuff+10;
516/1: 300 000 070|164 365|164 015|300 000 145|223 021 124 F.diagbuff+5; SHL-6; SHL+6; F.pread; J=.nodiag;
520/2: 300 000 146|223 021 124 F.pwrite; J=.nodiag;
521/2: 300 000 156|223 021 124 F.pprint; J=.nodiag;
522/2: 041|301 000 063|300 000 076|304 000 010|200 220 000 ZERO; S.diagbuff; F.out8wd; SET8; OUT;
524/3: 052 nodiag: ERASE;
524/4: 300 000 020|170 356 nodiag0: F.kq14; SQ14; / exit after restoring Q14
525/3: 202 360 001 EXIT.1;
!end
seekch0:
/ The system tape is mostly (always?) left positioned before an 8-word B-block format block
/ This routine looks to see if required item is next, and if not rewinds
!begin !label seek;
526/0: 301 001 171 S.seek;
/ F.seek; SHL+18; S.buff+1; F.out8; SET2; -;
/ SET8; OUT;
526/3: 300 001 263|170 356 F.chan+8; SQ14; / access channel 0
527/2: 304 002 374|170 344 SET.buff; SI14;
530/1: 304 000 007|170 342|140 340 SET7; SM14; M+I14;
531/2: 124 340|121 340 MFRQ14; PARQ14; / read immediate block -- assumed to be a b-BLOCK
532/0: 300 002 377|300 002 376|166 255|052 F.buff+3; F.buff+2; SHLD-42; ERASE;
533/3: 300 001 171|224 021 162|052 F.seek; J=.qfound; ERASE;
534/4: 157 357|136 370 QFRQ14/15; MRWDQ15; / not next file - so rewind -- may need +ve modifier
535/2: 304 000 002|170 364|304 000 001|170 362 SET2; SI15; SET1; SM15;
537/0: 134 360|121 360 MFSKQ15; PARQ15; / skip the label block
537/4: 300 000 062|220 141 142 F.mthead; J=Z.loop; / J if not standard header for first program
540/4: 134 360|121 360 MFSKQ15; PARQ15; / skip the last block marker
541/2: 134 360|121 360 MFSKQ15; PARQ15; / skip the KAB00 A-block
loop:
542/0: 304 000 007|170 342|140 340 SET7; SM14; M+I14;
543/1: 124 340|121 340 MFRQ14; PARQ14; / read b-BLOCK
543/5: 300 002 377|300 002 376|166 255|052 F.buff+3; F.buff+2; SHLD-42; ERASE;
545/2: 300 003 003|170 376 F.buff+7; SQ15; / filler word
546/1: 300 001 171|223 021 163 F.seek; J=.found;
547/1: 300 001 172|015|221 141 164 F.kab99; NEV; J=Z.notfound;
550/2: 245 361 156 JCZ15.final; / fragmented C-block C15 = no of 512 frags
550/5: 304 001 000 SET.bsz; / block size for fragmented C-blocks
551/2: 171 364|205 141 152 FI15; JNEZ.bin; / J if not text file in 32-word blocks
552/1: 052|304 000 040 ERASE; SET32;
552/5: 042|171 370|034|050 bin: DUP; FC15; MULTD; CONT;
553/4: 172 364|171 376 S+I15; FQ15; / N1 = final block "filler"
554/2: 065|170 364 REV; SI15; / block size in I15 for DH's crude MT emulation
554/5: 171 370|170 362 FC15; SM15; / M15 = no of 512 word fragments
555/3: 154 357|134 360|121 360 CFRQ14/15; MFSKQ15; PARQ15; / skip n 512 word fragments
556/3: 170 376 SQ15; / final block "filler"
final: / skip final C-block segment
556/5: 171 362|171 364|036|033|027 FM15; FI15; -; NOT; NEG; / block size
560/0: 170 364 SI15; / needed for Holdsworth emulator
560/2: 304 000 001|170 362|154 357 SET1; SM15; CFRQ14/15; / block count
561/3: 134 360|121 360 MFSKQ15; PARQ15; / skip C-block or final fragment
562/1: 200 261 142 J.loop;
qfound: / quickly found - next file on tape
562/4: 300 003 003|170 376 F.buff+7; SQ15; / filler word
563/3: 052|200 360 000 found: ERASE; EXITH;
notfound:
564/1: 041|301 000 063|300 000 076|304 000 010|200 220 000 ZERO; S.diagbuff; F.out8wd; SET8; OUT; / diagnostic output -- temp??
566/2: 304 000 144|164 041|304 000 200|011 SET100; SHL+16; SET#200; OR;
567/5: 200 320 106 JS.70;
570/2: 017|017|017|017|000 000 000 000 000 000 *seek: =0; / brick sought
572/0: 012 320 253 206 046 131 kab99: = P *c M *c KAB99;
!end
brickch:
!begin
573/0: 171 356|301 000 020 FQ14; S.kq14; / preserve Q-stores used -- do we need to on brick change?
573/5: 164 041|164 301 SHL+16; SHL-32; / brick number in chars
574/3: 300 001 227|011 F.kab; OR;
575/1: 042|304 000 007|166 125|301 000 002 DUP; SET7; SHLD+42; S.2; / first word of program ID
576/4: 300 000 003|164 015|164 365|011|301 000 003 F.3; SHL+6; SHL-6; OR; S.3;/ second word of program ID
600/3: 200 321 126 JS.seekch0;
!begin / routine to load binary prog
601/0: 244 361 205 JCZ15.final; / J if C-block not fragmented
601/3: 152 376 IFRQ15/14;
601/5: 304 000 377|170 342|140 340 loop: SET.bsz-1; SM14; M+I14; / 512 word transfer
603/0: 124 340|121 340 MFRQ14; PARQ14; / read 512 word fragment of C-block
603/4: 304 001 000|172 344|143 360 SET.bsz; S+I14; DC15; / move up 512 words
604/5: 265 361 201 JCNZ15.loop;
605/2: 152 357 IFRQ14/15; / start of final transfer
final:
605/4: 154 357 CFRQ14/15;
606/0: 124 360|121 360 MFRQ15; PARQ15; / read C-block (or final fragment)
/ MRWDQ15; / leave tape in position - no longer crude search from start of tape
/ now compute check
606/4: 300 003 003|170 376 F.buff+7; SQ15; / filler word
607/3: 171 362|171 364|036 FM15; FI15; -;
610/2: 145 360|102 360 IMONE15; FMMQ15/0;
611/0: 065|170 370 REV; SC15;
611/3: 102 360|015|263 361 211 chs: FMMQ15/0; NEV; JCNZ15.chs;
612/3: 042|164 061|015 DUP; SHL+24; NEV;
613/1: 300 001 231|042|164 377|066|164 321 F.radix; DUP; SHL-1; CAB; SHL-24; / 24-bit NEV check
614/4: 067|011|301 002 377 FRB; OR; S.buff+3;
615/3: 222 241 216 JEN.nofloat; / diagnostic to spot floaters
616/0: 143 360 DC15; / MRWDQ0; / Crash if first / removed
nofloat:
616/2: 300 001 230|171 370|056|301 002 375 F.brick; FC15; +; S.buff+1; / change K to J if nest not empty
617/5: 300 001 171|164 045|164 351|301 002 376 F.seek; SHL+18; SHL-12; S.buff+2;
621/3: 300 002 374|041|301 002 374 F.buff; ZERO; S.buff;
622/4: 300 001 226|304 000 010|200 220 000 F.out8; SET8; OUT;
624/1: 301 002 374 S.buff; / restore initial jump
!end
624/4: 300 000 020|170 356 F.kq14; SQ14; / reinstate Q14 -- do we need to?
/ SET3; SHL+14; F.Z0-10; OR; S.Z0-10; / hope to print level params and call matrix
/ suppressed, but may reappear in a more sophisticated form
625/3: 200 262 374 J.buff; / enter brick
626/0: 000 000 002 374 002 377 *out8: = Q 0/buff/buff+3;
627/0: 012 320 253 206 040 000 kab: = P *c M *c KAB *2s;
630/0: 002 054 251 216 260 000 brick: = P *s BRICK *2s ;
631/0: 101 004 020 101 004 020 radix: = #2020202020202020;
!end
/ -------------------------------------------------------------------
n1print:
/ prints a string embedded in code followed by bottom bits of n1
/ call sequence must be *JS.cwprint; *= #30; =P 8 chars; =0;
!begin
632/0: 173 000|033|027|042|170 363|140 360|304 000 030|101 360|140 360|042|170 364|174 000
FLINK; NOT; NEG; DUP; SRM15; M+I15; SET#30; SMM15/0; M+I15; DUP; SI15; SLINK;
635/3: 300 001 242|065|067|300 001 243|011|101 360 F.radix; REV; FRB; F.digits; OR; SMM15/0;
637/2: 171 376|304 000 010|200 220 000|202 360 003 FQ15; SET8; OUT; EXIT.3;
641/1: 017|017|017|017|017|040 202 001 020 202 001 *radix: =#1010100104101001;
643/0: 101 004 000 101 004 002 digits: =#2020200020202002;
!end
/ -------------------------------------------------------------------
crash:
/ // disaster
644/0: 041 ZERO;
644/1: 017|017|017|017|017|200 321 232|017|017|017|000 000 000 000 000 030
*JS.n1print; *=#30;
647/0: 171 350 362 207 072 000|000 000 000 000 000 000 =P --crash*s; =0;
651/0: 300 000 076|304 000 010|200 220 000 F.out8wd; SET8; OUT;
652/3: 136 010 MRWDQ0;
/ -------------------------------------------------------------------
/ I/O words for channels 0 to 8 ( 8 is brick changer )
652/5: 017|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 001 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000
*chan: =0; =0; =0; =Q1/0/0; =0; =0; =0; =0; =0; / channel transfer words Q dv/lo/hi chan 0 to 8
664/0: 000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000|000 000 000 000 000 000
*cbn: =0; =0; =0; =0; =0; =0; =0; =0; / channel block position -- newer more than chan 7
674/0: 000 000 000 000 000 000 *k4: =0; / location to keep restart word
/ ABS to printer chars, akin to abstoascii in out70.c
!begin !label abstolp, startlp, closelp; / N1 is address of output buffer, Q14 scans the input data
startlp:
675/0: 042|170 363|170 364|171 376|301 001 353|200 360 000 DUP; SRM15; SI15; FQ15; S.lpbuf; EXITH;
closelp:
677/1: 300 001 353|033|027|170 376 F.lpbuf; NOT; NEG; SQ15; / Q15 has I and M correct for output
700/2: 304 377 302|101 360 SET#177702; SMM15/0; / extra newline to make sure there is no junk left in the buffer
701/1: 205 261 333 J.prt;
abstolp: / Q14 scans the current input words from JSE70 call
701/4: 300 001 353|042|170 363 F.lpbuf; DUP; SRM15; / M15 address of the current output word
702/4: 170 336 SQ13; / also remembered in I13 to reset buffer after newline
/ C15 is the shift used to insert the most recent output character
703/0: 304 377 320|170 330 SET-48; SC13; / C13 is the shift used to extract the current ABS
/ start main loop
703/5: 100 340 mlp: FMM14/0;
704/1: 304 000 010|172 330 mlp2: SET8; S+C13; / increment input pointer
705/0: 164 320|033|027 SHLC13; NOT; NEG; / next ABS+1 in D40-47
705/4: 304 000 377|054|304 000 241|223 021 337 SET#377; AND; SET#241; J=.nl;/ print line if newline
707/2: 042|170 322|220 141 325 DUP; SM13; J=Z.mlp3; / J if dummy char, avoid printing 077 so as not to overflow line
710/2: 300 321 353 FM13.chtab-1; / pick up printer representation
710/5: 042|164 255|224 141 321 DUP; SHL-42; J=Z.onech; / j if single char symbol
711/5: 042|304 000 077|054|201 141 350 DUP; SET#77; AND; JNEZ.proc; / bottom char set if special symbol, i.e. proc
713/1: 304 000 007|166 125 SET7; SHLD+42; / strop char on front
714/0: 260 361 315 clp: JCNZ15.nfull; / come here to continue with a compound symbol
714/3: 201 321 341 JS.nwd; / initialise next output word
715/0: 042|164 255 nfull:DUP; SHL-42; / one char in N1 OR ZERO if end of symbol -- why can this be zero?
715/3: 304 377 372|172 370|164 360|100 360|011|101 360 SET-6; S+C15; SHLC15; FMM15/0; OR; SMM15/0;
717/3: 166 015|042|200 141 314 SHLD+6; DUP; JNEZ.clp; / loop until all characters sent
720/3: 052|052|304 000 007|167 351 ERASE; ERASE; SET7; SHC-12; / end of sym, put in last quote
721/4: 164 271 onech:SHL-36; / ABS represented by a single KDF9 char
722/0: 260 361 323 JCNZ15.nf2; / J if current output not full
722/3: 201 321 341 JS.nwd; / initialise next output word
723/0: 304 377 372|172 370|164 360|100 360|011|101 360 nf2: SET-6; S+C15; SHLC15; FMM15/0; OR; SMM15/0;
725/0: 265 321 303|304 377 320|170 330 mlp3: JCNZ13.mlp; SET-48; SC13;
726/2: 112 340|261 341 304 FMMQN14/0; JCNZ14.mlp2; / next word of ABSs - test for end
727/1: 052 ERASE; / discard overflow word
727/2: 171 324|171 362|027|033|015 FI13; FM15; NEG; NOT; NEV; / zero if last output was new line
730/3: 220 141 337 JEQZ.xit; / J if last char sent was new line
nlprt: / pad with dummies and print new line
731/0: 041|033|164 360|033|100 360|011|101 360 ZERO; NOT; SHLC15; NOT; FMM15/0; OR; SMM15/0; / pad with dummies
732/4: 304 377 302|113 360 SET#177702; SMMQN15/0; / bit inefficient if C15 is non-zero
733/3: 152 337 IFRQ13/15; / and now print
733/5: 154 017 prt: CFRQ0/15; / not sure we actually need this
734/1: 171 376|151 017|140 360|304 000 030|101 360 FQ15; MFRQ0/15; M+I15; SET#30; SMM15/0;
736/0: 304 000 010|200 220 000 SET8; OUT;
737/0: 200 360 000 xit: EXITH;
737/3: 052|200 321 331 nl: ERASE; JS.nlprt;
740/1: 205 321 344|200 261 325 JS.nbuf; J.mlp3; / keep going after the newline
nwd: / subroutine to initialise next word of output, but checking for 120 chars
741/1: 171 362|171 324|036|304 000 017|036|222 041 346 FM15; FI13; -; SET15; -; JLTZ.cont; / continue on same line
743/1: 304 377 302|113 360 SET#177702; SMMQN15/0;
744/0: 152 337|205 321 333 IFRQ13/15; JS.prt; / print line
744/5: 171 324|170 363 nbuf: FI13; SRM15; / back to start of buffer
745/3: 304 000 030|101 360 SET#30; SMM15/0; / reset OUT8 stream no as it is overwritten by director
746/2: 041|113 360 cont: ZERO; SMMQN15/0; / initialise next output word
746/5: 304 000 060|170 370 SET48; SC15;
747/4: 200 360 000 EXITH;
750/1: 304 014 245|167 351|065|304 000 007|166 365|052|200 261 314 proc: SET#6245; SHC-12; REV; SET7; SHLD-6; ERASE; J.clp;
752/4: 017|017|000 000 000 000 000 000 *lpbuf: =0; / preserves pointer between calls
*chtab:
754/0: 001 000 000 000 000 000 = #0020000000000000; / 000 = 0
755/0: 001 020 000 000 000 000 = #0021000000000000; / 001 = 1
756/0: 001 040 000 000 000 000 = #0022000000000000; / 002 = 2
757/0: 001 060 000 000 000 000 = #0023000000000000; / 003 = 3
760/0: 001 100 000 000 000 000 = #0024000000000000; / 004 = 4
761/0: 001 120 000 000 000 000 = #0025000000000000; / 005 = 5
762/0: 001 140 000 000 000 000 = #0026000000000000; / 006 = 6
763/0: 001 160 000 000 000 000 = #0027000000000000; / 007 = 7
764/0: 001 200 000 000 000 000 = #0030000000000000; / 010 = 8
765/0: 001 220 000 000 000 000 = #0031000000000000; / 011 = 9
766/0: 003 360 000 000 000 000 = #0077000000000000; / 012 = @
767/0: 001 360 000 000 000 000 = #0037000000000000; / 013 = .
770/0: 002 020 000 000 000 000 = #0041000000000000; / 014 = A
771/0: 002 040 000 000 000 000 = #0042000000000000; / 015 = B
772/0: 002 060 000 000 000 000 = #0043000000000000; / 016 = C
773/0: 002 100 000 000 000 000 = #0044000000000000; / 017 = D
774/0: 002 120 000 000 000 000 = #0045000000000000; / 020 = E
775/0: 002 140 000 000 000 000 = #0046000000000000; / 021 = F
776/0: 002 160 000 000 000 000 = #0047000000000000; / 022 = G
777/0: 002 200 000 000 000 000 = #0050000000000000; / 023 = H
1000/0: 002 220 000 000 000 000 = #0051000000000000; / 024 = I
1001/0: 002 240 000 000 000 000 = #0052000000000000; / 025 = J
1002/0: 002 260 000 000 000 000 = #0053000000000000; / 026 = K
1003/0: 002 300 000 000 000 000 = #0054000000000000; / 027 = L
1004/0: 002 320 000 000 000 000 = #0055000000000000; / 030 = M
1005/0: 002 340 000 000 000 000 = #0056000000000000; / 031 = N
1006/0: 002 360 000 000 000 000 = #0057000000000000; / 032 = O
1007/0: 003 000 000 000 000 000 = #0060000000000000; / 033 = P
1010/0: 003 020 000 000 000 000 = #0061000000000000; / 034 = Q
1011/0: 003 040 000 000 000 000 = #0062000000000000; / 035 = R
1012/0: 003 060 000 000 000 000 = #0063000000000000; / 036 = S
1013/0: 003 100 000 000 000 000 = #0064000000000000; / 037 = T
1014/0: 003 120 000 000 000 000 = #0065000000000000; / 040 = U
1015/0: 003 140 000 000 000 000 = #0066000000000000; / 041 = V
1016/0: 003 160 000 000 000 000 = #0067000000000000; / 042 = W
1017/0: 003 200 000 000 000 000 = #0070000000000000; / 043 = X
1020/0: 003 220 000 000 000 000 = #0071000000000000; / 044 = Y
1021/0: 003 240 000 000 000 000 = #0072000000000000; / 045 = Z
1022/0: 002 020 000 000 000 000 = #0041000000000000; / 046 = a
1023/0: 002 040 000 000 000 000 = #0042000000000000; / 047 = b
1024/0: 002 060 000 000 000 000 = #0043000000000000; / 050 = c
1025/0: 002 100 000 000 000 000 = #0044000000000000; / 051 = d
1026/0: 002 120 000 000 000 000 = #0045000000000000; / 052 = e
1027/0: 002 140 000 000 000 000 = #0046000000000000; / 053 = f
1030/0: 002 160 000 000 000 000 = #0047000000000000; / 054 = g
1031/0: 002 200 000 000 000 000 = #0050000000000000; / 055 = h
1032/0: 002 220 000 000 000 000 = #0051000000000000; / 056 = i
1033/0: 002 240 000 000 000 000 = #0052000000000000; / 057 = j
1034/0: 002 260 000 000 000 000 = #0053000000000000; / 060 = k
1035/0: 002 300 000 000 000 000 = #0054000000000000; / 061 = l
1036/0: 002 320 000 000 000 000 = #0055000000000000; / 062 = m
1037/0: 002 340 000 000 000 000 = #0056000000000000; / 063 = n
1040/0: 002 360 000 000 000 000 = #0057000000000000; / 064 = o
1041/0: 003 000 000 000 000 000 = #0060000000000000; / 065 = p
1042/0: 003 020 000 000 000 000 = #0061000000000000; / 066 = q
1043/0: 003 040 000 000 000 000 = #0062000000000000; / 067 = r
1044/0: 003 060 000 000 000 000 = #0063000000000000; / 070 = s
1045/0: 003 100 000 000 000 000 = #0064000000000000; / 071 = t
1046/0: 003 120 000 000 000 000 = #0065000000000000; / 072 = u
1047/0: 003 140 000 000 000 000 = #0066000000000000; / 073 = v
1050/0: 003 160 000 000 000 000 = #0067000000000000; / 074 = w
1051/0: 003 200 000 000 000 000 = #0070000000000000; / 075 = x
1052/0: 003 220 000 000 000 000 = #0071000000000000; / 076 = y
1053/0: 003 240 000 000 000 000 = #0072000000000000; / 077 = z
1054/0: 000 000 000 000 000 000 = #0;
1055/0: 312 130 154 000 000 000 = #6245415400000000; / 101 = real
1056/0: 246 355 045 236 134 200 = #5156644547456200; / 102 = integer
1057/0: 212 373 354 226 033 200 = #4257575445415600; / 103 = boolean
1060/0: 000 000 000 000 000 000 = #0;
1061/0: 000 000 000 000 000 000 = #0;
1062/0: 000 000 000 000 000 000 = #0;
1063/0: 000 000 000 000 000 000 = #0;
1064/0: 207 054 241 344 000 000 = #4162624171000000; / 110 = array
1065/0: 000 000 000 000 000 000 = #0;
1066/0: 000 000 000 000 000 000 = #0;
1067/0: 000 000 000 000 000 000 = #0;
1070/0: 000 000 000 000 000 000 = #0;
1071/0: 000 000 000 000 000 000 = #0;
1072/0: 000 000 000 000 000 000 = #0;
1073/0: 000 000 000 000 000 000 = #0;
1074/0: 303 053 343 226 115 162 = #6062574345446562; / 120 = procedure
1075/0: 000 000 000 000 000 000 = #0;
1076/0: 000 000 000 000 000 000 = #0;
1077/0: 000 000 000 000 000 000 = #0;
1100/0: 000 000 000 000 000 000 = #0;
1101/0: 000 000 000 000 000 000 = #0;
1102/0: 000 000 000 000 000 000 = #0;
1103/0: 000 000 000 000 000 000 = #0;
1104/0: 317 172 164 216 200 000 = #6367516443500000; / 130 = switch
1105/0: 000 000 000 000 000 000 = #0;
1106/0: 000 000 000 000 000 000 = #0;
1107/0: 000 000 000 000 000 000 = #0;
1110/0: 000 000 000 000 000 000 = #0;
1111/0: 000 000 000 000 000 000 = #0;
1112/0: 000 000 000 000 000 000 = #0;
1113/0: 000 000 000 000 000 000 = #0;
1114/0: 000 000 000 000 000 000 = #0;
1115/0: 000 000 000 000 000 000 = #0;
1116/0: 000 000 000 000 000 000 = #0;
1117/0: 000 000 000 000 000 000 = #0;
1120/0: 000 000 000 000 000 000 = #0;
1121/0: 000 000 000 000 000 000 = #0;
1122/0: 000 000 000 000 000 000 = #0;
1123/0: 000 000 000 000 000 000 = #0;
1124/0: 000 000 000 000 000 000 = #0;
1125/0: 000 000 000 000 000 000 = #0;
1126/0: 000 000 000 000 000 000 = #0;
1127/0: 000 000 000 000 000 000 = #0;
1130/0: 000 000 000 000 000 000 = #0;
1131/0: 000 000 000 000 000 000 = #0;
1132/0: 000 000 000 000 000 000 = #0;
1133/0: 000 000 000 000 000 000 = #0;
1134/0: 000 000 000 000 000 000 = #0;
1135/0: 000 000 000 000 000 000 = #0;
1136/0: 000 000 000 000 000 000 = #0;
1137/0: 000 000 000 000 000 000 = #0;
1140/0: 000 000 000 000 000 000 = #0;
1141/0: 000 000 000 000 000 000 = #0;
1142/0: 000 000 000 000 000 000 = #0;
1143/0: 000 000 000 000 000 000 = #0;
1144/0: 000 000 000 000 000 000 = #0;
1145/0: 262 030 245 260 000 000 = #5441424554000000; / 171 = label
1146/0: 317 114 251 272 160 000 = #6364625156470000; / 172 = string
1147/0: 000 000 000 000 000 000 = #0;
1150/0: 000 000 000 000 000 000 = #0;
1151/0: 000 000 000 000 000 000 = #0;
1152/0: 000 000 000 000 000 000 = #0;
1153/0: 000 000 000 000 000 000 = #0;
1154/0: 216 373 155 226 355 000 = #4357555545566400; / 200 = comment
1155/0: 327 000 000 000 000 000 = #6560000000000000; / 201 = up
1156/0: 263 100 000 000 000 000 = #5464000000000000; / 202 = lt
1157/0: 272 375 000 000 000 000 = #5657640000000000; / 203 = not
1160/0: 000 240 000 000 000 000 = #0012000000000000; / 204 = (
1161/0: 246 140 000 000 000 000 = #5146000000000000; / 205 = if
1162/0: 232 374 200 000 000 000 = #4657620000000000; / 206 = for
1163/0: 000 000 000 000 000 000 = #0;
1164/0: 236 375 057 000 000 000 = #4757645700000000; / 210 = goto
1165/0: 003 360 000 000 000 000 = #0077000000000000; / 211 = [
1166/0: 000 000 000 000 000 000 = #0;
1167/0: 000 000 000 000 000 000 = #0;
1170/0: 212 131 351 270 000 000 = #4245475156000000; / 214 = begin
1171/0: 304 000 000 000 000 000 = #6100000000000000; / 215 = q
1172/0: 000 320 000 000 000 000 = #0015000000000000; / 216 = *
1173/0: 277 173 200 000 000 000 = #5767560000000000; / 217 = own
1174/0: 000 000 000 000 000 000 = #0;
1175/0: 222 235 200 000 000 000 = #4451660000000000; / 221 = div
1176/0: 262 120 000 000 000 000 = #5445000000000000; / 222 = le
1177/0: 206 351 000 000 000 000 = #4156440000000000; / 223 = and
1200/0: 000 260 000 000 000 000 = #0013000000000000; / 224 = )
1201/0: 322 211 156 000 000 000 = #6450455600000000; / 225 = then
1202/0: 336 212 154 224 000 000 = #6750515445000000; / 226 = while
1203/0: 000 000 000 000 000 000 = #0;
1204/0: 001 300 000 000 000 000 = #0034000000000000; / 230 = ;
1205/0: 003 360 000 000 000 000 = #0077000000000000; / 231 = ]
1206/0: 000 000 000 000 000 000 = #0;
1207/0: 000 000 000 000 000 000 = #0;
1210/0: 226 351 000 000 000 000 = #4556440000000000; / 234 = end
1211/0: 324 000 000 000 000 000 = #6500000000000000; / 235 = u
1212/0: 000 000 000 000 000 000 = #0000000000000000; / 236 =
1213/0: 332 033 065 224 000 000 = #6641546545000000; / 237 = value
1214/0: 000 040 000 000 000 000 = #0002000000000000; / 240 =
1215/0: 000 360 000 000 000 000 = #0017000000000000; / 241 = /
1216/0: 000 220 000 000 000 000 = #0011000000000000; / 242 = =
1217/0: 277 040 000 000 000 000 = #5762000000000000; / 243 = or
1220/0: 000 000 000 000 000 000 = #0;
1221/0: 226 314 345 000 000 000 = #4554634500000000; / 245 = else
1222/0: 000 340 000 000 000 000 = #0016000000000000; / 246 = ,
1223/0: 000 000 000 000 000 000 = #0;
1224/0: 000 000 000 000 000 000 = #0;
1225/0: 000 000 000 000 000 000 = #0;
1226/0: 000 000 000 000 000 000 = #0;
1227/0: 000 000 000 000 000 000 = #0;
1230/0: 000 000 000 000 000 000 = #0;
1231/0: 000 000 000 000 000 000 = #0;
1232/0: 000 000 000 000 000 000 = #0000000000000000; / 256 = tab as space
1233/0: 000 000 000 000 000 000 = #0;
1234/0: 256 111 231 000 000 000 = #5344463100000000; / 260 = KDF9
1235/0: 000 320 000 000 000 000 = #0015000000000000; / 261 = × print as *
1236/0: 236 120 000 000 000 000 = #4745000000000000; / 262 = ge
1237/0: 246 334 000 000 000 000 = #5155600000000000; / 263 = imp
1240/0: 000 000 000 000 000 000 = #0;
1241/0: 000 000 000 000 000 000 = #0;
1242/0: 317 111 160 000 000 000 = #6364456000000000; / 266 = step
1243/0: 000 000 000 000 000 000 = #0;
1244/0: 000 000 000 000 000 000 = #0;
1245/0: 003 360 000 000 000 000 = #0077000000000000; / 271 = :
1246/0: 000 000 000 000 000 000 = #0;
1247/0: 000 000 000 000 000 000 = #0;
1250/0: 000 000 000 000 000 000 = #0;
1251/0: 000 000 000 000 000 000 = #0;
1252/0: 003 360 000 000 000 000 = #0077000000000000; / 276 = |
1253/0: 000 000 000 000 000 000 = #0;
1254/0: 206 311 357 260 000 000 = #4154475754000000; / 300 = ALGOL
1255/0: 001 320 000 000 000 000 = #0035000000000000; / 301 = +
1256/0: 237 100 000 000 000 000 = #4764000000000000; / 302 = gt
1257/0: 227 035 200 000 000 000 = #4561660000000000; / 303 = eqv
1260/0: 000 000 000 000 000 000 = #0;
1261/0: 000 000 000 000 000 000 = #0;
1262/0: 326 355 051 260 000 000 = #6556645154000000; / 306 = until
1263/0: 000 000 000 000 000 000 = #0;
1264/0: 000 000 000 000 000 000 = #0;
1265/0: 000 000 000 000 000 000 = #0;
1266/0: 000 000 000 000 000 000 = #0;
1267/0: 000 000 000 000 000 000 = #0;
1270/0: 000 000 000 000 000 000 = #0;
1271/0: 232 033 063 224 000 000 = #4641546345000000; / 315 = false
1272/0: 000 000 000 000 000 000 = #0;
1273/0: 000 000 000 000 000 000 = #0;
1274/0: 262 230 262 207 056 100 = #5451426241627100; / 320 = library
1275/0: 001 340 000 000 000 000 = #0036000000000000; / 321 = -
1276/0: 272 120 000 000 000 000 = #5645000000000000; / 322 = ne
1277/0: 000 000 000 000 000 000 = #0;
1300/0: 000 000 000 000 000 000 = #0;
1301/0: 000 000 000 000 000 000 = #0;
1302/0: 222 360 000 000 000 000 = #4457000000000000; / 326 = do
1303/0: 000 000 000 000 000 000 = #0;
1304/0: 000 000 000 000 000 000 = #0;
1305/0: 000 000 000 000 000 000 = #0;
1306/0: 000 000 000 000 000 000 = #0;
1307/0: 000 000 000 000 000 000 = #0;
1310/0: 000 000 000 000 000 000 = #0;
1311/0: 323 055 145 000 000 000 = #6462654500000000; / 335 = true
1312/0: 000 000 000 000 000 000 = #0;
1313/0: 000 000 000 000 000 000 = #0;
1314/0: 316 131 355 226 355 000 = #6345475545566400; / 340 = segment
1315/0: 000 000 000 000 000 000 = #0;
1316/0: 000 000 000 000 000 000 = #0;
1317/0: 000 000 000 000 000 000 = #0;
1320/0: 000 000 000 000 000 000 = #0;
1321/0: 000 000 000 000 000 000 = #0;
1322/0: 000 000 000 000 000 000 = #0;
1323/0: 000 000 000 000 000 000 = #0;
1324/0: 000 000 000 000 000 000 = #0;
1325/0: 000 000 000 000 000 000 = #0;
1326/0: 000 000 000 000 000 000 = #0;
1327/0: 000 000 000 000 000 000 = #0;
1330/0: 000 000 000 000 000 000 = #0;
1331/0: 000 000 000 000 000 000 = #0;
1332/0: 000 000 000 000 000 000 = #0;
1333/0: 000 000 000 000 000 000 = #0;
1334/0: 227 212 164 000 000 000 = #4570516400000000; / 360 = EXIT
1335/0: 000 000 000 000 000 000 = #0;
1336/0: 000 000 000 000 000 000 = #0;
1337/0: 000 000 000 000 000 000 = #0;
1340/0: 000 000 000 000 000 000 = #0;
1341/0: 000 000 000 000 000 000 = #0;
1342/0: 000 000 000 000 000 000 = #0;
1343/0: 000 000 000 000 000 000 = #0;
1344/0: 000 000 000 000 000 000 = #0;
1345/0: 000 000 000 000 000 000 = #0;
1346/0: 000 000 000 000 000 000 = #0;
1347/0: 000 000 000 000 000 000 = #0;
1350/0: 000 000 000 000 000 000 = #0;
1351/0: 000 000 000 000 000 000 = #0;
1352/0: 000 000 000 000 000 000 = #0;
/ = #0077000000000000; / 377 dummy is never accessed
!end
!begin !label nogo;
1353/0: 016|017|020|101|236|120 *test: = S 14; = S 15; = S 16; = S #101; = S #236; = S #120;
1354/0: 240|023|024|027|014|035 = S #240; = S 19; = S 20; = S 23; = S 12; = S 29;
1355/0: 044|236|023|377|377|240 = S 36; = S #236; = S 19; = S #377; = S #377; = S #240;
1356/0: 301|301|301|301|377|240 = S #301; = S #301; =S #301; = S #301; = S #377; = S #240;
1357/0: 240|120|240|240|120|240 = S #240; = S #120; =S #240; = S #240; = S #120; =S #240;
1360/0: 002 234 002 345 242 003 *och3: = Q #1234/ #1345/ #121003;
1361/0: 002 234 002 234 140 303 *cch3: = Q #1234/ #1234/ #060303;
1362/0: 002 353 002 357 270 321 *prt: = Q test/och3-1/#134321;
1363/0: 300 002 360|042|200 320 106|200 321 244 nogo: F.och3; DUP; JS.70; JS.crash; /open 3
1364/4: 052 ERASE;
1364/5: 300 002 360|304 000 016|056|042|200 320 106|200 321 244 F.och3; SET14; +; DUP; JS.70; JS.crash; /open 17
1367/1: 300 002 362|200 320 106|200 321 244 F.prt; JS.70; JS.crash; /print
1370/4: 052 ERASE;
1370/5: 300 002 361|200 320 106|200 321 244 F.cch3; JS.70; JS.crash; /close
1372/2: 136 010|041|200 220 000 MRWDQ0; ZERO; OUT;
!end
1373/2: 017|017|017|017 *opbuff: / initialisation code is overwritten by the printer output buffer
buff=opbuff: / this buffer is used by brick change - and may need to be somewhere else - doubt it
!begin !label main;
main: /main(int argc, char **argv)
1374/0: 300 003 036|301 000 002|300 003 037|301 000 003 F.progname; S.2; F.progname+1; S.3;
1376/0: 041|033|321 013 074 ZERO; NOT; S.Z0-35; / Set POST flag in Z35
1376/5: 041|033|301 000 060 ZERO; NOT; S.48; / Set POST flag in E48 ???
1377/4: 041|301 000 105 ZERO; S.69; / clear sumcheck required flag
1400/2: 300 000 004|301 001 274 F.4; S.k4; / keep restart word
1401/2: 304 053 071|170 362 SET.Z38; SM15; / Set bits in Z38
1402/1: 100 000|301 000 104 FMM0/0; S.68; / used by B20 substitute - not currently (Feb17) operational
1403/0: 205 243 006 JNEN.nen; / entry with Z38 in N1 for Bill Findlay
1403/3: 041|100 000|166 361|065 ZERO; FMM0/0; SHLD-8; REV; / save D24-39 for later
1404/3: 042|205 143 005 DUP; JNEZ.notintb;
1405/1: 052|300 003 061 ERASE; F.v1; / use the value of V1 if TINT;B not operational
notintb:
1405/5: 065|164 117|164 361|011 REV; SHL+39; SHL-8; OR; / incorporate the language selection bits from nnn in TINT;Bnnnzzz
1406/5: 101 360 nen: SMM15/0; / entry with Z38 in N1
// FMM15/0; / this info is nowoutput by brick 81
// SET16; SRC15;
//w0: SHL+1; STR; NOT; FM15.z38tab; OR; SMQ15.y0+1; JCNZ15.w0; ERASE;
// SET#30; S.y0; SET#177702; SM15.y0+1;
// F.v11; FM15; +; DUP; SET8; OUT;
// ZERO; S.y0; NEG; NOT; SET8; OUT;
/ now to open the system tape
1407/1: 201 243 011 JNEN.mtok; / J if MT was left in N2 on entry
1407/4: 300 003 034|304 000 004|200 220 000 F.mtlab; SET4; OUT;
1411/1: 170 351|140 340 mtok: SRC14; M+I14;
1411/5: 304 003 062|170 344|140 340 SET.buff; SI14; M+I14;
1413/0: 124 340|121 340 MFRQ14; PARQ14; / read label block
/ system tape left after label block
1413/4: 300 003 062|041|166 061|301 003 064 F.buff; ZERO; SHLD+24; S.buff+2;
1415/1: 301 003 065 S.buff+3;
1415/4: 041|301 003 062 ZERO; S.buff;
1416/2: 300 003 035|304 000 010|200 220 000 F.out8; SET8; OUT; / print tape label on monitor
1417/5: 171 356|301 001 263 FQ14; S.chan+8; / remember for channel 8
1420/4: 124 340|121 340 MFRQ14; PARQ14; / read possible prog header for Oct 2020 format
1421/2: 136 350|146 340|304 000 001|170 342 MRWDQ14; ITWO14; SET1; SM14;
1422/5: 300 003 062|200 143 026 F.buff; JNEZ.oldform; / J if no zero word last block found
1423/5: 134 340|121 340 MFSKQ14; PARQ14; / skip label block
1424/3: 134 340|121 340 MFSKQ14; PARQ14; / skip last block marker
1425/1: 041|033|301 000 062 ZERO; NOT; S.mthead; / marker for rewinds
oldform: / MT is old format -- no prog header block
1426/0: 134 340|121 340 MFSKQ14; PARQ14; / skip either label or A-block
// ZERO; SET4; OUT; SHL+32; S.chan+7; / channel 7 device number
// ZERO; SET4; OUT; SHL+32; S.chan+6; / channel 6 device number
1426/4: 304 003 100|200 321 275 SET.y0; JS.startlp; / set printer buffer pointers
// F.Z38; SHL+10; JNEZ.notkalgol; / channels 4 & 5 only needed by Kalgol
// ZERO; SET4; OUT; SHL+32; S.chan+5; / channel 5 device number
// ZERO; SET4; OUT; SHL+32; S.chan+4; / channel 4 device number
brick81: / B81 generates an initial channel 6
1427/4: 304 006 021 SET#3021; / to call brick 81
1430/1: 170 364|304 336 010|170 362 SI15; SET#157010; SM15;
1431/2: 171 376|200 260 106 FQ15; J.70;
notkalgol:
1432/1: 320 013 071|164 027|224 043 027 F.Z38; SHL+11; J<Z.brick81; / enter brick 81 if Usercode
1433/3: 136 010 MRWDQ0; / temp
1433/5: 017|317 234 364 207 011 131 *mtlab: = P SYSTAPE9;
1435/0: 000 000 003 062 003 065 *out8: = Q 0/buff/buff+3;
1436/0: 034 053 102 256 030 220 progname: =#07025502 53414220; / M KAB0
1437/0: 102 112 036 173 134 365 =P 0DH--USU;
*z38tab: / table of bits in Z38 (all these words are -ve)
1440/0: 323 050 143 224 017 377 = P TRACE*s; / D1 TINT;B100
1441/0: 322 030 254 227 060 077 = P TABLES*s; / D2 TINT;B040
1442/0: 277 052 147 173 075 300 = P ORIG-SW*s; / D3 TINT;B020 indicates use of original software for assembly
1443/0: 322 136 064 003 377 377 = P TEXT*s; / D4 TINT;B010
1444/0: 272 367 257 303 100 077 = P NO-OPT*s; / D5 TINT;B004
1445/0: 272 367 264 227 075 000 = P NO-TEST*s; / D6 TINT;B002
1446/0: 272 367 267 207 053 200 = P NO-WARN*s; / D7 TINT;B001
1447/0: 261 331 377 377 377 300 = P L+G*4d*s; / D8 TINT;B200000
1450/0: 256 033 047 276 300 077 = P KALGOL*s; / D9 TINT;B100000
1451/0: 336 033 047 276 300 077 = P WALGOL*s; / D10 TINT;B40000
1452/0: 327 071 162 216 371 045 = P USERCODE; / D11 TINT;B20000
1453/0: 232 374 264 312 033 200 = P FORTRAN*s; / D12 TINT;B10000
1454/0: 326 063 362 262 040 077 = P UC/RLB*s; / D13 TINT;B4000
1455/0: 256 033 024 003 377 377 = P KAL4*s; / D14 TINT;B2000
1456/0: 221 025 100 377 377 377 = P D15*s; / D15 TINT;B1000
1457/0: 221 025 200 377 377 377 = P D16*s; / D16 TINT;B400
1460/0: 000 000 003 100 003 101 v11: = Q 0/y0/y0+1;
1461/0: 067 000 000 000 000 000 v1: = #1560000000000000; / +tables +real KAA01 -text -optimiser -test points Kidsgrove is the default
buff:
/ /////////////// test code not now used
1462/0: 304 006 100|200 321 275 SET1600; JS.startlp;
1463/0: 304 003 077|304 003 073|042|170 343|036|170 350 SET.endwords; SET.words; DUP; SRM14; -; SC14;
1465/0: 204 321 301 JS.abstolp;
1465/3: 304 003 077|304 003 073|042|170 343|036|170 350 SET.endwords; SET.words; DUP; SRM14; -; SC14;
1467/3: 204 321 301 JS.abstolp;
1470/0: 304 003 100|304 003 073|042|170 343|036|170 350 SET.endwords+1; SET.words; DUP; SRM14; -; SC14;
1472/0: 204 321 301|136 010 JS.abstolp; MRWDQ0;
1472/5: 017|070 071 067 056 063 054|236 064 053 236 047 046|070 056 050 236 070 076|062 047 064 061 070 377
*words: ={string *s of *s basic *s symbols};
1477/0: 377 377 377 377 377 240 *endwords: = #7777777777777640;
!end
*y0:
Reached end of file
!end
C-block from 8 to 831
No of ID table entries = 433 (14%)