esix-1/0042755000175000017500000000000007604721411010352 5ustar vlmvlmesix-1/defs.pal0100644000175000017500000000112106304342605011757 0ustar vlmvlm/OPCODE DEFINITIONS FOR PDP-8 ESI-X. /ASSEMBLY USING THE FULL SYMBOL TABLE OVERFLOWS MEMORY. / EXPUNGE AND=0000 /BASIC INSTRUCTIONS TAD=1000 ISZ=2000 DCA=3000 JMS=4000 JMP=5000 OPR=7000 / /IOTS -- TELETYPE AND DATA FIELD ONLY. / KSF=6031 KCC=6032 KRS=6034 KRB=6036 TSF=6041 TCF=6042 TLS=6046 CDF=6201 RDF=6214 / /OPERATE MICRO-INSTRUCTIONS / NOP=7000 IAC=7001 RAL=7004 RTL=7006 RAR=7010 RTR=7012 CML=7020 CMA=7040 CLL=7100 CLA=7200 CIA=7041 STA=7240 STL=7120 / XX=7402 HLT=7402 SKP=7410 SNL=7420 SZL=7430 SZA=7440 SNA=7450 SMA=7500 SPA=7510 FIXTAB esix-1/esix.pal0100644000175000017500000025221706305603743012030 0ustar vlmvlm/ EIGHT/S INTERPRETER. ESI / DAVID J. WAKS / APPLIED DATA RESEARCH, INC. / / EXTENDED FEATURE ESI-X. / OCTOBER 1, 1966 / REVISED JULY, 1967 --- ROBERT M. SUPNIK / / MACROES... DEFINE ROTR4 DEFINE ROTR6 DEFINE ROTR8 DEFINE ROTL5 DEFINE ROTL4 DEFINE ROTR3 DEFINE ROTR5 DEFINE ROTL6 XX=HLT / / / ASSEMBLY PARAMETERS... / / NUMBER OF WORDS DEVOTED TO EACH F-P NUMBER IS... NUMWD=3 / NUMBER OF DECIMAL DIGITS OF PRECISION IS... PREC=NUMWD+NUMWD+NUMWD-2 / / /SYNTAX TABLE DEFINITIONS AND MACROES. / /FIRST WORD: / DEFINE TERML A DEFINE SUBGL A / /SECOND WORD: / / ALTERNATE: / ALTLOC = LOCATION OF ALTERNATE (1-15 WORDS FOLLOWING) / SUCLOC = LOC. OF SUCCESSOR (-26 TO +7 WORDS) / = NOSUC / QGEN = ?NEXT WORD A GENERATOR - "YES" OR "NO" / YES=1 NO=0 DEFINE FCALT ALTLOC SUCLOC QGEN < NOSUC=.-27 VFD 1:QGEN, 2:2, 4:ALTLOC-.-1, 5:SUCLOC-.+27> / / / OK TO FAIL: / DEFINE FCOK SUCLOC QGEN < NOSUC=.-27 VFD 1:QGEN, 2:1, 4:0, 5:SUCLOC-.+27> / / / DEAD: / DEFINE FCDEAD SUCLOC QGEN < NOSUC=.-27 VFD 1:QGEN, 2:3, 4:0, 5:SUCLOC-.+27> / / / FAIL: / DEFINE FCFAIL SUCLOC QGEN < NOSUC=.-27 VFD 1:QGEN, 2:0, 4:0, 5:SUCLOC-.+27> / / /WORDS 3-N (GENERATORS): / DEFINE GEN GENLOC QGEN /STRING MANIPULATION MACROES. / DEFINE ADV PTRNAM < JMS I [ADVPS] PTRNAM> / DEFINE RD PTRNAM < JMS I [RDS] PTRNAM> / DEFINE RDADV PTRNAM < JMS I [RDADVS] PTRNAM> / DEFINE WR PTRNAM < JMS WRS PTRNAM> / DEFINE WRADV PTRNAM < JMS I [WRADVS] PTRNAM> / DEFINE BKPTR PTRNAM < JMS BKPTRS PTRNAM> / DEFINE DIFPTR PTR1 PTR2 < JMS I [DIFPS] PTR1 PTR2> / DEFINE TYSTRG PTRNAM < JMS TYSTRS PTRNAM> DEFINE CPY A B < TAD A DCA B> / PAGE 0 ASSIGNMENTS. / /AUTO-INDEX REGISTERS. *10 AX0, 0 AX1, 0 AX2, 0 AX3, 0 AX4, 0 AX5, 0 / /FLOATING-POINT ARITHMETIC REGISTERS... / *20 DIGAC, 0 /QUOTIENT ACCUMULATOR MQ, 0 /FLOATING MQ REGISTER (FMQ) *MQ+PREC AC, 0 /FLOATING ACCUMULATOR (FAC) *AC+PREC ACX, 0 /FAC EXPONENT ACS, 0 /FAC SIGN IR, 0 /FLOATING INPUT REGISTER (IR) *IR+PREC IRX, 0 /IR EXPONENT IRS, 0 /IR SIGN ALDIG, 0 /ALIGNMENT AND AC OVERFLOW DIGIT / / / TEMPORARIES... / CRWD, 0 WDCNT, 0 /WORD COUNTER FOR LOOPS. ALCNT, 0 /NUMBER OF SHIFTS FOR REGISTER /ALIGNMENT. MULCNT, 0 /MULTIPLICATION COUNT NORMFR, 0 /"FROM" WORD POINTER. NORMTO, 0 /"TO" WORD POINTER. TMP, 0 /GENERAL TEMPORARY. /MAIN CONTROL PAGE 0 ASSIGNMENTS. / ENDPR, USERPR /CURRENT END OF USER PROG STORAGE ARYNXT, USEREND /CURRENT END OF ELEMENT STORAGE. STKNXT, 0 /CURRENT TOP OF STACK. STEPNO, 0 /STEP NUMBER IF INDIRECT *STEPNO+NUMWD GOAL=16 / / /FOR VARIABLES: INDEX, 0 /LOCATION OF "FOR" INDEX VARIABLE. INCR, 0 /VALUE OF "FOR" INCREMENT *INCR+NUMWD INCRSN, 0 /INCREMENT SIGN. TRMVAL, 0 /"FOR" TERMINAL VALUE. *TRMVAL+NUMWD / /LEXICAL ANALYSER TEMPORARIES AND DEFINITIONS. / NXTTTC=17 /NEXT TERMINAL TYPE CODE. NXTLXF, 0 /CURRENT GADGET START. QRTF, 0 XSTEP, 0 /LOC. OF INDIRECT STEP; 0 IF DIRECT NXTLXN, 0 /CURRENT CHARACTER BEING EXAMINED 0 CURSYM, 0 /LOCATION OF CURRENT V ARIABLE. QANYIN, 0 /?ANY INPUT IN BUFFER OR FAC CURCHR, 0 /LAST CHARACTER READ FROM STRING. SVLXF, 0 /STRING POINTER USED IN "TYPE". 0 VARNAM, 0 /VARIABLE NAME IN SCAN VARLOC, 0 /VARIABLE LOCATION IN SCAN / PRVSTP, 0 /PREVIOUS STEP LOCATION CURSTP, 0 /CURRENT STEP LOC. TEMPORARY NXTSTP, 0 /LOCATION OF NEXT STEP POINTER. / / /UNPACKED STRING POINTERS. /USED BY STRING MANIPULATION SUBROUTINES. / ADVAC, 0 /PDP-8 AC STORAGE PTR1ST, 0 /LOCATION OF CURRENT WORD IN STRING LPTR1ST, 0 /LOCATION OF STRING WORD POINTER. PTR2ND, 0 /LOCATION OF ?RIGHT. QADVC, 0 /?ADVANCE AFTER READ OR WRTIE. QEOL, 0 /END OF LINE FLAG QINSTAT, 0 /INTERRUPT STATEMENT FLAG PAGEKNT, 0 / / "INTERRUPT" AND "CANCEL" TELETYPE CODE IS: ICODE=375 / ("ALT MODE"). /MAJOR LOCATION REFERENCES AND SUBROUTINE CALLS: DEFINE GET A < TAD A JMS I [GETNUM]> DEFINE STORE A < TAD A JMS I [STPACK]> RETURN=JMP I [SUCLP2] PUSH=JMS I [PUSH1] POP=JMS I [POP1] SWP=JMS I [SWAP] TYPE=JMS I [TYCHAR] CRLF=JMS I [TYCRLF] / / PAGE 21 /TYCHAR /TYPE AN ASCII CHARACTER. /CHARACTER IN 8AC ON ENTRY, LEFT CLEAR ON EXIT. / TYCHAR, 0 TSF /IS TELEPRINTER READY? JMP .-1 /NO. TLS /YES. PRINT CHARACTER. CLA JMP I TYCHAR BP21=. LIT PAGE 30 / /TYCRLF /TYPE CARRIAGE RETURN/LINE FEED. /8AC CLEAR ON ENTRY AND EXIT. TYCRLF, 0 TAD ECR TYPE /TYPE "CR". TAD ELF TYPE /TYPE "LF". ISZ LINEKNT /IS LINE COUNT ZERO? JMP I TYCRLF /NO. JMS EJECT /YES, GO TO TOP OF FORM JMS NEWPAGE /PRINT NEW HEADING. JMP I TYCRLF / ECR, 215 ELF, 212 BP30=. LIT PAGE 1 /ESI-B GENERATORS. / /"SET" GENERATORS. / PSHCUR, TAD CURSYM /PUT "CURSYM" IN STACK. GPD, PUSH RETURN / STOREC, POP /GET LOCATION OF VARIABLE. DCA CURSYM /RECOVER VARIABLE LOC. CDF 10 TAD I CURSYM /GET CONTROL WORD. CDF 0 TAD (-3777) SNA CLA /IS IT SUBSCRIPTED? JMP ERRSUB /YES. SUBSCRIPT ERROR. CDF 10 STORE CURSYM /NO, STORE AND PACK AC THERE. RETURN / ACTOS, JMS PUSHAC /STORE FAC. RETURN / PUSHAC, 0 /SUBROUTINE TO STORE FAC. TAD STKNXT TAD [NUMWD-1] CIA CLL TAD ARYNXT /ARYNXT-(STKNXT+NUMWD-1) SNL CLA /IS IT POSITIVE? JMP ERRSO /NO. STACK OVERFLOW. CDF 10 STORE STKNXT /YES, STORE PACKED AC IN STACK. TAD STKNXT TAD [NUMWD] /INCREMENT STACK POINTER. DCA STKNXT / BY NUMWD. JMP I PUSHAC /EXIT. / POPAC, 0 /ROUTINE TO POP STORED AC. TAD STKNXT TAD [-NUMWD] /GET LOC. OF PACKED AC ON STACK DCA STKNXT CDF 10 GET STKNXT /UNPACK STACK TO FAC JMP I POPAC / POPDO, SWP /SWAP FAC AND IR. JMS POPAC /UNPACK TOP OF STACK TO FAC. DO, POP /GET LOCATION OF OPERATION. DCA TMP JMP I TMP /GO TO DELAYED OPERATION. / TOAC, CDF 10 /GET FIRST WORD OF VARIABLE. TAD I CURSYM CDF 0 AND [3777] TAD (-3777) SNA CLA /IS VARIABLE DEFINED AND SIMPLE? JMP ERRUND /NO. CDF 10 GET CURSYM /GO GET AND UNPACK NUMBER SPEC. BY CURSYM. RETURN / STDIV, TAD [DFDV-DFMU] STMUL, TAD [DFMU-DFSB] STSUB, TAD [DFSB-DFAD] STADD, TAD (DFAD) /LOCATION OF "FAD" ROUTINE. GPDU, JMS PUSH1U /STORE ON STACK UNDER TOP. RETURN / /PUSH1U - PUSHES A WORD, GIVEN IN 8AC AT ENTRY, INTO /STACK DIRECTLY UNDER TOP WORD. USED FOR DELAYED GENERATORS / PUSH1U, 0 DCA TMP /SAVE VALUE. POP /GET TOP WORD OF STACK. DCA WDCNT /SAVE IT. TAD TMP PUSH /PUSH DOWN NEW WORD. TAD WDCNT PUSH /PUSH OLD TOP. JMP I PUSH1U /ESIT. / / DFAD, JMS FAD RETURN / DFSB, JMS FSB RETURN / DFMU, JMS FMU RETURN / DFDV, JMS FDV RETURN / /PROCESS "LOG ON". / PRLON, TAD (LONMES) /PUT OUT "TITLE: " MESSAGE. JMS TYPKST JMS INPUT /READ INPUT LINE INTO 'BUFF'. CPY [TITBUF],SVLXF CPY [0010],SVLXF+1 PRLON1, RDADV NXTLXF /READ AN INPUT CHAR. TAD (-ICR) /IS IT CR? SNA CLA JMP PRLON1 /YES, IGNORE IT. TAD CURCHR /NO, WRITE IT IN TITLE BUFFER. WRADV SVLXF TAD CURCHR /WAS THE CHAR. EOL? SZA CLA JMP PRLON1 DCA PAGEKNT DCA LINEKNT PRPAGE, JMS EJECT /GO TO TOP OF FORM. JMS NEWPAGE /PRINT NEW HEADING. RETURN / LINEKNT, -LINPAG PRLOF, JMP UPRLOF /GENERATOR IN UPPER 2K. EP1=. LIT / PAGE 23 LONMES, TEXT /TITLE: / / /PROCESS "LOG OFF". / UPRLOF, JMS EJECT /GO TO TOP OF FORM. TAD (LF3-1) /EJECT 3 LINES TO ALIGN TEAR MARKS JMS TYUNPK TAD (LF3-1) /ACTUALLY, WE MUST EJECT 7 TIMES. JMS TYUNPK DCA PAGEKNT /CLEAR THE PAGE COUNT. CDF 10 DCA I [TITBUF] /CLEAR THE TITLE BUFFER. CDF 0 JMP PLINE /DO CRLF AND SET CR SWITCH. BP23=. LIT PAGE 34 /FDTOB /FLOATING DECIMAL TO BINARY CONVERSION. /INTEGER PART OF FAC IS CONVERTED TO A SIGNED BINARY INTEGER, /WHICH IS LEFT IN THE 8AC AT EXIT. THE LEGAL RANGE IS -999 /TO +999; VIOLATION CAUSES "SUBSCRIPT" ERROR. / FDTOB, 0 TAD AC+PREC-1 /GET H-O DIGIT OF FAC DCA MULCNT TAD ACX SNA SPA /IS EXPONENT GT 0? JMP FDTOBX /NO. INTEGER PART IS 0. TAD [-1] /YES. SNA CLA /IS EXPONENT = 1? JMP FDTOB1 /YES. DONE. JMS BMUL10 /NO. MULTIPLY MULCNT BY 10. TAD AC+PREC-2 /ADD NEXT AC DIGIT. DCA MULCNT TAD ACX TAD [-2] SNA CLA /IS EXPONENT = 2? JMP FDTOB1 /YES. JMS BMUL10 /NO. TAD AC+PREC-3 /ADD THIRD AC DIGIT. DCA MULCNT TAD ACX TAD [-3] SZA CLA /IS EXPONENT = 3? JMP ERRSUB /NO. SUBSCRIPT ERROR. FDTOB1, TAD ACS SNA CLA /IS AC SIGN "+"? JMP FDTOB2 /YES. TAD MULCNT /NO. CIA /COMPLEMENT RESULT. JMP I FDTOB / FDTOB2, TAD MULCNT JMP I FDTOB / FDTOBX, CLA JMP I FDTOB / BMUL10, 0 TAD MULCNT /MULTIPLY MULCNT BY 10. CLL RAL DCA MULCNT TAD MULCNT CLL RTL TAD MULCNT JMP I BMUL10 BP34=. LIT PAGE 3 /PROCESS SUBSCRIPTED VARIABLES. / /SET ?PERMIT UNDEFINED (QPUND) TO 0 OR 1. SQPUN1, CLA IAC SQPUN0, DCA QPUND /SET TO 0 OR 1. RETURN / / /SAVE QPUN ON STACK. STQPUN, TAD QPUND /SAVE QPUND. PUSH JMP SQPUN0 /CLEAR QPUND / /STORE FIRST SUBSCRIPT: STSUB1, JMS FDTOB /GET BINARY VALUE OF SUBS1. PUSH /SAVE IT ON STACK. CLA IAC /SET # OF SUBS TO 1. PUSH CLA IAC /SET 2ND SUBSCRIPT TO 1. GPD3, PUSH RETURN / /STORE SECOND SUBSCRIPT: / STSUB2, POP /THROW AWAY FALSE SUBS2. POP /GET OF SUBS. IAC /ADD 1. PUSH /PUT BACK 2. JMS FDTOB /GET BINARY VALUE OF SUBS2. JMP GPD3 /PUT IT ON STACK. BP3=. LIT PAGE 2 /COMPUTE SUBSCRIPT ELEMENT LOCATION. /STACK HAS FOLLOWING VALUES AT ENTRY : / TOP - SECOND SUBSCRIPT (SUBS2) / TOP-1 - NUMBER OF SUBSCRIPTS (NUMSUB) / TOP-2 - FIRST SUBSCRIPT (SUBS1) / TOP-3 - ?PERMIT UNDEFINED ELEMENT (QPUND) / TOP-4 - LOC. OF VARB. CONTROL WORD (CURSYM) / /AT EXIT: / CURSYM - LOCATION OF ELEMENT IN VARIBLE STORAGE / /8AC IS CLEAR ON ENTRY AND EXIT. / CMPSUB, POP /GET ALL SAVED VALUES. DCA SUBS2 POP DCA NUMSUB POP DCA SUBS1 POP DCA QPUND POP DCA CURSYM CDF 10 TAD I CURSYM /GET VARIABLE CONTROL WORD. CDF 0 CMA SNA /IS IT "UNDEFINED"? JMP PRU1 /YES. TAD [4000] SZA CLA /IS IT "SUBSCRIPTED"? JMP ERRSUB /NO. SUBSCRIPT ERROR. ISZ CURSYM /YES. CDF 10 TAD I CURSYM /GET # OF SUBSCRIPTS. CDF 0 CIA TAD NUMSUB SZA CLA /IS IT RIGHT? JMP ERRSUB /NO. SUBSCRIPT ERROR. ISZ CURSYM /ADVANCE TO ENTRY LOC. CMPL1, TAD CURSYM CDF 0 /BECAUSE OF FOLLOWING INDIRECT LINK. DCA PREVEL /SAVE PREDECESSOR LOC. CDF 10 TAD I CURSYM /GET POINTER TO NEXT ELEMENT. CDF 0 CLL TAD (-VBLKEND) /IS THERE A NEXT ELEMENT? SNL JMP PRU2 /NO. NOTE: AC NOT CLEAR. TAD (VBLKEND) DCA CURSYM /YES. MAKE IT CURRENT. TAD CURSYM DCA AX0 /LOCATION OF 1ST SUBSCRIPT. CDF 10 TAD I AX0 /GET 1ST SUBSCRIPT. CIA TAD SUBS1 SZA CLA /IS IT DESIRED VALUE? JMP CMPL1 /NO. TAD I AX0 /YES. GET SECOND SUBS. CIA TAD SUBS2 SZA CLA /IS IT DESIRED VALUE. JMP CMPL1 /NO. ISZ AX0 /YES. SET LOCATION OF VALUE. TAD AX0 DCA CURSYM CDF 0 RETURN /DONE. / /CREATE NEW ELEMENT IF ALLOWED (ELEMENT IS BEING DEFINED). PRU1, TAD QPUND SNA CLA /CAN IT BE UNDEFINED? JMP ERRSUB /NO. SUBSCRIPT ERROR. TAD [3777] CDF 10 DCA I CURSYM /SET VARIABLE "SUBSCRIPTED". ISZ CURSYM TAD NUMSUB /SET # OF SUBS. DCA I CURSYM ISZ CURSYM TAD CURSYM /REL LOC. OF POINTER. DCA I CURSYM /GOES TO POINTER WORD. CDF 0 CMPS2, TAD ARYNXT TAD (-NUMWD-3) /LOCATION OF NEW ELEMENT. DCA ARYNXT TAD STKNXT CIA CLL TAD ARYNXT SNA JMP ERRSO /NO ROOM FOR ELEMENT. SNL CLA JMP ERRSO CLA CMA TAD ARYNXT DCA AX0 CDF 10 TAD I CURSYM /GET POINTER OF LAST ELEMENT. DCA I AX0 /SET INTO NEW ELEMENT. TAD ARYNXT /MAKE PREVIOUS ELEMENT DCA I CURSYM / POINT OT NEW ONE. TAD SUBS1 /STORE SUBSCRIPT VALUES. DCA I AX0 TAD SUBS2 DCA I AX0 CLA CMA DCA I AX0 /SET ELEMENT "UNDEFINED". CDF 0 TAD AX0 DCA CURSYM /SET CURSYM TO NEW ELEMENT LOC. RETURN / PRU2, CLA TAD QPUND SNA CLA /CAN IT BE UNDEFINED JMP ERRSUB /NO. SUBSCRIPT ERROR. JMP CMPS2 /YES. CREATE NEW ELEMENT. / /TEMPORARIES: NUMSUB, 0 /NUMBER OF SUBSCRIPTS IN REFERENCE SUBS1, 0 /FIRST SUBSCRIPT VALUE. SUBS2, 0 /SECOND SUBSCRIPT VALUE QPUND, 0 /?PERMIT UNDEFINED ELEMENT. EP2=. LIT *BP3 /BUILT-IN FUNCTIONS. / SPRIP, TAD (PRIP-PRFP) SPRFP, TAD (PRFP-PRSGN) SPRSGN, TAD (PRSGN-PRABS) SPRABS, TAD (PRABS-PRSIN) SPRSIN, TAD (PRSIN-PRCOS) SPRCOS, TAD (PRCOS-PRSQRT) SPRSQRT, TAD (PRSQRT-PREXP) SPREXP, TAD (PREXP-PRLOG) SPRLOG, TAD (PRLOG-PRARC) SPRARC, TAD (PRARC-PRLN) SPRLN, TAD (PRLN-PRDP) SPRDP, TAD (PRDP-PREP) SPREP, TAD (PREP) JMP GPDU / / PRIP, JMS IPS /GET INTEGER PART OF FAC. RETURN / PRFP, JMS FPS /GET FRACTION PART. RETURN / FPS, 0 JMS PUSHAC /SAVE FAC. JMS IPS /GET IP OF FAC. SWP /FAC TO IR. JMS POPAC /GET FAC. JMS FSB /SUBSTRACT IP FROM FAC. JMP I FPS / PRSGN, TAD [-PREC] JMS CLFACS /CLEAR ALL FAC DIGITS. ISZ AC+PREC-1 /FORCE H-O DIGIT OF FAC TO 1. CLA IAC DCA ACX /FORCE ACX TO 1. RETURN / / /IPS /INTEGER PART OF FAC TO FAC. IPS, 0 TAD ACX /AC EXP. IS # OF INTEGER DIGITS. SPA CLA /IS ACX POSITIVE? DCA ACX /NO. CLEAR ALL AC DIGITS. TAD ACX TAD [-PREC] /SUBTRACT PRECISION. SMA /IS ACX 7 OR MORE? SKP CLA /YES. FAC IS INTEGRAL ALREADY. JMS CLFACS /NO. GO CLEAR SPEC. OF DIGITS. JMP I IPS /EXIT. / / /CLEAR SPECIFIED OF LOW-ORDER DIGITS OF FAC. CLFACS, 0 DCA WDCNT /SET WORD COUNT FOR # OF DIGITS. TAD [AC-1] /INITIAL CLEAR LOCATION. DCA AX1 CLFAC1, DCA I AX1 /CLEAR AN FAC DIGIT. ISZ WDCNT JMP CLFAC1 JMP I CLFACS / /CONDITIONAL CARRIAGE RETURN IN TYPE STATEMENTS. PLINE, TAD (CRLF) /SET SWITCH TO "RETURN". PNLINE, DCA .+1 /SET SWITCH TO "NO RETURN". CNLINE, CRLF /CONDITIONAL RETURN, EITHER "CRLF" OR "0000=NOP". RETURN / STUPAR, TAD (DFEXP) /SAVE ADDR OF ^ GENERATOR. JMP GPD3 EP3=. LIT PAGE 4 /"FOR" GENERATORS. / /SAVE INDEX LOCATION: SVINDX, TAD CURSYM /SAVE CURSYM DCA INDEX RETURN / /SAVE INCREMENT VALUE: SVINCR, STORE (INCR) /SAVE INCREMENT. TAD ACS DCA INCRSN /SAVE INCREMENT SIGN. RETURN / /STORE TERMINAL VALUE, AND PROCESS FOR. PRFOR, STORE (TRMVAL) /STORE TERMINAL VALUE. PRFORL, GET (TRMVAL) /TERMINAL VALUE TO FAC. SWP /NOW IN IR. CDF 10 GET INDEX /INDEX VALUE TO FAC. JMS FSB /INDEX - TRMVAL TO FAC. TAD ACS TAD INCRSN AND [0020] /SIGN(INCR)*SIGN(DIFFERENCE). SNA CLA /IS IT GE 0? JMP PRFOR4 /YES. SEE IF IT IS GT 0. PRFOR1, TAD (INDEX-1) /NO. PUSH DOWN INDEX, INCR, DCA AX0 / INCRSN, TRMVAL. TAD (-NUMWD-NUMWD-5) /AND LEX. POINTERS. DCA WDCNT PRFR1L, TAD I AX0 PUSH /PUSH A WORD. ISZ WDCNT /DONE? JMP PRFR1L /NO. TAD SYNAN /PUSH SYNAN RETURN LOC. PUSH TAD XSTEP SZA CLA /IS THIS A DIRECT STATEMENT? TAD (ISTAT-DSTAT1) /NO. MAKE AN . TAD (DSTAT1-1) /YES. MAKE A . PRFOR2, JMS SYNAN /CALL SYNTACTIC ANALYSER (RECURSION POP /POP UP ALL VARIABLES. DCA SYNAN TAD (-NUMWD-NUMWD-5) DCA WDCNT TAD (XSTEP) DCA NORMTO PRFR2L, POP DCA I NORMTO CLA CMA TAD NORMTO DCA NORMTO ISZ WDCNT JMP PRFR2L GET (INCR) /GET INCREMENT. SWP CDF 10 GET INDEX /GET INDEX VARIABLE VALUE. JMS FAD /ADD INDEX AND INCR. CDF 10 STORE INDEX /STORE IN INDEX, LEAVE IN FAC. JMP PRFORL / PRFOR4, TAD AC+PREC-1 /GET FAC H-O DIGIT. SNA CLA /IS FAC GT 0? JMP PRFOR1 /NO. EQUAL TO 0. RETURN /YES. EXIT. /"STOP" GENERATOR. / PRSTOP, POP /REMOVE AND POP /FROM THE STACK. CLA TAD (STPMSG) PRSTP1, JMS TYPKST /TYPE STOP MESSAGE. TAD (ERST+3) JMS TYPKST /TYPE "IN STEP". TAD XSTEP /LOCATION OF THIS STEP. JMS TYSNUM /GO TYPE STEP NUMBER. PRSTP3, CRLF PRSTP2, JMS INPUT /GET A LINE. ISZ QINSTAT DCA XSTEP /SET FOR "DIRECT". TAD (INTST-1) JMS SYNAN /CALL SYNTACTIC ANALYSER . JMP PRSTP2 /CONTINUE IN INTERRUPT MODE. / STPMSG, TEXT /"STOP" / INTMSG, TEXT /INTERRUPTED / / /ILLEGAL INTERRUPT COMMAND MESSAGE. ILLINT, TAD (EHMSG) /TYPE "EH?". JMS TYPKST JMP PRSTP3 /ACCEPT NEXT INTERRUPT MESSAGE. /"IF" GENERATORS. / / STGT, TAD (GGT-GLT) STLT, TAD (GLT-GGE) STGE, TAD (GGE-GLE) STLE, TAD (GLE-GEQ) STEQ, TAD (GEQ-GNE) STNE, TAD (GNE) JMP GPDU EP4=. LIT PAGE 5 / GGT, JMS COMP /COMPARE FAC WITH IR. JMP POPEX /AC < IR. JMP POPEX /AC = IR RETURN /AC > IR. SUCCESS. / GLT, JMS COMP RETURN JMP POPEX POPEX, POP /POP STACK TO REMOVE . CLA /OR . EXIT, JMP SYNEXIT /EXIT FROM SYNTACTIC ANALYZER. / GGE, JMS COMP JMP POPEX RETURN RETURN / GLE, JMS COMP RETURN RETURN JMP POPEX / GEQ, JMS COMP JMP POPEX RETURN JMP POPEX / GNE, JMS COMP RETURN JMP POPEX RETURN /COMP /COMPARISON SUBROUTINE. COMPARES FAC WITH IR, / DESTROYING BOTH IN THE PROCESS. 8AC IS 0 ON ENTRY /AND EXIT. /CALLING SEQUENCE IS: / JMS COMP / ... /IF AC < IR. / ... /IF AC = IR. / ... /IF AC > IR. / COMP, 0 JMS FSB /SUBTRACT IR FROM FAC. TAD ACS SZA CLA /IS FAC SIGN NEGATIVE? JMP I COMP /YES. ISZ COMP /NO. TAD AC+PREC-1 /GET H-O FAC DIGIT. SZA CLA /IS IT 0? ISZ COMP /NO. JMP I COMP /YES. THEREFOR FAC IS 0. EP5=. LIT *EP1 /"TYPE" GENERATORS. / SAVNXT, TAD NXTLXF /SAVE LEXICAL ANALYSER POINTER TO DCA SVLXF /CURRENT CHARACTER OF INSTRUCTION TAD NXTLXF+1 / STRING. DCA SVLXF+1 RETURN PAGE 6 / PSHNXT, DIFPTR NXTLXF,SVLXF /SVLXF-NXTLXF DCA WDCNT /STORE # OF CHARAS. RETURN PSHNX1, JMS TYEXPR /GO TYPE SYMBOLIC EXPRESSION RETURN / AND FAC. EP6=. *EP5 / TYEXPR, 0 TAD [NUMLSP] /# OF SPACES BEFORE "=". TAD WDCNT /SUBTRACT CHAR COUNT. SPA SNA /SHOULD LEADING SPACES BE PRINTED? JMP PTOT2 /NO. (NOTE AC NOT 0). JMS TYSPC /GO TYPE SPACES. PTOT2, DCA TMP /SAVE WHETHER OR NOT TO TYPE SPACES /AFTER = SIGN. JMS PRSTRG /TYPE CHAR. STRING. TAD TMP JMS TYVAL /GO TYPE VALUE. JMP I TYEXPR /EXIT. NUMLSP=DECIMAL 10 OCTAL /TYPE "STRING" GENERATORS. / TSTRG, TAD ALCNT /# OF CHARS. DETERMINED BY TCSCRS. SNA /IS IT 0? RETURN /YES. DON'T TYPE ANYTHING. CIA /NO. COMPLEMENT FOR COUNT. DCA WDCNT / OF CHARACTERS TO BE TYPED. ADV SVLXF /ADVANCE OVER FIRST ". JMS PRSTRG /PRING STRING. RETURN / / /PRSTRG /PRINT STRING SUBROUTINE. /PRINTS A STRING OF INTERNAL CHARACTERS. /FIRST CHARACTER LOCATION IS IN SVLXF AT ENTRY. /"WDCNT" HAS COMPLEMENT OF OF CHARS TO PRINT. /8AC IS 0 AT EXIT. / PRSTRG, 0 PRSL, RDADV SVLXF /GET NEXT CHARACTER. JMS TYINCH /TYPE CHAR. ISZ WDCNT /END OF LOOP? JMP PRSL /NO. JMP I PRSTRG /YES. / / /TYSPC /TYPE NUMBER OF SPACES SPECIFIED BY 8AC AT ENTRY. /8AC IS CLEAR AT EXIT. / TYSPC, 0 CIA DCA TMP TYSPCL, TAD (240) TYPE ISZ TMP /DONE? JMP TYSPCL /NO. JMP I TYSPC EP5=. LIT *EP2 /PROCESS UNARY MINUS. / SCHSGN, TAD (CHSGN) JMP GPD / CHSGN, TAD ACS /COMPLEMENT FAC SIGN. CMA AND [0020] PRABS, DCA ACS RETURN / /TYPE FLOATING FAC. TYFAC, IAC JMS TYFP /TYPE FAC WITHOUT LEADING SPACES. RETURN LIT *EP6 /TYPE ALL VALUES. / TAVAL, CRLF /RETURN CARRIAGE AT START. JMS SCNVRB /GO TO SCAN VARIABLES. JMP PRLINE /FINAL EXIT WHEN DONE SCAN. JMS TYPVAR /PLUGGED IN ROUTINE -- TYPE VAR. NOP /DONT CARE IF UNDEFINED. JMP SCNRET /TYPE ALL "A". / TYARRY, CPY CURSYM,VARLOC /COPY VARIABLE LOCATION TO VARLOC RD SVLXF /AND VARIABLE NAME TO VARNAM. DCA VARNAM JMS TYPVAR /TYPE OUT VARIABLE. JMP ERRUND /IF UNDEFINED, ERROR. PRLINE, CRLF /RETURN CARRIAGE AND EXIT. RETURN / /TYPE VARIABLE ROUTINE. /VARIABLE NAME IN 'VARNAM', LOCATION IN 'VARLOC'. / TYPVAR, 0 CDF 10 TAD I VARLOC /PLUGGED IN ROUTINE FOR VARB. CDF 0 CMA SNA /IS VARIABLE DEFINED? JMP I TYPVAR /NO, TAKE UNDEFINED EXIT. ISZ TYPVAR TAD [-4000] SNA CLA /IS VARIABLE SIMPLE? JMP TYSUBS /NO. TAD (NUMLSP-1) JMS TYSPC /TYPE SPACES. TAD VARNAM /TYPE VARIABLE NAME. JMS TYINCH CDF 10 GET VARLOC /UNPACK NUMBER. JMS TYVAL /GO TYPE VALUE. CRLF /RETURN CARRIAGE. JMP I TYPVAR /RETURN. / /TYPE OUT ALL VALUES OF A SUBSCRIPTED VARIABLE. / TYSUBS, TAD VARNAM /VARIABLE NAME IN PACKED CODE. CLL RTL ROTL4 TAD (ILBRAC) DCA OUTBUF /STORE AND "[". TAD VARLOC IAC DCA CURSYM /SET VARIABLE LOCATION. CLA CMA CDF 10 TAD I CURSYM /GET OF SUBSCRIPTS -1. DCA IRX /SAVE IT. ISZ CURSYM TYSUBL, TAD I CURSYM /GET CURRENT "NEXT" POINTER. CLL TAD (-VBLKEND) /IS IT LAST ELEMENT? SZL CLA JMP TYSUB1 /NO. CDF 0 /YES. JMP I TYPVAR /FINISHED WITH VARIABLE. / TYSUB1, TAD I CURSYM /LOCATION OF NEW ELEMENT. DCA CURSYM TAD CURSYM DCA AX4 TAD (OUTBUF+1) DCA SVLXF /INITIALISE STRING POINTER. DCA SVLXF+1 TAD I AX4 /GET FIRST SUBSCRIPT VALUE. CDF 0 JMS BTOD /CONVERT TO DECIMAL. TAD IRX SNA CLA /HOW MANY SUBSCRIPTS? JMP TYSUB2 /1. TAD (ICOMMA) /2. WRADV SVLXF /WRITE "," INTO STRING. CDF 10 TAD I AX4 /GET 2ND SUBSCRIPT VALUE. CDF 0 JMS BTOD /CONVERT O DECIMAL. TYSUB2, TAD (IRBRAC) WRADV SVLXF /WRITE "]" INTO STRING. TAD CURSYM TAD [3] /LOCATION OF VALUE. CDF 10 JMS I [GETNUM] /GET VALUE. DIFPTR SVLXF,LBUFF /GET OF CHARS. DCA WDCNT TAD LBUFF DCA SVLXF DCA SVLXF+1 /RESET POINTER TO BEGINNING. JMS TYEXPR /TYPE NAME AND VALUE. CRLF /RETURN CARRIAGE. CDF 10 JMP TYSUBL /GO PROCESS NEXT ELEMENT. / OUTBUF=IR LBUFF, OUTBUF /LOCATION OF BUFFER 0 /USED IN LENGTH COMPUTATION. / /TYPE "SIZE". / TYPSIZ, TAD [NUMLSP] /TYPE OUT LEADING SPACES. JMS TYSPC TAD STKNXT /COMPUTE AMOUNT OF SPACE LEFT: CMA /AYNXT-STKNXT-1. TAD ARYNXT JMS BTODX /CONVERT RESULT TO DECIMAL AND PRINT. JMP PRLINE / EP6=. LIT *BP34 /BINARY TO DECIMAL CONVERSION. / BTOD, 0 SPA /IS VALUE POSITIVE? JMP BTODM /NO. DCA IRS /YES. SVE IT. BTOD1, TAD DECIMAL (-100) OCTAL JMS BTODDV /GET THE HUNDREDS DIGIT. SKIP ON 0. JMP BTODNZ /NON-ZERO. TAD DECIMAL [-10] OCTAL JMS BTODDV /GET THE TENS DIGIT. SKIP ON 0. BTOD2, JMS BTODAD /PUT IN BUFFER. TAD IRS /GET ONES DIGIT. JMS BTODAD /PUT IN BUFFER EVEN IF 0. JMP I BTOD /EXIT. / BTODNZ, JMS BTODAD /NON-ZERO HUNDREDS DIGIT. TAD DECIMAL [-10] OCTAL JMS BTODDV /GET TENS DIGIT. NOP JMP BTOD2 / BTODM, CIA /COMPLEMENT NEGATIVE NUMBER DCA IRS / TO GET ITS MAGNITUDE. TAD [IMINUS-60] JMS BTODAD /PUT "-" IN BUFFER. JMP BTOD1 / /DIVIDES IRS BY NUMBER IN AC AT ENTRY. RESULT LEFT IN AC. BTODDV, 0 DCA ALDIG /SAVE DIVISOR. DCA DIGAC /CLEAR QUOTIENT. BTODD1, CLL TAD IRS TAD ALDIG /SUBTRACT DIVISOR SNL /IS RESULT POSITIVE? JMP BTODD2 /NO. DCA IRS /YES. ISZ DIGAC /INCREMENT QUOTIENT. JMP BTODD1 /LOOP. BTODD2, CLA TAD DIGAC SNA /IS QUOTIENT 0? ISZ BTODDV /YES. SKIP NEXT INXTRUCTION. JMP I BTODDV /EXIT. / /TAKES DECIMAL DIGIT (0-11 OCTAL), WRITES TO BUFFER. BTODAD, 0 TAD (60) WRADV SVLXF /WRITE INTOP BUFFER. JMP I BTODAD / /BTODX -- EXTENDED BINARY TO DECIMAL WITH PRINTING. / INPUT: BINARY IN 8AC. / OUTPUT: CHARS. ON TELETYPE / /RANGE: 0-4095. / BTODX, 0 DCA IRS /SAVE INPUT IN IRS (FOR BTOD), CPY (MQ),SVLXF /SET UP POINTER FOR BTOD. DCA SVLXF+1 CPY (BTXRTN),BTOD /SET UP RETURN FOR BTOD. TAD DECIMAL (-1000) OCTAL JMS BTODDV /DIVIDE INPUT BY 1000. SKP /WAS INPUT < 1000? JMP BTOD1 /YES, TREAT LIKE NORMAL NUMBER. JMS BTODAD /NO, STORE 1000'S DIGIT. TAD DECIMAL (-100) OCTAL JMS BTODDV /GET 100'S DIGIT NOP /AND STORE EVEN IF ZERO. JMP BTODNZ / BTXRTN, WRADV SVLXF /WRITE EOL AFTER LAST NUMBER. TAD (MQ) /TYPE OUT PACKED STRING. JMS TYPKST JMP I BTODX /RETURN / /"END OF LINE" PROCESSOR. PREOL, DCA QEOL /SET END OF LINE FLAG TO "EOL". RDADV NXTLXN /GET CURRENT CHAR. SNA /IS IT EOL? JMP RCSUC /YES, SUCCESS. TAD (-ISEMI) /NO, IS IT SEMICOLON? SZA CLA JMP RCFAIL /NO, FAILURE. CLA CMA DCA QEOL /YES, SET END OF LINE FLAG TO "SEMICOLON". JMP RCSUC LIT PAGE 7 /TYVAL /TYPE VALUE OF A NUMBER. /PASSES 8AC VALUE ON ENTRY TO TYFP. 8AC CLEAR AR EXIT. / TYVAL, 0 JMS TYSES /GO TYPE " = ". JMS TYFP /TYEP VALUE. JMP I TYVAL / /TYSES /TYPE " = ". /SAVES INPUT AC. TYSES, 0 DCA TMP TAD (240) /TYPE " = ". TYPE TAD (275) TYPE TAD (240) TYPE TAD TMP JMP I TYSES / / /"TYPE ALL PARTS" GENERATOR. / TYAP, TAD DECIMAL (-9) OCTAL DCA MULCNT /SET PART COUNTER. TAD (PRTLST) DCA AX4 /SET PART LIST START. TYAPS1, TAD AX4 /GET PART START LOCATION. DCA CURSTP CDF 10 TAD I CURSTP CDF 0 SNA CLA /IS PART EMPTY? JMP TYAPS3 /YES. CRLF /LEAVE BLANK LINE. TYAPS2, JMS GNSTP /GO TO NEXT STEP. JMP TYAPS3 /END OF PART. JMS TYSTPS /TYPE STEP. JMP TYAPS2 / TYAPS3, ISZ AX4 ISZ MULCNT /END OF PART LIST? JMP TYAPS1 /NO. TYPE NEXT PART. RETURN /YES. EXIT. / / /TYSTPS /TYPE STEP WHOSE LOCATION IS GIVEN BY CURSTP. / TYSTPS, 0 TAD CURSTP /GET LOC. OF STEP. JMS TYSNUM /GO TYPE STEP #. TAD (240) TYPE TAD CURSTP TAD (NUMWD+1) /GET LOC OF 1ST WORD OF STEP. JMS TYPKUP /GO TYPE STEP. TAD (256) TYPE /TYPE ".". CRLF JMP I TYSTPS /EXIT. / / /TYSNUM /TYPE STEP NUMBER. 8AC CONTAINS LOC. OF STEP. / TYSNUM, 0 IAC CDF 10 JMS I [GETNUM] /GET STEP #. CLA IAC DCA ACX /FORCE ACX"1. IAC /FORCE AC NON-0. JMS TYFP /TYPE STEP #. JMP I TYSNUM /TYPKST /TYPE PACKED STRING. /LOCATION OF STRING IS IN 8AC ON ENTRY. AC CLEAR ON EXIT. / TYPKST, 0 DCA NORMFR /STORE STRING POINTER. DCA NORMTO /SET ?RIGHT TO 0. TYSTRG NORMFR /TYPE STRING. JMP I TYPKST / / /TYSTRS /TYPE STRING SUBROUTINE. TYPES STRING UNTIL / AN END CHARCTER (00). / /CALLING SEQUENCE: / JMS TYSTRS / PTRNAM /LOCATION OF STRING POINTER. /MACRO: TYSTRG PTRNAM /8AC CLEAR ON INPUT AND OUTPUT. / TYSTRS, 0 TAD I TYSTRS /GET STRING POINTER. ISZ TYSTRS /ADVANCE OVER POINTER. DCA .+2 /STORE IN "RDADV" CALL. TYSTR1, RDADV 0 SNA /IS IT END OF STRING? JMP I TYSTRS /YES. EXIT. JMS TYINCH /NO. TYPE CHARACTER. JMP TYSTR1 / / /TYPE INTERNAL CHARACTER /CHARACTER IN 8AC AT ENTRY, 8AC CLEAR AT EXIT. / TYINCH, 0 TAD (-40) SPA /IS IT BETWEEN 0 AND 37? TAD (100) /YES. ADD 300 TO GET 301 TO 337. TAD (240) /NO. ADD 200 TO GET 240 TO 277. TYPE JMP I TYINCH / TYPKUP, 0 /TYPE UPPER MEMORY INTERNAL STRING. DCA NORMFR CPY [0010],NORMTO TYSTRG NORMFR JMP I TYPKUP /SCNVRB - SCAN ALL VARIABLES. /8AC CLEAR ON ENTRY AND BOTH EXITS. MUST ALSO BE 0 AT RETURN /AT EACH INTERMEDIATE EXIT TO PLUGGED-IN ROUTINE, / "VARLOC" CONTAINS LOCATION OF VARIABLE / "VARNAM" CONTAINS VARIABLE NAME IN ASCII. / SCNVRB, 0 TAD SCNVRB /GET LOCATION OF PLUGGED-IN IAC /ROUTINE AND SAVE IT. DCA PSENT DCA VARNAM /INITIALISE VARIABLE NAME. TAD DECIMAL (-26) OCTAL DCA SCNCNT TAD (VRBLOC-NUMWD) SKP SCNL1, TAD VARLOC TAD [NUMWD] DCA VARLOC ISZ VARNAM JMP I PSENT /GO TO PLUGGED-IN ROUTINE. /PLUGGED-IN ROUTINE RETURNS HERE: SCNRET, ISZ SCNCNT /LAST VARIABLE? JMP SCNL1 /NO. JMP I SCNVRB /YES. FINAL EXIT. / PSENT, 0 /PLUGGED-IN ROUTINE ENTRY. SCNCNT, 0 /VARIABLE COUNTER. / / /"DELETE" GENERATORS. / /DELETE ALL VALUES. / DLAVAL, TAD (USEREND) DCA ARYNXT /RESET START OF ELEMENT STORAGE. JMS SCNVRB /SCAN ALL VARIABLES. RETURN /FINAL EXIT. CLA CMA CDF 10 DCA I VARLOC /STORE 7777 IN VARIABLE. CDF 0 JMP SCNRET /RETURN TO SCAN. / / EP7=. LIT PAGE 10 /XEQS /EXECUTE STEP GENERATOR. CALLS SUBROUTINE SPECIFIED / BY XEQSUB FOR STEP SPECIFIED BY FAC. / XEQS, JMS FNDSTP /FIND LOCATION OF STEP. JMP ERRSTP /ERROR IN STEP NUMBER. JMS I XEQSUB /GO TO EXECTION SUBROUTINE. RETURN / / /XEQP /EXECUTE PART GENERATOR. CALLS SUBROUTINE /SPECIFIED BY XEQSUB ONCE FOR EACH STEP OF PART /SPECIFIED BY PARTNO AT ENTRY. / XEQP, TAD PARTNO TAD (PRTLST-1) DCA CURSTP /LOCATION OF PART CONTROL WORD. XEQPL, JMS GNSTP /GET NEXT STEP LOC. RETURN /END OF LOOP. JMS I XEQSUB /CALL EXECUTION SUBROUTINE. JMP XEQPL / XEQSUB, 0 /EXECUTION SUBROUTINE LOCATION. / / /INITIALISE XEQSUB GENERATORS. / STDLST, TAD (DLSTPS-TYSTPS) STTYST, TAD (TYSTPS-DOSTPS) STDOST, TAD (DOSTPS) DCA XEQSUB RETURN /DLSTPS /DELETE STEP SUBROUTINE. DELETE STEP WHOSE LOCATION /IS IN CURSTP AND WHOSE PREDECESSOR IS IN PRVSTP. /8AC IS CLEAR AT ETNRY AND EXIT. / DLSTPS, 0 CDF 10 TAD I CURSTP /GET POINTER OF CURSTP DCA I PRVSTP /PUT IN PREDECESSOR. TAD CURSTP JMS GLGSTP /GET STEP LENGTH. DCA ALCNT TAD CURSTP CIA CLL TAD PRVSTP SNL CLA /IS PREVIOUS STEP FOLLOWING CURRENT JMP DLSTP0 /NO. TAD ALCNT /YES. TAD PRVSTP /DECREMENT POINTER. DCA PRVSTP DLSTP0, CLA CMA /INITIALISE PACK-DOWN LOOP. TAD CURSTP DCA AX1 /"TO" LOACTION FOR LOOP. TAD AX1 TAD MULCNT DCA AX0 /"FROM" LOCATION. TAD CURSTP /INITIAL STEP LOCATION. DCA NORMTO TAD PRVSTP DCA CURSTP /PACK DOWN ONE STEP. DELLP1, TAD NORMTO /ADVANCE OVER PREVIOUS STEP. TAD MULCNT DCA NORMTO TAD NORMTO CIA TAD ENDPR SNA CLA /END OF STEP STORAGE? JMP DLST3 /YES. GO DELETE SPACE. TAD NORMTO /GET PART LOCATION. TAD [NUMWD] DCA TMP TAD I TMP AND (0017) TAD (PRTLST-1) DCA CRWD DELLP2, TAD I CRWD CIA TAD NORMTO SNA CLA /IS CURRENT STEP POINTING TO WANTED JMP DLST1 /YES. TAD I CRWD /NO. DCA CRWD /GO ON TO NEXT STEP. JMP DELLP2 DLST1, TAD ALCNT /SET POINTER TO POINT TO TAD NORMTO /NEW LOCATION. DCA I CRWD TAD NORMTO JMS GLGSTP /GET LENGTH OF CURRENT STEP. DCA WDCNT /STORE COMPLEMENT OF LENGTH. DLST2, TAD I AX0 /MOVE STEP DOWN "ALCNT" WORDS. DCA I AX1 ISZ WDCNT JMP DLST2 JMP DELLP1 /GO ON TO NEXT STEP IN STORAGE. / DLST3, TAD ALCNT /DECREMENT "END OF USER AREA" TAD ENDPR /ENDPR-ALCNT DCA ENDPR /TO ENDPR CDF 0 JMP I DLSTPS /EXIT. / /GLGSTP - GET LENGTH OF STEP SUBROUTINE. /AT ENTRY, 8AC HAS LOCATION OF STEP. /AT EXIT, MULCNT CONTAINS LENGTH, AND 8AC CONTAINS / COMPLEMENT OF LENGTH. / GLGSTP, 0 IAC /ADVANCE TO LENGTH WORD. DCA TMP TAD I TMP /GET LENGTH WORD. ROTR5 AND [0077] /EXTRACT LENGTH. DCA MULCNT /STORE LENGTH. TAD MULCNT CIA /GET COMPLEMENT OF LENGTH. JMP I GLGSTP /IN 8AC AT EXIT. EP10=. LIT PAGE 11 /"DELETE" . / DELCUR, CLL CDF 10 TAD CURSYM /GET VARIABLE LOCATION. TAD (-USERPR) /SUBTRACT BEGINNING OF USER AREA. SZL CLA /IS VARIABLE A SUBSCRIPT ELEMENT? JMP DELCR1 /YES. TAD I CURSYM /NO. TAD (-3777) SZA CLA /IS VARIABLE "SIMPLE" JMP DELCUN /YES. DELSUB, TAD CURSYM /NO. TAD [2] DCA PREVEL /POINTER LOC. DLSUB1, TAD I PREVEL /GET "NEXT ELEMENT" LOC. CLL TAD (-VBLKEND) /IS IT "END"? SNL JMP DELSBX /YES. TAD (VBLKEND) DCA CURSYM JMS DELELS /DELETE ELEMENT. JMP DLSUB1 / DELSBX, CLA /NOW DELETE CONTROL WORD. TAD PREVEL TAD [-2] DCA CURSYM /LOCATION OF CONTROL WORD. DELCUN, CLA CMA DCA I CURSYM /SET VARIABLE "UNDEFINED". CDF 0 RETURN / DELCR1, TAD CURSYM /LOCATION OF VALUE. TAD [-3] DCA CURSYM /LOCATION OF POINTER WORD. JMS DELELS /DELETE ELEMENT. CDF 0 RETURN / PREVEL, 0 /PREDECESSOR ELEMENT. /DELELS /DELETE SUBSCRIPTED VARIABLE ELEMENT. / CURSYM - LOC. OF POINTER WORD. / PREVEL - LOC. OF PREDECESSOR POINTER WORD. / DELELS, 0 TAD I CURSYM /GET POINTER OF DELETED ELEMENT. DCA I PREVEL /STORE IN PREDECESSOR. TAD CURSYM CIA TAD ARYNXT SNA CLA /IS DELETED ELEMENT LAST IN STORE? JMP DELELX /YES. TAD ARYNXT /NO. SET UP LOOP TO DCA CRWD / SEARCH FOR POINTER TO DELEL1, TAD I CRWD / LAST ELEMENT. CLL TAD (-VBLKEND) /IS CURRENT ELEMENT "END"? SNL JMP DELEL2 /YES. TAD (VBLKEND) DCA CRWD /NO. ADVANCE TO NEXT ELEMENT. JMP DELEL1 /CONTINUE SEARCH / DELEL2, TAD (VBLKEND) /NOW AT CONTROL WORD. DCA CRWD /LOCATION OF CONTROL POINTER. DELEL3, TAD I CRWD CIA TAD ARYNXT SNA CLA /IS THIS POINTER TO LAST ELEMENT? JMP DELEL4 /YES. TAD I CRWD /ADVANCE TO NEXT ELEMENT. DCA CRWD JMP DELEL3 / DELEL4, TAD CURSYM /SET PREDECESSOR TO POINT TO DCA I CRWD / LOC. OF DELETED ONCE. CLA CMA TAD ARYNXT DCA AX0 /FROM LOCATION. CLA CMA TAD CURSYM DCA AX1 /"TO" LOCATION TAD [-NUMWD-3] DCA WDCNT DELEL5, TAD I AX0 /MOVE LAST ELEMENT TO REPLACE DCA I AX1 /DELETED ONE. ISZ WDCNT JMP DELEL5 DELELX, TAD ARYNXT /SET NEW ELEMENT STORE TAD [NUMWD+3] /END LOCATION. DCA ARYNXT JMP I DELELS /EXIT. /"DELETE ALL PARTS" GENERATOR. / DALPRT, TAD (USERPR) /RESET START DCA ENDPR / OF USER PROGRAM AREA. TAD DECIMAL (-9) OCTAL DCA WDCNT TAD (PRTLST-1) /INITIALIZE CLEAR LOOP. DCA AX0 DALPR1, CDF 10 /CLEAR PART LIST. DCA I AX0 CDF 0 ISZ WDCNT JMP DALPR1 RETURN / / /"DEMAND" GENERATOR. / PRDMD, JMS PRSTRG /TYPE STRING WITH VARB. NAME. PRDMD1, JMS TYSES /TYPE " = ". TAD CURSYM PUSH /SAVE VAR. LOC. JMS SAVSYN /SAVE SYNAN VARIABLES. JMS INPUT /CALL INPUT ROUTINE TO GET EXPRESSION. DCA QEOL TAD (INVAL-1) JMS SYNAN /GET VALUE OF EXPRESSION. JMS GETSYN /RESTORE SYNAN VARIABLES. POP /GET VARB LOCATION. CDF 10 JMS I [STPACK] /STORE NUMBER IN "CURSYN". RETURN / SCREOL, JMP PREOL /GO PROCESS END OF LINE. LIT *EP10 /"DO" GENERATORS. / DOPRT, TAD NXTSTP PUSH TAD PARTNO TAD (PRTLST-1) DCA CURSTP /FIRST STEP POINTER. CDF 10 TAD I CURSTP /GET FIRST STEP POINTER. CDF 0 SNA CLA /IS PART EMPTY? JMP ERRPRT /YES. PART # ERROR. DOPRT1, JMS GNSTP /NO, GET NEXT STEP. JMP DOPRTX /DONE WITH PART. TAD CURSTP DCA NXTSTP /NEXT STEP POINTER. JMS DOSTPS /DO THE CURRENT STEP. TAD NXTSTP /GET THE NEXT STEP. DCA CURSTP /STORE POINTER TO NEXT STEP. JMP DOPRT1 /LOOP. / DOPRTX, POP DCA NXTSTP /SET NEXT STEP FOR HIGHER LEVEL RETURN /OF RECURSION AND EXIT. / PARTNO, 0 /CURRENT PART NUMBER. LIT *EP5 / / /DOSTPS /INVOKE A STEP SUBROUTINE. STEP LOC. IS IN CURSTP. / DOSTPS, 0 TAD CURSTP /SET STEP LOCATION DCA XSTEP / FOR ERROR ANALYSIS. TAD DOSTPS PUSH /PUSH DOWN EXIT FROM JMS SAVSYN /DOSTPS AND SYNAN FOR RECURSION. TAD CURSTP TAD (NUMWD+1) DCA NXTLXF /SCAN START. CPY [0010],NXTLXF+1 DCA QEOL TAD (ISTAT-1) /SCAN INDIRECT STATEMENT. JMS SYNAN KSF /IS KEYBOARD FLAG SET? JMP DOSTP2 /NO. KRS /READ KEYBOARD STATIC (DON'T TAD (-ICODE) / CLEAR FLAG.) SNA CLA /IT CHARACTER "ALT MODE"? JMP INTRPT /YES. GO INTO INTERRUPT STATE. DOSTP2, DCA QINSTAT /RESTORE SAVED LOCATIONS. JMS GETSYN POP DCA DOSTPS JMP I DOSTPS /EXIT. / /SAVSYN -- SAVE SYNTACTIC ANALYZER VARIABLES. SAVSYN, 0 TAD SYNAN /SAVE EXIT FROM SYNAN, PUSH /EOL FLAG, TAD QEOL PUSH TAD NXTLXF /AND LEXICAL ANALYZER POINTERS. PUSH TAD NXTLXF+1 PUSH JMP I SAVSYN /GETSYN -- GET SYNTACTIC ANALYZER VARIABLES. GETSYN, 0 POP /RESTORE VARIABLES FROM STACK. DCA NXTLXF+1 POP DCA NXTLXF POP DCA QEOL POP DCA SYNAN JMP I GETSYN LIT *EP4 / INTRPT, KCC /CLEAR TELETYPE FLAG. TAD (INTMSG) /GET SET TO TYPE "INTERRUPTED". JMP PRSTP1 /GO INTO INTERRUPT MODE. LIT *EP3 /"TO" GENERATORS: / /"TO STEP" GENERATOR. PRTOS, JMS FNDSTP /FIND STEP LOCATION. JMP ERRSTP /ERROR - STEP #. TAD CURSTP /GOOD - GET STEP LOC. PRDONE, CDF 10 /STORE NEXT STEP LOCATION INTO DCA I (TOSTPN) /UPPER MEMORY. CDF 0 TAD (TOSTPN) PRTOS1, DCA NXTSTP /FORCE TRANSFER OF CONTROL. RETURN / / /"TO PART" GENERATOR. PRTOP, TAD PARTNO TAD (PRTLST-1) /LOCATION OF 1ST STEP OF PART. JMP PRTOS1 / / /"CANCEL" GENERATOR. CANCEL, CRLF /ENTERED FROM "ALT MODE" IN INPUT. PRCANC, TAD (CANMSG) /ENTERED FROM "CANCEL" STATEMENT. JMS TYPKST /TYPE "CANCELLED". DCA QINSTAT JMP MAIN CANMSG, TEXT /CANCELLED/ LIT PAGE 12 /ESI-B SYNTAX. / DSTAT, TERML TLOG /LOG ON OR OFF FCALT DSTAT1,.+1,NO TERML TON FCALT .+3,NOSUC,YES GEN PRLON,YES GEN EXIT,NO TERML TOFF FCDEAD NOSUC,YES GEN PRLOF,YES GEN EXIT,NO DSTAT1, TERML TSTAR /COMMENT FCALT .+2,NOSUC,YES GEN EXIT,NO SUBGL IFCLSE /DIRECT STATEMENT FCALT .+1,.+1,NO SUBGL DTAIL FCDEAD NOSUC,YES GEN EXIT,NO / DTAIL, SUBGL FORCLS FCALT .+1,NOSUC,NO SUBGL DOIST FCALT .+1,NOSUC,NO SUBGL DONLY FCDEAD NOSUC,NO / DOIST, SUBGL SETST /DIRECT OR INDIRECT FCALT .+1,NOSUC,NO SUBGL DOST FCALT .+1,NOSUC,NO SUBGL TYPST FCALT .+1,NOSUC,NO TERML TLINE FCALT .+2,NOSUC,YES GEN PLINE,NO TERML TNLINE FCALT .+2,NOSUC,YES GEN PNLINE,NO TERML TPAGE FCFAIL NOSUC,YES GEN PRPAGE,NO / DONLY, SUBGL DDELST /DIRECT ONLY FCALT DONLY1,NOSUC,NO DONLY1, SUBGL ARITH FCDEAD NOSUC,NO / ISTAT, TERML TSTAR /COMMENT FCALT .+2,NOSUC,YES GEN EXIT,NO SUBGL IFCLSE /INDIRECT STATEMENT. FCALT .+1,.+1,NO SUBGL ITAIL FCDEAD NOSUC,YES GEN EXIT,NO / ITAIL, SUBGL FORCLS FCALT .+1,NOSUC,NO SUBGL DOIST FCALT .+1,NOSUC,NO SUBGL IONLY FCDEAD NOSUC,NO / IONLY, SUBGL TOST /INDIRECT ONLY. FCALT .+1,NOSUC,NO TERML TDONE FCALT IONLY1,NOSUC,YES GEN PRDONE,NO IONLY1, TERML TSTOP FCALT IONLY2,NOSUC,YES GEN PRSTOP,NO IONLY2, SUBGL DEMDST FCALT .+1,NOSUC,NO SUBGL IDELST FCDEAD NOSUC,NO / IFCLSE, TERML TIF /IF CLAUSE FCFAIL .+1,NO SUBGL AREX FCDEAD .+1,NO SUBGL RELOP FCDEAD IFCL1,YES GEN ACTOS,NO IFCL1, SUBGL AREX FCDEAD .+1,NO TERML TCOMMA FCDEAD NOSUC,YES GEN POPDO,NO / RELOP, TERML TEQUAL /RELATIONAL OPERATORS. FCALT .+2,NOSUC,YES GEN STEQ,NO TERML TLT2 FCALT .+2,NOSUC,YES GEN STLT,NO TERML TGT2 FCALT .+2,NOSUC,YES GEN STGT,NO TERML TGE FCALT .+2,NOSUC,YES GEN STGE,NO TERML TLE FCALT .+2,NOSUC,YES GEN STLE,NO TERML TNE FCDEAD NOSUC,YES GEN STNE,NO / FORCLS, TERML TFOR /FOR CLAUSE. FCFAIL .+2,YES GEN SQPUN1,NO SUBGL VARB FCDEAD .+1,NO TERML TEQUAL FCDEAD FORCL1,YES GEN SQPUN0,YES GEN PSHCUR,YES GEN SVINDX,NO FORCL1, SUBGL AREX FCDEAD .+1,NO TERML TLPAR FCDEAD .+2,YES GEN STOREC,NO SUBGL AREX FCDEAD .+1,NO TERML TRPAR FCDEAD .+2,YES GEN SVINCR,NO SUBGL AREX FCDEAD .+1,NO TERML TCOMMA FCDEAD NOSUC,YES GEN PRFOR,NO / SETST, TERML TSET /"SET" STATEMENT. FCFAIL .+2,YES GEN SQPUN1,NO SUBGL VARB FCDEAD .+1,NO TERML TEQUAL FCDEAD SETST1,YES GEN SQPUN0,YES GEN PSHCUR,NO SETST1, SUBGL AREX FCDEAD .+1,NO TERML TEOL FCDEAD NOSUC,YES GEN STOREC,NO / AREX, SUBGL TERM /ARITHMETIC EXPRESSION. FCFAIL AREX1,NO AREX1, SUBGL ADOP FCOK .+2,YES GEN ACTOS,NO SUBGL TERM FCDEAD AREX1,YES GEN POPDO,NO / TERM, SUBGL FACT FCFAIL TERM1,NO TERM1, SUBGL MULOP FCOK .+2,YES GEN ACTOS,NO SUBGL FACT FCDEAD TERM1,YES GEN POPDO,NO / FACT, TERML TMINUS /FACTOR FCALT FACT1,.+2,YES GEN SCHSGN,NO SUBGL FACT2 FCDEAD NOSUC,YES GEN DO,NO FACT1, TERML TPLUS FCALT .+1,.+1,NO SUBGL FACT2 FCFAIL NOSUC,NO / FACT2, SUBGL PRIMRY FCFAIL FACT3,NO FACT3, TERML TUPAR FCOK .+3,YES GEN STUPAR,YES GEN ACTOS,NO SUBGL PRIMRY FCDEAD FACT3,YES GEN POPDO,NO / PRIMRY, SUBGL VARB FCALT .+2,NOSUC,YES GEN TOAC,NO TERML TSCRN FCALT .+1,NOSUC,NO TERML TLPAR FCALT PRIM1,.+1,NO SUBGL AREX FCDEAD .+1,NO TERML TRPAR FCDEAD NOSUC,NO PRIM1, SUBGL FUNC FCFAIL .+1,NO TERML TLPAR FCDEAD .+1,NO SUBGL AREX FCDEAD .+1,NO TERML TRPAR FCDEAD NOSUC,YES GEN DO,NO / VARB, TERML TSCRV FCFAIL .+1,NO TERML TLBRAC FCOK .+3,YES GEN PSHCUR,YES GEN STQPUN,NO SUBGL AREX FCDEAD .+2,YES GEN STSUB1,NO TERML TCOMMA FCALT VARB1,.+1,NO SUBGL AREX FCDEAD VARB1,YES GEN STSUB2,NO VARB1, TERML TRBRAC FCDEAD NOSUC,YES GEN CMPSUB,NO / MULOP, TERML TSTAR /MULTIPLYING OPERATORS. FCALT .+2,NOSUC,YES GEN STMUL,NO TERML TSLASH FCFAIL NOSUC,YES GEN STDIV,NO / ADOP, TERML TPLUS /ADDING OPERATORS. FCALT .+2,NOSUC,YES GEN STADD,NO TERML TMINUS FCFAIL NOSUC,YES GEN STSUB,NO / FUNC, TERML TABS /FUNCTION NAMES. FCALT .+2,NOSUC,YES GEN SPRABS,NO TERML TIP FCALT .+2,NOSUC,YES GEN SPRIP,NO TERML TFP FCALT .+2,NOSUC,YES GEN SPRFP,NO TERML TSGN FCALT .+2,NOSUC,YES GEN SPRSGN,NO TERML TSIN FCALT .+2,NOSUC,YES GEN SPRSIN,NO TERML TCOS FCALT .+2,NOSUC,YES GEN SPRCOS,NO TERML TSQRT FCALT .+2,NOSUC,YES GEN SPRSQRT,NO TERML TLOG FCALT .+2,NOSUC,YES GEN SPRLOG,NO TERML TEXP FCALT .+2,NOSUC,YES GEN SPREXP,NO TERML TARCTAN FCALT .+2,NOSUC,YES GEN SPRARC,NO TERML TLN FCALT .+2,NOSUC,YES GEN SPRLN,NO TERML TDP FCALT .+2,NOSUC,YES GEN SPRDP,NO TERML TEP FCFAIL NOSUC,YES GEN SPREP,NO / DOST, TERML TDO /"DO" STATEMENT. FCFAIL .+2,YES GEN STDOST,NO SUBGL DOTAIL FCDEAD NOSUC,NO / DOTAIL, TERML TPART FCALT DOTL1,.+1,NO TERML TSCRI FCDEAD .+1,NO TERML TEOL FCDEAD NOSUC,YES GEN DOPRT,NO DOTL1, TERML TSTEP FCFAIL .+1,NO SUBGL AREX FCDEAD .+1,NO TERML TEOL FCDEAD NOSUC,YES GEN XEQS,NO / TYPST, TERML TTYPE /"TYPE" STATE,ENT. FCFAIL .+3,YES GEN STTYST,YES GEN SAVNXT,NO SUBGL TYTAIL FCDEAD NOSUC,NO / TYTAIL, SUBGL TYAREX FCALT TYTL1,.+1,NO TERML TEOL FCDEAD NOSUC,YES GEN CNLINE,NO TYTL1, SUBGL TYNOTA FCFAIL NOSUC,NO / TYAREX, SUBGL TYAR1 FCFAIL TYARXL,NO TYARXL, TERML TCOMMA FCOK .+3,YES GEN CNLINE,YES GEN SAVNXT,NO SUBGL TYAR1 FCDEAD TYARXL,NO / TYAR1, SUBGL AREX FCALT TYAR11,.+4,YES GEN PSHNXT,YES GEN PSHNX1,YES GEN SAVNXT,NO SUBGL TYAR2 FCDEAD NOSUC,NO TYAR11, TERML TQUOTE FCFAIL .+1,NO TERML TSCRS FCDEAD .+1,NO TERML TQUOTE FCDEAD .+3,YES GEN TSTRG,YES GEN SAVNXT,NO SUBGL TYAR3 FCDEAD NOSUC,NO / TYAR2, TERML TQUOTE FCOK .+1,NO TERML TSCRS FCDEAD .+1,NO TERML TQUOTE FCDEAD .+3,YES GEN TSTRG,YES GEN SAVNXT,NO SUBGL TYAR3 FCDEAD TYAR2,NO / TYAR3, SUBGL AREX FCOK .+3,YES GEN TYFAC,YES GEN SAVNXT,NO SUBGL TYAR2 FCDEAD TYAR3,NO / TYNOTA, TERML TSIZE FCALT .+2,NOSUC,YES GEN TYPSIZ,NO TERML TSTEP FCALT TYNTA2,.+1,NO TERML TSCRN FCDEAD .+1,NO TERML TEOL FCDEAD NOSUC,YES GEN XEQS,NO TYNTA2, TERML TPART FCALT TYNTA3,.+1,NO TERML TSCRI FCDEAD .+1,NO TERML TEOL FCDEAD NOSUC,YES GEN XEQP,NO TYNTA3, TERML TALLE FCALT TYNTA4,NOSUC,YES GEN TYAP,YES GEN TAVAL,NO TYNTA4, TERML TALL FCDEAD .+2,YES GEN SAVNXT,NO TERML TVALSE FCALT .+2,NOSUC,YES GEN TAVAL,NO TERML TPRTSE FCALT .+2,NOSUC,YES GEN TYAP,NO TERML TSCRV FCDEAD .+1,NO TERML TEOL FCDEAD NOSUC,YES GEN TYARRY,NO / INVAL, SUBGL AREX FCDEAD NOSUC,YES GEN EXIT,NO / DDELST, TERML TDELETE /"DELETE" STATEMENT - DIRECT ONLY FCFAIL .+2,YES GEN STDLST,NO SUBGL DELTAIL FCDEAD NOSUC,NO / DELTAIL, SUBGL DELLST FCALT DLTL1,.+1,NO TERML TEOL FCDEAD NOSUC,NO DLTL1, TERML TSTEP FCALT DLTL2,.+1,NO TERML TSCRN FCDEAD .+1,NO TERML TEOL FCDEAD NOSUC,YES GEN XEQS,NO DLTL2, TERML TPART FCALT DLTL3,.+1,NO TERML TSCRI FCDEAD .+1,NO TERML TEOL FCDEAD NOSUC,YES GEN XEQP,NO DLTL3, TERML TALLE FCALT DLTL4,NOSUC,YES GEN DALPRT,YES GEN DLAVAL,NO DLTL4, TERML TALL FCDEAD .+1,NO TERML TVALSE FCALT .+2,NOSUC,YES GEN DLAVAL,NO TERML TPRTSE FCDEAD NOSUC,YES GEN DALPRT,NO / DELLST, SUBGL VARB FCFAIL DLLST1,YES GEN DELCUR,NO DLLST1, TERML TCOMMA FCOK .+1,NO SUBGL VARB FCDEAD DLLST1,YES GEN DELCUR,NO / IDELST, TERML TDELETE /"DELETE" STATEMENT - INDIRECT ONLY FCFAIL DT2,NO DT2, SUBGL DELLST FCALT DT3,.+1,NO TERML TEOL FCDEAD NOSUC,NO DT3, TERML TALL FCDEAD .+1,NO TERML TVALSE FCDEAD NOSUC,YES GEN DLAVAL,NO / ARITH, TERML TNULL /ARITHMETIC ASSIGNMENT. FCDEAD .+2,YES GEN SQPUN1,NO SUBGL VARB FCDEAD .+1,NO TERML TEQUAL FCDEAD .+3,YES GEN SQPUN0,YES GEN PSHCUR,NO SUBGL AREX FCDEAD NOSUC,YES GEN STOREC,NO / TOST, TERML TTO /"TO" STATE,ENT FCFAIL TOTAIL,NO TOTAIL, TERML TSTEP FCALT TOTL1,.+1,NO SUBGL AREX FCDEAD .+1,NO TERML TIEOL FCDEAD NOSUC,YES GEN PRTOS,NO TOTL1, TERML TPART FCDEAD .+1,NO TERML TSCRI FCDEAD .+1,NO TERML TIEOL FCDEAD NOSUC,YES GEN PRTOP,NO / DEMDST, TERML TDEMAND /"DEMAND" STATEMENT. FCFAIL .+3,YES GEN SAVNXT,YES GEN SQPUN1,NO SUBGL VARB FCDEAD .+2,YES GEN PSHNXT,NO TERML TEOL FCDEAD NOSUC,YES GEN SQPUN0,YES GEN PRDMD,NO / INTST, TERML TGO FCALT .+2,NOSUC,YES GEN DOSTP2,NO TERML TCANC FCALT .+2,NOSUC,YES GEN PRCANC,NO SUBGL TYPST FCALT .+2,NOSUC,YES GEN EXIT,NO TERML TNULL FCDEAD NOSUC,YES GEN ILLINT,NO /TERMINAL SYMBOLS AND CLASSES. / /INTERNAL CHARACTER DEFINITIONS. / IA=01 IB=02 IC=03 ID=04 IE=05 IF=06 IG=07 IH=10 II=11 IJ=12 IK=13 IL=14 IM=15 IN=16 IO=17 IP=20 IQ=21 IAR=22 IS=23 IT=24 IU=25 IV=26 IW=27 IX=30 IY=31 IZ=32 I0=60 I1=61 I2=62 I3=63 I4=64 I5=65 I6=66 I7=67 I8=70 I9=71 IEOL=00 ICOMMA=54 IEQUAL=75 ILPAR=50 IRPAR=51 ILBRAC=33 IRBRAC=35 ILT=74 IGT=76 IUPAR=36 ISLASH=57 ISTAR=52 IPLUS=53 IMINUS=55 IQUOTE=42 ICOLON=72 ISEMI=73 ICR=37 ISPACE=40 /TERMINAL SYMBOL DEFINITIONS: / TNLINE, -IN; -IO TLINE, -IL; -II; -IN; -IE; SCREOL TGO, -IG; -IO TIEOL, IEOL TDONE, -IE; -IN; -ID; IEOL TSTOP, -IS; -IT; -IO; -IP; IEOL TIF, -II; IF TCOMMA, ICOMMA TGT2, IGT TLT2, ILT TGE, -IG TE, IE TLE, -IL; IE TNE, -IN; IE TFOR, -IF; -IO; IAR TSCRV, TCVARB TEQUAL, IEQUAL TLPAR, ILPAR TRPAR, IRPAR TSET, -IS; -IE; IT TUPAR, IUPAR TSCRN, TCFPN TLBRAC, ILBRAC TRBRAC, IRBRAC TSTAR, ISTAR TSLASH, ISLASH TPLUS, IPLUS TMINUS, IMINUS TIP, -II; IP TFP, -IF; IP TABS, -IA; -IB; IS TSGN, -IS; -IG; IN TCANC, -IC; -IA; -IN; -IC; -IE; -IL; IEOL TDO, -ID; IO TPART, -IP; -IA; -IAR; IT TSTEP, -IS; -IT; -IE; IP TTYPE, -IT; -IY; -IP; IE TSIZE, -IS; -II; -IZ; -IE TEOL, SCREOL TQUOTE, IQUOTE TSCRS, TCSTRG TPRTSE, -IP; -IA; -IAR; -IT; -IS; SCREOL TVALSE, -IV; -IA; -IL; -IU; -IE; -IS; SCREOL TALLE, -IA; -IL; -IL; SCREOL TALL, -IA; -IL; IL TDELETE, -ID; -IE; -IL; -IE; -IT; IE TSCRI, TCINTG TCOLON, ICOLON TNULL, TCNULL TTO, -IT; IO TDEMAND, -ID; -IE; -IM; -IA; -IN; ID TON, -IO; -IN; IEOL TOFF, -IO; -IF; -IF; IEOL TPAGE, -IP; -IA; -IG; -IE; SCREOL TLOG, -IL; -IO; IG TEXP, -IE; -IX; IP TSIN, -IS; -II; IN TCOS, -IC; -IO; IS TSQRT, -IS; -IQ; -IAR; IT TARCTAN, -IA; -IAR; -IC; -IT; -IA; IN TLN, -IL; IN TDP, -ID; IP TEP, -IX; IP /TERMINAL CLASS PROCESSOR FOR "SCRIPT V". / TCVARB, RDADV NXTLXN /GET CURRENT CHAR. SNA /IS IT "END OF LINE"? JMP RCFAIL /YES. TAD (-33) SMA /IS IT A LETTER? JMP RCFAIL /NO. TAD (33) /YES. SAVE IT TEMPORARILY DCA TMP RD NXTLXN /GET NEXT CHAR. SNA /IS IT END OF LINE? JMP TCV1 /YES.. TAD (-33) /NO. SUBTRACT 33. SPA /IS IT A LETTER? JMP RCFAIL /YES. NO GOOD. TAD (-25) /SUBTRACT TOTAL OF 60 SPA /IS IT SPECIAL CHAR. JMP TCV1 /YES. OK TAD [-12] /NO. SUBTRACT TOTAL OF 72. SPA /IS IT A NUMBER? JMP RCFAIL /YES. NO GOOD. TCV1, CLA /NO. NOT A LETTER OR DIGIT. TAD [-NUMWD] DCA WDCNT /MULTIPLY LETTER BY NUMWD. TCV1L, TAD TMP ISZ WDCNT JMP TCV1L /NOW HAVE REL LOC OF VARIABLE. TAD (VRBLOC-NUMWD) /ADD VARIABLE BASE. DCA CURSYM /THIS IS LOCATION OF VARIABLE. JMP RCSUC1 /PROCESS TERMINAL CLASS "SCRIPT S" - STRING. / TCSTRG, RD NXTLXN /GET CURRENT CHARACTER. SNA /IS IT EOL? JMP TCSTR1 /YES. TAD (-37) SNA /IS IT "CR"? JMP TCSTR1 /YES. TAD [-3] SNA CLA /IS IT "QUOTE". JMP TCSTR1 /YES. ADV NXTLXN JMP TCSTRG /TRY NEXT CHARACTER. / TCSTR1, DIFPTR SVLXF,NXTLXN /GET STRING LENGTH. TAD [-1] DCA ALCNT /STORE LENGTH. JMP STLXF / / /PROCESS TERMINAL CLASS "SCRIPT I" - / DECIMAL INTEGER 1 - 9 / TCINTG, 0 JMS TSTDEC /IS CURRENT CHAR DECIMAL DIGIT? JMP RCFAIL /NO. SNA /YES. IS IT ZERO? JMP RCFAIL /YES. DCA PARTNO /NO. TCNULL, JMP RCSUC /DONE. /PROCESS TERMINAL CLASS "SCRIPT N". / TCFPN, DCA ACX /CLEAR AC EXPONENT. DCA ACS /CLEAR AC SIGN. DCA QANYIN /CLEAR "ANY IN" FLAG. DCA QDCPT /CLEAR "DECIMAL POINT YET" FLAG. TAD [-PREC-1] DCA ALCNT /NUMBER OF AC DIGITS + 1. TAD [AC+PREC-1] /HIGH ORDER AC DIGIT. DCA CRWD TCFGDG, JMS TSTDEC /IS CURRENT CHAR A DECIMAL DIGIT? JMP TCF1 /NO. SNA /YES. IS DIGIT ZERO? JMP TCFTQA /YES. TCFAAC, JMS ADACS /ADD DIGIT TO FLOATING AC. NOP /"AC FULL" EXIT. TAD QDCPT SNA CLA /HAS A DECIMAL POINT BEEN REACHED? ISZ ACX /NO. INCREMENT AC EXPONENT. JMP TCFGDG / TCFTQA, TAD QANYIN SZA CLA /HAVE ANY DIGITS BEEN PUT IN FAC? JMP TCFAAC /YES. SO PUT IN THE ZERO. TAD QDCPT /NO. SNA CLA /HAS A DECIMAL POINT BEEN REACHED? JMP TCFGDG /NO. CMA TAD ACX /SUBTRACT ONE FROM AC EXPONENT. DCA ACX JMP TCFGDG / TCF1, TAD CURCHR /GET CURRENT CHAR. TAD (-56) SZA /IS IT A DECIMAL POINT? JMP TCF2 /NO. TAD QDCPT /YES. SZA CLA /HAS DECIMAL PT. BEEN REACHED? JMP TCF2 /YES. ISZ QDCPT /NO, SET "DEC. PT. REACHED" FLAG. ADV NXTLXN /ADVANCE OVER DECIMAL POINT. JMP TCFGDG / TCF2, CLA TAD QANYIN SZA CLA /HAVE ANY DIGITS BEEN PUT IN FAC? JMP TCFFAC /YES. RESULT IS NON-ZERO. DIFPTR NXTLXF,NXTLXN /NO. SNA CLA /HAS INPUT POINTER CHANGED? JMP RCFAIL /NO. TCFFAC, JMS ADACS /ADD ZERO TO FAC. JMP TCF3 /"AC FULL" EXIT. GO TEST FOR "E". JMP TCFFAC /"FAC NOT FULL" EXIT. / QDCPT, 0 /?DECIMAL POINT REACHED YET. EP17=. LIT PAGE 25 / TCF3, TAD CURCHR /GET CURRENT CHARACTER. TAD (-IE) SZA CLA /IS IT "E"? JMP TCF8 /NO. DONE. ADV NXTLXN /YES. PROCESS EXPONENT. CLA CMA /SET EXP SIGN SWITCH TO +. DCA IRS RD NXTLXN /GET NEW CHAR. TAD (-IPLUS) SNA /IS IT "+"? JMP TCF4 /YES. TAD [-IMINUS+IPLUS] SZA CLA /IS IT "-"? JMP TCF5 /NO. DCA IRS /YES, SET EXP SIGN SWITCH TO -. TCF4, ADV NXTLXN /ADVANCE OVER + OR -. TCF5, JMS TSTDEC /IS CHAR DECIMAL DIGIT? JMP RCFAIL /NO. TCF9, DCA MULCNT /YES. STORE DIGIT. TAD MULCNT DCA IRX JMS TSTDEC /IS NEXT CHAR DEC. DIGIT? JMP TCF6 /NO. DCA TMP /YES. SAVE SECOND DIGIT. JMS BMUL10 /MULTIPLY 1ST DIGIT BY 10. TAD TMP /ADD 2ND DIGIT. JMP TCF9 /GET NEXT DIGIT. TCF6, TAD IRX /GET "E" EXPONENT. ISZ IRS /WAS EXP SIGN +? CIA /NO, COMPLEMENT EXPONENT. TAD ACX /TO OR FROM FAC EXPONENT. DCA ACX JMS CHKEXP /CHECK FOR EXPONENT OVERFLOW. TCF8, TAD AC+PREC-1 SNA CLA /IS H-O AC DIGIT = 0? DCA ACX /YES. CLEAR EXPONENT. JMP RCSUC /DONE. / / ADACS, 0 DCA I CRWD /STORE DIGIT. TAD ALCNT SNA CLA /IS AC FULL? JMP I ADACS /YES. TAKE "AC FULL" EXIT. CMA TAD CRWD DCA CRWD /CRWD-1 TO CRWD. ISZ ALCNT /IS AC NOW FULL? JMP ADACS1 /NO. JMS ROUND /YES. ROUND AC BY H-O MQ DIGIT. JMP I ADACS /TAKE "AC FULL" EXIT. / ADACS1, ISZ ADACS ISZ QANYIN JMP I ADACS /TAKE "AC NOT FULL" EXIT. /TSTDEC /SUBROUTINE TO TEST CURRENT CHARACTER FOR DECIMAL DIGIT. /IF IT IS, CONVERTS IT TO RANGE 00-11 OCTAL. /CALLING SEQUENCE; / JMS TSTDEC / ... /NOT DECIMAL DIGIT. 8AC CLEAR. / ... /DECIMAL DIGIT, IN 8AC. / TSTDEC, 0 RD NXTLXN /GET NEXT CHAR. TAD (-60) SPA CLA /IS IT GE 0? JMP I TSTDEC /NO. FAIL EXIT. TAD CURCHR /YES. TAD (-72) SMA CLA /IS IT <72? JMP I TSTDEC /NO. FAIL EXIT. ADV NXTLXN /YES. ADVNCE OVER DIGIT. TAD CURCHR TAD (-60) /GET OCTAL EQUIV OF DIGIT. ISZ TSTDEC /SUCCESS EXIT. JMP I TSTDEC / PAGMES, TEXT /*PAGE / /LEXICAL ANALYSER. /CALLING SEQUENCE: / TAD (TERM) / JMS RECOG / ... /SUCCESS EXIT. / ... /FAIL EXIT. / RECOG, 0 DCA NXTTTC /NEXT TERMINAL TYPE CODE (AX7). TAD NXTLXF /CURRENT TERMINAL CHARCTER POSITION DCA NXTLXN /STORE IN RUNNING POINTER. TAD NXTLXF+1 DCA NXTLXN+1 RECOGL, TAD I NXTTTC /GET TTC. SPA /IS IT A NON-LAST WORD OF MULTI? JMP NLC /YES. RAL /NO. SHIFT LEFT 1. SMA /IS IT LAST WORD OF TTC? JMP LC /YES. RAR /NO. MUST BE TERMINAL CLASS PTR. DCA TMP /GET SUBROUTINE ENTRY LOCATION. JMP I TMP /ENTER TERMINAL CLASS SUBROUTINE. / NLC, RDADV NXTLXN /ADD CURRENT INPUT CHARACTER. SZA CLA /IS IT EQUAL TO DESIRED CHAR? JMP RCFAIL /NO. FAILURE. JMP RECOGL /GO ON TO NEXT INPUT CHARACTER. / LC, RAR /SHIFT CHARACTER BACK. CIA /- CHAR. RDADV NXTLXN /ADD CURRENT INPUT CHARACTER. SZA CLA /IS IS EQUAL TO DESIRED CHAR? JMP RCFAIL /NO. RCSUC, RD NXTLXN /GRT NEXT INPUT CHAR. CLA RCSUC1, TAD CURCHR /GET CHAR. TAD (-ISPACE) /IS IT "SPACE" CODE? SNA CLA JMP RCSUC2 /YES. SKIP SPACE. STLXF, TAD NXTLXN /NO. ADVANCE "PERMANENT" DCA NXTLXF /CHARACTER POINTER. TAD NXTLXN+1 DCA NXTLXF+1 JMP I RECOG /"SUCCESS" EXIT. / RCFAIL, ISZ RECOG /FAILURE RETURN AT (N+2). CLA JMP I RECOG / RCSUC2, ADV NXTLXN /ADVANCE OVER SPACE. JMP RCSUC / LIT /NOTE THAT TERMINAL CLASS PROCESSORS RETURN TO MAIN /LEXICAL ANALYSER IN ONE OF THREE WAYS: / RCSUC2 - ADVANCE INPUT STRING, THEN / RCSUC - READ CHRACTER, THE / RCSUC1 - TEST FOR SPACES. PAGE 20 / FLOATING POINT ARITHMETIC PACKAGE. / / /GETNUM - UNPACK A NUMBER AND PUT IT IN FAC. LOCATION OF /NUMBER IS SPECIFIED IN AC AT ENTRY. AC IS CLEAR AT EXIT. / GETNUM, 0 DCA CRWD /LOCATION OF WORD 0 RDF /PRESERVE INITIAL DATA BANK. TAD (CDF 0) DCA GTXX CPY GTXX,GTXX1 CPY GTXX,GTXX2 TAD I CRWD /GET FIRST WORD RAL /ROTATE AC SIGN TO LINK. AND [7700] /CLEAR NON-EXISTANT BITS. SZL /IS EXPONENT NEGATIVE? TAD [0077] /YES - FORCE ALL ONES. ROTR6 /RIGHT ALIGN EXPONENT DCA ACX TAD I CRWD /GET FIRST WORD AGAIN. AND [0020] /EXTRACT MANTISSA SIGN. DCA ACS /SAVE. TAD [AC-1] DCA AX0 TAD [-NUMWD+1] /NUMBER OF 3-DIGIT WORDS. DCA WDCNT TAD I CRWD /GET FIRST WORD AGAIN. AND (0017) /GET LOW-ORDER DECIMAL DIGIT. CDF 0 DCA I AX0 GTLP, ISZ CRWD /GO TO N-TH WORD. GTXX, XX TAD I CRWD /GET WORD. CDF 0 ROTR8 AND (0017) /EXTRACT DIGIT 1. DCA I AX0 GTXX1, XX TAD I CRWD CDF 0 ROTR4 AND (0017) /EXTRACT DIGIT 2. DCA I AX0 GTXX2, XX TAD I CRWD CDF 0 AND (0017) DCA I AX0 /EXTRACT DIGIT 3 ISZ WDCNT /WAS IT LAST WORD? JMP GTLP /NO. GO BACK FOR NEXT. JMP I GETNUM /YES. DONE. CP20=. LIT /FAD, FSB /FLOATING DECIMAL ADD AND SUBTRACT SUBROUTINES. /ADD OR SUBTRACT CONTENTS OF IR TO OR FROM FAC, LEAVING /NORMALISED RESULT IN FAC. PDP-8 AC IS CLEAR AT ENTRY /AND AT EXIT. / PAGE 27 FAD, 0 JMS FDADDS /ADD AC TO IR. JMP I FAD FSB, 0 TAD IRS CMA AND [0020] DCA IRS /COMPLEMENT IR SIGN. JMS FDADDS /SUBTRACT IR FROM FAC. JMP I FSB BP27=. LIT *CP20 / / /FDADDS /FLOATING DECIMAL ADD SUBROUTINE. /ADDS IR AND FAC. ASSUMES BOTH ARE SIGNED-MAGNITUDE /FLOATING-POINT DECIMAL NUMBERS. LEAVES NORMALISED RESULT /IN FAC. PDP-8 AC IS CLEAR AT ENTRY, NOT NECESSARILY /LEFT CLEAR AT EXIT. / FDADDS, 0 TAD IR+PREC-1 SNA CLA /IS IR = 0? JMP I FDADDS /YES. EXIT. TAD AC+PREC-1 SZA CLA /IS FAC = 0? JMP FDAD1 /NO. SWP /YES. SWAP AC AND IR. JMP I FDADDS /EXIT. FDAD1, TAD IRX /IR EXPONENT. CIA /COMPLEMENT IT. TAD ACX /ACX-IRX SPA CLA /IS AC MAGNITUDE GE IR MAGNITUDE? SWP /NO. SWAP FAC AND IR VALUES. SIGNS /AND EXPONENTS. DCA ALDIG /SET ALIGNMENT DIGIT TO 0. TAD IRS CIA TAD ACS /ACS-IRS SNA CLA /ARE THEY EQUAL? JMP TSTEXP /YES. TAD [IR-1] /NO. JMS COMP10 /COMPLEMENT IR. TAD DECIMAL (9) OCTAL DCA ALDIG /SET ALIGNMENT DIGIT TO 9. TSTEXP, TAD IRX CIA TAD ACX /ACX-IRX SNA /IS DIFFERENCE 0? JMP FDADM /YES. GO ADD MAGNITUDES. TAD [-PREC] SMA /IS IR NON-SIGNIFICANT JMP FDADX /EXIT, FORCE AC CLEAR. TAD [PREC] /NO. DCA ALCNT /STORE ALIGNMENT COUNT. TAD [IR-1] JMS ALIGN /ALIGN IR. FDADM, TAD ALDIG SNA CLA /ARE SIGNS EQUAL OR UNEQUAL? JMP FDSE /EQUAL. FDSU, TAD [IR-1] /ADD DECIMAL, SIGNS UNEQUAL. JMS ADSUB /ADD IR TO FAC. SZA CLA /IS THERE A CARRY? JMP FDNORM /YES. NO CHANGE IN AC SIGN. TAD ACS /NO. COMPLEMENT AC SIGN. CMA AND [0020] DCA ACS TAD [AC-1] JMS COMP10 /COMPLEMENT AC VALUE. FDNORM, JMS NORM10 /GO NORMALISE FAC, IF NECESSARY. JMP I FDADDS /EXIT. / FDSE, TAD [IR-1] /ADD DECIMAL, SIGNS EQUAL. JMS ADSUB /ADD IR TO FAC. SNA /IS THERE A CARRY? JMP I FDADDS /NO. EXIT. DCA ALCNT /YES. SET SHIFT COUNTER TO 1. DCA ALDIG /SET ALDIG TO 0. CPY AC,MQ+PREC-1 /SAVE HIGH ORDER AC DIGIT FOR ROUNDING. TAD [AC-1] JMS ALIGN /SHIFT AC RIGHT 1. H-O DIGIT IS 0. ISZ AC+PREC-1 /SET H-O DIGIT TO 1. JMS ROUND /ROUND PRODUCT TO 7 DIGITS. ISZ ACX /INCREMENT AC EXPONENT. FDADX, CLA /SUPPRESS SKIP ON 7777, CLEAR AC. JMP I FDADDS /EXIT. EP20=. LIT *BP21 /FMU /FLOATING DECIMAL MULTIPLY SUBROUTINE. /MULTIPLIES FAC BY IR, LEAVING NORMALISED AND ROUNDED RESULT /IN FAC. 8AC IS 0 AT EXIT AND ENTRY. / FMU, 0 TAD [AC-1] /MOVE AC TO MQ AND CLEAR AC. DCA AX0 TAD [MQ-1] DCA AX1 TAD [AC-1] DCA AX2 TAD [-PREC] DCA WDCNT FMUL1, TAD I AX0 /MOVE A DIGIT. DCA I AX1 DCA I AX2 /CLEAR AN AC DIGIT. ISZ WDCNT /DONE? JMP FMUL1 /NO. TAD [-PREC] /YES. INITIALISE COUNTER FOR /MAIN LOOP. DCA MULCNT FMUL3, DCA ALDIG /ALDIG HOLDS FAC CARRY DIGIT. FMUL4, TAD MQ /GET L-O DIGIT OF MQ. SNA /IS IT 0? JMP FMULSR /YES. SHIFT RIGHT. TAD [-1] /NO. SUBTRACT 1. DCA MQ /AND STORE. TAD [IR-1] JMS ADSUB /ADD FIR TO FAC. TAD ALDIG /ACCUMULATE CARRY DIGIT. DCA ALDIG JMP FMUL4 /TRY AGAION. / FMULSR, TAD (MQ) /SHIFT FAC-FMQ RIGHT 1 DIGIT. DCA AX0 TAD [MQ-1] DCA AX1 TAD (-PREC-PREC+1) DCA WDCNT FMUL5, TAD I AX0 /MOVE A DIGIT. DCA I AX1 ISZ WDCNT /DONE? JMP FMUL5 /NO. TAD ALDIG /YES. DCA AC+PREC-1 /MOVE IN CARRY DIGIT. ISZ MULCNT /END OF MULTIPLY LOOP? JMP FMUL3 /NO. WORK ON NEXT DIGIT. TAD AC+PREC-1 /YES. GET H-O AC DIGIT. SZA CLA /IS IT 0? JMP FMUL6 /NO. JMS NORM10 /YES. NORMALISE RESULT. TAD AC+PREC-1 SNA CLA /IS H-O AC DIGIT STILL 0? JMP I FMU /YES. WHOLE PRODUCT MUST BE 0. TAD AC-1 /NO. GET H-O MQ DIGIT, DCA AC /PUT IT IN L-O AC TAD AC-2 DCA AC-1 FMUL6, JMS ROUND /ROUND PRODUCT. TAD ACX TAD IRX /COMPUTE NEW AC EXPONENT. DCA ACX TAD ACS /COMPUTE NEW AC SIGN. TAD IRS /BY EXCLUSIVE OR OF AND [0020] /IR AND AC SIGNS. DCA ACS JMP I FMU /EXIT. /STPACK /STORES FLOATING AC IN ITS PACKED FORM. /STORAGE LOCATION IS SPECIFIED BY AC AT ENTRY. AC IS 0 AT /EXIT. / STPACK, 0 TAD [-1] DCA AX1 /SET FIRST STOARAGE LOCATION. RDF /PRESERVE CALLING DATA BANK. TAD (CDF 0) DCA STXX CPY STXX,STXX1 CDF 0 /SET DATA BANK 0 TO BEGIN. TAD [AC-1] DCA AX0 /SET FIRST AC LOCATION. TAD [-NUMWD+1] /NUMBER OF 3-DIGIT WORDS. DCA WDCNT JMS CHKEXP /CHECK FOR EXPONENT OVERFLOW. TAD ACX ROTL5 /CONSTRUCT FIRST WORD OF AND (7740) /PACKED FORM, WITH EXPONENT, TAD ACS /SIGN, TAD I AX0 /AND LOW-ORDER AC DIGIT. STXX, XX /SET OUTPUT DATA BANK. DCA I AX1 /STORE FIRST WORD. CLL STPL, CDF 0 /GET AN AC DIGIT. TAD I AX0 ROTL4 TAD I AX0 /GET A SECOND AC DIGIT. ROTL4 TAD I AX0 /GET A THIRD DIGIT. STXX1, XX /STORE AS PACKED WORD. DCA I AX1 CDF 0 ISZ WDCNT /IS IT END OF LOOP? JMP STPL /NO. GO PACK ANOTHER WORD. JMP I STPACK /YES. EXIT. / /CHECK FOR EXPONENT OVERFLOW OF ACX. CHKEXP, 0 TAD ACX SPA /TAKE ABSOLUTE VALUE OF ACX. CIA AND [7700] SZA CLA /IS EXPONENT LEGAL. JMP ERREXP JMP I CHKEXP /YES, RETURN. EP21=. LIT PAGE 22 /FDV /FLOATING DECIMAL DIVIDE SUBROUTINE. /DIVIDES FAC BY IR, LEAVING ROUNDED QUOTIENT IN FAC. /PDP-8 AC IS 0 ON ENTRY AND EXIT. / FDV, 0 TAD IR+PREC-1 /GET H-O IR DIGIT. SNA CLA /IS IT 0? JMP ERRD0 /YES. DIVISION BY 0. TAD AC+PREC-1 /GET H-O FAC DIGIT. SNA CLA /IS IT 0? JMP I FDV /YES. DIVIDEND IS 0, SO EXIT. TAD [-PREC] /MOVE IR TO IRP, CLEAR FMQ. DCA WDCNT TAD [IR-1] DCA AX0 TAD (IRP-1) DCA AX1 TAD [MQ-1] DCA AX2 FDVL0, TAD I AX0 /GET AN IR DIGIT. DCA I AX1 /STORE IN IRP. DCA I AX2 /CLEAR AN FMQ DIGIT. ISZ WDCNT /DONE? JMP FDVL0 /NO. DCA ALDIG /YES. CLEAR FAC OVERFLOW DIGIT. TAD [-PREC-1] DCA SHCNTR /INITIALIZE SHIFT COUNTER. TAD [IR-1] JMS COMP10 /TAKE 10'S COMPLEMENT OF IR. FDVL1, DCA DIGAC /CLEAR QUOTIENT DIGIT ACCUMULATOR. FDVL2, TAD [IR-1] JMS ADSUB /ADD IR TO FAC. SZA CLA /IS THERE A CARRY? JMP FDVAD1 /YES. CLA CMA /NO. TAD ALDIG /SUBTRACT 1 FROM AC OVERFLOW DIGIT. SPA /IS RESULT POSITIVE? JMP FDVTMQ /NO. DCA ALDIG /YES. STORE NEW OVERFLOW DIGIT. FDVAD1, ISZ DIGAC /INCREMENT QUOTIENT DIGIT. JMP FDVL2 / /GETS HERE WHEN AC OVERFLOW DIGIT GOES NEGATIVE. FDVTMQ, CLA TAD (IRP-1) JMS ADSUB /ADD IRP TO FAC. CLA /CLEAR CARRY, IF ANY TAD MQ+PREC-1 /GERT HO MQ DIGIT. SZA CLA /IS IT ZERO? JMP FDVMV /NO. TAD AC+PREC-1 /YES. MOVE FAC H-O DIGIT. DCA ALDIG /TO FAC OVERFLOW DIGIT. TAD (-PREC-PREC+1) /SHIFT FAC,FMQ LSFT 19 DCA WDCNT TAD [AC+PREC-1] DCA NORMTO TAD (AC+PREC-2) DCA NORMFR FDVL3, TAD I NORMFR /MOVE A DIGIT. DCA I NORMTO CLA CMA TAD NORMFR DCA NORMFR CLA CMA TAD NORMTO DCA NORMTO ISZ WDCNT /END OF LOOP? JMP FDVL3 /NO. TAD DIGAC /YES. MOVE ACCUMULATED QUOTIENT DCA MQ /DIGIT TO L-O MQ DIGIT. ISZ SHCNTR /INCREMENT SHIFT COUNTER. JMP FDVL1 /DON'T CARE ON OVERFLOW. JMP FDVL1 / FDVMV, TAD [MQ-1] /MOVE FMQ TO FAC DCA AX0 TAD [AC-1] DCA AX1 TAD [-PREC] DCA WDCNT FDVL4, TAD I AX0 DCA I AX1 ISZ WDCNT JMP FDVL4 TAD DIGAC /MOVE EXTRA DIGIT TO H-O MQ. DCA AC-1 JMS ROUND /ROUND QUOTIENT. TAD IRX /COMPUTE NEW EXPONENT. TAD SHCNTR CIA TAD ACX DCA ACX TAD ACS TAD IRS AND [0020] DCA ACS JMP I FDV / SHCNTR, 0 /DIVISION SHIFT COUNTER. IRP, 0 /POSITIVE IR VALUE. *IRP+PREC /ADSUB /DECIMAL ADD SUBROUTINE. /ADDS MAGNITUDE OF SPECIFIED REGISTER (IR OR IRP) /TO FAC. CARRY OUT OF HIGH-ORDER /FAC DIGIT IS IN 8AC ON EXIT. /CALLING SEQUENCE IS: / TAD [REG-1] / JMS ADSUB / ADSUB, 0 DCA AX0 /INITIALISE FIRST OPERAND LOCATION. TAD [AC-1] /INITIALISE SECOND OPERAND LOC. DCA AX1 TAD [AC-1] /INITIALISE THIRD OPERAND LOC. DCA AX2 TAD [-PREC] /INITIALISE COUNT. DCA WDCNT ADLP, TAD I AX0 /ADD TWO DIGITS. TAD I AX1 TAD DECIMAL [-10] OCTAL /SUBTRACT 10. SPA /IS RESULT GE 10? JMP ADBK /NO. DCA I AX2 /YES. STORE RESULT-10. CLA IAC /PUT CARRY DIGIT IN AC. JMP ADISZ / ADBK, TAD DECIMAL [10] OCTAL /ADD BACK 10. DCA I AX2 /STORE RESULT. ADISZ, ISZ WDCNT /END OF LOOP? JMP ADLP /NO. GO DO NEXT DIGIT. JMP I ADSUB /YES. EXIT WITH AC= 0 OR 1. LIT *BP23 /SWAP /SWAPS IR AND FAC DIGIT FOR DIGIT. /SWAPS VALUES, SIGNS, AND EXPONENTS. /ASSUMES 8AC CLEAR ON ENTRY AND EXIT. / SWAP, 0 TAD [IR-1] /INITIALIZE LOOP. DCA AX0 TAD [IR-1] DCA AX2 TAD [AC-1] DCA AX1 TAD [AC-1] DCA AX3 TAD (-PREC-2) DCA WDCNT /COUNT OF DIGITS +SIGN+EXPONENT. SWAPL, TAD I AX0 /GET DIGIT OF IR. DCA TMP /SAVE IT. TAD I AX1 /GET A DIGIT OF AC. DCA I AX2 /STORE IT IN IR. TAD TMP /GET SAVED IR DIGIT. DCA I AX3 /STORE IT IN FAC. ISZ WDCNT /END OF LOOP? JMP SWAPL /NO. JMP I SWAP /YES. /COMP10 /10'S COMPLEMENT SUBROUTINE. /TAKES 10'S COMPLEMENT OF REGISTER SPECIFIED BY 8AC /AT ENTRY. 8AC IS 0 AT EXIT. FORM OF CALL IS / TAD [REG-1] / JMS COMP10 / COMP10, 0 DCA AX0 /INITIALISE WORD INDICIES. TAD AX0 DCA AX1 TAD [-PREC] /SET COUNTER. DCA WDCNT C10L1, CLA IAC /SET CARRY TO 1. C10L2, DCA TMP /SAVE CARRY. TAD I AX0 /GET A DIGIT. CMA /COMPLEMENT IT. TAD TMP /ADD CARRY. SMA /IS (9-DIGIT+CARRY-10) POSITIVE? JMP C10ST /YES. TAD DECIMAL [10] OCTAL /NO. ADD 10 BACK. DCA I AX1 /STORE DIGIT. ISZ WDCNT /DONE YET? JMP C10L2 /NO. MAKE CARRY 0. JMP I COMP10 /YES. EXIT. / C10ST, DCA I AX1 /STORE DIGIT. ISZ WDCNT /DONE YET? JMP C10L1 /NO. MAKE CARRY 1. JMP I COMP10 /YES. EXIT. /ALIGN /ALIGNMENT SUBROUTINE. /SHIFTS REGISTER SPECIFIED BY INPUT 8AC RIGHT NUMBER /OF PLACES SPECIFIED BY ALCNT. /8AC IS CLEAR ON EXIT. THE CONTENTS OF "ALDIG" IS USED TO /LEFT FILL. / ALIGN, 0 DCA AX1 /STORE "TO" REGISTER ADDRESS. TAD AX1 TAD ALCNT DCA AX0 /STORE "FROM" REGISTER ADDRESS. TAD [-PREC] TAD ALCNT /ALCNT-PREC DCA WDCNT /SET COUNT. ALL1, TAD I AX0 /GET A DIGIT. DCA I AX1 /STORE IT MOVED. ISZ WDCNT /END OF LOOP? JMP ALL1 /NO. TAD ALCNT /YES. CIA DCA WDCNT /SET COUNT OF LEFT FILL IDGITS. ALL2, TAD ALDIG DCA I AX1 /STORE AN ALIGNMENT DIGIT. ISZ WDCNT /END OF FILL LOOP? JMP ALL2 /NO. JMP I ALIGN /YES. EXIT. /NORM10 /FLOATING DECIMAL NORMALISE ROUTINE. /NORMALISES FLOATING AC. /ASSUMES 8AC IS 0 ON ENTRY AND EXIT. / NORM10, 0 TAD [-PREC] /SET LIMIT FOR ALL DIGITS = 0. DCA WDCNT TAD [AC+PREC-1] /SET H-O DIGIT LOCATION. DCA NORMFR NLP1, TAD I NORMFR /GET AN AC DIGIT SZA CLA /IS IT ZERO? JMP NLP1E /NO. END LOOP 1. CLA CMA /BACK UP WORD POINTER. TAD NORMFR DCA NORMFR ISZ WDCNT /LOOKED AT EACH AC DIGIT? JMP NLP1 /NO. DCA ACX /YES. THEREFORE ALL 0. CLEAR ACX. DCA ACS /CLEAR ACS. JMP I NORM10 /EXIT. / NLP1E, TAD [PREC] /FOUND NON-ZERO DIGIT. TAD WDCNT /PREC-# OF NON-ZERO DIGITS. SNA /WAS H-O DIGIT 0? JMP I NORM10 /YES. SO EXIT. CIA DCA TMP /NO. SAVE # OF TRAILING ZEROES TAD [AC+PREC-1] DCA NORMTO /SET MOVE "TO" LOCATION. NLP2, TAD I NORMFR /GET A DIGIT. DCA I NORMTO /STORE IT. CLA CMA /DECREMENT LOC. COUNTERS. TAD NORMFR DCA NORMFR CLA CMA TAD NORMTO DCA NORMTO ISZ WDCNT /END OF LOOP? JMP NLP2 /NO. TAD ACX /SUBTRACT # OF SHIFTS FROM TAD TMP /AC EXPONENT. DCA ACX NLP3, DCA I NORMTO /SET AN AC DIGIT TO 0. CLA CMA /DECREMENT LOCATION. TAD NORMTO DCA NORMTO ISZ TMP /END OF LOOP? JMP NLP3 /NO. JMP I NORM10 /YES. EXIT. EP23=. LIT PAGE 33 /ROUND /ROUNDS FAC ACCORDING TO HIGH-ORDER FMQ DIGIT. /8AC IS 0 AT ENTRY AND EXIT. / ROUND, 0 TAD MQ+PREC-1 /GET H-O MQ DIGIT. TAD (-5) SPA CLA /IS H-O FMQ DIGIT 5 OR MORE? JMP I ROUND /NO. EXIT. TAD [AC-1] /YES. INITIALISE ADD AND CARRY /LOOP. DCA AX0 TAD [AC-1] DCA AX1 TAD [-PREC] /MAXIMUM NUMBER OF CARRY DCA WDCNT /PROPAGATIONS. ROUNDL, TAD I AX0 IAC /ADD 1 TO AN AC DIGIT. TAD DECIMAL [-10] OCTAL SPA /IS SUM BETWEEN 1 AND 9? JMP ROUNDE /YES. ALMOST DONE. DCA I AX1 /NO. IT'S 0. THUS THERE'S A CARRY. ISZ WDCNT /DONE EVERY DIGIT OF FAC? JMP ROUNDL /NO. DO NEXT DIGIT. ISZ AC+PREC-1 /YES. FAC HAS OVERFLOWED. /MUST BE ALL 0'S. THEREFORE SET /HIGH-ORDER FAC DIGIT TO 1. ISZ ACX /INCREMENT AC EXPONENT. NOP /TO COVER CASE OF .99999995! JMP I ROUND /EXIT. / ROUNDE, TAD DECIMAL [10] OCTAL DCA I AX1 /STORE INCREMENTED DIGIT. JMP I ROUND /EXIT. BP33=. LIT /TYFP /TYPE A FLOATING-POINT NUMBER. /TYPES CONTENTS OF FAC ON TELETYPE. /PDP-8 AC AT ENTRY SPECIFIES WHETHER OR NOT TO INSERT /LEADING BLANKS FOR ALGINMENT ABOUT = SIGN. / 0 - INSERT / 1 - DON'T INSERT. /PDP8 AC IS 0 AT EXIT. / PAGE 24 TYFP, 0 DCA QPRSP /STORE "?DON'T PRINT SPACES". TAD AC+PREC-1 /GET H-O AC DIGIT. SNA CLA /IS IT 0? JMP TYZERO /YES. THEREFORE WHOLE # IS 0. TAD [AC-1] /NO. COUNT # OF TRAILING ZEROES. DCA AX0 DCA ALCNT /CLEAR "NUMBER OF 0'S". TYFPL1, TAD I AX0 /GET AN AC DIGIT. SZA CLA /IS IT 0? JMP TYFP1E /NO. ISZ ALCNT /ADD 1 TO COUNT. JMP TYFPL1 /GO TO LOOK AT NEXT. / TYFP1E, TAD ACX /GET AC EXPONENT. SPA /IS IT NEGATIVE? JMP TYFPEF /YES. TYPE IN "E" FORMAT. TAD [-10] /NO. SMA CLA /IS IT > 8? JMP TYFPEF /YES. TYPE IN "E" FORMAT. TAD ACX /NO, BETWEEN 0 AND 7. TYFPFF, JMS TYFPS /TYPE IN "F" FORMAT. JMP I TYFP /EXIT. / TYFPEF, CLA IAC /SET AC = 1. JMS TYFPS /TYPE 1 DIGIT BEFORE DEC. PT. TAD (305) /TYPE "E". TYPE TAD ACX SMA CLA /IS AC EXP. NEGATIVE? JMP TYFPEP /NO. TAD (255) /YES. TYPE "-". TYPE DCA TMP /CLEAR TENS DIGIT OF EXP. TAD ACX CIA IAC /ADD 1. TYFPL2, TAD DECIMAL [-10] OCTAL SPA /IS DIFFERENCE POSITIVE? JMP TYFP2E /NO. END OF SUBTRACT LOOP. ISZ TMP /ADD 1 TO TENS DIGIT. JMP TYFPL2 / TYFP2E, TAD DECIMAL [10] OCTAL DCA ALDIG /SAVE UNITS DIGIT. TAD TMP /GET TENS DIGIT. SNA /IS IT ZERO? JMP TYFPTU /YES. DON'T PRINT IT. TAD (260) /NO. CONVERT TO ASCII. TYPE /PRINT IT. TYFPTU, TAD ALDIG /GET UNITS DIGIT TAD (260) /CONVERT TO ASCII. TYPE JMP I TYFP /EXIT. / TYFPEP, TAD (253) /TYPE "+". TYPE DCA TMP CLA CMA TAD ACX /GET EXPONENT. JMP TYFPL2 / TYZERO, TAD [PREC-1] DCA ALCNT /SET "# OF 0'S" TO (PREC-1). IAC /SET "EXP" TO 1. JMP TYFPFF /GO TYPE IN "F" FORMAT. / QPRSP, 0 /?DON'T PRINT SPACES BEFORE NUMBER. /TYFPS /FLOATING POINT OUTPUT SUBROUTINE. INPUTS ARE / A) NUMBER OF TRAILING ZEROES, IN "ALCNT"; / B) NUMBER OF DIGITS BEFORE DECIMAL POINT "N", STORED / IN PDP-8 AC AT ENTRY. /IT TYPES OUT THE FOLLOWING: / A) (4-N) SPACES; / B) "-" IF ACS IS -, "SPACE" IF ACS IS "+"; / C) N LEADING DIGITS OF FAC; / D) IF ALCNT GE (PREC-N), EXITS; / E) OTHERWISE, TYPES "." FOLLOWED BY (PREC-N-ALCNT) / MORE DIGTS OF FAC. / TYFPS, 0 DCA DIGAC /SAVE OF LEADING DIGITS. TAD QPRSP SNA CLA /SHOULD SPACES BE PRINTED? JMP TYFPS0 /YES. TAD ACS /NO, GET AC SIGN. SNA CLA /IS IT +? JMP TYFP2B /YES, NO SPACE BEFORE NUMBER. JMP TYFP2A /NO, GO TO TYPE "-". TYFPS0, TAD DIGAC /# LEADING DIGITS. TAD [-PREC] CIA /NUMBER OF SPACES BEFORE . SZA /IS IT 0? JMS TYSPC /NO, GO PRINT APPROPR. # OF SPACES. TYFPS2, TAD ACS /YES, GET FAC SIGN. SNA CLA /IS IT +? TAD (-15) /YES, TYPE "SPACE". TYFP2A, TAD (255) /NO, TYPE "-". TYPE TYFP2B, TAD [AC+PREC-1] /SET UP H-O FAC DIGIT LOCATION. DCA NORMFR TAD DIGAC /GET OF LEADING FAC DIGITS. SNA /IS IT 0? JMP TYFPS4 /YES, DONT TYPE LEADING DIGITS. CIA DCA WDCNT TYFPS3, TAD I NORMFR /GET AN AC DIGIT TAD (260) TYPE CLA CMA /GO ON TO NEXT FAC DIGIT. TAD NORMFR DCA NORMFR ISZ WDCNT /END OF LOOP? JMP TYFPS3 /NO. TAD DIGAC /GET COUNT OF LEADING DIGITS. TYFPS4, TAD ALCNT /ADD COUNT OF ZEROES. TAD [-PREC] SMA /ANYTHING LEFT TO TYPE? JMP TYFPSX /NO. EXIT. DCA WDCNT /YES. STORE COUNT. TAD (256) /TYPE "." TYPE TAD [PREC] /FORCE EXIT FROM PRINT LOOP. DCA ALCNT JMP TYFPS3 / TYFPSX, CLA JMP I TYFPS / /INSTALLATION CODE LOCATION: INSCOD, 0 EP24=. LIT PAGE 26 /MAIN /ESI MAIN CONTROL ROUTINE. /8AC IS CLEAR AT ENTRY. / ESI, TLS /SET TTY OUTPUT FLAG. MAIN, CRLF /RETURN CARRIAGE. JMS INPUT /READ A LINE OF INPUT. TAD NXTLXN /CALCULATE LENGTH OF INPUT. TAD (-BUFF) DCA LENBUF TAD ENDPR /INITIALISE STACK POINTER DCA STKNXT /TO END OF USER PROGRAM AREA. DCA XSTEP /SET "DIRECT STATEMENT IN PROCESS". TAD (TSCRN-1) /DOES RECOGNISER HAVE A NUMBER? JMS RECOG JMP STIND /YES. INDIRECT STATEMENT. TAD (DSTAT-1) /NO. MUST BE DIRECT STATEMENT. JMS SYNAN /CALL SYNTACTIC ANALYSER. JMP MAIN+1 /GET NEXT STATEMENT. / / /INDIRECT STATEMENT PROCESSOR. / /STIND /STORE INDIRECT STATEMNET. / STIND, JMS FNDSTP /SEE IF STEP IS ALREADY PRESENT. SKP /NOT PRESENT. JMS DLSTPS /PRESENT, DELETE IT. TAD ENDPR DCA STKNXT /RESTORE STACK IN CASE OF DELETION. TAD ARYNXT /CHECK FOR POSSIBLE OVERFLOW. CIA CLL TAD STKNXT TAD LENBUF SZL CLA JMP ERRSO CDF 10 TAD I PRVSTP /GET POINTER OF PRVST. CDF 0 PUSH /STORE IN FIRST WORD OF STEP. TAD ENDPR CDF 10 DCA I PRVSTP /SET PREVIOUS STEP TO PT. TO NEW ONE. CDF 0 TAD STKNXT DCA ALCNT /SAVE LOC. OF STEP . GET (STEPNO) JMS PUSHAC /SAVE STEP TAD STKNXT / GET NEXT STACK LOCATION. DCA SVLXF /SET LOC. OF STEP STORAGE. CPY [0010],SVLXF+1 STIND1, RDADV NXTLXF /GET CHAR. FROM BUFFER. STIND2, WRADV SVLXF /WRITE IT IN STEP STORE. TAD CURCHR /GET CURRENT CHARACTER. SNA CLA /IS IT END? JMP STIND3 /YES. JMP STIND1 / STIND3, TAD SVLXF+1 /GET?RIGHT. RAR /IS IT RIGHT? SZL CLA JMP STIND2 /YES. FORCE LEFT. TAD ENDPR /NO. LEFT. CMA TAD SVLXF /SVLXF-ENDPR-1. CLL RAL ROTL4 /SHIFT TO EXP. POSITION. CDF 10 TAD I ALCNT /ADD STEP WORD WITH EXP OF 1. DCA I ALCNT /STORE BACK WITH WORD COUNT. CDF 0 TAD SVLXF DCA ENDPR /SET NEW END OF PROGRAM JMP MAIN+1 / LENBUF, 0 /BUFFER LENGTH /FNDSTP /FIND STEP LOCATION GIVEN STEP #. /STEP # IN FAC AT ENTRY, 8AC CLEAR. /AT EXIT: / CURSTP - CURRENT STEP LOCATION (IF IT'S PRESENT) / PRVSTP - PREVIOUS STEP LOCATION / STEPNO - STEP / /CALLING SEQUENCE: / JMS FNDSTP / ... /NOT FOUND / ... /FOUND / FNDSTP, 0 CLA CMA TAD ACX SZA CLA /IS ACX = 1? JMP ERRSTP /NO. TAD ACS /YES. SZA CLA /IS ACS = 0? JMP ERRSTP /NO. STORE (STEPNO) /SAVE FAC IN STEPNO. TAD AC+PREC-1 /GET PART . TAD (PRTLST-1) /GET PART LOCATION. DCA CURSTP FNDSTL, JMS GNSTP /GET NEXT STEP LOCATION. JMP I FNDSTP /EXIT AT "NOT FOUND". TAD CURSTP IAC /GET LOC. OF STEP . CDF 10 JMS I [GETNUM] /UNPACK STEP NUMBER. CLA IAC DCA ACX /SET ACX TO 1. SWP GET (STEPNO) JMS COMP /COMPARE DESIRED WITH CURRENT STEP JMP I FNDSTP /DC. NOT YET FOUND. ISZ FNDSTP JMP I FNDSTP /"FOUND" EXIT. / / /PROCESS "DIGIT PART". / PRDP, CLA IAC /SET ACX TO 1. DCA ACX RETURN / /PROCESS EXPONENT PART. / PREP, TAD [-PREC] /CLEAR THE FAC. JMS CLFACS CLA IAC /SET AC MANTISSA TO 1. DCA AC+PREC-1 DCA ACS JMP PRLOG /GO TAKE LOG OF RESULT. EP26=. LIT *BP33 /GNSTP /GET NEXT STEP SUBROUTINE. /AT ENTRY, CURSTP HAS LOC. OF CURRENT STEP. /AT EXIT; / CURSTP - NEXT STEP (IF NOT LAST OF PART) / PRVSTP - PREVIOUS STEP LOC. / /CALLING SEQUENCE: / JMS GNSTP / ... /LAST STEP. / ... /NOT LAST. / GNSTP, 0 TAD CURSTP DCA PRVSTP CDF 10 TAD I PRVSTP SNA /IS CURRENT STEP LAST? JMP GNEXT /YES. DCA CURSTP /NO. ISZ GNSTP GNEXT, CDF 0 JMP I GNSTP /TAKE "NOT LAST" EXIT. BP33=. LIT *BP27 /ERROR PROCESSOR. / / 1) STORAGE EXCEEDED: / ERRSO, JMS ERRG /GO TO GENERAL ERRROR TYPEOUT. TEXT /STORAGE/ / / 2) DIVISION BY 0: / ERRD0, JMS ERRG TEXT /0 DIVISOR/ / / 3) SYNTACTIC ERROR: / ERRSYN, JMS ERRG EHMSG, TEXT /EH?/ / / 4) UNDEFINED VARIABLE: / ERRUND, JMS ERRG TEXT /UNDEFINED/ / / 5) EXPONENT OVER/UNDERFLOW: / ERREXP, JMS ERRG TEXT /EXPONENT/ / / 6) SUBSCRIPT ERROR: / ERRSUB, JMS ERRG TEXT /SUBSCRIPT/ / / 7) PART ERROR: / ERRPRT, JMS ERRG TEXT /PART / / / 8) STEP ERROR: / ERRSTP, JMS ERRG TEXT /STEP / / /GENERAL ERROR TYPEOUT: / ERRG, 0 TAD XSTEP SZA CLA /IS CURRENT STATEMENT DIRECT? JMP ERRIND /NO, INDIRECT, TAD (ERAB) /TYPE "ERROR ABOVE" ERRG1, JMS TYPKST TAD ERRG JMS TYPKST /TYPE SPECIFIC MESSAGE. JMP MAIN /GO GET NEW LINE. ERAB, TEXT /ERROR ABOVE: / / ERRIND, TAD (ERST) JMS TYPKST /TYPE "ERROR IN STEP " TAD XSTEP JMS TYSNUM /TYPE STEP NUMBER. TAD (LCOL) /TYPE ": ". JMP ERRG1 ERST, TEXT /ERROR IN STEP / LCOL, TEXT /: / LIT /INPUT /MAIN INPUT SUBROUTINE - USED FOR ALL KEYBOARD INPUT. /8AC IS 0 AT ENTRY AND AT EXIT. /AT EXIT, NXTLXF CONTAINS LOCATION OF FIRST CHARACTER OF /BUFFER; LAST CHARACTER IS EITHER 00 ("PERIOD-CR") OR /37("CR") FOLLOWED BY 00. / / /INPUT LINE BUFFER. / BLENG=DECIMAL 36 OCTAL BUFF, 0 *BUFF+BLENG / *BP30 INPUT, 0 TAD (207) /RING BELL. TYPE TAD (337) TYPE ININIT, TAD (BUFF) /INITIALISE READ BUFFER. DCA NXTLXN DCA NXTLXN+1 TAD (-BLENG-BLENG+2) /LIMIT # OF CHARACTERS TO 70. DCA WDCNT TAD (BUFF) DCA NXTLXF /INITIALISE LEXICAL ANALYSER. DCA NXTLXF+1 DCA QANYIN /CLEAR "?ANY INPUT YET". CGET, KSF /GET A CHARACTER FROM KEYBOARD. JMP .-1 /WAIT FOR CHARACTER. KRB /READ CHAR. DCA TMP /SAVE CHAR. TAD (-NSPCHR) /SET UP SPECIAL CHARACTER COMPARE LOOP. DCA MULCNT TAD (SPCTB-1) DCA AX0 INPL1, TAD I AX0 /GET A CHAR. CODE. TAD TMP /ADD INPUT CHAR. SNA CLA /IS IT A SPECIAL ONE? JMP I AX0 /YES, GO TO SPECIAL ROUTINE. ISZ AX0 /NO, ADVANCE OVER ENTRY LOC. ISZ MULCNT /END OF LOOP? JMP INPL1 /NO. ISZ QANYIN /YES, SET "?ANY INPUT YET". INP1, TAD TMP /STORE "STRIPPED" CHAR. AND [0077] /IN BUFFER. WRADV NXTLXN TAD ADVAC /ECHO INTERNAL CHAR. JMS TYINCH / TO TELEPRINTER. ISZ WDCNT /IS BUFFER FULL? JMP CGET /NO. / /GETS HERE OR BUFFER FULL OR ON "CR". / NDLIN, CRLF TAD QANYIN SNA CLA /HAS ANYTHING BEEN PUT IN BUFFER? JMP INPUT+1 /NO. GO GET A NEW LINE. BKPTR NXTLXN /BACK UP POINTER. RD NXTLXN /READ LAST CHAR. STORED IN BUFFER. TAD (-56) SNA /IS IT "."? JMP INP2 /YES. TAD (-77+56) SNA CLA /IS IT "?"? JMP INPUT+1 /YES. FORGET LINE. ADV NXTLXN /ADVANCE OVER LAST CHAR. TAD (37) WRADV NXTLXN /STORE CR AT END OF LINE. INP2, WR NXTLXN /STORE 00 AT END OF LINE. JMP I INPUT /EXIT. / /GETS HERE ON "RUBOUT". / PRRO, DIFPTR NXTLXF,NXTLXN TAD [-1] SNA SPA CLA /IS THERE MORE THAN 1 CHAR IN UBFFR JMP INPUT+1 /NO. ISZ WDCNT /ADVANCE COUNTER. BKPTR NXTLXN /BACK UP POINTER. TAD (337) TYPE /TYPE "_". JMP CGET / / /GETS HEREON DPACE. PRSPC, TAD QANYIN SZA CLA /HAVE ANY CHARACTERS BEEN READ? JMP INP1 /YES. JMP CGET /NO. / /SPECIAL CHARACTER TABLE: SPCTB, -215 /C-R JMP NDLIN -240 /SPACE JMP PRSPC -ICODE /ALT MODE OR "ESC" JMP CANCEL -377 /RUBOUT JMP PRRO -337 /BACK ARROW JMP CGET -300 JMP CGET -200 /L-T JMP CGET -207 /BELL JMP CGET -212 /LINE FEED JMP CGET 0 JMP CGET NSPCHR=DECIMAL 10 OCTAL / EP30=. LIT PAGE 31 /SYNAN /SYNTACTIC ANALYSER. /CALLED WITH MAJOR GOAL LOCATION IN AC. /EXITS WITH 8AC CLEAR. / SYNAN, 0 STGL, DCA GOAL /GAOL IS AN AUTO-INDEX. SYNLP, TAD I GOAL /GET "LOOKFOR" WORD. SPA /IS GOAL TERMINAL? JMP TRMGL /YES. DCA TMP /SAVE NEW GOAL TAD GOAL /GET OLD GOAL. JMS PUSH1 /PUT IT ON STACK. TAD TMP JMP STGL /SET NEW SUBGOAL. / TRMGL, AND [3777] /EXTRACT TERMINAL LOCATION. JMS RECOG /CALL RECOGNISER. IS THAT CURRENT? JMP SUCLP /YES. SUCCESS. TSTFAL, TAD I GOAL /NO, FAULURE. GET 2ND WORD. DCA TMP /SAVE IT. TAD TMP AND (3000) /GET FAIL CODE. SNA /IS IT 0 - FAIL? JMP POPGL /YES. GO REPORT FAILURE TO TO TAD (-1000) / SUPER-GOAL. SNA /IS IT 1 - OK? JMP NWGL /YES. GO REPORT SUCCESS TAD (-1000) / TO SUPER-GOAL. SZA CLA /IS IT 2 - ALTERNATE? JMP ERRSYN /NO. 3 - DEAD. SYNTAX ERROR. TAD TMP /YES. AND (0740) /EXTRACT "ALTERNATE" LOC. CLL RTR ROTR3 TAD GOAL /LOCATION OF NEW GOAL JMP STGL /SET NEW GOAL. / POPGL, JMS POP1 /POP SUPER-GOAL. DCA GOAL /REPORT FAILURE. JMP TSTFAL / NWGL, JMS POP1 /GET PARENT GOAL. DCA GOAL /SET GOAL. REPORT BACK SUCESS. SUCLP, TAD I GOAL /GET REL LOC OF SUCCESSOR. AND (0037) DCA SUCLOC /SAVE IT. TAD GOAL DCA GOALT /TEMPORARY GOAL POINTER. SUCLP2, TAD I GOALT /ALL GENERATORS RETURN HERE. SMA CLA /IS NEXT LOC. A GENERATOR? JMP SETSUC /NO. GO SET SUCESSOR. ISZ GOALT /ADVANCE TO GENERATOR WORD,P TAD I GOALT /GET GENERATOR POINTER. AND [3777] /EXTRACT GEN. LOC. DCA TMP JMP I TMP /GO TO GENERATOR. AC = 0. / SETSUC, TAD SUCLOC /GET SUCESSOR LOC. SNA /IS THERE A SUCESSOR? JMP NWGL /NO. TAD (-30) /YES. GET REL LOC OF CUCESSOR. TAD GOAL JMP STGL /NEW GOAL. / GOALT, 0 SUCLOC, 0 / / PUSH1, 0 CDF 10 DCA I STKNXT /STORE WORD ON STACK. CDF 0 TAD STKNXT CMA /WAS LAST STACK ENTRY AT TAD ARYNXT /LAST WORD BEFORE ARRAY VALUES? SNA CLA JMP ERRSO /YES. STACK OVERFLOW. ISZ STKNXT /NO. ADVANCE TO NEXT WORD. JMP I PUSH1 / POP1, 0 /AC NOT NECESSARILY CLEAR AT ENTRY. CLA CMA TAD STKNXT DCA STKNXT /BACK UP STACK. CDF 10 TAD I STKNXT /GET TOP OF STACK. CDF 0 JMP I POP1 LINPAG=DECIMAL 56 OCTAL /LINES PER PAGE. / /EJECT -- TOP OF FORM ROUTINE. / EJECT, 0 TAD LINEKNT /IS THE LINE COUNT ZERO? SNA CLA /NO. JMP NOLF /YES, DONT FEED LINES. TAD ELF TYPE /EJECT LINES UNTIL PAGE COUNT EXHAUSTED. ISZ LINEKNT JMP .-3 NOLF, CPY (-LINPAG),LINEKNT /RESET LINE COUNTER. TAD (JEQSEQ-1) /TYPE OUT END OF PAGE SEQUENCE. JMS TYUNPK JMP I EJECT / / SYNEXIT, TAD QEOL /IS END OF LINE FLAG "EOL"? SNA CLA JMP I SYNAN /YES, EXIT. DCA QEOL TAD QINSTAT /ARE WE IN INTERRUPT MODE. SZA CLA /YES, TRY FOR . JMP SYNEX1 TAD XSTEP /ARE WE TRYING FOR . SZA CLA TAD (ISTAT-DSTAT) /NO, TRY FOR NEW . TAD (DSTAT-INTST) SYNEX1, TAD (INTST-1) JMP STGL / /TYUNPK -- TYPE UNPACKED STRING. / ADDR-1 OF STRING IN AC. / TYUNPK, 0 DCA AX0 /GET STRING ADDRESS-1. TYUN1, CDF 10 TAD I AX0 /GET NEXT CHARACTER. CDF 0 SNA /IS IT EOL? JMP I TYUNPK /YES, EXIT. TYPE /NO, TYPE IT OUT. JMP TYUN1 LIT /STRING POINTER MANIPULATION SUBROUTINES. / /THIS SET OF MACROES AND SUBROUTINES PROVIDE FOR THE EASY /MANIPULATION OF PACKED TWO-BYTE-PER-WORD CHARCTER STRINGS. /THE MACRO DEFINITIONS ARE AT THE BEGINNING OF THE PROGRA. /ALL OF THESE SUBROUTINES ARE CALLED BY MEANS OF MACROES. /THE FORMS AND MEANINGS OF THESE MACROES ARE AS FOLLOWS: / / 1) ADVNCE PTRNAM / ADVANCE POINTER "PTRNAM" TO NEXT CHAR. OF STRING. / /2) RDADV PTRNAM / READ CURRENT CHAR. AND ADVANCE PTRNAM. / /3) WRADV PTRNAM / WRITE 8AC TO CURRENT CHAR. AND ADVANCE PTRNAM. / /4) RD PTRNAM / READ CURRENT CHAR. TO 8AC; SAVE IN CURCHR. / /5) WR PTRNAM / WRITE 8AC TO CURRENT CHAR. / /6) BKPTR PTRNAM / BACK UP POINTER PTRNAM / /7) DIFPTR PTR1,PTR2 / TAKE DIFFERENCE BETWEEN PTR2 AND PTR1 TO 8AC. / /SUBROUTINES. / /ALL SUBROUTINES MANIPULATE STRING POINTERS, EACH OF WHICH /IS A PAIR OF WORDS; THE FIRST WORD IS THE ADDRESS OF THE /CURRENT WORD IN THE STRING, THE SECOND IS 0000 OR 0001 /ACCORDING AS THE CURRENT CHARACTER IS THE LEFT OR RIGHT /ONE OF THE CURRENT WORD. / /ALL SUBROUTINES ARE CALLED BY A SEQUENCE OF THE FORM: / JMS SUBR / PTRNAM /POINTER LOCATION. / PAGE 32 /GTPTRS /USED BY ALL OTHER SUBROUTINES TO GET THE 2-WORD STRING /POINTERS UNPACKED TO STANDARD LOCATION. /THE LOCATION OF THE POINTER IS IN THE 8AC AT ENTRY. /CALLING SEQUENCE: / JMS GTPTRS / ... /IF ?RIGHT IS 0. / ... /IF ?RIGHT IS 1. /OUTPUTS ARE : /PTRSTR - LOCATION OF CURRENT WORD OF STRING. /QRIGHT - ?RIGHT FOR STRING. /PTRLOC - LOCATION OF WORD POINTER FOR STRING. /QLOC - LOCATION OF WORD POINTER+1 FOR STRING. / /GTPTRS ALSO SETS THE DBR TO THE PROPER VALUE. / PTRSTR=PTR1ST QRIGHT=PTR2ND PTRLOC=LPTR1ST QLOC, 0 / GTPTRS, 0 /ENTRY. DCA PTRLOC /SAVE LOCATION OF POINTER. TAD I PTRLOC /SAVE FIRST WORD OF POINTER DCA PTRSTR /IN PTRSTR. TAD PTRLOC IAC DCA QLOC /CALCULATE ADDRESS OF ?RIGHT. TAD I QLOC AND (0030) /SET THE DBR FROM ?RIGHT. TAD (CDF 0) DCA GETPTX CLA IAC /GET ?RIGHT FROM QRIGHT AND I QLOC SZA /DOES QRIGHT = 1 = RIGHT? ISZ GTPTRS /NO, EXIT AT (N+1). DCA QRIGHT /SAVE ?RIGHT IN QRIGHT. GETPTX, XX JMP I GTPTRS /EXIT TO CALLER. / /SUBROUTINE REPACK -- REPACK PREVIOUSLY UNPACKED POINTERS. /CALLING SEQUENCE: / JMS REPACK /REPACK IS CALLED BY EVERY ROUTINE WHICH HAS MODIFIED THE /INPUT POINTERS. REPACK PUTS THE UNPACKED POINTER BACK INTO /THE PROPER FORM AND SETS THE DBR TO 0. / REPACK, 0 RDF /GET THE DATA BANK FOR ?RIGHT. CDF 0 TAD QRIGHT DCA I QLOC /PUT NEW ?RIGHT BACK IN POINTER. TAD PTRSTR /PUT REVISED STRING POINTER DCA I PTRLOC /INTO POINTER. JMP I REPACK /ADVS /ADVANCE PREVIOUSLY UNPACKED POINTERS. /CALLED BY ADVPS, WRADVS, RDADVS. / ADVS, 0 TAD QRIGHT SNA CLA /IS IT LEFT OR RIGHT? JMP ADVLFT /LEFT. DCA QRIGHT /RIGHT. SET IT LEFT. ISZ PTRSTR JMP I ADVS / ADVLFT, ISZ QRIGHT /SET IT TO RIGHT. JMP I ADVS /EXIT . / / /ADVPS (CALLED BY "ADVNCE" MACRO). /ADVANCE PACKED POINTERS TO NEXT CHAR. OF STRING. / ADVPS, 0 TAD I ADVPS /BET POINTER LOC. ISZ ADVPS /ADVANCE OVER POINTE. JMS GTPTRS /UNPACK POINTER. OPR JMS ADVS /ADVANCE POINTER. JMS REPACK /REPACK POINTER. JMP I ADVPS /EXIT. / /NEWPAGE -- TYPE NEW PAGE HEADING ROUTINE. / NEWPAGE, 0 ISZ PAGEKNT /INCREMENT PAGE COUNT. TAD (PAGMES) /TYPE OUT "*PAGE ". JMS TYPKST /NOTE THAT "*" WILL CAUSE PAPER TAPE TAD PAGEKNT /TO DISREGARD THIS ON INPUT. JMS BTODX /CONVERT PAGE COUNT TO DECIMAL AND PRINT. TAD (5) JMS TYSPC /TYPE 5 SPACES. TAD [TITBUF] /TYPE OUT TITLE BUFFER. JMS TYPKUP TAD (CRLF3-1) /RETURN THE CARRIAGE AND SPACE. JMS TYUNPK JMP I NEWPAGE / / /RDS -- READ CHARACTER SUBROUTINE. /USED BY "RD" AND "RDADV" MACROES. / RDS, 0 DCA ADVAC /SAVE INPUT AC. CLA CMA /SET ADVANCE SWITCH TO NO ADVANCE. RDS1, DCA QADVC TAD I RDS ISZ RDS JMS GTPTRS /UNPACK INPUT POINTER. JMP RDSLFT /IF LEFT, GO PROCESS. TAD I PTRSTR /FETCH CURRENT WORD RDMASK, AND [0077] /AND GET LOW ORDER SIX BITS. DCA CURCHR ISZ QADVC /IF ADVANCE FLAG IS SET, JMS ADVS /ADVANCE INPUT. JMS REPACK /REPACK INPUT. TAD CURCHR TAD ADVAC /LEAVE RESULT IN AC. JMP I RDS / RDSLFT, TAD I PTRSTR /LEFT. MOVE LEFT TO RIGHT. ROTR6 JMP RDMASK /GO FETCH CHARACTER. / /RDADVS -- READ ADVANCE SUBROUTINE. /USED BY "RDADV" MACRO. / RDADVS, 0 DCA ADVAC /SAVE INPUT AND SET ADVANCE SWITCH. CPY RDADVS,RDS JMP RDS1 /WRS (CALLED BY "WR" MACRO) / WRS, 0 DCA ADVAC /SAVE INPUT 8AC. CLA CMA /SET ?ADVANCE TO NO ADVANCE. WRS1, DCA QADVC TAD I WRS /GET POINTER LOC. ISZ WRS /ADVANCE OVER POINTER. JMS GTPTRS /UNPACK POINTERS AND TEST ?RIGHT. JMP WRSLFT /LEFT CHAR. TAD I PTRSTR /RIGHT CHAR. GET WORD. AND [7700] TAD ADVAC WRS2, DCA I PTRSTR /STORE NEW WORD. ISZ QADVC /IF ?ADVANCE IS SET, JMS ADVS /ADVANCE POINTER. JMS REPACK JMP I WRS / WRSLFT, TAD ADVAC /GET CHARACTER. ROTL6 /CLEAR RIGHT-HAND CHARACTER. JMP WRS2 / / /WRADVS (CALLED BY "WRADV" MACRO) / ALTERNALTE ENTRY TO WRS. / WRADVS, 0 DCA ADVAC /SAVE INPUT AD. CPY WRADVS,WRS JMP WRS1 *BP33 /DIFPS (CALLED BY "DIFPTR" MACRO) /GET DIFFERENCE OF TWO POINTERS. /(PTR2-PTR1) TO 8AC. /CALLING SEQUENCE / JMS DIFPS / PTR1 / PTR2 / DIFPS, 0 TAD I DIFPS JMS GTPTRS OPR TAD PTRSTR CLL RAL TAD QRIGHT CIA /GET ROL. CHAR. POSITON OF PTR1 DCA ADVAC /SAVE (-PTR1) ISZ DIFPS CDF 0 TAD I DIFPS JMS GTPTRS /UNPACK PTR2. OPR TAD PTRSTR CLL RAL TAD QRIGHT TAD ADVAC /REL. POS. OF PTR2 - PTR1. ISZ DIFPS CDF 0 JMP I DIFPS / /BKPTRS -- BACK UP POINTERS. /USED BY "BKPTR" MACRO. / BKPTRS, 0 TAD I BKPTRS /UNPACK INPUT POINTER ISZ BKPTRS /AND TEST ?RIGHT. JMS GTPTRS JMP BKLFT /LEFT. GO PROCESS. DCA QRIGHT /RIGHT. MAKE PTR POINT TO LEFT. JMP BKEXIT BKLFT, ISZ QRIGHT /LEFT. MAKE PTR POINT TO RIGHT CLA CMA /OF PREVIOUS WORD. TAD PTRSTR DCA PTRSTR BKEXIT, JMS REPACK /REPACK MODIFIED POINTER. JMP I BKPTRS EP33=. LIT /UPPER MEMORY ORGANIZATION. / /PAGE 0...USED BY SYSTEM. / TOSTPN=0001 /NEXT STEP POINTER. TITBUF=0002 /TITLE BUFFER. HASCON=TITBUF+BLENG /HASTINGS CONSTANTS. / /PAGES 1...37 USER MEMORY. / / 1) PART LIST / PRTLST=200 / / / 2) VARIABLE STORAGE / VRBLOC=DECIMAL PRTLST+10 OCTAL VBLKEND=DECIMAL VRBLOC+78 OCTAL / / / 3) ARRAY STORAGE / USERPR=VBLKEND USEREND=7740 /END OF PROGRAM. / esix-1/fp.pal0100644000175000017500000002415506304342612011455 0ustar vlmvlm/FP,LIST,TAPE -- RMS. /FLOATING POINT ARITHMETIC FUNCTION ROUTINES FOR ESI-X. RMS -- 7/67. / /FUNCTIONS -- SIN, COS, LN, LOG, EXP, SQRT, ARCTAN / ALL FUNCTIONS EXCEPT SQRT USE HASTINGS APPROXIMATIONS. / SQRT USES NEWTON-RAPSON ITERATION /ALL ROUTINES PRODUCE RESULTS WITH ERROR < 3*10**-7. / /FLOATING NATURAL LOG GENERATOR. /RETURNS LN(FAC) IN FAC. / PAGE 35 PRLN, JMS FLN /GET FLOATING NATURAL LOG OF FAC. RETURN /FLOATING COMMON LOGARITHM GENERATOR. / PRLOG, JMS FLOG /GET LOGARITHM OF FAC, BASE 10 RETURN /NATURAL LOGARITHM ROUTINE. /RETURNS LN(FAC) IN FAC. /THE 8AC IS CLEAR AT ENTRY AND EXIT. FLN, 0 JMS FLOG /GET COMMON LOG OF FAC IN FAC. SWP /NOTE: LN X = LOG X * LN 10 GET (TENBASE) /MULTIPLY FAC BY LN 10. JMS FMU JMP I FLN /FLOATING COMMON LOGARITHM ROUTINE. /RETUNRS LOG(FAC) IN FAC. /8AC IS CLEAR AT ENTRY AND EXIT. / FLOG, 0 /ENTRY. TAD ACS /IS THE SIGN OF THE FAC -? SZA CLA JMP ERRARG /YES, ERROR. TAD AC+PREC-1 /IS FAC ZERO? SNA CLA JMP ERRARG /YES, ERROR. CLA CMA TAD ACX DCA SAVCS /NO...SAVE ACX-1 FOR LATER SCALING. CLA IAC DCA ACX STORE (X) /SET FAC EXPONENT TO 1 AND STORE. GET (SQRT10) JMS CHGPAR /SET X = X-SQRT(10)/X+SQRT(10) GET (FPHALF) TAD DECIMAL (-9) OCTAL /DO A FIVE TERM HASTINGS JMS HASTINGS LOGCON /APPROXIMATION. SKP TAD SAVCS /GET FORMER ACX-1. SNA /IS IT ZERO? JMP I FLOG /YES, EXIT ...NO SCALING NEEDED. SMA /NOTE: THE CHARACTERISTIC OF THE CIA /LOG IS THIS SCALING FACTOR. DCA ADVAC /NO. COMPLEMENT IT AND USE AS LOOP CONTROL. FLOGLP, SWP /X TO IR, 1 TO FAC. GET (FP1) TAD SAVCS /WAS ACX-1 > 0? SPA CLA /NO...SUBTRACT 1 FROM X. JMP FLSUBX JMS FAD /YES...ADD 1 TO X. FLINDX, ISZ ADVAC /SCALING DONE? JMP FLOGLP /NO, CONTINUE. JMP I FLOG /YES, EXIT. / FLSUBX, SWP /SUBTRACT 1 FROM X. JMS FSB JMP FLINDX /CHANGE PARAMTER SUBROUTINE. /PRODUCES X-FAC/X+FAC IN FAC. / CHGPAR, 0 STORE (Y) /SAVE FAC IN Y, JMS GETX /X TO FAC, Y TO IR. JMS FSB / X-Y. JMS GETX / XO TO FAC, X-Y TO IR, AND REVERSE. SWP STORE (X) GET (Y) /Y TO FAC, JMS FAD / X+Y TO FAC. JMS GETX / X-Y TO FAC, X+Y TO IR, JMS FDV / X-Y/X+Y IN FAC. STORE (X) JMP I CHGPAR /FLOATING ARCTANGENT GENERATOR. /PRODUCES ARCTAN(FAC) IN FAC. /8AC IS CLEAR AT ENTRY AND EXIT. / PRARC, JMS SAVSGN /SAVE SGN(FAC) AND GET ABS(X) IN FAC. GET (FP1) JMS CHGPAR /SET X=X-1/X+1. GET (PIBY4) /INITIAL HASTINGS TERM OF PI/4. TAD DECIMAL (-15) OCTAL /DO AN 8 TERM HASTINGS APPROXIMATION JMS HASTINGS ARCCON SKP CPY SAVCS,ACS /SIGN OF OUTPUT = SIGN OF INPUT. RETURN /MINOR SUBROUTINES. / GETX, 0 SWP /FAC TO IR, GET (X) /X TO FAC. JMP I GETX / SAVSGN, 0 CPY ACS,SAVCS /SAVE FAC SIGN IN SAVCS. DCA ACS /PUT ABS(FAC) IN X. STORE (X) JMP I SAVSGN / GETY, 0 SWP GET (Y) JMP I GETY /SCRATCH STORAGE AND A CONSTANT. SAVCS, 0 EP35=. LIT /FLOATING EXPONENTIAL GENERATOR. /RETURNS E**(FAC) IN FAC. /8AC IS CLEAR AT ENTRY AND EXIT. / PAGE 37 LITBAS 7754 PREXP, JMS SAVSGN /SAVE SIGN OF INPUT, GET ABS(X) IN FAC. GET (TENBASE) /DIVIDE INPUT BY LN 10. JMS GETX /NOTE: E**X = JMS FDV / 10**IP(X/LN 10) + E**(LN 10*FP(X/LN 10)) STORE (X) JMS IPS /SAVE INTEGER PART (CONVERTED TO BINARY) JMS FDTOB /AS SCALING FACTOR. DCA EXPTMP JMS GETX JMS FPS /USE FRACTION PART*LN 10 AS BASIS FOR SWP /HASTINGS APPROXIMATION. GET (TENBASE) JMS FMU STORE (X) GET (FP1) /DO A 6 TERM HASTINGS APPROXIMATION. TAD [-6] JMS HASTINGS EXPCON NOP STORE (X) /RAISE RESULT TO THE FOURTH POWER. TAD (-4) JMS XPOWER TAD ACS /ADD SCALING FACTOR TO AC EXPONENT. TAD EXPTMP /I.E, MULTIPLY BY 10**EXPTMP. IAC DCA ACX JMS CHKEXP /DID EXPONENT OVERFLOW? EXPVRT, TAD SAVCS /WAS ORIGINAL INPUT NEGATIVE? SNA CLA RETURN /NO. SWP /YES...OUTPUT IS INVERTED. GET (FP1) JMS FDV RETURN / EXPTMP, 0 /FLOATING EXPONENTIATION SECTION. /GIVEN A IN FAC, B IN IR, RETURNS A**B. /THIS VERSION CHECKS FOR THE FOLLOWING SPECIAL CASES: / A=0 RESULT IS 0 / B INTEGRAL, NON-ZERO AND ABS(B) <9 / EXPONENTIATION DONE BY MULTIPLYING. / DFEXP, TAD AC+PREC-1 /DOES A (IN FAC) =0? SNA CLA RETURN /YES, THEN A**B =0. STORE (X) /SAVE A, SWP /SAVE B, JMS PUSHAC /GET FP(B). TAD AC+PREC-1 /IS B ZERO? SNA CLA JMP DFEXP2 /YES, THEN RETURN 1. TAD ACX TAD [-1] /IS B BETWEEN 1 AND 10? SZA CLA JMP DFEXP1 /NO, DO BY NORMAL METHODS. JMS FPS TAD AC+PREC-1 /S B AN INTEGER? (I.E, FP(B)=0?) SNA CLA JMP DFIEXP /YES, DO BY INTEGRAL EXPONENTIATION. DFEXP1, JMS GETX /NO, RECOVER A. JMS FLN /NOTE: A**B = EXP(B*LN(A)) SWP JMS POPAC /RECOVER B. JMS FMU /B*LN A IN FAC. JMP PREXP /DO EXPONENTIATION. / DFIEXP, JMS POPAC /POP B, CPY ACS,SAVCS /SAVE ITS SIGN AND CONVERT ITS DCA ACS /MAGNITUDE TO A BINARY INTEGER. JMS FDTOB CIA JMS XPOWER /RAISE A TOTHE B POWER BY MULTIPLICATION. JMP EXPVRT DFEXP2, GET (FP1) /RETURN 1.0 RETURN /XPOWER -- RAISE X TO POWER N. /CALLING SEQUENCE... / TAD (-POWER) / JMS XPOWER / XPOWER, 0 DCA ADVAC /SAVE COUNT. GET (FP1) /START OFF WITH X**0 IN FAC. XPLP, JMS GETX /X**(N-1) TO IR, X TO FAC. JMS FMU /X**N IN FAC. ISZ ADVAC /DONE? JMP XPLP /NO. JMP I XPOWER EP37=. LIT /FLOATING SIN/COS GENERATOR. /RETURNS SINE OR COSINE OF FAC IN FAC. /8AC IS CLEAR AT ENTRY AND EXIT. / PAGE 36 PRCOS, SWP GET (PIBY2) /ADD IN PI/2. JMS FAD PRSIN, SWP GET (PIBY2) /DIVIDE BY PI/2 TO REDUCE X TO PROPER RANGE SWP JMS FDV FSIN1, STORE (X) /SAVE RESULT IN X, DCA ACS /AND GET ABS(X) IN FAC. SWP GET (FP1) JMS COMP /COMPARE ABS(X) WITH 1. JMP FSINC2 /ABS(X) > 1. NOP / = 1. FSIN2, TAD (-PREC-2) / < 1. JMS CLFACS /SET INITIAL FAC TO ZERO. TAD DECIMAL (-9) OCTAL /DO A FIVE TERM HASTINGS APPROX. JMS HASTINGS SINCON SKP RETURN / /IF ABS(X) > 1, WE MUST FOLD X SO THAT / -1 < X < 1. / FSINC2, JMS GETX DCA ACS SWP GET (FP2) JMS COMP /COMPARE ABS(X) WITH 2. JMP FSINC4 /ABS(X) > 2. NOP / = 2. JMS GETX /ABS(X) < 2. SWP GET (FP2) CPY IRS,ACS /SET FAC TO 2*SGN(X), JMS FSB /AND THEN TO 2*SGN(X) - X. STORE (X) /STORE NEW VALUE OF X. JMP FSIN2 / FSINC4, GET (FP4) TAD X /GET FIRST WORD OF X, AND [0020] DCA ACS /AND 4*SGN(X)IN FAC. JMS GETX /RECOVER X, JMS FSB /X-4*SGN(X). JMP FSIN1 /PROCESS SQRT GENERATOR. /RETURNS SQRT(FAC) IN FAC. /8AC IS CLEAR AT ENTRY AND EXIT. / PRSQRT, TAD ACS /IS FAC > OR = 0? SZA CLA JMP ERRARG /NO, ERROR. STORE (X) /YES, SAVE INITIAL VALUE. TAD ACX /IF X = Y*10**N IAC /INITIAL APPROXIMATION IS Y*10**(N+1)/2 CLL SPA CML RAR DCA ACX SQRTL, STORE (Y) /SAVE CURRENT APPROXIMATION IN Y. JMS GETX JMS FDV /X/Y. JMS GETY JMS FAD /X/Y+Y. SWP GET (FPHALF) JMS FMU / (X/Y+Y)*0.5. CPY ACX,ADVAC /SAVE NEW APPROXIMATION ON STACK JMS PUSHAC /AND NEW AC EXPONENT IN ADVAC. JMS GETY JMS FSB /OLD APPROXIMATION - NEW APPROXIMATION TAD AC+PREC-1 /IS AC=0? SNA CLA JMP SQRTX /YES...DONE TAD ACX / OLD EXPONENT - NEW EXPONENT CIA TAD ADVAC TAD (-5) /IS CHANGE OVER ITERATION LESS THAN 10**-5? SMA CLA JMP SQRTX /YES. DONE JMS POPAC /NO, RECOVER NEW APPROXIMATION JMP SQRTL /AND ITERATE. / SQRTX, JMS POPAC /RECOVER ANSWER. RETURN /AND EXIT / ERRARG, JMS ERRG /ARGUMENT ERROR. TEXT /ARG/ EP36=. LIT /GENERAL HASTINGS APPROXIMATION CALCULATOR. /INPUT: FAC -- INITIAL TERM / X -- VALUE FOR SERIES / RETURN+1 -- ADDRESS OF HASTINGS CONSTANTS IN BANK 1 / RETURN+2 -- SERIES INDEX DECREMENT: -1, -2, ETC. / 8AC -- NUMBER OF TERMS IN SERIES. / /OUTPUT: FAC -- RESULT. / 8AC -- 0. / *EP33 HASTINGS, 0 DCA QADVC /SAVE NUMBER OF TERMS IN SERIES. TAD I HASTINGS /PICK UP POINTER TO CONSTANTS AND SAVE. ISZ HASTINGS DCA ADVAC TAD I HASTINGS /PICK UP SERIES DECREMENT SWITCH. ISZ HASTINGS DCA HSWTCH JMS PUSHAC /SAVE INITIAL TERM OF SERIES ON STACK. CPY [IR-1],AX0 /CLEAR THE INPUT REGISTER. CPY (-PREC-2),TMP DCA I AX0 ISZ TMP JMP .-2 HASLP, TAD ADVAC /PICK UP C(N) CDF 10 JMS I [GETNUM] JMS FAD / C(N) + PARTIAL SUM IN AC. TAD ADVAC TAD [NUMWD] /ADVANCE POINTER IN HASTINGS CONSTANTS. DCA ADVAC JMS GETX JMS FMU /PRODUCE C(N)+PARTIAL SUM *X ISZ QADVC /WAS THAT THE LAST TERM? JMP HSWTCH /NO, CONTINUE LOOP. SWP /YES, ADD IN INITIAL TEMR. JMS POPAC JMS FAD JMP I HASTINGS /EXIT TO CALLER. HSWTCH, HLT /MULTIPLY BY X OR X**2 SWITCH. JMP NOSQR /NO SQUARING, GO TO NEXT LOOP CYCLE. JMS GETX /MULTIPLY AGAIN BY X. JMS FMU ISZ QADVC /THIS CAN NEVER OVERFLOW! NOSQR, SWP /SWAP PARTIAL SUM INTO IR, JMP HASLP /AND ITERATE. EP33=. LIT /CONSTANTS FOR FLOATING POINT ROUTINES. / *EP33 X, 0000 *X+NUMWD FPHALF, 0000 0000 0005 Y, 0000 *Y+NUMWD *EP35 TENBASE, 0045 /LN 10 = 2.30258509 4122 0062 PIBY2, 0046 /PI/2 = 1.570796326 4560 3521 PIBY4, 0002 /PI/4 = .7853981633 4223 2607 *EP36 SQRT10, 0050 /SQRT(10) = 3.16227766 3442 3023 FP1, 0040 /1.0 0000 0001 FP2, 0040 /2.0 0000 0002 *EP37 FP4, 0040 /4.0 0000 0004 /HASTINGS CONSTANTS FOR FP FUNCTIONS. / BANK 1 *HASCON /SIN/COS CONSTANTS. / SINCON, 7642 /0.00015148419 2204 0521 7726 /-.00467376557 3163 3544 7750 /.07968967928 3230 3227 0027 /-.645963711 1551 2506 0046 /1.570796318 4560 3521 /LOGARITHM CONSTANTS. / LOGCON, 0007 /.191337714 3463 0621 7750 /.094376476 2147 1511 0001 /.177522071 1045 3561 0005 /.289335524 2463 4602 0011 /.868591918 0625 4150 /EXPONENTIAL CONSTANTS / EXPCON, 7500 /69906E-7 0006 0226 7540 /5.4302E-6 0040 1505 7640 /1.71562E-J 1145 0561 7701 /.0025913712 3461 4522 7750 /.0312575832 2565 1023 0007 /.24999868 4231 4502 /ARCTANGENT CONSTANTS. / ARCCON, 7730 /-.004054058 2404 2404 7743 /.0218612288 1026 4022 7771 /-.0559098861 4220 4525 7744 /.096420041 0002 2151 0023 /-.1390853351 2600 4461 0004 /-.1994653599 2544 4621 0026 /-.33329856 4222 1463 0003 /.9999993329 4631 4631 / /EJECTION SEQUENCE JEQSEQ, 212; 212; 212; 212; 337; 337; 337; 337; 337 CRLF3, 215 LF3, 212; 212 JLF, 212; 0000 $ esix-1/esix.bin0100600000175000017500000002050206305603770012002 0ustar vlmvlm€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€@@@@@(? @8@<Ab0!*0&:.bp %; %;?.'>'=.  q=4,3 %p B %>-?%=2 2 ?>(/>2 %9-?"-?4 89!3>/=2 4%94 74.4 642 4%5.%<"%=1,12 24 ?>(/<2 %5-? 8 8 8 ;"=-?1%=,1%>,%>.=':-?'9-?'8-?'7-? 6'5'4 8 3 %2 3>(+ %1 > +%'2'1-??/0C0&4,3 ?!0 7&$".... .$ C'f  : '? >'= >'=2 82/(*"!. />(*"!. 6> /? >(*.8!...:..9..9..!y?.$x)F:?-??%>*'>%>:%>:%>-?%=%=8%>'>* G>8+FD%=*%=(%=)%=+%=2 28 <(*: 5> /?2 28! (> /? 2>2 29 =<+# < 2 8! )> * 8! *> *2-? +>(/? 42  ( 23 ;349!3<(/:>/:: 32 3 ) *: 2-?: +>(/?+E:. ?:<($.$E,F / = < ; : 9 8 7 6 5 4 6 3/2"2-?"%-?'1"2%<'0'/.% ."<:-?? .=>"<.2, -  ,+.< .%:-? -* G->*%:.;-& ><>>3?  -;?7G H 8-? ?%9 <-? >%9 >%5%<2 8%5'= <,>(*= < ;, %>,*:%> > 9 8':%=: ;, 70%=0: 00,*+ ?%5%<2 8%5'62 8%9* >(*-?%=%=: 5'4 3'4 '2%:'1 0':+ ""  /'4+ . - . . . ,/+I+; ?:?<.0 ./ 7 . !2?57.=9I&J"**-?"-?*%=:/?"*-?-?"-?-?*"*-?*"-?*-?'> > .> .K>.3J$C'   -?L%+,-?'?-?M? $J$ *,=(**"?1"81'=.$-<(-?8!,%)"8-?%2'<,*9.88!1 ;%;1+.?K; KE, 9/8 8 , -?8'7-?E7(.E6L%:'>*"8/=  %( "/<%:-?2 28 <(. 5>(*+ ;': '92 %5'8%:. 988 7! 8: 2 ( 9 6>+2.   5 2'4(>(+ 3%12 2'4 2%1  72 %5%+ &, & '1%:2 *9! *':48 3'0*M09 $,8)"<( ? .#M/x)=*;) >#*6 '##)#.)# '#8*28!) 6#*-*9)*<+ )+:<(/ =%1/) < ;) :#<*-# >#8*6%1 <'9/%2<(/8 7> /6: /8y6+1?+%709%0>y5N"'?.1 >%; =%; >%;1. <. ;   2 2>(*%:':*""* .*-? ". >%; 9# 8%;%:."82 %5:8'?../0"=/.7==%2<(.=#+ 7= 6 >%;// 30"=// 8& 5' 4< 7  /&'+/ 73#-?: 2  2+#O4?&? .6?7= (O1P'?/>& -? 2 = '<-?& * ; : 9 -?2  #- 9! >* -  :   . 0  0.008!2>(+ 0 71 18 =+ +8!0>(+ ++*9-0+0#,  ,+**-222.81 18 8 8&..8!/Q8 /6?..-QR92  ?>*  >> *  8$$9 ?<* ="%* : $ /: 2-?  6"%2-? $ 8!3>(+3+ +9 ?<*7 =+*/ =+ +8!3>(+ ++*9 +: 3:  %,  ,+ 3 $3.% =2 <, ;2 2,+-?':'9 %>'8'7 6'5'4%=2 %9-?/3S39* *200  8??7 <(S.Q %> 2 7 2 2>(/6'5+/ '4  +'%=-?Q4 6.*?Q3K  %># : 3 9'80+0 7>(/6#*%=/8%> %> %> %>/ %=%=%=%=8/*K6 &<2*K4I&0 *+I* I)G ',/+ 2 *2 *-?) (+%: ''&/% G%,7?2..-G T=#=1# =8#& <0 8 "&;;0 ;0 = "3)<0 28 "85;&0  ;*0 ;/ 8 ;18';>0 #;30 ;20 ;40 !;60 ";88 $;: ;>8&" ;?8 <8 ;18< ;>8& 8& 8=<#8 ;%8 <= ;%8= #'8 ?-?9?=???2?=?;?4?<?0???.?-?,?;?,?'?0?-?7?&?;-"?0???.?,?--?*???4?+?;?--???4?4-???4 ?=/? =1%(<(* >=/? <=* '=/?: 6,1,* ;/:%(<(*, 9<(*, 6>(*,%)*%+ 0-/8'7/?<(/?6/5 , #- "+'7+<(+ '48 ,>(+ > + ,>(+8 +  3< + ,> + ,%)+: > +)%+>(/?'4/2+)_2*?*(+%2*7+,?!+(?+?%+1_-j  ?> *$%): )%( ><(* /> *)%)"7+1..("7*1'=1*()8!'<>(+%+->(.(8 ++-*4';.((.(%( :?.7  9?.7%)  :7.7*    =+8=+81,1%2> +1+88!%2> +1%(:  8>(+4  /  :/ %)+%k8? ??6#)8!??;k7`+2 ? & - +8!< &8 8 8  +, - /, +>2+< +2888>< +28 8 >< +2>,*.a>2`5n'?.)8 ,)'?.o? 5n `5'>(.5> *>%<.5(8!?%<*)8! >(+ '= <*(8!<(+ .=+5 - ';*>(+( ':> +& 8 , -'='9.5 ':<(.5-* -';'8:.5a86' %"&8 &"a7b - , - .,   ,* ..*<(*! 0 '?*** > , =,  ,*'*.*> *:'<>(.';( ), . 0 2 : #2 - /,#)8889 < 92 88 88 < 2,+/=8!!> /8/)c8.? 26' ?3%"c1d'>(/?>(. .,  > ,   ,** # '= #"> *#: *=*%**: >#":> +* <, "0 ;/ /0: //: 00,*4** , - .,  ,+ ':( 8! ), .e" - - .,  '=+2 :+4 * ,+*/"e:6?3&"%.e7f   - - ;, 1  1 ,*. .,:1 8 1=*4 * ,*)." ,*(."  - .-,  ,+-8!,* ,+.8 ., "/ /> +: //,+ / ,<(/ 8!1 "0 /0: //: 00,+$10: 001+1/ g;?7g8v ??. - - ., 8 '=* ,* 8. * .w??;vh=>(*9 -- > * -*=* #?*">.:"> ?%;?*3 >%;18!8 '=*(1*# **1<(*/ =%;* =%;. <%;1: *# $-8* =>(+ >(++ .8!< '; >( : >%; "/<(+!8!, / =%;: //,+- .=++, 9%; -+:.>i9.?3 ?+0-i.l0&%:'?  >24 ='<* ;':*#<'92439!4 >/82 2%>22  24- 7%5'64 3 %2%1 >(*3*+ 8>*-28 9882 --2 2*: > /5 > /5 7%9 4 '3/ 82 %5:%< 7%5'2/<+/:-? .'1: /0m0:< 6?..5. 2?+ .0 m,v  2 <(*# 2.v%n "2"20   "2?"2 "2"2 "2 "2 > + >'= 2'=/< : ;'= ': 9*7   : o9/./,7.;oo6p <%; ;%; : 9, :0*01 '. 8 1>(,.*"1&%1 '7,*%: >(* '6%( 5<(+ 4>(* %) 3%1'2. %+ 0?(* ,'6 ;%;* > ***=3*2= +</1<+*=9*=6**q15?/?6:1>:/q,r =* 1":1*4'?*% 11><(* =<(*# => /<1;9 8 8*#* # :988?*28841,1 9<(*# 9*2 4248 3>(/84.:: 442 42/7>(+6%;7+ 57 4#'/ >(. > +% > 3 2 1*2 2<(/'%;+)s18/+-?0 %. ?( .8+ s0t  8? >:< <.2 2  . >(*"..$$"8"".$ ='< '; :'9 8'8 7'6.,: 99"+ &""  .9 8 8 8 + 9*<: "+$ ! ""/ 888+ )+u63'6 ?97+2v%%'>8 9 8!%2%'>8 9  %2.%::'>++: '=.:w=44wz"-?" -?" %< ?%5'>. > /=>(/=: $: <%9 ;%5"5 :%5 9'85< $<(. =8!%< 7%5 $?*2'6*(. %<'5*/ 4%9#'5#%< <%9 4%5'6#'3 <%9.5# 7%5"5 2%5 1'8< $ -?%< <%5/ $ <%9/%< 4%5/{1?1;+$73..=!7?770=7-=";%{%~~', +%5'*') (%9'''&)'*'%%< +%5'$ (%9 #%5 %'"8 (%9 !#  )8' >(-?%< #%5')-?>(-? (%9%<'>(+  0> *<'%>(+'*'%<''$*'  '&8!# *! #%5-? #%5'*'$+/ :;$#)?<7=!"%827-$;;%;|%< ?%5'>%< ?%5%<'= <%9 %< ;%5':*8 9'8 9'7&<-?'6 %< 5%5':*+8'6%< 5%5) '4 <%9* 3%5<, '6'4*  > + <%989=88 2%9'6'='1'>%< 0%5'/'.'1'4>(+8!  -?+',*?',-?'+}+.2?;"70;73?.=$;7??5)5? ?=#0"&32:2*ÈB@&>"?3$?( )&%03?(' %13& !(== > %1?1%?(5"%??# ?9"%?$)$1$&" 3&&        ;€esix-1/esix_doc.txt0100644000175000017500000002473406356540251012721 0ustar vlmvlmTo: Users From: Bob Supnik Subj: ESI-X Date: 10-Mar097 COPYRIGHT NOTICE The following copyright notice applies to both the ESI-X source and binary: Original code published in 1966-1968, written by David J Waks Portions Copyright (C) 1997 Digital Equipment Corporation All Rights Reserved except as specified below. Permission is hereby granted to use, copy, modify, and distribute this software (or portions thereof) for any purpose, without fee, subject to these conditions: (1) If any part of the source code for this software is distributed, then this copyright and no-warranty notice must be included unaltered; and any additions, deletions, or changes to the original files must be clearly indicated in accompanying documentation. (2) If only executable code is distributed, then the accompanying documentation must state that "this software is based in part on the original work of David J Waks". (3) Permission for use of this software is granted only if the user accepts full responsibility for any undesirable consequences; the authors accept NO LIABILITY for damages of any kind. These conditions apply to any software derived from or based on this code, not just to the unmodified code. Permission is NOT granted for the use of any author's name or company name in advertising or publicity relating to this software or products derived from it. 1. Introduction This package contains the source and binary for ESI-X, the Engineering and Scientific Interpreter eXtended. ESI-X was the first stored program scientific interpreter for the PDP-8. It provided a full range of scientific calculation capabilities, including the ability to store complex programs. It was written at Applied Data Research in 1966-67. The package contains the following items: defs.pal minimal symbol table definitions esix.pal ESI-X main program fp.pal ESI-X transcendental functions esix.bin ESI-X binary tape image macro8x.c assembler for ESI-X To assemble ESI-X, you must first compile the assembler: cc macro8x.c -o macro8x and then use it to assemble the sources: macro8x esix.pal fp.pal Note that the defs.pal file is not used with this version of macro8x; it was used with the original sources to conserve symbol table space. The binary tape image can be used directly with any PDP-8 simulator that has a built-in binary loader command. Because it uses locations 7600-7754, it requires a special loader to be executed on a real PDP-8. 2. History Of The Program ESI was designed in 1966 by Dave Waks and implemented by Dave Waks and Spike Chagnon. The original version ran in 4KW of memory. Dave Waks wrote the following comments on the origins of the program: "Digital's announcement in August of 1966 of the PDP-8/s-- the first computer which sold for "less than ten thousand dollars" (it cost $9,995) -- was what stimulated me to write ESI. (The price list is dated 8/1/66; my design notes start on 8/3.) The thought was that a newbie could buy a real computer at what seemed like a very reasonable price, but what could they do with it? ESI (originally the "Eight S interpreter") was the answer... Many of the key concepts came from the Johnniac Open Shop System (JOSS) developed at the Rand Corporation - what I believe was actually the first interactive computer system as we would define it today. I had seen a talk on JOSS by its developer (Cliff Shaw?) at a computer conference (FJCC 64 in SFO?), and was so taken by it that I travelled to Santa Monica to meet with the author and get my hands on the system. (I think also in the Fall of 64). I really wanted to create my own version of JOSS, and the 8/S looked like the right target. (btw, I'm pretty sure that John Kemeny of Dartmouth also saw Shaw's talk, and he want back to Dartmouth and wrote BASIC.)" In 1967, Bob Supnik extended the program to use 8KW of memory and added the transcendental functions. Thereafter, the 4KW version was called ESI-B (basic) and the 8KW version ESI-X (extended). In 1968, Digital Equipment wrote a very similar program, FOCAL, and gave it away for free; this ended ESI-X' marketability. In the 1970's, Applied Data Research gave the binaries of the program to DECUS. However, the source was believed lost. 3. Provenance Of The Source In 1997, Dave Waks found two PDP-10 failsafe tapes in his basement. According to a directory listing, one of them contained old Applied Data Research software for the PDP-7 and PDP-8, including ESI-X. (The other had no label and has proved unreadable.) Dave sent the tape to me to see if it could be salvaged. I in turn contacted Paul Pierce, who was able to use his seven track magtape set up to read most of the tape. Tim Litt then wrote a failsafe format interpreter which recovered the original ASCII files. I then modified Gary A. Messenbrink's PDP-8 cross assembler to add the features (macros, variable field definitions) used by the source code. The result is the binary in this package. As best as I can tell, the source was recovered more or less intact. There were numerous garbles in the comments, but whether these were due to undetected read errors, or typos in the original source, is impossible to determine. In preparing for this release, I have made the following changes to the source: - The macro "SDB n" (meaning CDF n*10) has been removed and replaced by equivalent CDF instructions. This is due to a limitation in the macro assembler, which cannot process macros inside of literals. - Obvious garbles in the comments have been removed or cleaned up. - Tabulation of comments has been regularized, for readability. - The definition of XX=HLT in defs.pal has been duplicated in esix.pal. Otherwise, the source is unchanged. 4. Users' Guide ESI-X implements a straightforward procedural language. It has 26 variables, denominated by the letters A-Z. A variable can either be a simple variable or a subscripted variable, with one or two dimensions. If subscripted, only those subscript instances which are used are actually stored. Subscripts have a maximum value of 999. Language statements can either be executed directly or stored as programs for later execution. Programs are organized into parts. There can be 9 parts, numbered 1-9. Each part consists of multiple steps, numbered as floating point numbers beginning with the part number. A sample program: 1.01 TYPE "HELLO WORLD!". 1.02 TYPE "HERE IS A TABLE OF SQUARE ROOTS.". 1.03 FOR I=1(1)10, TYPE I, SQRT(I). 1.04 STOP. All ESI-X statements are sentences, with a verb to start and a period at the end. The period is NOT optional. The statement syntax follows. In the syntax, literal strings are capitalized; terminal classes are denoted by T. The terminal classes are: Tname variable name (A - Z) Tnumber floating point number Tinteger integer part number (1-9) Tstring text string, delimited by " := LOG ON | LOG OFF | * | {} := | | := | | | LINE | NOLINE | PAGE := | := * | {} := | | := | | | DONE | STOP := GO | CANCEL | := IF , := FOR = ( ) , := SET = := DO := PART Tinteger | STEP := TYPE := | := {, ...} := | " Tstring " := " Tstring " := := SIZE | STEP Tnumber | PART Tinteger | ALL | ALL VALUES | ALL PARTS | ALL Tname := DELETE := | STEP Tnumber | PART Tinteger | ALL | ALL VALUES | ALL PARTS := {, ... } := = := TO STEP | TO PART Tinteger := DEMAND := DELETE | DELETE ALL VALUES := { ...} := { ...} := {+ | - } := {^ ...} := | Tnumber | ( ) | ( ) Tname { [ {, } ] } := + | - := + | - := = | < | > | GE | LE | NE := ABS | IP | FP | SGN | SIN | COS | SQRT | LOG | EXP | ARCTAN | LN | DP | EP Some comments on the syntax: - LOG ON and LOG OFF delimit a session for a particular user. LOG ON allows the user to specify a session name. ESI-X keeps track of lines typed and inserts page breaks appropriately, with the page number and session name at the top of each page. PAGE forces top of new page. - NOLINE and LINE disable and enable, respectively, typing a new line character at the end of each TYPE statement. - When executing a stored program, ESI-X monitors for interruption (signified by the ALTMODE character, ^} on a modern keyboard). In interrupt mode, the user can inspect the state of the program with TYPE commands, continue execution with GO, or return to direct statement mode with CANCEL. 5. Useful Patches - ESI-X rings the bell each time it requires keyboard input. To suppress this, patch the loaded program as follows: sim> d 6015-6016 nop or in binary: 6015/ 7000 6016/ 7000 - ESI-X requires a period at the end of every statement. To suppress this, patch the loaded program as follows: sim> d 6102-6104 nop or in binary: 6102/ 7000 6103/ 7000 6104/ 7000