/[ KAL4 assembler written by John Thomason and copy typed by David Holdsworth /[ *Q on listing is underlined [ on flex and { in this file -- similarly *u is } /[ This file needs to be in ISO not UTF-8, i.e. this � is a multiplication sign /[ comments introduced by /[ have been added in the 21st century /[ this version has simulations of Eldon2 OUTs as subroutines !begin gap = 0: bjtime=300: /maximum time limits fjtime=30: /fjtime is default time limit for all jobs mcsize=29600: /maximum size for binaries prog=0: /form B-block J.8; prog=4: JS.rs1; J.rs2; /restart prog=8: !begin !label failmark, endmark, zeroout, catfail, fail, ptr, failno; SET.code; SRM1; QFRQ0/2; ITWO2; M+I2; FMMN0/0; SRM7; IFRQ0/6; SET48; SRC3; JS.openoutput; JEJ.ptinput; FLINK; ERASE; J.openinput; opened: ZERO; NOT; DUP; SMMQN2/1; NEG; SHL31; F.indisc; OR; S.indisc; FMM0/0; SMM1/0; IMTWO7; M+I7; ZERO; SM1.5; MFRQ2/3; J.dumbeg; /[ simulations of Eldon2 OUTs as subroutines out51: /[ ignore job accounting info out50: ERASE; EXITH; /[ ignore job accounting info out32: ERASE; /[ remove seek !begin F.ourptr; JGEZ.ptok; DUP; SQ12; /[ xfer params SET2; SET5; OUT; DUP; SC12; SHL+16; SET.disc; OR; SHL+16; SET.disc+1; OR; S.ourptr; ZERO; loop1: PIBQ12; PARQ12; ERASE; F.ptbfr; F.disc; JNE.loop1; ERASE; /[ leave word in N1 if read off end ptok: SHL-16; SRM12; SET640; SC12; FQ5; F.ourptr; SQ5; loop2: PIBQ5; PARQ5; F.hexrad; F.disc; F.aaaaaa; -; TOB; SHL+24; F.hexrad; F.disc+1; F.aaaaaa; -; TOB; OR; SMMQ12/0; JCNZ12.loop2; SQ5; EXITH; *ourptr:=#7777777777777777; aaaaaa:= #0200414141414141; hexrad:= #2020202020202020; disc:= P DISCDISC; =0; /[ 2 word input buffer !end out17: SET9; OUT; SET3; OUT; EXITH; !label out17, out50, out51; /[ end of simulations of OUTs *failmark:=0; endmark:=0; error:= {*cError*sat*s}; after:= P *safter*s; fl:= {*cFAILS}; ptr:= {*s ��� *s*d in *s updating *s}; cline:= 0; /basic symbol pointer at start of current line zeroout: ZERO; OUT; MRWDQ0; /used as default restarts fl12: SET#5602; nfail: S.failno; catfail: SET-100; S.failmark; F.fl; S.error; fail: JEJ.prog+1; FLINK; ERASE; JNEN.prog-0s1; JNEJ.prog-1; failm: F.error+1; F.error; JS.printtwo; FC3; SET#70; AND; SC3; SET#377; DUP; JS.printadd+0s3; JS.printline; F.after; JS.print8; F.lastlab; REV; JS.printid+0s3; F.lineno; JS.printline+0s2; JS.prnl; F.failmark; NOT; NEG; DUP; S.failmark; DUP; JLTZ.windup; SHL-5; F.endmark; JNEZ.upderr; FQ13; FQ12; CFRQ0/13; F.cline; SQ12; pl: FQ12; JEQ.pw-0s1;JS.inbs; JS.oubs; J.pl;REV; pw: FQ13; JEQ.pr-3; JS.inbs; SET#240; JNE.prog+1;JS.countl; JS.oubs; J.pw; F.ptr; JS.printsix; JCNZ13.pr; JCNZ12.pr; SET#240; J.pr+0s3; pr: JS.inbs; DUP; JS.oubs; SET#240; NEV; JNEZ.pr; SQ13; SQ12; JNEZ.fl3; JS.round; J.nxitem; upderr: F.ptr+2; F.ptr+1; JS.printtwo; FMMN10/0; DUP; SET#377; JS.printid+0s3; JS.prnl; REV; JEQZ.updfail; fl3: SET3; J.nfail; /more than 32 errors /options *test:= 0; / -1 bin 0 load and go length:= -1; / 1 C 2 8 3 L 0 8 with text -1 L with text tables:= 0; / -1 tables 0 w/o tables ptbin:=0; / 0 disc binaries, #0 P.T. binaries jq:=0; /0 foreground, 1 background, -1 paper tape timelt:=0; =H0; prnl: SET#240; /output newline /out basic symbol /ptoubs comes in here /[ ----- page 2 !begin !label openoutput, bfr, oubs; *oubs: VR; DUP; SHL-6; JNEZ.long; JS.bstopr; char: FMM14/0; SHA6; OR; SMM14/0; JV.nwd; EXITH; ouch: SET2; JNE.char; M+I14; ERASE; tfr: SET#177702; SMM14/0; CIFRQ15/14;JCZ15.out8; PARQ14; LPQ14; J.reset; out8: SET#30; S.bfr; FQ14; SET8; OUT; reset: SET16; SRC14; SET.bfr; SM14; nwd: SET#177776; SMMQN14/0; JCZ14.tfr; EXITH; tab: ERASE; FMM14/0; SHA6; JNV.prog-0s2; SMM14/0; J.nwd; long: SET#256; JEQ.tab; SET#377; JEQ.du; FQ13; REV; SET.endtable-table; SRC13; *loop: FMQ13.table; STR; ERASE; SHL-36; JEQ.found; JCNZS13; found: ERASE; FM13.table; FM13.table-1; CAB; SQ13; STR; SHLD+12; JGEZ.unpk; DUP; JS.unpk; DUP; unpk: ZERO; SHLD6; JS.ouch; DUP; JNEZ.unpk; ERASE; du: ERASE; EXITH; *bfr:=D 0; openoutput: SET.bfr; SRI15; J.reset; prog=bfr+17: /output buffer - 17 words for L.P. /teletype output can overflow into character table *table:= #0236 000000000000; = # 0240 020000000000; =#0230 340000000000; =#0241 170000000000; =#0301 350000000000; =#0214 154245475156; =#0234 154556440000; =#0321 360000000000; =#0261 150000000000; =#0221 154451660000; =#0201 151500000000; =#0271 100000000000; =#0242 110000000000; =#0265 101100000000; =#0322 155645000000; =#0302 154764000000; =#0202 155464000000; =#0262 154745000000; =#0222 155445000000; =#0246 160000000000; =#0204 120000000000; =#0224 130000000000; =#0211 151200000000; =#0231 151300000000; =#0215 156100000000; =#0235 156500000000; =#0216 140000000000; =#0276 154555020000; =#0101 156245415400; =#4102 155156644547; =#4562 000000000000; =#0206 154657620000; =#0326 154457000000; =#0266 156364456000; =#0306 156556645154; =#0226 156750515445; =#4200 154357555545; =#5664 000000000000; =#4103 154257575445; =#4156 000000000000; =#0110 144162624171; =#4120 156062574345; =#44656245 00000000; =#0237 156641546545; =#0171 155441424554; =#4130 156367516443; =#50 00000000000000; =#4172 156364625156; =#47 00000000000000; =#0217 155747560000; =#0205 155146000000; =#0316 156545550200; =#0225 156450455600; =#0245 154554634500; =#0210 154757645700; =#0223 154156440000; =#0243 155762000000; =#0263 155155600000; =#0303 154561660000; =#0203 155657640000; =#0335 156462654500; =#0315 154641546345; =#4320 155451426241; =#6271 000000000000; =#0260 155344463100; =#0360 154570516400; =#4340 156345475545; =#5664 000000000000; =#0300 154154475754; =#0220 070000000000; =#0777 060000000000; endtable=prog: !end !begin /basic symbol to teletype *entry: J.outt; /to overwrite oubs outt: VR; FMMQ14/0; SHA8; OR;SMM14/0; JV.word; EXITH; word: JCZ14.tfr; FI14; SMMQN14/0; EXITH; finoutt: VR; FMM14/0; NOT; SHA8; JNV.prog-0s2; NOT; SMM14/0; JCZ14.tfr; F.sixz; SMMQN14/0; JCNZ14.prog-0s5; tfr: FQ15; SET33; OUT; FC15; NOT; NEG; SET19; MAX; ERASE; SC15; F.qwd; SQ14; JNV.end; DC15; F.sixz; SMMQ14/0; F.sixz+2; SMMQ14/0; F.sixz+3; SMMQ14/0; end: FI14; SMM14/0; EXITH; openoutt: F.entry; S.oubs; F.qwd; DUP; SQ14; SHC+16; SQ15; M+I15; SET#736; J.end+0s2; /[ ----- page 3 *qwd:= Q 39 / 1 / bfr; sixz:= {*6z *3c Too*smuch*sO/P*3c}; !label openoutt, outt, finoutt; !end prog=prog+gap: /allow elbow-room for slotting ptoubs *transfer: =Q 0 / block /block+639; texid:= P *n*cT*c------------; /file ident to check chaining jobno:= P +0/00299; /systems box in case of book /[ a Leeds Univ job no of the KDF9 era magic:= P PDUX /CUE; /stats code - disc or P.T. dlost:= -32768; time:= D 0; / ran/el times for Adrian /[ Adrian Hock was head of user services eml:= #3777777767650000; /last line of text after SHL2; SHAD5; !begin !label initial; initial: F.block+13; JS.discread; F.block; F.block+1; JS.chfile+1; F.ptbin; JEQZ.open; SET2; SHC-6; SET4; SRC11; ZERO; FM11.block+2; SHLD-6; CAB; OR; SMQ11.ablock+3; JCNZ11.prog-1s5; SET#75; OR; S.ablock+7; open: F.ptfile; JNEZ.opened; F.block+80; S.block; F.block+81; DUP; NEG; SRM12; JS.chfile; FQ12; S.cline; SET.block+81; +; SQ13; J.opened; !label inbs, line, options, blocks; inbs: JCNZ13.next; JCNZ12.nword; newline: FM12; JNEZ.line; F.inlib; JNEZ.nblock; *blocks: F.block; JS.discread; JS.chfile; F.block+1; DUP; NEG; SRM12; SET.block+1; +; SM13; line: FQ12; S.cline; FMMN12/13; ZERO; SHLD2; REV; ZERO; SHAD5; SC12; SET8; SC13; REV; JNEZ.dummyl; F.eml; NEV; JEQZ.em; nword: SET-48; S+C13; first: M+I12; DC12; next: SET8; S+C13; SET#377; FMM12/13; SHLC13; AND; EXITH; em: F.inlib; JNEZ.endlib; SET1; J.nfail; dummyl: SHL-39; SET#367; +; DUP; SHA-1; JEQZ.ta; ERASE; dl: FC12; S+M12; CFRQ0/12; J.newline; ta: S.tables; JS.prnl; ZERO; S.refcount; J.dl; !end !label blocks, line, jq, ptbin, test, length, tables, oubs, openoutput; !label discread, transfer, openinput, inbs, libcall, chfile, reread, erex; discread: DUP; S.indisc; F.transfer; SHLD16; SHC-16; REV; SHL16; JS.out32; EXITH; reread: F.ptfile; JNEZ.prog-1; F.indisc; DUP; JS.discread+0s4; JS.chfile; SHL16; JGEZ.prog+1s3; F.block+80; S.block; EXITH; libcall: /library insertion !begin !label lib F.O.C, endlib, nblock, inlib; F.cline; S.oldcline; JS.input; M+I2; F.idbfr; SQ8; onelib: FMMQ2/1; DUP; SHL-6; JNEZ.fail; JS.bstopr; F.zer; SHL-24; ndig: FMMQ2/1; DUP; SET10; SIGN; JGEZ.last; SET#20; OR; REV; VR; SHA6; OR; JNV.ndig; J.fail; last: PERM; ZERO; SHLD24; JEQZ.fail; REV; SHLD-6; ERASE; SMMQ8/0; SET#230; JEQ.last; SET#246; NEV; JNEZ.fail; JCNZ8.onelib; J.fail; lastlib: ERASE; SET-41; S+C8; SET.f-1; SM8; NC8; F.blkscan; SQ9; F.lib F.O.C; nblk: QFRQ8/10; * FMMQN10/0; JLTZ.prog+1s3; *JCNZS10; J.endind; DUP; JEQZ.endind; JS.discread+0s4; QFRQ8/10; F.block+639; ZERO; scan: ERASE; JCZ10.nblk; FMMQN10/0; DUP; JGEZ.scan; QFRQ9/11; *FMMQ11/0; DUPD; NEV; SHL-18; JEQZ.match; ERASE; JCNZS11; J.scan; match: FMMQ11/0; DUP; SQ5; JLTZ.match; SI15; FQ5; SMM10/0; J.scan; endind: ERASE; QFRQ8/10; QFRQ8/9; * FMMQN10/0; DUP; JLTZ.err; SMMQN9/0; /[ ----- page 4 echeck: JCNZS10; FC9; NEG; S+C8; FQ12; S.q12; FQ13; S.q13; JCZ9.prog+1s3; JS.prnl; JS.prnl; ZERO; NOT; S.inlib; M+I8; FQ8; J.endlib+0s3; err: F.mess; JS.print8; SHL-6; SET#56; OR; JS.print8; F.mess+1; JS.print8; F.failmark; NOT; NEG; S.failmark; J.echeck; endlib: F.libaddrs; SQ9; JCZ9.exit; FMMQ9/0; FQ9; S.libaddrs; DUP; SQ9; JS.discread+0s4; FI9; reset: SET.block; +; SQ13; FMM13/0; SHL30; STR; S.cont; SHC18; DUP; NEG; SRM12; S+M13; JEJ.nxitem; /symbol is only wanted if JS used J.inbs+1; /newline to cure running of end of lib file(RRH) nblock: F.cont; JEQZ.fl8; F.block+639; JS.discread+0s4; ZERO; J.reset; exit: JS.restore; F.oldcline; S.cline; JNEJ.inbs; J.nxitem; restore: F.q12; SQ12; F.q13; SQ13; ZERO; S.inlib; J.reread; fl8: SET8; J.nfail; *q12:= 0; q13:= 0; oldcline:= 0; inlib:= 0; idbfr:= Q 41/1/f; blkscan:= Q 639/-1/block+639; lib F.O.C:= 0; libaddrs:= 0; cont:= 0; mess:= P *clibrary 0t *s found; !end *ptfile:=0; /non-zero if input is direct from paper tape tail:= {0/6*s}; syms:= S{*s*d*c*c*t*3d:}; /symbol table for lptobs, print8 = S {= ( ) *a � , / 0123456789 *d @ ; + - . *d ABCDEFGHIJKLMNOPQRSTUVWXYZ *4x*d}; printtwo: JS.printsix; /print two words via printsix printsix: /outputs six symbols packed in N1 DUP; NOT; J=Z.erex; ZERO; SHLD8; JS.oubs; SET#377; OR; J.printsix; checkz: /used for leading zero suppression !begin DUP; J=Z.zero; MFRQ0/11; EXITH; zero: ERASE; FM11; EXITH; !end countl: FI1; F.inlib; +; S+I6; EXITH; chfile: F.block+636; F.block+637; F.texid+1; NEV; REV; F.texid; NEV; OR; JNEZ.fl12; EXITH; space: /check store used FM3; F.inbfr; MAX; FM1; +; ROUND; space1: FM7; -; F.dlost; MAX; S.dlost; erex: ERASE; EXITH; printid: /print packed identifier !begin SET#236; SM11; SET8; SC11; SHC6; loop: SHC-12; ZERO; SHLD6; DC11; JS.checkz; JS.oubs; JCNZ11.loop; !end ERASE; EXITH; printadd: /print program address from Q3 !begin SET#236; DUP; SM11; JS.oubs; FM3; SHL33; SET4; SC11; word: ZERO; SHLD3; JS.checkz; JS.oubs; DC11; JCNZ11.word; SHL-5; F.tail; OR; FC3; SHL21; -; J.printsix; /[ ----- page 5 !end printline: /outputs current line number FI6; SET#236; JS.oubs; F.ssss; F.decimal; CAB; FRB; SHLD-6; REV; SHL-2; REV; DUP; JNEZ.prog-0s7; ERASE; SET#13413; SHLD-16; ERASE; J.printsix; bstopr: /6-bit B.S. to printer code !begin SET12; -; DUP; JLTZ.num; SET26; DIVI; SET#41; ex: +; ROUND; EXITH; num: SET#34; REV; DUPD; SHA-2; JNEZ.ex; DUP; SHL-2; CAB; SHL2; +; J.ex; !end print8: NOT; DUP; JEQZ.erex; ZERO; NOT; SHLD6; NOT; JS.lptobs; JS.oubs; J.print8+0s1; lptobs: SET6; DIVI; SHL3; SC11; SM11; FM11.syms; SHLC11; SHL-40; EXITH; !label countl, space, space1, printid, printline, bstopr, print8; !label initial, fl12, texid, lib F.O.C, openoutt; !label timelt, printsix, printadd, decimal, printtwo, windup, inlib; *decimal:=#1212121212121212; ssss:={*4s}; refcount:=0; lastlab:=� GORP; lineno:=0; /line number of last label inbfr:=8; failno:=0; indisc:=0; flag:=-1; closestr:= Q #30/#30/#30; !label ptfile, refcount, lastlab, lineno, inbfr, indisc, flag, dlost; windup: /end of translate !begin F.failmark; JEQZ.ok; F.fls; F.failno; NEV; S. okw; ok: F.k4; JS.printsix; F.okw; JS.print8; F.ran; JS.printsix; SET#176054; SHL6; F.decimal; SET3; OUT; F.time; -; SET10; SHL23; �; FRB; SHLD-6; REV; SHC-10; REV; JS.prno; F.sex; JS.printsix; F.snw; JS.print8; F.snw+1; JS.print8; JS.space; ZERO; NOT; F.decimal; FMMN0/0; SLINK; FLINK; F.dlost; +; SHL-5; NOT; NEG; NOT; NEG; SHL5; FRB; JS.prno; F.snw+2; JS.print8; F.length; NEG; NOT; JEQZ.end; F.jq; JNEZ.typeend; SET1; S.length; JS.openoutt; J.ok; end: JS.finoutt; JS.out17; F.time; -; JS.frb; S.time; F.time+1; JS.frb; S.time+1; FMMN0/0; SHL24; JS.frb; S.dlost; FM1.3; SHL36; SHL-42; SET#60; JEQ.pors; SET#63; JEQ.pors; ERASE; ZERO; pors: SHC-6; F.magic; OR; F.ptfile; JNEZ.prog+0s5; SHL-24; SHL+24; S.magic; SET7; SRM11; SET.transfer; SI11; FMM11/0; S.transfer; M+I11; FQ11; JS.out50; F.failmark; JNEZ.stop; EXITH; typeend: F.length; SHC-1; JLTZ.prog+1s3; SET#276; JS.oubs; F.test; NOT; F.failmark; OR; JEQZ.end+0s3; /suppress O.K. flex message after on disc or punched F.okw; F.texid+1; F.texid; NOT; SHL24; NOT; JS.type; J.end+0s3; frb: SHA-24; F.decimal; REV; FRB; F.zer; OR; EXITH; prno: SHLD-6; REV; SHL-2; REV; DUP; JNEZ.prog-0s7; ERASE; J.printsix; *k4:= {*c KAL4 }; /[ ----- page 6 okw:= P *s O.K. *s; fls:= P *s FAIL *s*d 0; ran:= # 4741641406317377; sex:= {*s secs.}; snw:= P *2s store *s needed *3s words. *c; zer:=P 00000000; !label prno, zer; !end !label prnl, time, prno, closestr; !label nfail, options, jobno, ssss, rs1, rs2, fl2, fl6, fl7, fl9; fl2: SET2; J.nfail; /dictionary meets program rs1: IONE14; FLINK; J.nfail; /even restart - terminate rs2: IONE14; SET5; J.nfail; /odd restart fl6: SET6; J.nfail; /dictionary lost during binary output fl7: SET7; J.nfail; /error in OUT29 fl9: SET9; J.nfail; !end / Facility added in assembler by A.P.McCann June 1972 / Input source file may be switched by stmt of type / !goto newfile-name where newfile-name is a full 12 char ident. Any chars in / amendment field are ignored in searching index. If file is not on disc / then a fail message is given and assembler packs up / !begin !begin (block for goto procesing) !label goto; / goto: SI11; /flag for 2 halves of ident / / read 6 chard making half the ident / gethalf: SET6; SC11; ZERO; /6 chars in each half / / char fetch loop / getchs: SHL6; JS.einbs; JS.bstopr; /get char convert to printer code OR; DC11; JCNZ11.getchs; /form chars into word FI11; ZERO; SI11; JNEZ.gethalf; /do other half of ident SHL12; REV; SHLD-12; /shift into place F.nctc; OR; ZERO; /ident completed. N1 = text index adrs / / loop for searching text index which is read into input text bfr / srchindex: JS.discread; SET.block; SRM12; /M12 points to 1st word of index blk SET212; FMMQ12/0; SHL-32; -;/get no. of entries in blk SC12; SET3; SI12; JCZ12.anymo; /Q12 set for scan. jmp if blk empty * FMMQ12/0; JEQ.maybe; /loop to match top half of ident / / return to search loop if 2nd half of ident doesnt match / *contsrch: JCNZS12; /scan all entries in blk / / here when blk finished to see if more blcks / anymo: F.block+639; DUP; JNEZ.srchindex; /get next on chain NOT; SHL30; OR; /mask top 3 chars of ident JS.print8; JS.print8; /priny ident /[typo for print (?) F.notfnd; JS.print8; J.catfail; /print not fnd,fail / / half matched ident. see if other half matches /[ ----- page 7 / maybe: M-I12; REV; DUP; /N1 = 2nd half FMMN12/0; NEV; /compare ZERO; NOT; SHL12; SHC18; AND; /mask amendment no JEQZ.fnd; /jmp if it matches REV; M+I12; J.contsrch; /keep looking / / here when located / fnd: ERASE; ERASE; FM12.2; JS.discread; /read alpha block F.block; S.texid; /keep.... F.block+1; S.texid+1; /....identifier F.block+80; S.block; /NOC F.block+81; DUP; /word count NEG; SRM12; /Q12 set up SET.block+81; +; SQ13; /Q13 set up J.nxitem; /continue assembling *notfnd := P *snot*sfnd; /for fail message nctc := P *n *c T *c *4s; /to complete identifier / !end (of goto) / bracket: ERASE; ZERO; NOT; JS.pbs; SET#204; JNE.prog+1s1; REV; NEG; NOT; REV; SET#224; NEV; JNEZ.prog+0s5; NOT; NEG; DUP; JNEZ.bracket+0s3; ERASE; nxitem: FM2; FM3; F.inbfr; MAX; ROUND; DUP; SRM2; MAX; FM1; +; FM7; -; JGEZ.fl2; ERASE; VR; JNEN.fl9; /check dict. meets prog, nest /check for comment asterisk etc. JS.einbs; return: DUP; SHL-6; J=Z.load; /letter SET#242; J=.equals; /constant SET#216; J=.ast; SET#240; J=.crlf; SET#214; J=.beginblock; /!begin SET#234; J=.endblock; /!end SET#241; J=.slash; / / comments SET#171; J=.labelspec; / !label list SET#200; J=.comment; / !comment comments SET#340; J=.segment; / !segment SET#204; J=.bracket; SET#210; J=.goto; /find alternative input file SET#320; J=.libcall; / !library SET#230; J=.nxitem-0s1; /extra semicolon / load: SMMQN2/1; /read rest of item to semicolon or colon nxebs: JS.einbs; DUP; SMMQN2/1; SET#230; J=.instr; SET#240; JEQ.fail; SET185; NEV; J#Z.nxebs; J.ident; slash: FC12; S+M12; CFRQ0/12; CFRQ0/13; crlf: FI1; F.inlib; +; S+I6; J.nxitem-0s1; comment: F.tables; JEQZ.slash; SET#240; DUP; JS.oubs; REV; SHL8; F.ssssd; OR; JS.printsix; ccopy: JS.inbs; DUP; JS.oubs; JNE.ccopy; /[ ----- page 8 ZERO; S.refcount; J.crlf; ast: JS.round; JS.einbs; REV; J#.return; FM3; NEG; NOT; SHL-5; NOT; NEG; SHL5; SM3; J.nxitem-0s1; /conversion table for signs in instructions *spec: =# 10000000 77775 301; / =HX+; =T-6; =S{+}; =# 11000000 77775 321; =# 30402737 77764 261; =# 17244100 77767 221; =# 20340000 77772 242; =# 31200000 77772 322; =# 27370000 77772 202; =# 27200000 77772 222; =# 22370000 77772 302; =# 22200000 77772 262; speclist:= Q prog-spec / 1 / spec-1; du:={*6#17}; /dummy syllables for rounding qn:=0; qnn:=0; instr: FC2; NOT; NEG; S+M2; SHL-4; SC2; IMFRQ0/4; ZERO; NOT; /C2 = 9 !begin /basic parsing scan nibs: FMMQ2/1; SET#230; J=.eparse; JCZ2.fail; /instruction pattern too long DUP; SET12; SIGN; JGEZ.nibs; IMONE4; SET11; J=.eparse; /type CA digit: DUPD; ERASE; ABS; SHC-7; JGEZ.dig; /not sign / ABS caters for case of no code before digit ERASE; M-I2; /number signed or invalid - go back to sign dig: JS.assemno; S.qn; IONE4; SET#230; JEQ.eparse; IMTWO4; SET#13; JEQ.eparse; SET#241; JNE.fail; cnn: ERASE; FMMQ2/1; JS.assemno; /second Q-store number S.qnn; ITWO4; /type two SET152; JNE.fail; /second number not terminated by semicolon eparse: /pack instruction pattern for location ZERO; REV; l: ERASE; REV; DUP; NOT; JEQZ.endpa; SHLD-6; DUP; JEQZ.l; /letter SHLD6; SHC-8; F.speclist; SQ11; /symbol *FMMQN11/0; SHL40; JEQ.prog+1s2; JCNZS11; J.fail; ERASE; FMM11/0; SHL-8; SC11; SHLC11; FMMH0/11; OR; J.l+0s1; endpa: ERASE; / N1 = instruction pattern !end !begin M+I4; FM4.tc; /fetch appropriate dope word /instruction pattern locator SQ11; MFRQ11/4; FC11; SM11; MFRQ0/10; high: MFRQ10/9; loop: FM11; FM9; DUPD; +; SHL-1; SM10; /binary search NOT; +; REV; DUP; FMM10/4; SIGN; DUP; JEQZ.found; CAB; JEQZ.fail; JGTZ.high; MFRQ10/11; J.loop; found: SM11; ERASE; ERASE; M+I11; FMMH10/11; /N1 = blank instruction FI4; J=Z.store; FI4; DUP; J 15 SHC-16; OR; cn: F.qn; DUP; SHL-4; J#Z.fail; SHC-12; OR; store: DUP; SHL-46; SET2; MAX; ERASE; NOT; NEG; SC4; ZERO; SHLD8; DC4; JS.storesyll; JCNZ4.prog-1s2; J.nxitem-0s1; addr: REV; CFRQ0/4; CMFRQ3/6; /allow funnies and set update pointer for calcadd DUP; SHL+1; JLTZ.mors; /use instruction to determine address type DUP; SHL8; SHL-40; SET#360; MAX; SIGN; NOT; NEG; DUP; NOT; -; endaddr: SM4; JS.calcadd; /M4 = address type SET#230; NEV; J#Z.fail; /check terminator semicolon JS.addup; REV; NOT; J=Z.store; /unmodified J.cn; /modified mors: DUP; SHL-40; SET#304; SIGN; ABS; SHL+1; J.endaddr; !end addup: /adds the syllable in N1 and word /in N2 to the instruction in N3. /mode of arithmetic specified by M4. !begin DUP; FM4.sw; REV; JNEZ.prog+1; SHL-24; OR; SLINK; EXIT; jumpadd: CAB; SHC5; ZERO; SHLD3; CAB; +; SET6; DIVI; CAB; +; SHC-8; PERM; +; jumpword: REV; SHC4; STR; REV; SHC8; REV; SHLD12; CAB; +; SHLD-12; REV; SHC-7; REV; SHLD-1; ERASE; SHC-4; EXITH; msadd: REV; SHC2; ZERO; SHLD3; REV; SHC7; REV; SHLD12; CAB; +; SHLD-12; REV; SHC-7; REV; SHLD-3; ERASE; SHC-2; EXITH; setadd: SHL32; REV; SHC+8; VR; SHA2; JV.fail; SHA-2; +; SHC-8; EXITH; syll: CAB; SHC+8; DUP; SHL-32; JNEZ.fail; PERM; REV; SHL+35; REV; SHLD-3; ERASE; +; SHC-8; EXITH; *sw:= HA setadd; =HA syll; =HA jumpword; =HA jumpadd; =HA msadd; =HA fail; =HA jumpword; =HA fail; !end storesyll: /stores syllable in D40-D47 of N1: D0-D39 zero SET-8; S+C3; SET#377; SHLDC3; NOT; FMM3/1; AND; /preserve other syllable OR; SMM3/1; JCZ3.endro-0s2; EXITH; round: SET-48; S+C3; JCZ3.endro; NC3; FMM3/1; F.du; SHLDC3; NC3; SHCC3; SMM3/1; ERASE; M+I3; endro: SET48; SC3; EXITH; /process constant equals: ERASE; JS.einbs; !begin SET#23; J=.hconst; SET#17; J=.dconst; SET#36; J=.sconst; SET#37; J=.tconst; SET48; SRI5; /alignment SET#34; J=.qconst; common: FC3; FI5; �I; /[ ----- page 10 JNEZ.fail; ERASE; /check alignment SET#33; JEQ.pconst; SET#215; JEQ.string; SET.endinput; SLINK; input: M+I2; FM2; SET#230; CAB; DUP; SMMQ2/1; SET#271; JEQ.fail; SET#240; JEQ.fail; JEQ.prog+1s3; JS.einbs; J.input+1s2; ERASE; SM2; endinput: EXITH; FMMQ2/1; /usual exit is to this FMMQ SET#322; JEQ.octal; SET#14; JEQ.aconst; SET#261; JEQ.xconst; SET#43; JEQ.xconst; SET#21; JNE.prog+1s1; /number - check F SM5; FMMQ2/1; /set floating tag !begin /assemble numeric constant number: QFRQ0/10; IMFRQ0/11; QFRQ0/8; SET94; SC11; ZERO; ZERO; CAB; FI5; NEG; NOT; DUP; SRI9; JGTZ.chpm; FC11; SI9; chpm: SET#301; JEQ.sign+0s2; SET#321; JEQ.sign; chdig: DUP; SET10; SIGN; JGEZ.chdot; JS.digits; chdot: SET11; JEQ.dec; chten: SET10; JEQ.exp; SET#20; JEQ.exp; chsl: SET#241; JEQ.slash; M+I9; chsc: SET#230; NEV; JNEZ.fail; SET94; FC11; -; SC10; JCZ10.fail; / no digits /number in C10 I. P. in N1/N2 FM10; FM11; -; SET12; DIVI; SC5; DUP; ABS; SC11; JLTZ.divide; JCZ11.endexp; mult: F.const; DUP; PERM; �D; REVD; �+-47; SET40; S+C10; DC11; JCNZ11.mult; endexp: JCZ5.endno; FI1; * SET10; �D; CONT; DC5; JCNZS5; SET47; FLOAT; FIX; S+C10; DUP; PERM; �D; REVD; �+-47; endno: DUP; JEQZ.prog+2s4; DUP; SHL1; JLTZ.prog+1s4; DC10; SHAD1; J.endno+0s4; FI10; JEQZ.pos; NEGD; pos: FM5; JNEZ.float; FM9; NEG; S+C10; FC10; NEG; NOT; DUP; JGTZ.fail; FI9; NOT; -; JLTZ.fail; SHADC10; /check shift O.K. FI5; DUP; JLTZ.storetwo; SET24; NEV; JEQZ.hfix; ROUND; store: JV.fail; SMM3/1; M+I3; J.nxitem; float: FC10; DUP; SHA40; JV.fail; ERASE; FLOATD; FI5; DUP; JLTZ.storetwo; SET24; NEV; JEQZ.hfloat; ROUNDF; J.store; divide: SHAD-1; F.const; DUP; REVD; CAB; DIVR; PERM; REV; DIV; ZERO; PERM; STR; +D; SET-39; S+C10; DC11; JCNZ11.divide; J.endexp; storetwo: ERASE; SMM3/1; M+I3; J.store; hfix: ROUNDH; J.storeh; hfloat: ROUNDHF; storeh: JV.fail; ZERO; SHLD8; JS.storesyll; ZERO; SHLD8; JS.storesyll; SHL-40; JS.storesyll; J.nxitem-0s1; sign: IONE10; ERASE; FMMQ2/1; J.chdig; dec: ERASE; IONE11; FMMQ2/1; DUP; SET10; SIGN; JGEZ.fail; JS.digits; J.chten; exp: ERASE; FC11; SET94; NEV; JNEZ.expa; ZERO; NOT; SHAD-1; S+C11; expa: FMMQ2/1; JS.assemno; SM10; J.chsl; slash: ERASE; FM5; JNEZ.fail; FMMQ2/1; JS.assemno; SM9; J.chsc; digits: JCNZ8.dig; DC11; DC8; dig: SET-4; S+C11; M+I11; ZERO; SHADC11; REVD; SHAD-1; DUPD; SHAD-2; +D; +D; DUP; JNEZ.shift; SET4; S+C11; J.nxdig; shift: DUP; SHL1; JLTZ.nxdig; FI1; S+C11; SHAD1; J.shift; nxdig: FMMQ2/1; DUP; SET10; SIGN; JLTZ.dig; EXITH; *const:= 128 000 000 000 000; / 10**12 / 40 !label store, storeh; !end /[ ----- page 11 hconst: SET24; J.prog+1; dconst: SET-48; SRI5; ERASE; JS.einbs; J.common; pconst: ERASE; !begin nxchar: JS.pbs; DUP; SHL-6; JNEZ.long; JS.bstopr; JS.storechar; J.nxchar; storechar: SET-6; S+C3; SET#77; DUP; PERM; AND; REV; SHLDC3; NOT; FMM3/1; AND; OR; SMM3/1; JCZ3.endro-0s2; EXITH; query: ZERO; NOT; SHLC3; NOT; FMM3/1; OR; SMM3/1; SET6; SC3; J.storechar-1; long: SET#216; JEQ.ast; SET#230; JNE.find; fin: ERASE; FC3; FI5; DIVI; JEQZ.nxitem-0s1; SET#77; JS.storechar; J.fin; ERASE; JS.countl; pbs: JS.einbs; SET#240; JEQ.pbs-0s4; EXITH; !label pbs, lookup, storechar; find: SET15; JS.lookup; SHL-18; J.storechar-1; ast: ERASE; JS.pbs; SET#34; JEQ.query; DUP; SET10; SIGN; JLTZ.count; FI1; esym: SC5; SET#322; JEQ.octal; JS.pbs; REV; ZERO; JS.lookup; SHL-33; J.store; octal: JS.num; REV; DUP; SHL-6; JNEZ.fail; store: DUP; JS.storechar; DC5; JCNZ5.store; ERASE; JS.einbs+1s2; JS.pbs+0s3; J.nxchar+0s3; count: JS.num; REV; DUP; NEG; NOT; SHL-16; JNEZ.fail; J.esym; !end lookup: SC10; SET11; SRC11; *!begin FMQ11.symtab; SHLC10; SHL-39; JEQ.found; JCNZS11; J.fail; found: ERASE; FM11.symtab-1; EXITH; /tables of specials in P and { constants *symtab: /P formal/char/P spec/char/BS formal/BS =# 36 00 301 35 036 236; =# 16 02 321 36 016 240; =# 37 04 241 17 037 256; =# 31 07 246 16 034 215; =# 14 14 271 10 040 235; =# 17 77 214 12 014 216; =# 20 75 224 13 017 377; =# 33 03 242 11 020 276; =# 43 06 261 15 045 316; =# 40 32 220 32 027 220; =# 27 32 000 00 043 376; !end JS.countl; string: ERASE; nxsbs: JS.inbs; SET#377; JEQ.string; SET#240; JEQ.string-0s3; !begin SET#236; JEQ.string; SET#256; JEQ.string; SET#216; JEQ.ast; SET#235; JEQ.end; JS.storesyll; J.nxsbs; end: JS.einbs; SET#230; NEV; JNEZ.fail; fin: ERASE; FC3; FI5; DIVI; JEQZ.nxitem-0s1; SET#377; JS.storesyll; J.fin; ast: ERASE; JS.pbs; DUP; SET10; SIGN; JLTZ.count; FI1; SC5; esym: SET#322; JEQ.octal; SET30; JS.lookup; SET#377; AND; JS.store; J.nxsbs; octal: JS.num; REV; DUP; SHL-8; JNEZ.fail; JS.store; J.nxsbs+0s3; store: DUP; JS.storesyll; DC5; JCNZ5.store; ERASE; EXITH; count: JS.num; REV; DUP; NEG; NOT; SHL-16; JNEZ.fail; J.esym-0s2; /[ ----- page 12 !end sconst: ERASE; SET8; SRI5; JS.einbs; SET#215; JEQ.string; JS.input; FMMQ2/1; JS.assemno; REV; SET#230; NEV; JNEZ.fail; SHA39; STR; ERASE; SHL-39; JNV.lastsy; J.fail; !label num; num: DUP; SET10; SIGN; CFRQ0/11; !begin JLTZ.nosign; SET#322; NEV; JNEZ.fail; ZERO; JS.pbs; DUP; SHL-3; JNEZ.fail; octnum: OR; SHA3; JS.inbs; DUP; SHL-3; JEQZ.octnum; REV; SHL-3; REV; SET#377; JNE.exith; ERASE; ZERO; J.octnum; nosign: JS.pbs; SET10; DUPD; SIGN; JGEZ.erex; CAB; MULTD; CONT; +; J.nosign; !end tconst: JS.input; M+I2; ZERO; SET#230; FM3; FC3; SET48; DIVI; SET8; +; PERM; -; SM6; CMFRQ0/4; JS.part; SHLD-8; JS.storesyll; SHL-40; lastsy: JS.storesyll; J.nxitem; part: SC6; JS.calcadd; PERM; REVD; NEV; JNEZ.fail; SHL13; DUP; JEQZ.prog+1s2; REV; SET#17777; AND; OR; SLINK; FLINK; EXITH; qconst: FC3; FI5; NEV; JNEZ.fail; CMFRQ0/4; FM3; NEG; NOT; SM6; JS.input; M+I2; SET#241; SET8; JS.part; SHL32; MFRQ3/6; SET#241; SET40; JS.part; SHL16; OR; oneadd: SET#230; SET24; JS.part; OR; J.store; xconst: /instruction pattern constant !begin ERASE; xloop: FMMQ2/1; DUP; SHL-6; JNEZ.endx; JS.storechar; J.xloop; spec: SHL-4; SET#11; AND; J.xloop+1s2; endx: SET#301; JEQ.spec; SET#321; JEQ.spec; SET#230; JNE.fail; align: ERASE; FC3; FI5; DIVI; JEQZ.nxitem-0s1; ZERO; JS.storechar; J.align; !end octal: FI5; DUP; JLTZ.fail; NEG; NOT; SM5; JS.assemno; !begin REV; SET#241; JNE.end; ERASE; FMMQ2/1; JS.assemno; SM5; end: SET#230; NEV; JNEZ.fail; SET47; FM5; DUP; JLTZ.fail; -; SC5; DUP; SHLC5; REV; SHCC5; JNE.fail; /bits lost FI5; SHL-5; JNEZ.store; DUP; DUP; SHL24; JEQZ.storeh; J.fail; !end aconst: !begin ERASE; FI5; DUP; JLTZ.fail; CMFRQ3/6; CMFRQ0/4; SET48; NEV; DUP; JEQZ.oneadd; JS.calcadd; SET#230; NEV; JNEZ.fail; ZERO; PERM; JS.addup; J.storeh; !end !label storechar, lookup, pbs, input; !end /process label declaration ident: !begin FC2; NOT; NEG; S+M2; JS.packid; CMFRQ0/4; /only check repetion in this block JS.dsearch; J.boob; FMMQ2/1; SET#271; J=.implicit; /colon SET#242; NEV; J#Z.fail; /check = DC4; F.progid; JEQ.patch; SMMN7/0; ZERO; JS.calcadd; SET#271; NEV; JNEZ.fail; /[ ----- page13 /check terminator colon - address value in N1 store: SC11; SM11; IFRQ6/11; FQ11; SMMQ7/0; /complete dictionary entry JEQZ.nxitem; /jump if ref. table entry not reqd F.ssss; JS.printsix; F.lastlab; JS.printid; JS.printadd; JS.printline; F.refcount; DUP; NEG; NOT; S.refcount; F.length; +; JGTZ.nxitem; ZERO; S.refcount; JS.prnl; J.nxitem; implicit: ERASE; F.progid; J=.fail; /attempt to declare prog DUP; SMMN7/0; FI6; S.lineno; FM3; SET6; FC3; SHL-3; -; DUP; JEQZ.prog+2; DUPD; ERASE; VR; SHA34; JV.fail; ERASE; CAB; S.lastlab; F.tables; PERM; J.store; patch: ERASE; JS.calcadd; SET#271; NEV; J#Z.fail; DUPD; ERASE; JLTZ.fail; /prog would go negative FM3; PERM; SET6; REV; -; SHL3; SC3; /syllable DUP; SM3; MAX; F.inbfr; MAX; S.inbfr; ERASE; J.nxitem-0s1; boob: JS.because; J.fail; because: F.bdotodot+1; F.bdotodot; JS.printtwo; SET#377; JS.printid+0s3; FMM10/0; SHL16; SHL-32; J.printline+0s2; *bdotodot:= {*cbecause*sof*s}; !label because; !end /search dictionary for the work in N1 /C4 = 0 if search to stop at !begin marker (zero entry) dsearch: CMFRQ7/10; /use current dictionary pointer sdsearch: /entry with old dictionary pointer in Q10 !begin JCZ10.a+0s3; NC10; ITWO10; M+I10; *loop: FMMQN10/0; DUP; J=Z.b; J=.match; loopa: JCNZS10; EXIT.1; /end of dictionary b: ERASE; a: JCNZ4.loopa; /pass begins EXIT.1; /unallocated match: M-I10; FMM10/0; JGEZ.exith; M+I10; J.loopa; exith: EXITH; !label exith; !end packid: /packs identifier (backwards and left justified) !begin SET7; SC2; ZERO; FMM2/1; DUP; SET12; SIGN; J=��()*l*#376;#*a,*#376 abcdefghijklmnopqrstuvwxyz*2#376*e*2#376}; *btable=prog: /[ ----- page 26 =# 1271 0003 2242 0265; =# 0220 3211 0215 3231; =# 0235 3202 0222 3302; =# 0262 3276 0316 1046; =# 0017 0220 1063 0004; =# 0220 2051 0223 0067; =# 0220 0067 0220 0046; =# 0220 2076 0110 1047; =# 0013 0220 1052 0013; =# 0220 0054 0220 0056; =# 0220 2063 0214 1015; =# 0016 0220 0064 0220; =# 0064 0220 0061 0220; =# 0052 0220 0046 0220; =# 2063 0103 1050 0016; =# 0220 0064 0220 0062; =# 0220 0062 0220 0052; =# 0220 0063 0220 2071; =# 0200 1051 0004 0220; =# 2064 0326 1052 0022; =# 0220 1063 0004 0220; =# 2051 0234 1066 0004; =# 0220 2073 0303 0061; =# 0220 0070 0220 2052; =# 0245 1053 0017 0220; =# 1064 0004 0220 2067; =# 0206 0046 0220 0061; =# 0220 0070 0220 2051; =# 0315 1054 0014 0220; =# 0064 1220 0001 1236; =# 0002 0220 0071 0220; =# 2064 0210 1056 0025; =# 0220 3053 0205 1062; =# 0004 0220 2065 0263; =# 0063 0220 0071 0220; =# 0052 0220 0054 0220; =# 0052 0220 2067 0102; =# 1061 0027 0220 1046; =# 0010 0220 0047 0220; =# 0052 0220 2061 0171; =# 0056 0220 0047 0220; =# 0067 0220 0046 0220; =# 0067 0220 2076 0320; =# 1063 0006 0220 0064; =# 0220 2071 0203 1064; =# 0010 0220 3067 0243; =# 0074 0220 2063 0217; =# 2065 0022 0220 0067; =# 0220 0064 0220 0050; =# 0220 0052 0220 0051; =# 0220 0072 0220 0067; =# 0220 2052 0120 1067; =# 0010 0220 0052 0220; =# 0046 0220 2061 0101; =# 1070 0051 0220 1071; =# 0017 0220 1052 0004; =# 0220 2065 0266 0067; =# 0220 0056 0220 0063; =# 0220 2054 0172 1074; =# 0012 0220 0056 0220; =# 0071 0220 0051 0220; =# 2055 0130 0052 0220; =# 0054 0220 0062 0220; =# 0052 0220 0063 0220; =# 2071 0340 1071 0017; =# 0220 1055 0006 0220; =# 0052 0220 2063 0225; =# 0067 0220 0072 0220; =# 2052 0335 1072 0012; =# 0220 0063 0220 0071; =# 0220 0056 0220 2061; =# 0306 1073 0012 0220; =# 0046 0220 0061 0220; =# 0072 0220 2052 0237; =# 1074 0012 0220 0055; =# 0220 0056 0220 0061; =# 0220 2052 0226 1014; =# 0012 0220 0027 0220; =# 0022 0220 0032 0220; =# 2027 0300 1020 0010; =# 0220 0043 0220 0024; =# 0220 2037 0360 0026; =# 0220 0017 0220 0021; =# 0220 2011 0260 0000; !end *endptread: !end / !segment /8/endbase-1; /[ do this later / !segment -----P /ptread/prog-1; /[ do this later !end [ last end in source text * dhradix:=#0104101001041010; dhzeros:=#0020202000202020; dh10101010:=#1010101010101001; dh20202020:=#2020202036; dhlpout:= #30; prog=prog+20: dhtest: SET#31; SRM1; JS.dhprt; JS.dhprt; JS.dhprt; JS.dhprt; JS.dhprt; JS.dhprt; JS.dhprt; JS.dhprt; MBSKQ0; dhprt: SET.dhlpout+1; SRM2; F.dh10101010; FM1; FRB; F.dh20202020; OR; SMMQ2/0; FMM1/0; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; FMM1/0; SHL+16; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; FMMQ1/0; SHL+32; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; SET#170036; SMMQ2/0; FMM1/0; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; FMM1/0; SHL+16; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; FMMQ1/0; SHL+32; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; SET#170036; SMMQ2/0; FMM1/0; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; FMM1/0; SHL+16; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; FMMQ1/0; SHL+32; SHL-32; F.dhzeros; F.dhradix; CAB; FRB; OR; SMMQ2/0; SET#177702; SMM2/0; SET.dhlpout; SI2; CFRQ0/2; FQ2; SET8; OUT; EXITH; !end !end !end !end !end !end !end !end !end }}}}}}}}}}}}}}}}}}} // bogus for testing )))))))))))))))))))) Director instructions FNSC 176 001 K7; FPHU 176 004 K5; FRFIS 176 010 K4; SBANOL 175 100 =K1; SBUZZ 175 200 =K0; SCPDAR 175 040 =K2; SNSC 175 020 =K3; OUT; M+I4; !end !end !end F:\dh\KDF9>cat old/disc.txt F.num; SQ1; MRWDQ0; *num:= T num; =T2; =T #123; num2: =S#111; =S#222; =S#333; =S#44; =S#55; =S#66; !end !end !end !end !end F.ppp; MBSKQ0; *ppp:= P *safter*s; !end !end !end !end !end !end !end }}}}}}}}}}}}}}}}}} )))))))))))))))))) [MLBQ0;+; MLWEQ0;+; MLWQ0;+; MRWDQ0;+; �++0;+; [ last entry was originally �++0 [�+C0;+; MWEQ0;+; MWIPEQ0;+; MWQ0;+; NC0;+; J.#727s4; prog=#727s4: ZERO; ZERO; prno: SHLD-6; REV; SHL-2; REV; DUP; JNEZ.prog-0s7; ERASE; MBSKQ0; ZERO; DUP; DUP; DUP; DUP; lll: DUP; DUP; +; +; +; +; +; JLTZ.prog-0s7; OUT; !end !end !end !end SET-6; DUP; NEG; DIVI; MBSKQ0; !end !end !end !end F.qwd; F.qqq; SET32; OUT; ZERO; OUT; *qqq: = Q 1 / 1 / 1; qwd:= Q 1 / bbb / bbb+639; bbb: = 0; !end !end !end !end prog=0: /form B-block J.8; prog=8: SET6001; NEG; SET6000; DIVI; MBSKQ0; !end !end !end !end