--- /dev/null
+/OS8 FORTRAN II COMPILER V5
+/
+/
+/
+/
+/
+/
+/
+//
+/
+/
+/
+/
+/COPYRIGHT (C) 1971,1974,1975
+/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
+/
+/
+/
+/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
+/SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
+/SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER
+/COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
+/TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
+/AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
+/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
+/
+/
+/THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
+/NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
+/EQUIPMRNT COROPATION.
+/
+/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
+/SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
+/
+/
+/
+/
+/
+/
+\f/
+/ SYMBOL TABLE FOR FORTRAN COMPILER (8K- PDP-8)
+/ FOR USE WITH DISK/DECTAPE MONITOR SYSTEM
+/ CHANGE LOCATION 'XFINI' TO A 'JMP I LFINI' THEN
+/ASSEMBLE AND SAVE
+/ .PAL FORT.PA
+/ .PAL FPATCH.PA
+/
+/ .LO FORT.BN$FPATCH.BN$
+/
+/ .SA SYS FORT
+/
+/
+
+ FIELD 0
+ *200
+INBUF, TEXT /PDP-8 FORTRAN DEC-08-A2B1-5A/
+
+ *1000
+BEGIN, PLS /INITIALIZATION ROUTINE
+ TLS
+ RFC
+ CDF 00
+ TAD CM1300 /SET SYMBOL TABLE TO ZEROS (6300-7577 FIELD 1)
+ DCA INDX
+ TAD BSYMP
+ DCA TPTT
+LP, DCA I TPTT
+ ISZ INDX
+ JMP LP
+ TAD CM60
+ DCA INDX
+ TAD BTTAB
+ DCA TPTT
+ DCA I TPTT /ZERO OUT TEMPORARY TABLES IN FIELD 0
+ ISZ INDX
+ JMP .-2
+ CDF 10
+ TAD MIN104 /ZERO EVERYTHING FROM ZERO TO 107
+ DCA INDX
+ TAD CP6
+ DCA TPTT
+LPP, DCA I TPTT
+ ISZ INDX
+ JMP LPP
+ TAD TPT /MOVE DATA FROM TABLE TO FIELD 0
+ DCA TPTT
+REP, CDF 00
+ TAD I TPTT
+ SNA /END OF FIELD 0 INITIALIZATION?
+ JMP DN /YES
+ DCA LOC
+ TAD I TPTT
+ CDF 10
+ DCA I LOC
+ JMP REP
+DN, TAD I TPTT /MOVE DATA FROM TABLE TO FIELD 1
+ SNA /END FIELD 1 INITIALIZATION
+ JMP DNN /YES
+ DCA LOC
+ TAD I TPTT
+ DCA I LOC
+ JMP DN
+DNN, CIF 10
+ JMP I STRT
+LOC, 0
+INDX, 0
+MIN104, L7-ASSIGN
+CP6, L7-1
+CM1300, -1300
+CM60, -60
+BTTAB, ITTAB-1
+BSYMP, BSYM-1 /BOTTOM OF TEMPORARY SYMBOL TABLE
+STRT, FORST /STARTING POINT AFTER INITIALIZATION
+TPTT=10
+TPT, TABLE-1
+TABLE,
+PUNCH
+ LTTYPE
+15
+ DOEND
+45
+ FTTAB
+51
+ ITTAB
+47
+ TSYM-3
+50
+ TSYM
+55
+ -25
+56
+ BSYM
+57
+ BSYM
+71
+ 5777
+74
+ 3000
+MIKE4
+ 3377
+POINTZ
+ 3377
+BASE
+ INBUF
+BASE2
+ INBUF+100
+SCOUNT
+ 0
+SCOUNT+1
+ 0
+SCOUNT+2
+ 0
+QONE
+ 0
+QONE+1
+ 0
+QONE+2
+ 0
+QONE+3
+ 0
+QONE+4
+ 0
+QONE+5
+ 0
+QONE+6
+ 0
+0 /THIS TERMINATES FIELD ZERO INITIALIZATION
+2375
+ 4000
+2376
+ 4000
+2377
+ 4000
+0
+
+\f/ ERROR MESSAGE TABLE AND TEXT
+
+ELIST, -ERR1-1; EMSG1 /ILLEGAL CONTINUATION
+ -ERR2-1; IE /ILLEGAL ARITHMETIC EXPRESSION
+ -ERR3-1; IE
+ -ERR6-1; IE
+ -ERR9-1; EMSG3
+ -ERR10-1; EMSG4
+ -ERR12-1; EMSG4
+ -ERR14-1; EMSG4
+ -ERR15-1; EMSG3
+ -ERR16-1; EMSG5
+ -ERR17-1; EMSG6
+ -ERR18-1; SE /SYNTAX ERROR
+ -ERR28-1; SE
+ -ERR29-1; SE
+ -ERR30-1; EMSG8 /ILLEGAL VARIABLE
+ -ERR31-1; SE
+ -ERR35-1; SE
+ -ERR36-1; EMSG36
+ -ERR37-1; CE
+ -ERR38-1; EMSG9 /ILLEGAL DO NESTING
+ -ERR39-1; SE
+ -ERR40-1; IE
+ -ERR41-1; EMSG10 /EXPRESSION TOO BIG
+ -ERR42-1; IE
+ -ERR43-1; EMSG11 /MIXED MODE
+ -ERR44-1; EMSG9
+ -ERR47-1; SF /SUBR. OR FUNCT. STMT. NOT FIRST
+ -ERR48-1; SE
+ -ERR50-1; SE
+ -ERR51-1; SE
+ -ERR52-1;IE
+ -ERR53-1; EMSG12 /ILLEGAL SUBSCRIPT
+ -ERR54-1; EMSG13 /ILLEGAL EQUIVALENCING
+ -ERR59-1; SE
+ -ERR60-1; EMSG3
+ 0; EMSG14 /COMPILER MALFUNCTION
+
+EMSG1, TEXT /ILLEGAL CONTINUATION/
+IE, TEXT /ILLEGAL ARITHMETIC EXPRESSION/
+EMSG3, TEXT /ILLEGAL STATEMENT/
+EMSG4, TEXT /ILLEGAL CONSTANT/
+EMSG5, TEXT /ILLEGAL STATEMENT NUMBER/
+EMSG6, TEXT /SYMBOL TABLE EXCEEDED/
+SE, TEXT /SYNTAX ERROR/
+EMSG8, TEXT /ILLEGAL VARIABLE/
+EMSG9, TEXT /ILLEGAL OR EXCESSIVE DO NESTING/
+EMSG10, TEXT /ARITHMETIC EXPRESSION TOO COMPLEX/
+EMSG11, TEXT /MIXED MODE EXPRESSION/
+EMSG12, TEXT /EXCESSIVE SUBSCRIPTS/
+EMSG13, TEXT /ILLEGAL EQUIVALENCING/
+EMSG14, TEXT /COMPILER MALFUNCTION/
+CE, TEXT /UNBALANCED QUOTES/
+SF, TEXT /SUBR. OR FUNCT. STMT. NOT FIRST/
+EMSG36, TEXT /ARRAY TOO LARGE/
+\fITTAB=710
+FTTAB=ITTAB+30
+DOEND=2377
+BSYM=6300
+TSYM=7600
+
+/ THE STATEMENT TYPE TABLE FOLLOWS
+ *2600
+STYPE, 7361 /-DO
+ 0000
+ LDO
+ 6672 /-IF
+ 0000
+ LIF
+ 7061 /-GO
+ 5361 /-TO
+ LGOTO
+ 7477 /-CA
+ 6364 /-LL
+ CAL
+ 5573 /-RE
+ 5353 /-TU
+ LRET
+ 7461 /-CO
+ 6154 /-NT
+ LCONT
+ 5454 /-ST
+ 6060 /-OP
+ LSTOP
+ 5777 /-PA
+ 5255 /-US
+ LPAUSE
+ 5573 /-RE
+ 7674 /-AD
+ LREAD
+ 5056 /-WR
+ 6654 /-IT
+ LWRIT
+ 7161 /-FO
+ 5563 /-RM
+ LFRMAT
+ 7262 /-EN
+ 7400 /-D
+ LLAST
+ 7461 /-CO
+ 6263 /-MM
+ LCOMON
+ 7367 /-DI
+ 6273 /-ME
+ LDIMEN
+ 7257 /-EQ
+ 5267 /-UI
+
+ EQUI
+ -0611 /-FI
+ -1611 /-NI
+ LFIN
+XXSUBR, 5453 /-SU
+ 7556 /-BR
+ LSUB
+ 7153 /-FU
+ 6175 /-NC
+ LFUNC
+ 0000 /THIS IS THE END OF LIST
+AREA1, 0
+AREA2, 0
+
+/ THE PRECEDENCE TABLE FOLLOWS, NON-ZERO PREC. OPERATORS APPEAR
+ -45 / PREC('%') = 7 NOTE: '%' REPLACES '**'
+ 700
+ -52 / PREC('*') = 5
+ 500
+ -57 / PREC('/') = 5
+ 500
+ -53 / PREC('+') = 4
+ 400
+ -55 / PREC('-') = 4
+ 400
+ -75 / PREC('=') = 1
+ 100
+ -74 / PREC('<') = 1 NOTE: '<' IMPLIES SUBSCRIPTED ASSIGNMENT
+ 100
+ 1 /THIS IS THE END OF THE TABLE
+THOU, -1750
+ -144
+ -12
+ -1
+
+/ THE PERMANENT SYMBOL TABLE BEGINS HERE
+ *6000
+ 1501 /MAIN
+ 1116
+ 0001
+ 0601 /FAD
+ 0400
+ 0001
+ 2324 /STO
+ 1700
+ 0001
+ 0623 /FSB
+ 0200
+ 0001
+ 0615 /FMP
+ 2000
+ 0001
+ 0604 /FDV
+ 2600
+ 0001
+ 1520 /MPY
+ 3100
+ 0001
+ 0411 /DIV
+ 2600
+ 0001
+ 2205 /READ
+ 0104
+ 0001
+ 2722 /WRITE
+ 1124
+ 0501
+ 1117 /IOH
+ 1000
+ 0001
+ 5060 /(0
+ 0000
+ 0001
+ 1215 /JMP
+ 2000
+ 0001
+ 1617 /NOP
+ 2000
+ 0001
+ 0516 /ENTRY
+ 2422
+ 3101
+ 0501 /EAP
+ 2000
+ 0001
+ 2001 /PAUSE
+ 2523
+ 0501
+OPTADI, 2401 /TAD I
+ 0440
+ 1101
+OPTAD, 2401 /TAD
+ 0400
+ 0001
+OPDCA, 0403 /DCA
+ 0100
+ 0001
+OPJMPI, 1215 /JMP I
+ 2040
+ 1101
+ 2205 /RETRN
+ 2422
+ 1601
+ 0320 /CPAGE
+ 0107
+ 0501
+OPSNA, 2316 /SNA
+ 0100
+ 0001
+ 2320 /SPC
+ 0300
+ 0001
+ 0301 /CALL
+ 1414
+ 0001
+ 0313 /CKIO
+ 1117
+ 0001
+ 1014 /HLT
+ 2400
+ 0001
+OPCLA, 0314 /CLA
+ 0100
+ 0001
+ 0614 /FLOT
+ 1724
+ 0001
+ 1106 /IFAD
+ 0104
+ 0001
+ 0311 /CIA
+ 0100
+ 0001
+ 0310 /CHS
+ 2300
+ 0001
+ 0611 /FIX
+ 3000
+ 0001
+ 1123 /ISTO
+ 2417
+ 0001
+ 2001 /PAGE
+ 0705
+ 0001
+BLCK, 0214 /BLOCK
+ 1703
+ 1301
+ 0516 /END
+ 0400
+ 0001
+ 1401 /LAP
+ 2000
+ 0001
+ 0317 /COMMN
+ 1515
+ 1601
+ 1123 /ISZ
+ 3200
+ 0001
+ 2325 /SUBSC
+ 0223
+ 0301
+DUMMY, 0425 /DUMMY
+ 1515
+ 3101
+ 0122 /ARG
+ 0700
+ 0001
+ 0314 /CLEAR
+ 0501
+ 2201
+ 1111 /IIPOW
+ 2017
+ 2701
+ 0611 /FIPOW
+ 2017
+ 2701
+ 1106 /IFPOW
+ 2017
+ 2701
+ 0606 /FFPOW
+ 2017
+ 2701
+ 0403 /DCA I
+ 0140
+ 1101
+ 0103 /ACH
+ 1000
+ 0001
+OPEN, 1720 /OPEN
+ 0516
+ 0001
+ 0522 /ERROR
+ 2217
+ 2201
+ 1116 /INC
+ 0300
+ 0001
+FORTR, 0617 /FORTR
+ 2224
+ 2201
+OPCMA, 0315 /CMA
+ 0100
+ 0001
+OPIAC, 1101 /IAC
+ 0300
+ 0001
+EXIT, 0530 /EXIT
+ 1124
+ 0001
+\f FIELD 1
+ *0
+FIRSTF, 1
+ *7
+L7, 0
+L10, 0
+L11, 0
+L12, 0 /LAST LINE'S CONTENTS FOR OPTOMIZATION
+ 0
+L14, 0
+L15, 2377 /POINTER INTO DOEND LIST
+L16, 0
+L17, 0
+L20, 0 /FLAG, NON-ZERO IF '=' SEEN
+L21, 0
+L22, 0 /SUBSCRIPT NESTING LEVEL
+L23, 0 /USED BY "DUMARG" AND "IOHAR" PATCH
+L24, 0 /LINE POINTER
+L25, 0 /HIGHEST SUBSCRIPT TEMP USED
+L26, 0 /USED FOR DIMENSION INFORMATION
+ 0 /UNUSED
+L30, 0 /FOLLOWING EIGHT LOCS ARE USED BY ENTITY
+L31, 0
+L32, 0
+L33, 0
+L34, 0
+L35, 0
+L36, 0
+L37, 0
+L40, 0 /CONTAINS THE CURRENT TRIPLE NUMBER
+L41, 0 /THIS IS THE POINTER INTO THE PUSH DOWN LIST
+L42, 0 /THESE TWO LOCATIONS ARE USED BY THE TRIPLE PROCESSOR
+L43, 0 /
+L44, 0 /CONTAINS ONE FOR RIGHT OF EQUALS, ZERO FOR LEFT
+L45, FTTAB /CONTAINS LARFEST FLOATING POINT TEMPORARY NUMBER USED
+L46, 0 /CONTAINS NUMBER OF THE TRIPLE CURRENTLY IN THE AC
+L47, 7575 /CONTAINS THREE LESS THAN START OF FCON TABLE
+L50, 7600 /CONTAINS START OF DIMENSION TABLE
+L51, ITTAB /CONTAINS LARGEST INTEGER TEMPORARY NUMBER USED
+L52, 0 /CONTAINS ONE IF RETURN FROM GENER IS DESIRED FOR BALANCE
+L53, 0 /CONTAINS THE LAST CREATED LABEL
+L54, 0 /CONTAINS THE LABEL FOR THE CURRENT STATEMENT
+L55, -25 /CONTAINS THE MAXIMUM ALLOWABLE NUMBER OF UNENDED DOS
+L56, 6300 /CONTAINS BEGINNING OF SYMBOL TABLE
+L57, 6300 /CONTAINS END OF SYMBOL TABLE
+L60, 0 /"INDIRECT =" FLAG FOR S.S LEFT OF EQUALS SIGN
+L61, 0 /NON-ZERO IF LAST STMT READ IS A COMMENT
+L62, 0 /NEXT FOUR LOCATIONS USED BY GENER AND ENTITY
+L63, 0 /CONTAINS THE CURRENT OPERATOR
+L64, 0 /POINTS TO THE LAST OPERATOR IN THE STACK
+L65, 0 /CONTAINS THE PRECEDENCE OF THE CURRENT OPERATOR
+BPAREN, 0 /PARENTHESIS COUNTER
+L67, 0 /ONE FOR FUNCTION AND ZERO FOR SUBROUTINE
+L70, 0 /CONTAINS POINTER TO SUBPROGRAM NAME
+L71, 5777 /BEGINNING OF PUSHDOWN LIST
+L72, 0 /SET TO ONE IF SUBSCRIPT IS ENCOUNTERED
+L73, 0 /
+L74, 3000 /BEGINNING OF ERASABLE LOCATIONS USED FOR PARAMETERS
+L75, 0 /SET TO ONE SUPPRESS /OUTPUT FROM COMPILER
+L76, 0 /
+L77, 0 /CONTAINS ADDRESS OF LAST ENTRY INTO FCON OR SYMBOL TABLE
+ /THE FOLLOWING THREE LOCS ARE USED BY THE
+ /LITERAL COLLECTER
+COUNT2, 0 /NUMBER OF DIGITS TO RIGHT OF DECIMAL POINT
+ESIGN, 0 /0 MEANS POSITIVE EXPONENT, 1 MEANS NEGATIVE
+FPSW, 0 /0 MEANS INTEGER CONSTANT, 1 MEANS FLOATING POINT
+MIKE4,MA, 3377
+MIKE8,TOTAL, 0
+INTA, 0
+INTB,MIKE7, 0
+SNUM,MB, 0
+POINTZ, 3377
+CHK, 0
+IMPDO, 0 /"IMPLIED DO-LOOP IN PROGRESS" FLAG
+KOUNT, 0
+ASSIGN, LASIGN /ROUTINE TO PROCESS ASSIGNMENT STATEMENTS
+PUTCH, LPUTCH /ROUTINE TO PUT A CHARACTER BACK IN THE INPUT BUFFER
+PROP, LPROP /PRINTS OPCODES
+PRCRL, LPRCRL /PRINTS CREATED LABELS
+PRINT, LPRINT /PRINTS ONE ASCII CHAR
+P2, LP2 /PRINT TWO PACKED ASCII CHARS
+GETCH, LGETCH /GETS ONE CHARACTER OUT OF THE INPUT BUFFER
+LUNCH, LLUNCH /PRINTS ERROR COMMENTS
+MODE, LMODE /DETERMINES THE MODE OF THE ARGUMENT
+LOOK, LLOOK /CHECKS FOR THE REST OF THE INPUT STATEMENT
+ZZZ, LZZZ /PRINTS OUT STATEMENT LABELS
+ENTITY, LENTT /GETS THE NEXT LOGICAL INPUT PARAMETER
+SYMTAB, LSYMTB /ENTERS SYMBOLS INTO THE SYMBOL TABLE
+DUMARG, LDMARG /SEES IF PARAMETER IS A DUMMY ARG OR SUBSCRIPT
+PRSYM, LPRSYM /PRINTS SYMBOLS
+CREATE, LCREAT /CREATES LABELS
+PROTAC, LPRTAC /PRINTS CONTENTS OF AC IN OCTAL
+PLAB, LPLAB /PRINTS LABELS
+PIFF, LPIFF /PUTS OUT AN IFF FOR THE CONTENTS OF THE AC
+TRIPL, LTRIPL /PROCESSES THE TRIPLES GENERATED FROM AN EXPRESSION
+GENER, LGENER /GENERATES THE TRIPLES
+LCHNG, CHNG /TEST FOR DUMMY ARG AND REPLACE
+CLAB, LCLAB /HANGS A CREATED LABEL ON THE NEXT LINE
+STORE, LSTORE /STORES THE CONTENTS OF THE AC
+FPROP, LFPROP /PUT OUT CALLS TO F.P. ROUTINES
+ZER, LZER
+DUM, LDUM /PROCESSES OCCURRANCES OF DUMMY ARGUMENTS IN LISTS
+DIM, LDIM /LOOKS UP DIMENSION INFORMATION ON VARIABLES
+PUNCH, LTTYPE /ADDRESS OF CURRENT OUTPUT ROUTINE
+C2, 2
+C3, 3
+\fC40, 40
+C7240, 5440 /THIS WAS COLON-SPACE NOW ITS COMMA-SPACE
+C77, 77
+CM40, -40
+CM4046, -4046
+CM50, -50
+CM51, -51
+CM54, -54
+CM2, -2
+CM3, -3
+CHECK, LCHECK
+SMODE, LSMODE
+BSS, LBSS
+ARG, LARG
+C54, 54
+BASE, INBUF
+BASE2, INBUF+100
+C4000, 4000
+GNB, LGNB
+\f *177
+START, CLA /COME HERE AT BEGINNING OF EACH STMT
+ DCA FIRSTF
+START1, TAD IMPDO
+ SZA CLA
+ JMP ERR1 /IF IMPDO<>0 THEN WE MUST HAVE SCREWED UP ON
+ /CONTINUATIONS (I THINK)
+ ISZ CHK /IS THERE A STMT IN THE BUFFER?
+ JMP .+3
+ JMS I SWAP /YES, SWITCH BUFFER POINTERS
+ JMP .+3
+ TAD BASE
+ JMS I RCD /NO, READ THE NEXT LINE
+TEST, TAD L15
+ TAD CM3
+ DCA L16 /SET UP XR FOR DO TERMINATION TEST
+ TAD L54
+ CIA
+ TAD I L16
+ SZA CLA /ARE WE TERMINATING A DO?
+ JMP ATRY
+ JMS LDNEXT /TERMINATE DO LOOP
+ JMP TEST /SEE IF THERE IS ANY MORE...
+ATRY, TAD L61
+ SZA CLA /A COMMENT?
+ JMP CMNT
+ TAD CHK
+ SZA CLA /ILLEGAL CONTINUATION?
+ERR1, JMS I LUNCH
+ JMS I STMT /GET THE STMT NR...
+ TAD L32
+ SNA
+ JMP .+4 /NO STMT NUMBER
+ CIA
+ TAD L12
+ SZA CLA /CAN WE OMIT A TERMINAL JMP?
+ JMS I PRINT
+ DCA L24
+FLST, JMS LIST /PUNCH SOURCE STMT
+ JMS I WIPE /ZERO THE SUBSCRIPT TEMP. TABLE
+ TAD L32
+ DCA L54
+ TAD CM2
+ DCA L64
+ SKP
+ACA, DCA I BAREA1
+ JMS I GETCH
+ JMP ALPH
+ NOP
+ JMS I PUTCH /PUT CHARACTER BACK
+ALPH, RTL CLL
+ RTL
+ RTL
+ DCA L65
+ JMS I GETCH
+ JMP ALPH2
+ NOP
+ JMS I PUTCH /PUT CHARACTER BACK
+ALPH2, TAD L65
+ ISZ L64
+ JMP ACA
+ DCA I BAREA2
+ DCA CHK
+ TAD SSTYP /COMPARE THESE CHARS WITH DISPATCH TABLE
+ DCA L17
+TRY, TAD I L17
+ SNA /END OF THE TABLE?
+ JMP I ASSIGN /YES, MUST BE ARITHMETIC STMT
+ TAD I BAREA1
+ SZA CLA
+ JMP NOHIT2
+ TAD I BAREA2
+ TAD I L17
+ SZA CLA
+ JMP NOHIT1
+ TAD I L17 /FOUND A MATCH, GO TO PROPER HANDLER...
+ DCA L30
+ JMP I L30
+NOHIT2, ISZ L17
+NOHIT1, ISZ L17
+ JMP TRY /DOESN'T MATCH, TRY AGAIN
+
+LDNEXT, 0
+ TAD L15 /RESET THE DO END POINTER
+ TAD CM3
+ DCA L15
+ TAD L15
+ IAC
+ DCA L16
+ CMA
+ TAD L55
+ DCA L55
+ JMS I PROP /PUNCH 'JMP <LABEL>'
+ 6044
+ TAD I L16
+ JMS I PRCRL
+ JMS I PRINT
+ TAD I L16 /PUNCH '<LABEL>,'
+ JMS I CLAB
+ JMS I PRINT
+ JMP I LDNEXT
+
+PTEM, 0
+
+LIST, 0 /PUNCH THE SOURCE STATEMENT
+ TAD BASE /GET THE POINTER
+ DCA PTEM
+ TAD I PTEM /PUNCH A CHARACTER PAIR...
+ JMS I P2
+ TAD I PTEM
+ ISZ PTEM
+ AND C77
+ SZA CLA /END OF THE BUFFER?
+ JMP LIST+3
+ JMS I PRINT /YES, PUNCH A CR-LF AND RETURN
+ JMP I LIST
+
+CMNT, JMS I PRINT /WE HAVE A COMMENT
+ DCA L24
+ JMS LIST
+ JMP START1 /ALLOW COMMENTS BEFORE SUBR. OR FUNCTION STMT.
+
+
+BAREA1, AREA1
+BAREA2, AREA2
+RCD, LRCD
+SSTYP, STYPE-1 /POINTER TO STATMENT TABLE IN FIELD 1
+WIPE, LWIPE
+STMT, LSTMT
+SWAP, LSWAP
+\f *400
+/ THE FOLLOWING ROUTINE IS ENTERED WITH THE BUFFER POINTER IN THE AC
+/ IT PUTS ONE LINE INTO THE BUFFER,
+/ CHECKS FOR COMMENTS AND COUTINUATION LINES, AND IF IT IS A
+/ CONTINUATION IT SETS KOUNT TO THE PROPER COLUMN
+/
+LRCD, 0
+ DCA TEM1 /SAVE THE BUFFER POINTER
+ DCA I TEM1
+ DCA CHK /ZERO CONTINUATION FLAG
+ DCA L20 /ZERO THE EQUALS FLAG
+ DCA L61 /ZERO THE COMMENT FLAG
+ TAD CM111 /BUFFER LIMIT IS 72 CHARACTERS
+ DCA IX
+LRCDL, CLA
+ JMS LPTRIN
+ AND D177
+ SZA /LEADER OR BLANK TAPE?
+ TAD CM177
+ SNA /RUBOUT?
+ JMP LRCDL
+ TAD (177-15
+ SNA
+ JMP LCAR
+ TAD (15-11
+ SNA
+ JMP TAB
+ TAD (11-40
+ SPA
+ JMP LRCDL
+ TAD (40-75
+ SNA /AN '=' ?
+ ISZ L20
+ TAD C75 /CHAR OK... RESTORE IT & PUT IN BUFFER
+ JMS KRONK /PUT IT IN THE BUFFER...
+ JMP LRCDL /AND GET ANOTHER
+
+LCAR, TAD IX /PROCESS A CAR RETURN...
+ CIA
+ TAD CM111
+ SNA CLA /NULL STATEMENT?
+ JMP LRCDL /YES, IGNORE
+ JMS KRONK /PUT A ZERO IN THE BUFFER
+ TAD I TEM1
+ TAD CM3
+ SNA
+ JMP COMNT
+ TAD CM20
+ SZA CLA /TEST FOR "S" IN COLUMN ONE
+ JMP TINUE
+ JMP I (SCODE
+COMNT, ISZ L61 /SET COMMENT FLAG...
+ TAD C40
+ JMP STORSL
+
+TINUE, TAD TEM1 /CHECK FOR CONTINUATION...
+ TAD C3
+ DCA P /SET THE POINTER TO COLS. 6 AND 7
+ TAD I P
+ AND C5700 /NON-ZERO OR NON BLANK IN COL 6
+ TAD C4000 /MAKES THIS A CONTINUATION...
+ SNA CLA /IS IT?
+ JMP LRCDA /MAYBE...
+LRCDX, TAD B7 /YES, MAKE IT START IN COL 7
+ DCA KOUNT
+ ISZ CHK /INCREMENT THE CONTINUATION FLAG
+ TAD I TEM1
+STORSL, TAD C5700 /MAKE THIS INTO A COMMENT LINE
+ DCA I TEM1
+ JMP I LRCD /THEN RETURN
+
+LRCDA, TAD I P /NUMERIC AND NON-ZERO IN COL 7 MAKES
+ AND C77 /THIS A CONTINUATION...
+ TAD CM61
+ SPA CLA /IS IT?
+ JMP LRCDX+3 /NO, RETURN
+ IAC /YES, MAKE IT START IN COL 8
+ JMP LRCDX
+
+TAB, TAD C40 /PROCESS TAB CHARACTERS...
+ JMS KRONK /PUT SOME SPACES IN THE BUFFER
+ TAD IX
+ TAD C3 /MAKE 1ST TAB GO TO COL 7
+ SMA /ARE WE AT END OF THE BUFFER?
+ CLA /YES, FORCE TERMINATION
+ AND B7
+ SZA CLA /MODULO 8?
+ JMP TAB /NO, PUNCH SOME MORE SPACES
+ JMP LRCDL /YES, GET ANOTHER CHAR
+
+KRONK, 0 /PUT A CHARACTER IN THE BUFFER...
+ DCA CAR
+ CLA IAC
+ TAD IX /FIRST COMPUTE BUFFER ADDRESS...
+ SNA /PAST COL. 72?
+ JMP I KRONK /YES-RETN.
+ TAD C111 /NO
+ CLL RAR
+ TAD TEM1
+ DCA P
+ TAD CAR /PICK UP THE CHARACTER
+ AND C77
+ SZL /ZERO LINK SAYS WE WANT THE LEFT HALF
+ JMP .+5
+ RTL
+ RTL
+ RTL
+ DCA I P
+ TAD I P /ADD IN THE LEFT 6 BITS
+ DCA I P /AND SALT THEM AWAY...
+ ISZ IX /BUFFER OVERFLOW?
+ JMP I KRONK
+
+LPTRIN, 0 /PAPER TAPE READER INPUT ROUTINE
+ RSF
+ JMP .-1
+ RRB RFC
+ JMP I LPTRIN
+
+CAR, 0 /TEMPORARY, HOLDS THE CURRENT CHARACTER
+P, 0 /THIS IS THE BUFFER POINTER
+TEM1, 0 /THIS CONTAINS THE CURRENT BUFFER ADDRESS
+IX, 0 /THIS IS THE CHARACTER COUNTER
+CM111, -111 /MINUS THE BUFFER LIMIT PLUS ONE
+C111, 111 /THIS IS THE BUFFER LIMIT PLUS ONE
+D177, 177
+CM177, -177
+C75, 75
+B7, 7
+C5700, 5700
+CM61, -61
+CM20, -20
+M1700, -1700
+\f *600
+CAL, TAD KOUNT /SUBROUTINE CALL STMT PROCESSOR
+ DCA COUNT3
+ JMS I ENTITY
+ JMP I ASSIGN
+ JMP ON
+COUNT3, 0
+Q12, 12
+ JMP I ASSIGN
+ON, JMS I GNB
+ SNA /ANY ARGUMENTS?
+ JMP CR2 /NO
+ TAD CM50
+ SZA /MAYBE, IS THIS A '(' ?
+ JMP I ASSIGN
+ JMS I ZZZ /YES, PUNCH STMT NR, IF ANY
+ TAD COUNT3
+ DCA KOUNT
+ ISZ L44
+ DCA L46 /AC SWITCH
+ DCA L52 /IF STATEMENT SWITCH
+ JMS I GENER /LET TRIPLE GENERATOR PROCESS IT
+ DCA L46 /ZERO AC AGAIN
+ JMP START /COMPLETE, GET NEXT STATEMENT
+CR2, ISZ L32 /NO ARGUMENTS
+ JMS I SYMTAB
+ TAD L77
+ DCA GLU
+ JMS I ZZZ /PUNCH '<LABEL>, CALL 0,<NAME>'
+ JMS I FPROP
+GLU, 0
+ JMP START
+LGNB, 0
+ JMS LGTC
+ DCA GLU
+ TAD GLU
+ TAD CM40
+ SNA CLA
+ JMP LGNB+1
+ TAD GLU
+ JMP I LGNB
+LGETCH, 0
+ JMS I GNB
+ SNA /IS IT A END OF CARD
+ JMP PUNC /YES ITS PUNTUATION
+ TAD QM32
+ SPA SNA /IS IT ALPHABETIC
+ JMP ALPHA //YES
+ TAD CM40
+ CLL
+ TAD Q12
+ SZL /IS IT NUMERIC?
+ ISZ LGETCH /NUMERIC
+PUNC, ISZ LGETCH /PUNCTUATION
+ALPHA, CLA /ALPHABETIC
+ TAD GLU
+ JMP I LGETCH /RETURN
+/ THIS ROUTINE DETERMINES WHETHER SYMBOL IS FP OR INTEBER
+/ ROUTINE SKIPS IF SYMBOL IS INTEGER
+LMODE, 0
+ SMA /IF ITS PLUS WE HAVE AN INTEGER
+ JMP AINT /WE HAVE AN INTEGER
+ RAL /GET NEXT BIT
+ SPA /CHECK THIS BIT
+ JMP FV /ITS EITHER A FCON OR VARIABLE
+ RTL /GET NEXT TWO BITS
+ SNL /IS IT AN OPERATOR
+ERR2, JMS I LUNCH /YES
+AFP, SMA CLA /CHECK THIS BIT
+ JMP AINT /ITS AN INTEGER
+ JMP I LMODE /SYMBOL WAS F P MODE
+FV, RAR /RESTORE AC TO ORIGINAL CONTENTS
+ CIA /SET NEGATIVE
+ TAD L47 /ADD START OF FCON TABLE
+ SPA /IS /SYMBOL FCON
+ JMP AFP /YES
+ CIA /NO /RESTORE AC AGAIN
+ TAD L47
+ DCA ATEM /SAVE THE RESTORED NUMBER
+ TAD I ATEM /GET THE POINTER TO THE VARIABLE
+ TAD CM1100 /SUBTRACT AN I
+ SPA /IS IT LESS THAN I
+ JMP AFP /YES ITS FLOATING POINT
+ TAD CON1 /NOW SUBTRACT AN N
+ SPA CLA /IS IT LESS THAN N
+AINT, ISZ LMODE /YES
+CON1, CLA /CLEAR THE AC FOR THE RETURN
+ JMP I LMODE
+ATEM, 0
+CM1100, -1100
+QM32, -32
+LGTC, 0 /GET A CHARACTER FROM THE BUFFER
+ TAD KOUNT
+ ISZ KOUNT
+ CLL RAR /LINK TELLS IF LEFT OR RIGHT HALF
+ TAD BASE
+ DCA GLU
+ TAD I GLU
+ SZL /WHICH CHARACTER
+ JMP MMSK
+ RTR
+ RTR
+ RTR
+MMSK, AND C77
+ SZA
+ JMP I LGTC
+ TAD CHK
+ SPA CLA /DO WE WANT A NEW LINE YET?
+ JMP I LGTC /NOT YET...
+ TAD BASE2 /YES, USE THE ALTERNATE BUFFER
+ JMS I RLCD
+ TAD CHK
+ SZA CLA /IS IT A CONTINUATION?
+ JMP .+4
+ CMA /NO, SET FLAG AND RETURN W ZERO AC
+ DCA CHK
+ JMP I LGTC
+ JMS LSWAP /YES, SWITCH BUFFERS AND CONTINUE
+ DCA CHK
+ JMP LGTC+1
+
+RLCD, LRCD
+LSWAP, 0 /SWITCH THE LINE BUFFER POINTERS
+ TAD BASE
+ DCA ATEM
+ TAD BASE2
+ DCA BASE
+ TAD ATEM
+ DCA BASE2
+ JMP I LSWAP
+\f *1000
+/ THE POINTER TO THE CURRENT LOCATION IN THE PUSH LIST IS
+/ IN LOC 41, THE CURRENT TRIPLE NUMBER IS IN LOCATION 40
+/ LOC 44 MUST BE SET TO 0 IF THERE IS AN '=' , TO 1 IF NOT.
+PBEGN, AREA2 /START OF THE PRECEDENCE LIST
+BINTEG, TAD L32 /HERE IF ENTITY SENT AN INTEGER
+ JMP I BPUSH /PUSH IT INTO STACK
+FLPT, JMS I FCON /HERE IF ENTITY FOUND A FLOATING POINT CON
+ SKP /ENTER IT INTO FPTABLE
+BLPHA, JMS I SYMTAB /HERE IF ENTITY FOUND A VARIABLE
+ TAD L77 /PICK UP POINTER INTO SYM TAB OR FLPT TAB AN
+ JMP I BPUSH /PUSH IT DOWN
+LABELX, JMP I LGENER
+LGENER, 0 /ENTRY POINT
+ TAD C5000
+ DCA L40 /*
+ DCA L21 /ZERO THE SYMBOL TABLE SWITCH
+ TAD L71
+ DCA L41 /SET PUSH DOWN POINTER
+ DCA L22
+ DCA BPAREN /ZERO OUT THE PAREN SWITCH
+ TAD C4000
+ DCA I L41 /FIRST PUSH DOWN LEFT CLOSURE NAMELY 0
+BNEXT, JMS I ENTITY /THIS WILL GET THE NEXT DATUM TO BE PROCESSE
+ JMP HOO /END OF STATEMENT RETURN,TREAT LIKE PUNCTION
+ JMP BLPHA /VARIABLE RETURN
+ JMP BINTEG /INTEGER RETURN
+ JMP FLPT /FLOATING POINT RETURN
+HOO, TAD CM50 /PUNCTIOATION RETURN,
+ SNA /IS IT (
+ JMP I BPAR /YES
+ TAD C7753
+ SZA /IS IT AN '=' ?
+ JMP BRET
+ TAD L44 /WE HAVE AN '=', IS IT LEGAL?
+ SNA CLA
+ JMP BRET /IT IS
+ TAD IMPDO
+ SZA CLA /ARE WE IN AN IMPLIED DO LOOP?
+ JMP I PIOEQL /YES - TERMINATE LOOP CODE
+ERR3, JMS I LUNCH
+PIOEQL, IOEQL
+BRET, TAD C0075
+ DCA L63
+ TAD I L41 /CHECK FOR A UNARY OPERATOR
+ TAD C4000
+ AND C7000
+ SZA CLA /WAS IT AN OPERAATOR AT ALL
+ JMP PREC /NO, STILL NOT UNARY OPERATOR
+ TAD L63
+ TAD C7725
+ SNA /IS IT A '+'
+ JMP BNEXT /YES, IGNORE IT
+ TAD CM2 /NO
+ SZA CLA /IS IT A '-' ?
+ JMP ERR3
+ TAD C4643 /THIS IS THE UNARY MINUS
+ JMP I BPUSH
+PREC, TAD PBEGN /HERE IS WHERE WE FIND THE PRECIDENCE
+ DCA L17
+ DCA L65
+ SKP
+RETUR, ISZ L17 /PICK UP NEXT OP CODE IN LIST
+ TAD I L17 /TO GET THE NEXT LIST ITEM
+ SMA SZA /IS THIS THE END OF THE LIST
+ JMP BMORE /NO, THE ASSUMPTION IS THAT THE PRECIDENCE
+ TAD L63 /IS ZERO
+ SZA CLA /IS THIS THE RIGHT TABLE ENTRY
+ JMP RETUR /TRY AGAIN (IT WASN"T)
+ TAD I L17 /TO GET THE PRECEDENCE
+ DCA L65
+BMORE, CLA IAC /HERE WE ARE GOING TO SEE IF THERE IS A PREC
+ TAD L41
+ DCA L64 /L64 NOW POINTS TO THE PREVIOUS OPERATOR
+ TAD I L64
+ TAD C4000
+ AND C7000
+ SZA /IS THERE A VALID OPERATOR ON THE STACK?
+ JMP ERR3 /APPARENTLY NOT...
+ TAD I L64 /IF THE PRECEDENCE OF THE PREVIOUS OPERATOR
+ AND C700 /IS NON-ZERO, AND ITS PRECEDENCE IS GREATER
+ SNA /THAN OR EQUAL TO THE PRECEDENCE OF THE
+ JMP NO /CURRENT OPERATOR, THEN PROCESS THE PREVIOUS
+ CIA /OPERATOR; IF NOT WE WILL PROBABLY PUT
+ TAD L65 /THE CURRENT OPERATOR ON THE STACK AND GET
+ SMA SZA CLA /ANOTHER ITEM FROM THE STATEMENT BUFFER...
+ JMP NO
+ ISZ L40 /YES, INCREMENT THE TRIPLE NUMBER AND....
+ JMS I TRIPL /PROCESS THE PREVIOUS OPERATOR
+ ISZ L41 /*****NOTE WHAT IF IT WAS UNARY************
+ TAD I L41
+ TAD C3135 /THIS IS MINUS UNARY MINUS
+ SZA CLA
+ ISZ L41 /DELETE THE LAST 3 ITEMS AND REPLACE WITH TR
+ TAD L46
+ DCA I L41
+ JMP BMORE /TRY FOR ANOTHER TRIPLE
+NO, TAD L63
+ SNA /IS IT A END OF STATEMENT MARK
+ JMP I LCDONE /IT WAS--WE ARE ALL FINISHED, EXCEPT CHECKING
+ TAD CM51
+ SNA /IS IT A ')' ?
+ JMP I LKPAR /YES
+ TAD CM3
+ SZA /IS IT A ',' ?
+ JMP NCOMMA /NO
+ TAD BPAREN
+ SNA CLA /IS A COMMA LEGAL HERE?
+ JMP I LCDONE /MAYBE...
+NCOMMA, TAD CM21
+ SNA CLA /IS IT AN EQUALS SIGN?
+ ISZ L44 /YES - SET EQUALS SWITCH ON
+ TAD L63 /PUT THE OPERATOR ON THE STACK
+ TAD L65 /ADD THE PRECEDENCE
+ TAD C4000
+ JMP I BPUSH
+/
+BPUSH, PUSH
+C5000, 5000
+BPAR, ALPAR
+C7753, 7753
+C0075, 75
+C7000, 7000
+CM21, -21
+C7725, 7725
+C4643, 4643
+C700, 700
+C3135, 3135
+LCDONE, CDONE
+LKPAR, KPAR
+FCON, LFCON
+\f *1200
+PUSH, DCA L63
+ CLA CMA
+ TAD L41 /SPACE THE POINTER UP ONE
+ DCA L41 /*
+ TAD L63
+ DCA I L41 /*
+ JMP I LBNEXT /BACK TO BEGINING
+/ THIS IS TO PROCESS SUBSCRIPTS OR FUNCTION CALLS---
+/ IF ARITHMETIC, JUST DELETE BOTH ( AND )
+KPAR, TAD I L64
+ TAD C3730 /MINUS LEFT PAREN
+ SZA /IS IT (
+ JMP BCON /NO-- CHECK SOME MORE
+ TAD I L41 /DELETE PARENS
+ DCA I L64
+ ISZ L41 /UPDATE POINTER
+LAPP, ISZ BPAREN /DO PARENS BALENCE
+ JMP I LBNEXT
+ TAD L52 /YES
+ SNA CLA /SHOULD WE RETURN IF BALANCED
+ JMP I LBNEXT
+ TAD L46
+ SZA CLA
+ JMP CDONE
+ TAD I L41
+ DCA L77
+ JMS I XTAD /GENERATE TAD OR (TAD I)
+ DCA I L41 /ZERO IS INTEGER
+CDONE, TAD L41
+ CMA
+ TAD L71
+ SZA /WELL...
+ERR6, JMS I LUNCH /HA...YOU GOOFED
+ JMS I XZQ
+ JMP I .+1
+ LABELX
+BCON, IAC /IS IT FUNCTION
+ ISZ L40
+ SNA
+ JMP BFOUT /YES
+ IAC /NO-- NOW IS IT SUBSCRIPT
+ SNA
+ JMP SOUT /YES
+ TAD C7772 /NO
+ SZA /IS IT COMMA
+ JMP ERR6 /NO - BYE BYE CHARLIE
+ ISZ L64
+ ISZ L64
+ TAD I L64
+ TAD C3724 /IS IT A COMMA
+ SNA
+ JMP BFOUT /FOUND TWO COMMAS,MUST BE FUNCTION
+ TAD C5 /NO
+ SNA /IS IT A PRIME
+ JMP BFOUT /GOT A FUNCTION
+ IAC /NO
+ SZA CLA
+ JMP ERR6 /SORRY, IT AIN'T NUTTIN
+SOUT, JMS I PLSBSC /PROCESS A SUBSCRIPT
+ CMA
+ TAD L22
+ DCA L22
+ SKP
+BFOUT, JMS I FUNCT
+ JMP LAPP
+FUNCT, LFUNCT
+/ THIS IS WHERE WE FIND OUT WHAT KIND OF LPAR
+ALPAR, CMA
+ TAD BPAREN
+ DCA BPAREN
+ TAD I L41
+ TAD C4000
+ AND B7000 /IS IT AN OPERAND
+ SZA CLA
+ JMP CUNT /NO , TRY SOME MORE
+ IAC
+ JMP PRIME
+CUNT, TAD I L41 /PICK UP TOP LIST ITEM
+ TAD C2 /ADD TWO TO FIND THE DIMENSION INTO(INFO)
+ DCA L64
+ TAD I L64
+ AND C20 /JUST WANT ONLY THIS ONE BIT(DIMENSION)
+ SNA CLA /IS IT DIMENSIONED
+ JMP PRIME /NO ITS GOT TO BE A FUNCTION CALL
+ ISZ L22
+ CMA
+PRIME, TAD C4047
+ JMP PUSH /GO PUSH A PRIME, IT IS THE FUNCTIONS LEFT PAREN
+XZQ, LXZQ
+LBNEXT, BNEXT
+C3730, 3730
+C7772, 7772
+C3724, 3724
+C5, 5
+D7, 7
+B7000, 7000
+C20, 20
+C4047, 4047
+XTAD, LXTAD
+LPUTCH, 0
+ CLA CMA
+ TAD KOUNT
+ DCA KOUNT
+ JMP I LPUTCH
+
+LASIGN, TAD L20 /ARITHMETIC STATEMENT PROCESSOR
+ SNA CLA /IS THERE AN '=' IN THE STMT?
+ERR9, JMS I LUNCH /NO, BETTER COMPLAIN...
+ TAD D7 /SET POINTER TO COL 7
+ DCA KOUNT
+ JMS I ZZZ /PUNCH THE LABEL, IF ANY
+ DCA L46
+ DCA L44
+ DCA L52
+ JMS I GENER /PROCESS IT...
+ TAD L63
+ SZA CLA /WAS TERMINATOR A <CR/LF> ?
+ JMP ERR9 /NO, ILLEGAL STATEMENT ERROR ...
+ JMP START
+PLSBSC, LSUBSC
+
+LPRCRL, 0 /SUBROUTINE PRINTS CREATED LABELS
+ DCA LPRCTM
+ TAD C36 /PUNCH '^'
+ JMS I PRINT
+ TAD LPRCTM /PUNCH THE LETTERS
+ JMS I P2
+ JMP I LPRCRL
+C36, 36
+LPRCTM, 0
+\f *1400
+PRET, ISZ LENTT /PUNCTIONATION EXIT POINT
+FRET, ISZ LENTT /FLOATING POINT EXIT POINT
+XIRET, ISZ LENTT /INTEGER EXIT POINT
+XARET, ISZ LENTT /VARIABLE EXIT
+ERET, JMP I LENTT /CR END OF LINE EXIT
+LENTT, 0 /ENTRY POINT
+ CLA /WIPE OUT PSEUDO ACCUMULATOR
+ DCA L32
+ DCA L31
+ DCA COUNT2 /RESET ALL KINDS OF THINGS TO ZERO
+ DCA L36
+ DCA L37
+ DCA L30
+ DCA FPSW
+ DCA ESIGN
+ TAD CM6
+ DCA L65 /SET UP FOR MAXIMUM OF 6 CHARS
+ JMS I GETCH /GET THE FIRST INPUT CHARACTER
+ JMP .+3 /ALPHA RETURN
+ JMP PUNCT /PUNCTIONATION RETURN
+ JMP DIG /DIGIT RETURN
+ JMS PACK /STORE THIS CHARACTER
+ JMS I GETCH /GET ANOTHER CHACTER
+ JMP .-2 /ALPHA- IS OK
+ SKP /PUNCTUATION
+ JMP .-4 /DIGIT--IS OK PROCESS IT
+ JMS I PUTCH /PUT THAT PUNCTUATION BACK IN THE BUFFER
+ TAD L32
+ AND CC7700 /MAKE SURE NAME IS <= 5 CHARACTERS LONG
+ DCA L32
+ JMP XARET /RETURN WITH VARIABLE
+
+PACK, 0 /THIS PACK CHARS INTO L30 L31 AND L32
+ DCA L64 /SAVE THE CHAR...
+ TAD L65
+ SNA /DO WE HAVE SIX CHARS ALREADY?
+ JMP I PACK /YES - IGNORE
+ STL; RAR
+ TAD P33
+ DCA LTEM
+ ISZ L65
+C7, 7
+ TAD L64
+ CDF 10
+ SNL /DO WE HAVE LEFT OR RIGHT HALF?
+ JMP .+5
+ CLL RTL /MUST BE LEFT HALF...
+ RTL
+ RTL
+ SKP
+ TAD I LTEM
+ DCA I LTEM
+ CDF 00
+ JMP I PACK
+LTEM, 0
+
+PUNCT, SNA /HERE TO PROCESS PUNCTION---IS IT A CARIAGE RET
+ JMP ERET /YES, GO RIGHT BACKTO THE CALLER....BY-BY
+ TAD C7722 /IS IT A PERIOD
+ SNA
+ JMP CC /YES--WE ASSUME THAT THIS LENTT IS A FLOATING
+ TAD C7
+ SNA /IS IT A QUOTE?
+ JMP I QUOTE /YES - CHARACTER LITERAL
+ TAD CM3
+ SZA /IS IT AN ASTERISK
+ JMP NAH /NO
+ JMS I GETCH /YES- PEEK AT NEXT CHAR
+ JMP NOASS /ALPHA-- PUT IT BACK
+ JMP ASSCK /PUNCTUATION-- CHECK FOR AN ASTERISK
+NOASS, JMS I PUTCH /DIGIT---PUT IT BACK
+NAH, TAD X52 /RESTORE CHARACTER TO WHAT IT WAS
+ JMP PRET /THATS ALL---IT WAS PUNCTIONATION
+ASSCK, TAD CM52 /ANOTHER PUNCTUATION--IS IT (*)
+ SZA
+ JMP NOASS /NO---PUT IT BACK
+ TAD C45 /IT WAS-- CHANGE ** TO PERCENT
+ JMP PRET /---ALTERED PUNCTUATION
+DIG, AND C17 /FIRST CHAR WAS A DIGIT, DONT KNOW IS INTEGER O
+ DCA L32 /AT ANY RATE SAVE IT IN THE PSEUDO ACCUMULATER
+CA, JMS I GETCH /GET ANOTHER CHACTER
+ JMP I LTESTE /ALPHA--GO SEE IF IT IS AN -E-
+ SKP /PUNCT
+ JMP BONT /DIGIT GO PROCESS IT
+ TAD C7722 /PUNCTUATION HERE, IS IT A PERIOD
+ SZA
+ JMP I LCOP / IT IS . WE HAVE A FLOATING POINT NUMBER
+CC, TAD FPSW
+ SZA
+ERR10, JMS I LUNCH /TOO MANY (.)
+ ISZ FPSW
+ DCA COUNT2
+ JMP CA /GO BACK AND GET ANOTHER CHAR
+BONT, AND C17 /***COME HERE WITH ANOTHER DIGIT.
+ DCA L36 /SAVE IT
+ ISZ COUNT2
+ JMS I LMUL10 / AC = AC * 10 + DIGIT
+ JMP CA /GO GET ANOTHER CHAR
+P33, L30+3
+CM6, -6
+C7722, 7722
+X52, 52
+CM52, -52
+C17, 17
+LTESTE, TESTE
+C45, 45
+LCOP, COP
+LMUL10, MUL10
+QUOTE, LQUOTE
+
+
+DMPLIN, 0 /SUBROUTINE TO DUMP "LAST LINE" BUFFER
+ ISZ L24
+ TAD I L24 /GET NEXT CHAR
+ JMS I PUNCH /PUNCH IT
+ TAD I L24
+ TAD CM212
+ SZA CLA /IS CHAR A LINE FEED?
+ JMP DMPLIN+1 /NO
+ CLA IAC
+ DCA L24 /RESET POINTER
+ DCA L12 /ZERO CONTENTS FLAG
+ JMP I DMPLIN /RETURN
+CM212, -212
+CC7700, 7700
+\f *1600
+TESTE, TAD C7773 /IS IT E
+ SZA
+ JMP COP /NO, GO PUT IT BACK AND PROCESS
+/ HERE IF EXPONENT FOLLOWES
+ DCA L37 /IT WAS AN E
+/ THIS ROUTINE IS TO PROCESS THE EXPONENT THAT FOLLOWES THE -E- THAT WE
+/
+ ISZ FPSW /MAKE SURE THE FLOATING POINT SWITCH WAS KICKED
+ JMS I GETCH /GET ANOTHER CHAR
+ JMP ERR12 /ALPHA , CANT BE-- SO LONG, ITS BEEN NICE
+ SKP /PUNCT
+ JMP CD /DIGIT, GO PROCESS IT
+ TAD X7725 /IS IT PULS SIGN
+ SNA
+ JMP CF /YES, IGNOR IT
+ TAD CM2
+ SZA /IS IT MINUS
+ JMP COP /NO, GO PROCESS THE FLOATING POINT NUMBER
+ CLA CMA
+ DCA ESIGN /YES- REMEMBER THAT THE EXPONENT WAS MINUS
+CF, JMS I GETCH /GET ANOTHER CHAR
+ JMP COP /ALPHA, ALL READY TO PROCESS
+ JMP COP /PUNCTUATION, READY TO PROCESS
+CD, AND X17 /DIGIT
+ DCA L36 /SAVE IT IN 36 AND..
+ TAD L37 /MULTIPLY THE - EXPONENT TO DATE- BY 10
+ RAL CLL
+ DCA L37
+ TAD L37
+ RAL CLL
+ RAL CLL
+ TAD L37
+ TAD L36 /AND ADD IN THIS DIGIT I.E. 37C10*
+ DCA L37 / L37 = 10 * L37 + L36
+ JMP CF /GO DO IT AGAIN
+COP, JMS I PUTCH
+ CLA CLL /PROCESS THIS NUMBER
+ TAD FPSW /IS IT AN INTEGER
+ SZA CLA
+ JMP CH /NO, MUST BE FLOATING POINT
+/ INTEGER IS IN ACC
+ TAD L30 /YESS
+ SNA /MAKE SURE INTEGER IS VALID
+ TAD L31
+ SZA CLA
+ JMP ERR12
+ TAD L32
+ SPA CLA
+ERR12, JMS I LUNCH /TOO BIG
+ JMP I .+1 /TAKE INTEGER RETURN WITH INTEGER IN 32
+ XIRET
+CH, TAD L37 /WAS THIS AN E-CONVERSION NUMBER
+ ISZ ESIGN /EXPONENT POSITIVE?
+ CIA /YES
+ TAD COUNT2 /ADD POST-DECIMAL COUNTER
+ CLL
+ SNA
+ JMP CM /NOTHING TO DO
+ SMA /DETERMINE WHETHER TO
+ CML CIA /MULTIPLY OR DIVIDE
+ DCA COUNT2
+ RAL
+ TAD CJ
+ DCA CK
+ JMS XFLOAT /SET UP THE NUMBER
+CK, HLT /JMP I (MULT OR JMP I (DIVIDE
+ ISZ COUNT2
+ JMP CK /LOOP ON COUNT
+ JMP I LPOLIS /FINISH UP
+
+CM, JMS XFLOAT
+ JMP I LPOLIS
+CJ, JMS I .+1
+ MULT
+ DIVIDE
+
+/ THIS ROUTINE CONVERTS THE NUMBER TO FLOATING POINT
+XFLOAT, 0
+ CLA CLL
+ TAD L32 /CHECK IF THE ACCUMULATED NUMBER IS ZERO
+ SNA
+ TAD L31
+ SNA
+ TAD L30
+ SNA CLA
+ JMP I LFRET /IT WAS ZERO SEND A FLOATING POINT ZERO BACK--
+ TAD C2440 /IT IS NOT ZERO--SET THE EXPON TO 36 BASE 10
+ DCA L37
+ JMS NORMAL /GO TO THE NORMALIZE ROUTINE
+ JMP I XFLOAT /AT THIS POINT THE MANTISA AND EXPON ARE SEPERA
+/ ALSO NOTICE THAT WE HAVE 36 BINARY DIGITS I E THE WHOLE 3 WORDS ARE U
+/ NORMAL IZATION OF A F P NUMBER
+NORMAL, 0
+DA, TAD L30 /WE MUST SHIFT UNTIL THE HIGH ORDER WORD GOES N
+ SPA CLA
+ JMP I NORMAL /IT IS NEG., ALL DONE
+ JMS I LLSHIF /GO DO A TRIPLE PRECISION LEFT SHIFT
+ TAD L37 /AND SUBTRACT ONE FROM THE EXPONENT
+ TAD C7770 /NOTE-- THE 3 LOW ORDER BITS ARE NOT USED
+ SPA /IF THIS DOESNT SKIP WE HAVE F P OVERFLOW
+ JMP ERR12 /BY-BY NUMBER TOO LARGE FOR THE MACHINE
+ DCA L37
+ JMP DA
+/ THE FOLLOWING ROUTINE SAVES THE ACC IN THE MQ
+C7773, 7773
+X7725, 7725
+X17, 17
+C7770, 7770
+LPOLIS, POLISH
+LFRET, FRET
+C2440, 2440
+LLSHIF, LSHIFT
+
+SCODE, CDF 10 /SHIFT S-CODE 2 COLS. LEFT
+ TAD I (TEM1
+ CDF 0
+ DCA SLOC1
+ TAD SLOC1
+ IAC
+ DCA SLOC2
+ ISZ L61 /SET COMMENT FLAG
+SCODL, TAD I SLOC2
+ DCA I SLOC1
+ TAD I SLOC2
+ AND C77
+ SNA CLA /END OF LINE?
+ JMP I (STORSL+2
+ ISZ SLOC1
+ ISZ SLOC2
+ JMP SCODL /AND CONTINUE PROCESS
+
+SLOC1, 0
+SLOC2, 0
+\f *2000
+XSAVE, 0 /-- THE F.P. AC IS IN LOCS 30-32
+ TAD L30 /-- THE "MQ" IS IN LOCS 33-35
+ DCA L33 /---THE EXPONENT IS IN LOCS 37
+ TAD L31
+ DCA L34
+ TAD L32
+ DCA L35
+ JMP I XSAVE
+/ SHIFTS THE PSEUDO-ACC LEFT ONE PLACE
+LSHIFT, 0
+ CLA CLL
+ TAD L32
+ RAL
+ DCA L32
+ TAD L31
+ RAL
+ DCA L31
+ TAD L30
+ RAL
+ DCA L30
+ JMP I LSHIFT
+/ THE FOLLOWING ROUTINE ADDS THE MQ TO THE ACC
+ADD, 0
+ CLA CLL
+ TAD L32
+ TAD L35
+ DCA L32
+ RAL
+ TAD L31
+ TAD L34
+ DCA L31
+ RAL
+ TAD L30
+ TAD L33
+ DCA L30
+ JMP I ADD
+/ THE FOLLOWING ROUTINE SHIFTS THE ACC RIGHT ONE PLACE
+RSHIFT, 0
+ CLA CLL
+ TAD L30
+ RAR
+ DCA L30
+ TAD L31
+ RAR
+ DCA L31
+ TAD L32
+ RAR
+ DCA L32
+ JMP I RSHIFT
+/
+/
+MULT, 0 /ACCCACC*10 MQ
+ JMS RSHIFT
+ JMS XSAVE
+ JMS RSHIFT
+ JMS RSHIFT
+ JMS ADD /THIS FINISHES THE MULT BY 10
+ TAD L37 /NOW DIDDLE THE EXPONENT
+ TAD C40
+ SPA /OVERFLOW TEST
+ERR14, JMS I LUNCH /FLOATING POINT OVERFLOW
+ DCA L37
+ JMS I LNRMAL /MAKE SURE THE F P NUMBER IS STILL IN NORMAL FO
+ JMP I MULT
+DIVIDE, 0 /DIVIDE THE F P NUMBER BY 10
+ JMS RSHIFT /BASED ON THE FACT THAT .1 BASE 10 C .000110011
+ JMS XSAVE /THAT IS WE MULTIPLE BY ONE TENTH
+ TAD C7766 /THIS IS A COUNTER**********************
+ DCA ZCTR
+DB, JMS RSHIFT
+ JMS ADD
+ ISZ ZCTR
+ SKP
+ JMP DC
+ JMS RSHIFT
+ JMS RSHIFT
+ JMS RSHIFT
+ JMS ADD
+ JMP DB
+DC, TAD L37
+ TAD C7750 /********INSERT HERE THE CONSTANT************
+ DCA L37 /WE HAVE JUST DIDDLED THE EXPONENT BY THE PROP
+ JMS I LNRMAL /MAKE SURE IT IS STILL NORMALIZ D
+ JMP I DIVIDE
+ZCTR, 0
+MUL10, 0 /THIS MULTIPLIES THE TRIPLE PREC. INTEGER INT E
+ JMS LSHIFT /BY 10
+ JMS XSAVE
+ JMS LSHIFT
+ JMS LSHIFT
+ JMS ADD
+ TAD L36 /NOW CRAM THE DIGIT THAT WE WANT TO ADD INTO TH
+ DCA L35 /*
+ DCA L34
+ DCA L33
+ JMS ADD /AND ADD IT TO THE ACC
+ JMP I MUL10 /IN OTHER WORDS ACCCACC*10 DIGIT
+POLISH, CLA CLL /THIS TAKES THE SEPARATE MANTISSA AND EXP--ENT.
+ TAD C400 /AND PUTS THEM INTO 7090 FORM. THIS IS THE R-U
+ DCA L35 /27 DIGITS
+ DCA L34 /ROUND FACTOR IS CRAMED INTO THE MQ
+ DCA L33
+ JMS ADD /AND ADDED TO THE INTEGER IN THE ACC
+ SNL /IF THE LINK IS ON, WE OVERFLEW ON THE CARRY
+ JMP POLSH /WE DIDNT
+ TAD C4000 /SET THE ACC TO .1000000000 (THE REST OF IT IS
+ DCA L30
+ TAD L37 /DIDDLE THE EXPONENT BY ONE. THIS IS A FINKIE N
+ TAD J10
+ SNA
+ JMP ERR14 /EXPONENT OVERFLOW ...
+ DCA L37
+POLSH, TAD C7767 /NOW SHIFT THE ENTIRE ACC RIGHT 9 TIMES
+ DCA ZCTR /( THATS SO WE WILL HAVE ROOM TO STICK IN THE E
+HOOP, JMS RSHIFT
+ ISZ ZCTR
+ JMP HOOP
+ TAD L37 /CRAM THE EXP
+ TAD L30 /INTO THE ACC
+ DCA L30 /AND VOILA, WE ARE DONE. GO TAKE THE FPOINT EX
+ JMP I .+1
+ FRET
+LNRMAL, NORMAL
+C7766, 7766
+C7750, 7750
+C400, 400
+J10, 10
+C7767, 7767
+\f *2200
+/ THE FOLLOWING ROUTINE LOOKS FOR A STATEMENT NUMBER
+LSTMT, 0
+ JMS I CLEAR /CLEAR THE PSEUDO ACC AND MQ
+ TAD C7240 /DON'T LET LGTC GET ANOTHER LINE YET(CHK MUST BE NEG., BUT NOT 4000!!)
+ DCA CHK
+ IAC
+ DCA KOUNT
+LABEL, JMS I GTCL /GET A CHARACTER
+ SNA /IS THIS A CAR RET?
+ERR15, JMS I LUNCH /YES, INCOMPLETE STATEMENT
+ TAD CM40
+ SNA /SPACE?
+ JMP SPACE
+ TAD CM32
+ CLL
+ TAD C12
+ SNL / 260 <= CHAR < 272 ?
+ERR16, JMS I LUNCH
+ DCA L36 /SAVE THIS DIGIT...
+ JMS I MULT10 / ACC = 10 * ACC + L36
+SPACE, TAD KOUNT
+ TAD DM6
+ SPA CLA /END OF STMT NR FIELD?
+ JMP LABEL /NOT YET...
+ JMS I GTCL /SKIP OVER COL 6
+ SNA CLA /IS IT A CAR RET?
+ JMP ERR15
+ TAD L31 /SEE IF STMT NR IS LEGAL...
+ SZA
+ JMP ERR16
+ TAD L32
+ SPA CLA /IS STMT NR < 2048 ?
+ JMP ERR16 /NO, STMT NR TOO BIG
+ JMP I LSTMT
+CLEAR, LCLEAR
+GTCL, LGTC
+MULT10, MUL10
+CM32, -32
+DM6, -6
+C12, 12
+/
+/ SUBROUTINEE TO PRINT A SYMBOL
+/
+/ JMS I PRSYM
+/
+LPRSYM, 0 /THIS ROUTINE PRINTS SYMBOLS
+ DCA LCH
+ TAD LCH
+ SMA /IS IT AN INTEGER CONSTANT
+ JMP ICON /YES PROCESS IT
+ RTL /SHIFT THE NEXT BIT INTO THE LINK
+ SNL /IS IT A TEMPORARY
+ JMP TEMPO /ITS A TEMPORARY
+ RTR /RESTORE THE SYMBOL
+ CIA /SET IT NEGATIVE
+ TAD L47 /SUBTRACT THE BEGINNING OF THE XFCON TABLE
+ SPA CLA /DO WE HAVE AN FCON
+ JMP XFCON /YES PROCESS IT
+ TAD LCH
+ TAD C2 /ADD TWO TO THE SYMBOL TABLE POINTER
+ DCA LP2 /AND SAVE IT
+ TAD I LP2 /GET THE CONTROL BITS FOR THE SYMBOL
+ RAR /GET EXTERNAL SUBROUTINE BIT IN LINK
+ SZL CLA /IS THIS AN EXTERNAL SUBROUTINE
+ JMP SKPIT /YES...DONT PUT OUT THE BACK SLASH
+ TAD C34
+ JMS I PRINT
+SKPIT, TAD I LCH
+ JMS LP2 /PRINT THEM
+ ISZ LCH
+ TAD I LCH
+ JMS LP2 /AND PRINT THEM
+ ISZ LCH
+ TAD I LCH
+ AND X7700 /MASK SO WE DONT PUT OUT CONTROL BITS
+ JMS LP2 /AND PRINT IT
+ JMP I LPRSYM /NOW RETURN
+LP2, 0 /THIS IS THE ROUTINE THAT PRINTS TWO CHARACTERS
+ DCA UNCH /SAVE THE CHARS
+ TAD UNCH /GET THEM AGAIN
+ RTR /ROTAT FIRST CHAR INTO POSITION
+ RTR
+ RTR
+ AND C77 /MASK SECOND CHARACTER
+ SZA /IS IT AN ACTUAL CHARACTER
+ JMS I PRINT /YES PRINT IT
+ TAD UNCH /GET THE TWO CHARS AGAIN
+ AND C77 /MASK OUT FIRST CHARACTER
+ SZA /IS IT ACTUALLY A CHARACTER
+ JMS I PRINT /YES PRINT IT
+ JMP I LP2 /AND RETURN
+ICON, CLA /INTEGER CONSTANT, PUNCH A '('
+ TAD K50
+ JMS I PRINT
+ TAD LCH /AND THE NUMBER
+PROCT, JMS I PROTAC
+ JMP I LPRSYM /RETURN
+TEMPO, RTL
+ SPA CLA /SUBSCRIPT TEMPORARY?
+ JMP SBSCR
+ RTL
+ TAD D33 /PUNCH '[' FOR INTEGER AND ']' FOR FLOATING PT
+ JMS I PRINT /AND PRINT IT
+ TAD LCH
+ SPA /DO WE STILL HAVE A TEMPORARY
+ JMS I TEMPOR /YES GET THE TEMPORARY NUMBER
+ JMS I PRINT /AND PRINT IT
+ JMP I LPRSYM /RETURN
+SBSCR, TAD D33 /SUBSCRIPT TEMPORARY, PUNCH A '['
+ JMS I PRINT
+ TAD LCH
+ JMS I SUBTEM /AND 4 DIGITS
+ JMP PROCT
+XFCON, TAD C35 /FLOATING POINT CONSTANT...
+ JMS I PRINT /PUNCH A ']'
+ TAD LCH
+ CIA
+ TAD L50 /SUBTRACT FROM END OF TABLE
+ JMP PROCT
+D33, 33
+C35, 35
+K50, 50
+C34, 34
+X7700, 7700
+LCH, 0
+UNCH, 0
+SUBTEM, LSBTEM
+TEMPOR, LTMPOR
+\f *2400
+/
+/ SUBROUNTINE TO DO SYMBOL TABLE MANIPULATIONS
+/
+C300, 300
+C212, 212
+C215, 215
+SCOUNT, 0 /CURRENT NUMBER OF SYMBOLS
+XCTR, 0 /COUNTER
+FCOUNT, 0 /CURRENT NUMBER OF FCONS
+LSYMTB, 0
+ CLA /CLEAR THE AC
+LOOP1, TAD L56 /GET BEGINNING OF SYMBOL TABLE
+ DCA LSYMTM /AND SAVE IN TABLE
+ TAD SCOUNT /GET NUMBER OF SYMBOLS CURRENTLY
+ CMA
+ DCA XCTR /USE AS A COUNTER
+ TAD C7700 /GIVE SEARCH A MASK TO USE ON LAST SYMBOL
+ JMS SEARCH /LOOK FOR OCCURRENCE OF SYMBOL IN TABLE
+ JMP ZCHECK /SYMBOL IS IN TABLE CHECK IT
+ TAD L57 /TELL ENTER WHERE TO PUT THE SYMBOL
+ JMS ENTER /ENTER THE SYMBOL
+ TAD C3 /UPDATE THE POINTER
+ DCA L57 /AND SAVE IT
+ DCA L21 /ZERO SWITCH SINCE SYMBOL JUST LOADED
+ ISZ SCOUNT /UPDATE COUNT OF SYMBOLS
+ JMP LOOP1 /GO BACK AND CHECK IT
+ZCHECK, TAD L77 /GET POINTER INTO SYMBOL TABLE
+ TAD C2 /MOVE TO LAST WORD
+ DCA LSYMTM /SAVE IT
+ TAD I LSYMTM /GET THE CONTROL BITS
+ AND L21 /AND THE MASK
+ SZA CLA /ARE ANY ILLEGAL BITS ON
+ERR54, JMS I LUNCH /ERROR 54 ... PROBABLY IN EQUIVALENCING ...
+ TAD L32 /NOW OR IN NEW BITS
+ CMA
+ AND I LSYMTM
+ TAD L32
+ DCA I LSYMTM
+ JMP I LSYMTB /RETURN
+/ FLOATING CONSTANT IS IN 30 THRU 32
+LFCON, 0
+ CLA
+MLOOP, TAD L47 /GET BEGINNING OF FCON TABLE
+ TAD C3 /MOVE TO ACTUAL START OF TABLE
+ DCA LSYMTM /AND SAVE
+ TAD FCOUNT /GET NUMBER OF FCONS SO FAR
+ CMA
+ DCA XCTR /AND USE FOR A COUNTER
+ CMA /GIVE SEARCH A MASK FOR THE LAST WORD
+ JMS SEARCH /SEARCH THE TABLE FOR THE CURRENT FCON
+ JMP I LFCON /ITS ALREADY IN THERE JUST RETURN
+ TAD L47 /TELL ENTER WHERE TO PUT THE FCON
+ JMS ENTER /ENTER THE FCON
+ TAD CM3 /AND UPDATE IT
+ DCA L47 /AND SAVE
+ ISZ FCOUNT /UPDATE NUMBER OF FCONS
+ JMP MLOOP /GO BACK AND CHECK
+/ THIS IS THE ROUTINE THAT SEARCHES THE TABLES FOR
+/ OCCURRENCES OF THE CURRENT SYMBOL OR FCON
+SEARCH, 0
+ DCA ENTER /SAVE THE MASK
+MBACK, ISZ XCTR /SEE IF WE HAVE PROCESSED ALL SYMBOLS
+ SKP /NO GO ON
+ JMP QRET /YES
+ TAD I LSYMTM /GET FIRST WORD OF SYMBOL
+ CIA /NEGATE
+ TAD L30 /SUBTRACT FIRST WORD OF CURRENT SYMBOL
+ ISZ LSYMTM /INCREMENT POINTER
+ SZA CLA /DO THEY MATCH
+ JMP I1 /NO GO TO NEXT SYMBOL
+ TAD I LSYMTM /YES GET SECOND WORD OF SYMBOL
+ CIA
+ TAD L31 /SUBTRACT SECOND WORD OF CURRENT SYMBOL
+ ISZ LSYMTM /ADVANCE POINTER
+ SZA CLA /DO THEY MATCH
+ JMP I2 /NO GO TO NEXT SYMBOL
+ TAD I LSYMTM /SEE IF NEXT WORD MATCHES
+ AND ENTER /MASK OUT DESIRED PORTIONS
+ CIA
+ TAD L32 /SUBTRACT THIRD CURRENT WORD
+ AND ENTER /K AGAIN
+ ISZ LSYMTM /ADVANCE POINTER
+ SZA CLA /DO THEY MATCH
+ JMP MBACK /NO GO TO NEXT SYMBOL
+ TAD LSYMTM /YES
+ TAD CM3 /MOVE BACK POINTYER
+ DCA L77 /PUT POINTER IN PAGE ZERO
+ JMP I SEARCH /RETURN
+QRET, ISZ SEARCH /SET UP RETURN FOR NOT FOUND
+ JMP I SEARCH /RETURN
+I1, ISZ LSYMTM /ADVANCE POINTER
+I2, ISZ LSYMTM /ADVANCE PIINTER
+ JMP MBACK /GO TO NEXT SYMBOL
+/ THIS ROUTINE ENTERS THE CURRENT SYMBOL INTO THE TABLE SPECIFIED
+ENTER, 0
+ DCA LSYMTM /SAVE ADDRESS
+ TAD L47 /GET BEGINNING OF FCON TABLE
+ CMA
+ TAD L57 /SUBTRACT END OF SYMBOL TABLE
+C7700, SMA CLA /IS THERE ROOM FOR ANOTHER SYMBOL OR FCON
+ERR17, JMS I LUNCH /NO
+ TAD L30 /YES GEYT FIRST WORD
+ DCA I LSYMTM /STORE IT
+ TAD LSYMTM
+ DCA L11 /SET UP AUTO - XR
+ TAD L31
+ DCA I L11
+ TAD L32
+ DCA I L11
+ TAD LSYMTM /GET THE ADDRESS BACK INTO THE AC
+ JMP I ENTER /AND RETURN
+DUMPLN, DMPLIN
+LSYMTM=.
+LPRINT, 0 / CONVERTS FROM TRIMMED TO EIGHT BIT ASCII
+ DCA LFCON /SAVE THE CHARACTER
+ TAD L75 /S GET THE SUPPRESS PRINTING WITCH
+ SZA CLA
+ JMP I LPRINT
+ ISZ L24 /IS THIS A NEW LINE?
+ SKP /NO
+ JMS I DUMPLN /YES - DUMP THE OLD ONE FIRST
+ TAD LFCON /NO...GET THE CHARACTER
+ SNA /IS IT A CR
+ JMP CRLF /YES...PUT OUT CRLF
+ AND C40 /CHECK BIT SIX
+ CLL RAL
+ CIA /AC CONTAINS 0 OR -100
+ TAD C300 /NOW CONTAINS 300 OR 200
+ TAD LFCON /NOW ADD THE CHARACTER IN
+\fPRIT, DCA I L24 /AND STORE IT IN THE BUFFER
+ JMP I LPRINT
+CRLF, TAD C215 /GET AN EIGHT BIT CR
+ DCA I L24 /STORE IT IN THE BUFFER
+ ISZ L24
+ TAD C212
+ DCA I L24 /STORE A LINE FEED TOO
+ CLA CMA
+ DCA L24 /SET SWITCH TO DUMP LINE ON NEXT CHAR
+ JMP I .+1
+ PRIT+1
+\fLCOMON, CLA
+ JMS I LOOK /CHECK REST OF STATEMENT NAME
+ -2 /TWO CHARACTERS
+ -17 /O
+ -16 /N
+GETVAR, JMS I ENTITY /GET A VARIABLE
+ SKP /NOT A VARIZBLE
+ JMP VARI /WE GOT A VARIABLE
+ NOP
+B20, 20
+ERR18, JMS I LUNCH /ERROR
+VARI, TAD C40
+ TAD L32 /PUT IN COMMON BIT
+ DCA L32
+ TAD K37 /GET MASK FOR SYMBOL TABLE SWITCH
+ DCA L21 /PUT IN THE SWITCH
+ JMS I SYMTAB /PUT SYMBOL IN TABLE
+ JMS I ENTITY /LOOK FOR A COMMA
+ JMP START /THAT'S ALL GOT A CR-LF...
+K37, 37
+K27, 27
+ JMP .+3 /ERROR
+ TAD CM54 /CHECK FOR COMMA
+ SZA CLA /IS IT A COMMA
+ JMP ERR18 /NO...ERROR
+ JMP GETVAR /GET ANOTHER VARIABLE
+LDIMEN, JMS I LOOK /LOOK FOR REST OF STATEMENT
+ -5 /FIVE CHARS
+ -16 /N
+ -23 /S
+ -11 /I
+ -17 /O
+ -16 /N
+QAGAIN, CLA CMA /-U
+ DCA REDY /SET SWITH FOR VARIABLE
+QGET, JMS I ENTITY /GET WHATEVER IS NEXT IN LINE
+ JMP QDONE /IT EAS A CR
+ JMP .+4 /IT WAS A VARIABLE
+ JMP ASUBSC /IT WAS ONE OF THE SUBSCRIPTS
+ JMP ERR18 /WE BETTER NOT GET ANY FP NUMBERS
+ JMP QPUNC /IT WAS A PUNCTION
+ ISZ REDY
+ JMP ERR18 /WE WERENT READY FOR A VAR
+ TAD B20
+ TAD L32
+ DCA L32
+ TAD K27 /GET THE MASK FOR THE SYMBOL TABLE
+ DCA L21 /PUT IN THE SWITCH
+ JMS I SYMTAB /PUT SYMBOL IN TABLE
+ CMA CLA
+ TAD L47 /GET BEGINNING OF TABLE
+ DCA L16
+ TAD L77 /GET TABLE ADDRESS
+ DCA I L16
+ CLA CMA
+ DCA V /SET WITCH TO SAY WEVE GOTTEN A VAR
+ JMP QGET /GET NEXT THING
+QPUNC, TAD CM54
+ SNA /IS IT A COMMA
+ JMP COMMA /YES
+ TAD C3
+ SNA
+ JMP QRPAR /RIGHT PAREN
+ IAC
+ SNA /IS IT A LEFT PAREN
+ ISZ V /PRECEDED BY A VAR
+ JMP ERR18 /NO - ERROR
+ CLA CMA
+ DCA XLP /SET SWITCH TO SHOW LPAR
+ JMP QGET
+ASUBSC, ISZ XLP /DID WE JUST GET LPAR
+ JMP SECOND /NO...BETTER BE SECOND SUBSC
+ TAD L32 /GET INTEGER
+ DCA I L16 /PUT IN DIMTAB
+ CMA CLA
+ DCA QONE /SET SWITCH TO SHOW WE HAVE ONE SUBSC
+ JMP QGET
+COMMA, ISZ QONE /DOES THIS COMMA SEPARATE SUBSCS
+ JMP RIGHT /NO...LAST CHAR BETTER HAVE BEEN L RPAR
+ CMA CLA
+ DCA SEC /SET SWITCH TO EXPECT SECOND SUBSCRIPT
+ JMP QGET
+SECOND, ISZ SEC /IS THIS SECOND SUBSCRIPT
+ JMP ERR18 /NO...ERROR
+ TAD 32 /GET INTEGER
+ DCA I L16
+ CMA CLA
+ DCA R /SET SWITCH FOR RPAR
+ JMP QGET
+QRPAR, ISZ QONE /HAVE WE GOTTEN ONE SUBSC
+ JMP QTWO /NO...CHECK FOR TWO
+ IAC /ONLY ONE SO USE 1 AS SECOND
+ DCA I L16
+QBACK, CMA CLA
+ DCA RIG
+ TAD L47 /GET BEGINNING OF TABLE
+ DCA L50 /SAVE IN LOW CORE
+ TAD L47
+ TAD CM3 /SUBTRACT THREE FROM ADDRESS
+ DCA L47 /AND SAVE
+ JMP QGET /WE EXPECT COMMA OR CR
+QTWO, ISZ R /HAVE WE GOTTEN TWO
+ JMP ERR18 /NO...ERROR
+ JMP QBACK
+RIGHT, ISZ RIG /DID WE JUST GET RPAR
+ JMP ERR18 /NO...ERROR
+ JMP QAGAIN
+QDONE, ISZ RIG
+ JMP ERR18
+ JMP START
+QONE, 0
+RIG, 0
+R, 0
+REDY, 0
+V, 0
+XLP, 0
+SEC, 0
+\f *3000
+LGOTO, TAD L74
+ DCA L16 /USE AUTO INDEXING
+ DCA L76
+ JMS I ENTITY
+ NOP
+ SKP
+ JMP ALAB /WE HAVE A LABEL
+ JMP I ASSIGN
+ TAD CM50 /IF PUNCT...CHECK FOR LEFT PAREN
+ SZA CLA /IS IT (
+ JMP I ASSIGN
+ANEXT, JMS I ENTITY
+ NOP
+ SKP
+ JMP THERE /WE HAVE A LABEL
+ NOP
+ERR28, JMS I LUNCH
+THERE, TAD L32 /GET THE LABEL
+ DCA I L16 /PUT IN LIST
+ ISZ L76
+ JMS I GNB
+ TAD CM54 /CHECK FOR BEING A COMMA
+ SNA /IS IT A COMMA
+ JMP ANEXT /YES GET ANOTHER LABEL
+ TAD C3 /CHECK FOR BEING A RIGHT PAREN
+ SZA CLA /IS IT A )
+ JMP I ASSIGN
+ JMS I GNB
+ TAD CM54 /CHECK FOR ANOTHER COMMA
+ SZA /IS IT ANOTHER
+ JMS I PUTCH /IGNORE ANYTHING ELSE ...
+ JMS I ENTITY /GET THE CONTROL VARIABLE
+ SKP
+ JMP .+4 /WE GOT IT
+ NOP
+ NOP
+ERR29, JMS I LUNCH
+ DCA L21 /ZERO THE SYMBOL TABLE SWITCH
+ JMS I SYMTAB /PUT VARIABLE IN SYMBOL TABLE
+ TAD L77 /GET ADD RESS OF SYMBOL
+ JMS I MODE /CHECK THE MODE OF THE VAIABLE
+ERR30, JMS I LUNCH /ITS FLOATING POINT
+ JMS I ZZZ /PUT OUT STMT LABEL
+ JMS LXTAD /LOAD VARIABLE WITH TAD OR TAD*
+ JMS I PROP /PUT OUT OP CODE
+Q6066, 6066 /OP CODE IS TAD
+ JMS I CREATE /GET THE NEXT CREATED LABEL
+ JMS I PRCRL /PRINT THE CREATED LABEL
+ JMS I PRINT /PUT OUT CR LF
+ JMS I PROP /PUT OUT OP CODE
+ 6071 /OP CODE IS DCA
+ TAD GO7
+ JMS I PROTAC
+ JMS I PRINT /PUT OUT CRLF
+ JMS I PROP /PUNCH 'TAD I 7'
+ OPTADI
+ TAD GO7
+ JMS I PROTAC
+ JMS I PRINT
+ JMS I PROP /PUNCH 'DCA 7'
+ OPDCA
+ TAD GO7
+ JMS I PROTAC
+ JMS I PRINT
+ JMS I PROP /PUNCH 'JMP I 7'
+ OPJMPI
+ TAD GO7
+ JMS I PROTAC
+ JMS I PRINT
+ TAD L76 /PUNCH 'CPAGE <N+1>'
+ IAC
+ JMS I PIFF
+ TAD L53 /PUNCH '<CR.LABEL2>, <CR.LABEL2>'
+ JMS I CLAB
+ TAD L53
+ JMS I PRCRL
+ JMS I PRINT
+ TAD L76 /NOW PUNCH THE LABELS
+ CIA /SET NEGATIVE
+ DCA L76
+ TAD L74
+ DCA L16 /USE AUTO INDEXING AGAIN
+ TAD I L16 /GET THE NEXT LABEL
+ JMS I PLAB /PRINT THE LABEL
+ JMS I PRINT /PUT OUT CRLF
+ ISZ L76
+ JMP .-4 /NO
+ JMP START
+/ THE FOLLOWING SECTION IS TO TREAT REGULAR GOTO S
+ALAB, JMS I ZZZ
+ TAD L32
+ JMS PRJUMP /PUT OUT A JUMP TO THE LABEL IN "L32"
+ JMP START
+
+LXTAD, 0
+ TAD L77 /GET ADDRESS AGAIN
+ JMS I DUMARG
+ TAD CM3
+ TAD Q6066 /TAD OR TAD*
+ DCA OP /USE AS OPERATOR
+ JMS I PROP /PUT OUT OP CODE
+OP, 0
+ TAD L77 /GET ADDRESS AGAIN
+ JMS I PRSYM /PRINT THE SYMBOL
+ JMS I PRINT /PUT OUT A CR LF
+ JMP I LXTAD
+
+LLEAD, 0 /PUNCH SOME LEADER...
+ DCA L7
+ JMS I PUNCH
+ ISZ L7
+ JMP .-2
+ JMP I LLEAD
+GO7, 7
+
+PRJUMP, 0 /SUBROUTINE TO PUT OUT A JUMP
+ DCA LLEAD /STORE THE LABEL
+ JMS I PROP
+ 6044 /JMP
+ TAD LLEAD
+ JMS I PLAB /PUT OUT THE LABEL
+ JMS I PRINT /PUT OUT A CRLF
+ TAD LLEAD
+ DCA L12 /SET CONTENTS OF LAST LINE TO LABEL
+ JMP I PRJUMP
+\f *3200
+/ THE FOLLOWING ROUTINE PUNCHES OCTAL NUMBERS
+
+LPRTAC, 0
+ DCA TMP /SAVE THE NUMBER
+ DCA TM
+ TAD CM4 /PUT OUT FOUR CHARACTERS
+ DCA DCTR /CHARACTER COUNTER
+BK, TAD TMP /GET THE NUMBER
+ RAL /ROTATE IT LEFT ONE
+ RTL /ROTATE TWO LEFT...THAT MAKES ONE OCTAL DIGIT
+ DCA TMP /SAVE THE ROTATED NUMBER
+ TAD TMP /GET IT IN ACCUMULATOR
+ AND C3
+ RAL /GET THE DIGIT INTO THE LOW-ORDER AC
+ ISZ DCTR /IS THIS THE LAST DIGIT?
+ JMP .+4 /NO, CONTINUE
+ TAD C60 /MAKE IT LOOK LIKE A TRIMMED ASCII DIGIT
+ JMS I PRINT /PRINT THE DIGIT
+ JMP I LPRTAC
+ SZA /DO WE HAVE A ZERO DIGIT?
+ JMP .+4
+ TAD TM
+ SNA CLA /YES, IS IT A LEADING ZERO?
+ JMP BK /YES, IGNORE IT
+ TAD C60
+ JMS I PRINT
+ ISZ TM /DON'T SUPPRESS ZEROS ANY MORE
+ JMP BK /NOW...PUT OUT ANOTHER
+TMP, 0
+TM, 0
+CM4, -4
+C60, 60
+LIF, TAD CM4
+ DCA COUNT1 /SET UP COUNTER
+ JMS I GNB
+ TAD CM50 /CHECK FOR LEFT PAREN
+ SZA CLA /IS IT A (
+ JMP I ASSIGN
+ JMS I PUTCH /YES...PUT IT BACK FOR GENER
+ JMS I ZZZ
+ ISZ L52 /SET BALANCED PARENS SWITCH FOR GENER
+ ISZ L44 /SET SWITCH FOR RIGHT SIDE OF EQUALS SIGN
+ JMS I GENER /NOW CALL GENER AND PROCESS EXPRESSION
+ TAD I L41
+ JMS I MODE /WHAT IS ITS MODE
+ JMS I GETHI /GET HI ORDER P.P. AC
+ TAD CDCA41
+ DCA LIFDCA /SET UP INSTRUCTION TO STORE LABELS
+LABL, JMS I ENTITY /GET A LABEL
+D34, 34
+ SKP
+ JMP INTEG /WE GO A LABEL
+C46, 46
+ERR31, JMS I LUNCH /DIDNT GET A LABEL
+INTEG, TAD L32 /GET THE LABEL
+ ISZ LIFDCA
+LIFDCA, .-. /STORE LABELS IN L42 THROUGH L44
+ DCTR=LIFDCA
+ ISZ COUNT1 /HAVE WE GOTTEN TOO MANY LABELS
+ SKP /NO
+ JMP ERR31 /YES
+ JMS I GNB
+ SNA /SEE IF ITS A CR
+ JMP .+5 /ITS A CR
+ TAD CM54 /CHECK FOR COMMA
+ SZA CLA /IS IT A COMMA
+ JMP ERR31
+ JMP LABL /YES
+ ISZ COUNT1 /DID WE GET THE RIGHT NUMBER OF LABELS
+ JMP ERR31 /NO
+ TAD L42
+ CIA
+ TAD L44
+ SNA CLA /IF THE JUMPS FOR AC<0 AND AC>0 ARE EQUAL
+ JMP ISPECL /WE CAN SAVE SOME CODE
+ TAD L43
+ CIA
+ TAD L44
+ SNA CLA /IF THE JUMPS FOR AC=0 AND AC>0 ARE EQUAL
+ JMP SPCONL /WE CAN ALSO SAVE SOME CODE
+ JMS I PROP /PUT OUT OP CODE
+ 6105 /OP CODE IS SNA
+ JMS I PRINT /PUT OUT CRLF
+ TAD L43
+ JMS I PRJMP /OUTPUT THE ZERO BRANCH
+SPCONL, JMS I PROP /PUT OUT OP CODE
+ 6110 /OP CODE IS P SPA CLA
+ JMS I PRINT /PUT OUT CRLF
+ TAD L42 /OUTPUT THE NEGATIVE BRANCH
+IFCOMN, JMS I PRJMP
+ TAD L44
+ JMS I PRJMP /OUTPUT THE POSITIVE (>0) BRANCH
+ DCA L46 /ZERO AC
+ JMP START /GO GET NEXT STATEMENT
+ISPECL, JMS I PROP /PUNCH 'SNA CLA'
+ OPSNA
+ JMS I PROP
+ OPCLA
+ JMS I PRINT
+ TAD L43
+ JMP IFCOMN /OUTPUT THE ZERO AND POSITIVE BRANCHES
+PRJMP, PRJUMP
+COUNT1, 0
+LCREAT, 0
+ ISZ L53 /INCREMENT BY ONE...
+ TAD L53
+ AND C77
+ TAD CM33
+ SMA CLA /HAVE WE BEEN HERE 26 TIMES?
+ TAD C46 /YES, BUMP THE HIGH ORDER DIGIT
+ TAD L53
+ DCA L53 /AND SAVE
+ TAD L53 /NOW RETURN IT IN AC
+ JMP I LCREAT /RETURN
+LPLAB, 0 /THIS PRINTS REGULAR LABELS
+ DCA TMP /FIRST SAVE LABEL
+ TAD D34 /NOW PUNCH A '\'
+ JMS I PRINT
+ TAD TMP /GET LABEL
+ JMS I DECOUT /AND PRINT IT
+ JMP I LPLAB /RETURN
+GETHI, LGETHI
+CDCA41, DCA L41
+CM33, -33
+DECOUT, LDCOUT
+
+/TELETYPE OUTPUT ROUTINE FOR ERROR MESSAGES
+LTTYPE, 0
+ TSF
+ JMP .-1
+ TLS
+ CLA
+ JMP I LTTYPE
+
+\f *3400
+DORET, JMP I XDO
+ISZDO, JMS I PROP
+ 6170 /ISZ
+ TAD L30
+ JMS I PRSYM
+ JMS I PRINT
+ JMP DOSUBT /GO GENERATE THE LIMIT TEST
+NUMB, 0
+SWIT, 0
+DM5, -5
+CM24, -24
+C5001, 5001
+LEQI, EQI
+
+LDO, JMS I ZZZ
+ JMS I ENTITY /LOOK FOR THE SCOPE LABEL
+C55, 55
+ SKP
+ JMP SLAB /WE GOT THE SCOPE LABEL
+E53, 53
+ JMP I ASSIGN
+SLAB, TAD L32 /GET THE INTEGER
+ JMS XDO /PUT OUT DO-LOOP CODE
+ JMP START /NORMAL EXIT
+ JMP ERR35 /IMPLIED DO EXIT - ERROR
+
+XDO, 0 /DO LOOP SUBROUTINE - ENTERED WITH
+ /TARGET LABEL IN AC
+ DCA I L15 /PUT IN DO END PUSH DOWN LIST
+ TAD L74
+ DCA L16 /SET UP LIST OF DO ENDS
+ DCA L21 /ZERO THE SYMBOL TABLE SWITCH
+ CMA CLA
+ DCA SWIT /SET SWITCH FOR CONTROL VARIABLE
+ TAD DM5
+ DCA NUMB /SET COUNTER OF NUMBER OF PARAMETERS
+GETMOR, JMS I ENTITY /LOOK FOR A PARAMETER
+ JMP .+3 /ERR
+ JMP CVAR /GOT A VARIABLE
+ JMP DPAR /GOT AN INTEGER
+C21, 21
+ JMP ERR35
+CVAR, JMS I SYMTAB /PUT SYMBOL IN TABLE
+ TAD L77 /GET ADDRESS
+ JMS I MODE /DETERMINE MODE OF SYMBOL
+ JMP ERR35
+ TAD L77 /GET ADDRESS AGAIN
+DOSTOR, DCA I L16 /SAVE
+ ISZ NUMB /HAVE WE GOTTEN TOO MANY PARAMS
+ SKP /NO
+ERR35, JMS I LUNCH /YES, DO ERROR ...
+ JMS I GNB
+ SNA /IS IT CR
+ JMP ALLDNE+1 /YES WERE DONE
+ TAD CM51
+ SNA /IS IT A RIGHT PAREN?
+ JMP ALLDNE /YES-FINISH UP AND TAKE IMPLIED DO EXIT
+ TAD CM24
+ SZA /IS IT =
+ JMP MCOM /NO
+ ISZ SWIT /IS SWITCH SET FOR IT
+ JMP ERR35 /NO
+ JMP GETMOR /YESS...GO BACK FOR ANOTHER PARAMETER
+MCOM, TAD C21 /CHECK FOR COMMA
+ ISZ SWIT /IF NO EQUAL SIGN YET
+ SZA /OR IF THIS ISN'T A COMMA
+ JMP ERR35 /THEN ITS AN ERROR
+ JMP GETMOR /GET ANOTHER
+DPAR, TAD L32 /GET THE INTEGER
+ ISZ SWIT /HAVE WE SEEN AN EQUAL SIGN?
+ JMP DOSTOR /YES - SAVE THE INTEGER AND PROCEED
+ JMP ERR35 /NO
+ALLDNE, ISZ XDO /BUMP RETURN POINTER IF TERMINATOR WAS RPAR
+ CLA IAC
+ DCA I L16 /STORE A ONE IN THE FOURTH (OR FIFTH) ARGUMENT
+ TAD C2
+ TAD NUMB
+ SPA CLA /DID WE GET AT LEAST THREE ARGS?
+ JMP ERR35 /NO
+ ISZ L44
+ TAD L74 /GET ERASABLE LOCATIONS
+ DCA L16 /USE THE AUTO INDEX REGISTERS
+ TAD I L16 /GET CONTROL VARIABLE
+ DCA L30 /AND PUT IN THIRTY
+ TAD I L16 /GET INITIAL VALUE
+ DCA L31 /AND SAVE IT
+ TAD I L16 /GET FINAL VALUE
+ DCA L32 /AND SAVE IT
+ TAD I L16 /GET INCREMENT
+ DCA L33 /AND SAVE IT
+ TAD L74 /GET ADDR OF ERASABLE AGAIN
+ IAC /INCREMENT ONCE
+ DCA L41 /TELL TRIPL WHERE TO FIND THE DUMMY TRIPLES
+ TAD L74 /GET IT AGAIN
+ DCA L16 /USE AUTO INDEX TO STORE TRIPLE
+ DCA L46 /ZERO THE AC
+ TAD C5001 /SET UP INITIAL TRIPLE NUMBER
+ DCA L40
+ TAD L33
+ CIA
+ TAD L31
+ SNA CLA /IF INITIAL VALUE = STEP SIZE
+ JMP STCTLV /NO NEED TO COMPUTE THE DIFFERENCE
+ TAD L33 /GET STEP SIZE
+ DCA I L16 /PUT IN TRIPLE
+ TAD C55 /PUT IN A MINUS SIGN
+ DCA I L16
+ TAD L31 /GET INITIAL VALUE
+ DCA I L16
+ JMS I TRIPL /PROCESS THE TRIPLE
+STCTLV, JMS I LEQI /STORE ANSWER IN CONTROL VARIABLE
+ JMS I CLAB /PUT A CDREATED LABVEL ON THE NEXT STATEMENT
+ TAD L53 /GET THE CREATED LABEL
+ DCA I L15 /AND PUT IN DO END LIST
+ TAD L74
+ DCA L16
+ TAD L33 /GET STEP SIZE
+ CLL RAR
+ SNA /IF STEP SIZE=1 THEN
+ JMP ISZDO /WE CAN USE AN ISZ TO INCREMENT
+ RAL
+ DCA I L16
+ TAD E53 /WERE GOING TO ADD
+ DCA I L16
+/ L30 IS IN THE THIRD POSITION SINCE WE CALLED "EQI"
+ JMS I TRIPL /ADD STEP SIZE TO CONTROL VARIABLE
+ JMS I LEQI /STORE ANSWER IN CONTROL VARIABLE
+DOSUBT, TAD L74
+ DCA L16
+ TAD L30 /GET THE CONTROL VARIABLE
+ DCA I L16
+ TAD C55 /WERE GOING TO SUBTRACT
+ DCA I L16
+ TAD L32 /GET FINAL VALUE
+ DCA I L16
+ JMS I TRIPL /SUBTRACT CONTROL VARIABLE FROM FINAL VALUE
+\f DCA L46 /CLEAR THE AC FLAG
+ JMS I PROP
+ 6110 /SPA CLA
+ JMS I PRINT
+ JMS I PROP
+ 6044 /PUT OUT A JMP
+ JMS I CREATE /TO A CREATED LABEL
+ DCA I L15 /PUT CREATED LABEL IN DO END LIST
+ TAD L53 /GET LABEL
+ JMS I PRCRL /AND PRINT IT
+ JMS I PRINT /CRLF
+ ISZ L55 /INCREMENT UNENDED DO COUNTER
+ SKP
+ERR38, JMS I LUNCH /TOOO MANY UNENDED DOS
+ JMP I .+1
+ DORET /RETURN FROM SUBROUTINE "XDO"
+
+EQI, 0
+ TAD L74
+ DCA L16
+ TAD L46 /GET RESULT OF PREVIOUS COMPUTATION
+ DCA I L16
+ TAD E75 /GET EQUALS SIGN
+ DCA I L16
+ TAD L30 /GET CONTROL VARAIBLE
+ DCA I L16
+ JMS I TRIPL /PROCESS
+ DCA L46 /WIPE AC SWITCH
+ JMP I EQI /RETURN
+LFUNCT, 0
+ DCA ARGCNT
+ TAD L46 /GET AC
+ SZA CLA /IS IT ZERO
+ JMS I STORE /NO...STORE THE AC
+ TAD L53 /GET CURRENT CREATED LABEL
+ DCA L73 /AND SAVE
+ CLA CMA /AC IS MINUS ONE
+ TAD L41 /PUSH LIST POINTER
+ DCA L42 /PUSH LIST POINTER MINUS ONE
+CKFNCT, ISZ L42 /INCREMENT POINTER
+ ISZ L42 /AGAIN
+ TAD I L42 /GET THE OPERATOR
+ TAD CM4047 /SUBTRACT THE FUNCTION OPERATOR
+ SZA /IS THIS THE FUNCTION OPERATOR
+ JMP CKSBSC /NO
+ CLA IAC /YES...THE FUNCTION NAME IS IN THE NEXT LOCATIO
+ TAD L42 /THIS POINTS TO IT
+ DCA SAVE /AND SAVE
+ TAD I SAVE
+ TAD C2
+ DCA EQI
+ TAD I EQI
+ AND CM2
+ IAC
+ DCA I EQI
+MOR, CLA CMA /NOW EXAM THE ARGUMENTS
+ TAD L42 /WERE POINTING TO THE FIRST ARGUMENT
+ DCA L42 /SAVE THE POINTER
+ ISZ ARGCNT
+ JMS I LCHNG /CHECK L42 FOR ZERO OR DUMMY ARG
+ DCA I L42 /REPLACE IT BY UPDATED VALUE
+ TAD L42 /IT WASNT...SEE IF IT WAS THE LAST ARGUMENT
+ CIA
+ TAD L41 /SUBTRACT THE END OF ARGUMENT LIST
+ SNA CLA /IS IT ZERO
+ JMP OUT /YES...WE'VE COMPLETED THIS PHASE
+ CLA CMA /NO...MOVE THE POINTER BACK ONE
+ TAD L42
+ DCA L42 /AND SAVE
+ JMP MOR /NOW CHECK THE NEXT ARGUMENT
+OUT, TAD SAVE /GET THE POINTER TO THE FUMCTION NAME AGAIN
+ DCA L42 /AND PUT IN 42
+ TAD I L42 /GET THE ARGUMENT
+ DCA FUNOP /USE FPROP TO PUT OUT THE CALL TO THE FUNCTION
+ TAD ARGCNT /GIVE FPROP THE NUMBER OF ARGUMENTS
+ JMS I FPROP /PUT OUT THE CALL TO THE FUNCTION
+FUNOP, 0
+ TAD L73 /NOW RESTORE THE CREATED LABEL LOCATION
+ DCA L53
+MNEXT, TAD L42 /GET THE POINTER
+ TAD CM2 /MOVE POINTER TO ARGUMENT
+ DCA L42 /AND SAVE
+ TAD I L42 /GET NEXT ARGUMENT
+ JMS I PSYMOT /GENERATE AN "ARG" FOR THE ARGUMENT
+ TAD L42 /GET THE POINTER
+ CIA /SET IT NEGATIVE
+ TAD L41 /ADD
+ SZA CLA /ARE THEY EQUAL
+ JMP MNEXT /NO THERE ARE MORE ARGS
+ TAD I SAVE /YES...GET THE FUNCTION NAME
+ JMS I MODE /WHAT MODE IS IT
+ TAD E400 /ITS FLOATING POINT
+ TAD L40 /ITS INTEGER
+ DCA L46 /PUT THE TRIPLE NUMBER IN THE AC SWITCH
+ TAD SAVE /YES...CHANGE PUSH LIST POINTER
+ DCA L41 /STORE POINTER TO NAME IN PUSH LIST POINTER
+ TAD L46 /GET CURRENT TRIPLE NUMBER
+ DCA I L41 /AND PUT IT IN THE PUSH LIST
+ JMP I LFUNCT /RETURN
+CKSBSC, IAC
+ SZA CLA /IS IT THE SUBSCRIPT OPERATOR?
+ JMP I CKF /NO - KEEP LOOKING
+ JMP I .+1
+ ERR39
+PSYMOT, SYMOUT
+SAVE, 0
+ARGCNT, 0
+E75, 75
+CM4047, -4047
+E400, 400
+
+ TAD C47
+ JMS I PPACK
+LQUOTE, JMS I PGTC /GET A CHARACTER
+ SNA
+ERR37, JMS I LUNCH /CARRIAGE RETURN - ERROR
+ TAD CM47
+ SZA
+ JMP LQUOTE-2 /IF NOT A QUOTE, STORE IT
+ JMP I .+1
+ FRET
+C47, 47
+CM47, -47
+PGTC, LGTC
+PPACK, PACK
+CKF, CKFND
+\f *4000
+LCONT, JMS I LOOK /CHECK REST OF LINE
+ -4 /LOOK FOR FOUR CHARACTERS
+ -11 /I
+ -16 /N
+ -25 /U
+ -5 /E
+ JMS I ZZZ
+ JMS I PROP /PUNCH 'NOP'
+ 6047
+ JMS I PRINT /PUT OUT A CRLF
+ JMP START /GO GET NEXT STATEMENT
+
+LPAUSE, JMS I LOOK /CHECK REST OF STATEMENT TYPE
+ -1 /JUST ONE CHARACTER
+ -5 /E
+ CLA CMA
+LSTOP, DCA SW /SET SWITCH FOR STOP OR PAUSE
+ DCA L32
+ JMS I ENTITY /LOOK FOR THE OPTIONAL INTEGER
+ JMP MCR /WE GOT A CR
+ SKP /ERR
+ JMP .+3 /WE GOT AN INTEGER
+ NOP /ERR
+ JMP I ASSIGN
+
+MCR, JMS I ZZZ
+ ISZ SW /PAUSE OR STOP?
+ JMP STOP
+ JMS I FPROP /PUNCH 'CALL 0,CKIO'
+ 6116
+ JMS I PROP /PRINT OP CODE
+ 6066 /OPCODE IS TAD
+ TAD L32 /GET THE INTEGER
+ JMS I PRSYM /PRINT IT
+ JMS I PRINT /CR
+ JMS I PROP
+ 6121
+ JMS I PRINT
+ JMS I PROP
+ 6124
+ JMS I PRINT /PUT OUT CRLF
+ JMP START /GO GET NEXT STATEMENT
+
+STOP, JMS OSTOP
+ JMP START
+
+OSTOP, 0 /PUNCH 'CALL 0,CKIO'
+ JMS I FPROP
+ 6116
+ JMS I CLAB /PUNCH '<LAB>, HLT'
+ JMS I PROP
+ 6121
+ JMS I PRINT
+ JMS I PROP /PUNCH 'JMP <LAB>'
+ 6044
+ TAD L53
+ JMS I PRCRL
+ JMS I PRINT
+ JMP I OSTOP
+
+SW, 0
+LFRMAT, JMS I LOOK /CHECK REST OF STATEMENT TYPE
+ -2 /TWO CHARACTERS
+ -1 /A
+ -24 /T
+ ISZ OSTOP
+ TAD L74
+ DCA L10
+ DCA L76
+ JMS I PROP
+ 6044
+ JMS I CREATE
+ JMS I PRCRL
+ JMS I PRINT
+ JMS I GNB /READ UNTIL A PAREN IS GOTTEN
+ TAD CM50 /SUBTRACT A (
+ SZA CLA /IS IT A (
+ERR39, JMS I LUNCH /NO...ILLEGAL CHARACTER
+ TAD C50 /GET A LEFT PAREN
+ JMP PAREN /AND GO START COUNTING PARENS
+AGAIN, JMS I GTC
+ SNA /IS IT A CR
+ JMS I PUTCH
+PAREN, RTL CLL /SHIF CHAR LEFT
+ RTL
+ RTL
+ DCA L32 /SAVE THE CHAR
+ JMS I GTC
+ SNA /IS IT A CR
+ DCA OSTOP
+ TAD L32 /PACK THE TWO CHARS (SOME DONE AT FRMTCK)
+ JMP I FRMTCK /GO CHECK IF FORMAT STMT. TOO BIG
+FRMT, TAD OSTOP /GET BALANCED PAREN SWITCH
+ SZA CLA /ARE THEY BALANCED
+ JMP AGAIN /NO GET SOME MORE CHARS
+ TAD L76
+ JMS I PIFF
+ TAD L74
+ DCA L10
+ TAD L76
+ CIA
+ DCA L76
+ JMS I ZZZ
+ TAD I L10
+ JMS I PROTAC
+ JMS I PRINT
+ ISZ L76
+ JMP .-4
+ TAD L53 /PUNCH '<LABEL>,'
+ JMS I CLAB
+ JMS I PRINT
+ JMP START
+GTC, LGTC
+PXSUBR, XXSUBR
+C50, 50
+
+LPIFF, 0 /PUNCH 'IFF <N>'
+ DCA LZZZ /ENTER WITH N IN THE AC
+ JMS I PROP
+ 6102
+ TAD LZZZ
+ JMS I PROTAC
+ JMS I PRINT
+ JMP I LPIFF
+
+LZZZ, 0 /PUNCH THE CURRENT LABEL, IF ANY
+ TAD L54
+ SNA /IS THERE A LABEL?
+ JMP ZZZRET /NO
+ JMS I PLAB /PUNCH '<LABEL>, '
+ TAD C7240
+ JMS I P2
+ZZZRET, DCA I PXSUBR /MAKE SUBROUTINES AND FUNCTIONS ILLEGAL
+ JMP I LZZZ
+FRMTCK, CKFRMT
+\f *4200
+LTRIPL, 0
+ JMS I XZQL /FIRST CHECK IF A TRIPLE IS LEGAL HERE
+ TAD L41 /GET PUSH LIST POINTER
+ IAC /INCREMENT TO POINT TO OPERATOR
+ DCA L42 /OPERATOR POINTER
+ TAD L42 /GET IT AGAIN
+ IAC /INCREMENT IT
+ DCA L43 /OPERAND TWO POINTER
+ TAD I L42 /GET OPERATOR
+ AND C77 /MASK GARBAGE BITS
+ TAD CM41 /SUBTRACT AN ADD INDIRECT OPERATOR
+ SNA CLA /IS OPERATOR <DOLLAR>
+ JMP I LADDIN /YES PROCESS IT
+ TAD I L43 /NO...GET OPERAND TWO
+ JMS I DUMARG /SEE IF ITS A DUMMY ARGUMENT
+ SKP /YES IT IS
+ JMP CK2 /NO ..CHECK THE OTHER ARGUMENT
+ TAD I L42 /YES GET THE OPERATOR
+ AND C77 /MASK GARBAGE BITS
+ TAD EM75 /IS IT AN EQUALS SIGN
+ SNA /IS OP C
+ JMP LEQUIN /YES USE C*
+ IAC /SEE IF ITS ALREADY EQUALS INDIRECT
+ SZA CLA /IS OP C*
+ JMS I LDUMTW /YES TWO IS DUMMY ARG
+CK2, CLA
+ TAD I L41 /NO IS OPND ONE A SYMBOL
+ JMS I DUMARG /SEE IF ITS A DUMMY ARGUMENT
+ JMS I LDUMON /IT IS
+ CLA CLL /NOW LETS SEE WHAT THE OPERATOR IS
+ TAD I L42 /GET THE OPERATOR
+ AND C77 /MASK OUT GARBAGE BITS
+ TAD CM53
+ SNA /IS IT
+ JMP I LAADD /YES
+ IAC
+ SNA /IS IT *
+ JMP I LMUL /YES
+ TAD CM3
+ SNA /IS IT -
+ JMP I LASUB /YES
+ TAD CM2
+ SNA /IS IT /
+ JMP I LDIV /YES
+ TAD CM16
+ SNA /IS IT C
+ JMP I LEQU /YES
+ IAC
+ SNA /IS IT C*
+ JMP I LEIND /YES
+ TAD J27
+ SNA /IS IT **
+ JMP I LEXP /YES
+ TAD C2
+ SNA /IS IT A UNARY MINUS
+ JMP I LUMIN /YES
+ERR40, JMS I LUNCH /NO BETTER COP OUT
+LDMARG, 0
+ SMA /IS HIGH ORDER BIT ON
+ JMP INC /NO...ITS NEITHER A SYMBOL OR A TRIPLE NUMBER
+ RAL /GET NEXT BIT
+ SMA /IS IT ON
+ JMP MAYBE /NO...WE MIGHT HAVE A SUBSCRIPT THOUGH
+ RAR /YES...RESTOR THE PARAMETER
+ CIA /SET IT NEGATIVE
+ TAD L47 /SUBTRACT IT FROMTHE START OF THE FCON TABLE
+ SPA /IS THE RELULT POSITIVE
+ JMP INC /NO...ITS AN FCON NOT A SYMBOL
+ CIA /YESS...RESTORE ORIGINAL PARAMETER
+ TAD L47
+ TAD C2 /YES MOVE POINTER TO CONTROL BITS
+ DCA L23 /SAVE
+ TAD I L23 /GET THE CONTROL BITS
+ AND C10 /MASK ALL BUT DUMMY ARG BIT OUT
+INC1, SNA CLA /IS THIS SYMBOL. A DUMMY ARG
+INC, ISZ LDMARG /NO...INCREMENT THE RETURN
+ CLA /CLEAR THE ACCUMULATOR
+ JMP I LDMARG /AND RETURN
+MAYBE, AND F400 /MASK THE SUBSCRIPT BIT OF THE TRIPLE NUMBER
+ JMP INC1 /AND CHECK BECAUSE WE TREAT SUBSCS AS DUMMY ARG
+ARET, JMP I LTRIPL /THIS IS THE RETURN FROM TRIPLE
+
+LEQUIN, TAD C74
+ DCA I L42 /SET OP TO =*
+ JMP CK2
+C74, 74
+/
+/ THIS ROUTINE CHECKS THE REST OF THE CHARS FOR A STATEMENT
+LLOOK, 0
+ JMS GLOOK /GET CHARACTER COUNT
+ DCA LTRIPL
+ABACK, JMS I GNB
+ JMS GLOOK /ADD IN THE TEST CHAR
+ SZA CLA /WERE THEY EQUAL
+ JMP I ASSIGN /NO...IT MUST BE AN ASSIGNMENT STATEMENT
+ ISZ LTRIPL /THEY MATCH...ARE WE DONE
+ JMP ABACK /NO
+ JMP I LLOOK /RETURN
+
+GLOOK, 0
+ CDF 10
+ TAD I LLOOK
+ ISZ LLOOK
+ CDF 00
+ JMP I GLOOK
+/
+LAADD, AADD
+LADDIN, ADDIND
+LASUB, ASUB
+LEQU, EQU
+LEIND, EIND
+LEXP, EXP
+LUMIN, UMIN
+CM41, -41
+EM75, -75
+LDUMTW, DUMTWO
+CM16, -16
+C10, 10
+F400, 400
+LDUMON, DUMONE
+CM53, -53
+LMUL, MUL
+LDIV, DIV
+XZQL, LXZQ
+J27, 27
+
+CKFND, TAD L42 /SEE IF POINTER IS INTO SYMB. TABLE
+ TAD K2000 /(IT HAS HAPPENED!)
+ SZA CLA
+ JMP I CKFNCP
+ JMP I .+1 /YES-ERROR
+ ERR39
+CKFNCP, CKFNCT
+K2000, 2000
+\f *4400
+ / FIGURE OUT WHATS IN AC
+LCHECK, 0
+ TAD L46 /GET WHATS IN THE AC
+ CIA /SET NEGATIVE
+ TAD I L41 /SUBTRACT
+ SNA CLA /ARE THEY EQUAL
+ JMP ONE /YES
+ TAD L46 /GET AC AGAIN
+ CIA /SET NEGATIVE
+ TAD I L43 /SUBTRACT TWO
+ SNA CLA /ARE THEY EQUAL
+ JMP TWO /YES
+ TAD L46 /GET THE AC
+ SNA CLA /IS IT ZERO
+ JMP NONE /NO YES YES YES
+ JMP SOME /JUST SIMETHING IN AC
+ONE, ISZ LCHECK
+NONE, ISZ LCHECK
+SOME, ISZ LCHECK
+TWO, JMP I LCHECK
+
+/ FINDS TEMPORARY THAT TRIPLE NUMBER IS ASSIGNED TO
+
+LTMPOR, 0
+ DCA LFPROP /SAVE TRIPLE NUMBER
+ TAD LFPROP
+ JMS I MODE /DETERMINE ITS MODE
+ TAD C30 /FLOATING POINT
+ TAD TTAB /INTEGER
+ DCA LCHECK
+ TAD CM30
+ DCA FOP /SET UP COUNT FOR SEARCH
+LTLP1, TAD I LCHECK
+ CIA
+ TAD LFPROP
+ SNA CLA /IS THIS THE ONE?
+ JMP ZEROIT /YES - ZERO IT OUT AND RETURN IT
+ ISZ LCHECK
+ ISZ FOP
+ JMP LTLP1 /LOOP OVER ENTIRE TABLE
+ TAD LCHECK /NOT FOUND - WE HAVE TO ASSIGN IT
+ TAD CM30
+ DCA LCHECK /RESET POINTERS FOR ZERO SEARCH
+ TAD CM30
+ DCA FOP
+LTLP2, TAD I LCHECK
+ SNA CLA /IS THIS TEMPORARY FREE?
+ JMP TEMPTY /YES
+ ISZ LCHECK
+ ISZ FOP
+ JMP LTLP2 /CHECK THEM ALL
+ERR41, JMS I LUNCH /OUT OF TEMPORARIES
+TEMPTY, TAD LCHECK
+ CIA
+ TAD L45
+ SNA CLA /ADJUST THE NUMBER OF FLOATING POINT TEMPS
+ ISZ L45
+ TAD LCHECK
+ CIA
+ TAD L51
+ SNA CLA /ADJUST THE NUMBER OF INTEGER TEMPS
+ ISZ L51
+ TAD LFPROP /STORE TRIPLE NUMBER IN THIS TEMPORARY SLOT
+ZEROIT, DCA I LCHECK
+ TAD FOP
+ TAD C31 /GET POSITIVE NUMBER FROM TABLE COUNTER
+ JMP I LTMPOR /RETURN
+C31, 31
+
+LFPROP, 0 /THIS ROUTINE PUNCHES SUBROUTINE CALLS
+ DCA FOP /SAVE THE NUMBER OF ARGUMENTS
+ JMS I PROP
+ 6113 /PUT OUT THE CALL
+ TAD FOP /GET THE NUMBER OF ARGUMENTS
+ JMS I PROTAC /PRINT IT
+ TAD C54 /GET A COMMA
+ JMS I PRINT /PRINT IT
+ CDF 10
+ TAD I LFPROP
+ CDF 00
+ JMS I PRSYM
+ JMS I PRINT
+ ISZ LFPROP /INCREMENT RETURN
+ JMP I LFPROP /RETURN
+FOP, 0
+/ COME HERE IF OP IS -
+ASUB, JMS I SMODE /MAKE SURE THAT BOTH ARGS ARE OF SAME MODE
+ TAD I L43 /GET OPERAND TWO
+ JMS I MODE
+ JMP FSUB /ITS FLOATING POINT
+ JMS LCHECK /ITS INTEGER...CHECK WHATS IN THE AC
+ JMP STWO /TWO IS IN THE AC
+ JMS I STORE /SMETHING IS IN THE AC
+ JMS I LADDON /NOTHING IS IN THE AC...ADD ONE TO IT
+ASBCMN, JMS I LCOMP /ONE IS IN AC...COMPLEMENT IT
+ JMS I LADDTW /ADD TWO TO IT
+ JMP I LRETUR /AND RETURN
+STWO, JMS I LCOMP /TWO IS IN AC...COMPLEMENT IT
+ JMS I LADDON /ADD ONE TO IT
+ JMS I LCOMP /AND COMPLEMENT IT AGAIN
+ JMP I LRETUR /AND RETURN
+FSUB, JMS LCHECK /FLOATING POINT...CHECK THE AC
+ JMP FS /TWO IS IN AC
+ JMS I STORE /SOMETHING IN AC...STORE IT
+ JMP FAS /NOTHING IN AC
+ JMP ASBCMN /ONE IS IN AC - COMPLEMENT AND ADD TWO
+FAS, JMS I LADDTW /NOTHING IN AC...ADD TWO IN
+FS, IAC /WE HAVE ONE ARG
+ JMS I FPROP
+ 6011
+ JMS I ARG /PUT OUT THE ARG PSEUDO OP
+ TAD I L41 /GET ARGUMENT ONE
+IRET, JMS I PRSYM /AND PUT IT OUT
+ JMS I PRINT /PUT OUT CRLF
+ JMP I LRETUR
+TTAB, ITTAB /THIS IS THE STARTING ADDRESS OF THE TEMP TABLE
+LCOMP, COMP
+LADDON, ADDONE
+C30, 30
+CM30, -30
+LRETUR, RETURN
+LADDTW, ADDTWO
+
+/CHECK SIZE OF FORMAT STMT.
+/
+CKFRMT, DCA I L10 /CONTINUE PACK ROUTINE
+ ISZ L76
+ TAD L76
+ TAD M174 /IS IT TOO BIG
+ SMA CLA
+ JMP I ILCON /YES-GIVE IT ILLEGAL CONT. MESSAGE
+ JMP I LFRMT /NO-GO BACK
+LFRMT, FRMT
+M174, -174
+ILCON, ERR1 /ILLEGAL CONTINUATION MESSAGE
+\f *4600
+/ PROCESS *
+ADDIND, JMS I CHECK /CHECK WHATS IN THE AC
+ NOP /TWO IS IN AC
+ SKP /N SOMETHING IS IN AC
+ SKP /NOTHING IS IN AC
+ JMS I STORE /STORE WHATEVER IS IN AC
+ TAD I L41 /GET OPERAND ONE
+ JMS I MODE /WHAT MODE IS IT
+ JMP FLOT /YES IT FLOATING POINT
+ JMS I PROP /IST INTEGER...
+ 6063 /PUT OUT A TAD*
+LOOP6, TAD I L41 /GET THE FIRST OPERAND AGAIN
+ JMP I LIRET /GO TO THE RETURN ROUTINE
+FLOT, IAC /WE ONLY HAVE ONE ARG
+ JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE
+ 6132 /PUT OUT A CALL TO FLOATING INDIRECT ADD
+ JMS I ARG /PUT OUT THE ARG PSEUDO OP
+ JMP LOOP6 /AND JUMP BACK
+/ THIS PUTS OUT OPCODES FOR AN ADD
+ADDL, 0
+ CLL RAR
+ SNA /TEST FOR 0 OR 1
+ JMP ADSPCL
+ RAL /NOT 0 OR 1, TREAT NORMALLY
+ JMS I MODE /WHAT MODE ARE WE IN
+ JMP LOOP7 /YES
+ JMS I PROP /PUT OUT A TAD
+ 6066
+ JMP I ADDL /RETURN
+LOOP7, IAC /WE ONLY HAVE ONE ARGUMENT
+ JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE
+ 6003 /PUT OUT A FLOATING ADD
+ JMS I ARG /PUT OUT THE ARG PSEUDO OP
+ JMP I ADDL /AND RETURN
+ADSPCL, ISZ ADDL
+ ISZ ADDL /BUMP RETURN POINT PAST ARGUMENT TO "TAD"
+ SNL /0?
+ JMP I ADDL /YUP - DON'T PUT OUT NUTTIN
+ JMS I PROP
+ OPIAC /PUT OUT "IAC"
+ JMP I ADDL
+
+/ STORES CONTENTS OF AC IN TEMPORARY
+/ PUT OUT DCA OR CALL STO
+/ FOLLOWED BY THE TEMPORARY LOC
+LSTORE, 0
+ TAD L46 /GET THE AC
+ JMS I MODE /WHAT MODE IS IT
+ JMP FSTO /ITS FLOATING POINT
+ JMS I PROP
+ 6071 /ITS INTEGER...PUT OUT A DCA
+STORET, TAD L46 /GET THE AC AGAIN
+ JMS I PRSYM /PRINT WHATEVER IS IN IT
+ JMS I PRINT /PUT OUT A CRLF
+ DCA L46 /ZERO THE AC
+ JMP I LSTORE /AND RETURN
+FSTO, IAC /WE ONLY HAVE ONE ARG
+ JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE
+ 6006 /PUT OUT A CALL TOFLOATING STORE
+ JMS I ARG /PUT OUT THE ARG PSEUDO OP
+ JMP STORET /AND JMP BACK
+COMP, 0
+ TAD L46 /GET THE AC
+ JMS I MODE /WHAT MODE IS IT
+ JMP FCOM /ITS FLOATING POINT
+ JMS I PROP /ITS INYTEGER
+ 6135 /PUT OUT A CIA
+ JMS I PRINT /PUT OUT A CRLF
+ JMP I COMP /AND RETURN
+FCOM, JMS I FPROP
+ 6140 /TO FLOATING CHANGE SIGN
+ JMP I COMP
+/ COME HERE IF OP IS *
+MUL, JMS I SMODE /CHECK FOR SAME MODE
+ JMS I CHECK /CHECK WHATS IN THE AC
+ JMP TMUL /TWO IS IN THE AC
+ JMS I STORE /SOMETHING IS IN AC...STORE IT
+ JMS I KADDON /NOTHING IS IN AC..GET ONE IN AC
+AMUL, TAD I L43 /GET OPERND TWO
+ JMS I MODE /WHAT MODE IS IT
+ TAD EM6
+ TAD C6022
+ DCA FML /SAVE OPCODE
+ IAC
+ JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE
+FML, 0
+ JMS I ARG /PUT OUT THE ARG PSEUDO OP
+ TAD I L43 /GET OPERAND TWO
+ JMP I LIRET /AND GO TO THE RETURN ROUTINE
+TMUL, TAD I L41 /GET OPERAND ONE AND REPLACE OPERAND TWO
+ DCA I L43
+ JMP AMUL /AND JUMP BACK
+KADDON, ADDONE
+LIRET, IRET
+EM6, -6
+C6022, 6022
+
+LSUB, JMS I LOOK /CHECK REST OF STATEMENT
+ -6 /
+ -17 /O
+ -25 /U
+ -24 /T
+ -11 /I
+ -16 /N
+ -5 /E
+ JMP I .+1
+ TART
+
+LCLEAR, 0 /CLEAR THE PSEUDO ACC AND MQ
+ DCA L30
+ DCA L31
+ DCA L32
+ DCA L33
+ DCA L34
+ DCA L35
+ JMP I LCLEAR
+ *5000
+/ THIS ROUTINE TAKES CARE OF TWO BEING DUMMY ARG
+DUMTWO, 0
+ TAD I L41 /GET OPND ONE
+ DCA FDV /AND SAVE
+ TAD I L43 /GET OPND TWO
+ DCA I L41 /ZERO OPND ONE
+ JMS DUMONE /PROCESS DUMMY ARGUMENT
+ TAD FDV /GET SAVED OPERAND
+ DCA I L41 /AND USE AS OPERAND
+ TAD L46 /GET TRIPLE NUMBER
+ DCA I L43 /AND REPLACE
+ JMP I DUMTWO /RETURN
+/ TAKES CARE OF ONE BIING DUMMY ARG
+DUMONE, 0
+ TAD I L42 /GET OPERATOR
+ DCA ASTOP /AND SAVE
+ TAD E41 /GET ADD INDIRECT OPERATOR
+ DCA I L42 /AND REPLACE OPERATOR
+ CDF 10
+ TAD I TRIPL
+ CDF 00
+ DCA FEX /AND SAVE RETURN
+ JMS I TRIPL /CALL TRIPL
+ TAD L46 /GET TRIPLE NUMBER
+ DCA I L41 /AND REPLACE OPERAND
+ TAD ASTOP /RESTORE OPERATOR
+ DCA I L42
+ ISZ L40 /ADVANCE TRIPLE
+ TAD FEX /RESTORE RETURN
+ CDF 10
+ DCA I TRIPL
+ CDF 00
+ JMP I DUMONE /RETURN
+/ COME HERE IF OP IS /
+DIV, JMS I SMODE /CHECK FOR SAME MODE
+ JMS I CHECK /CHECK WHATS IN THE AC
+ JMP DIVE /TWO IS IN AC
+\f JMS I STORE /THERES SOMETHING IN THE AC...STORE IT
+ SKP /NOTHING IS IN AC
+ JMS I STORE /THERES SOMETHING IN THE AC...STORE IT
+ JMS I MADDTW /GET TWO INTO THE AC
+DIVE, TAD I L41 /GET OPERAND ONE
+ JMS I MODE /WHAT MODE IS IT
+ TAD FM6
+ TAD C6025
+ DCA FDV /SAVE OERATOR
+ IAC
+ JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE
+FDV, 0
+ JMS I ARG /PUT OUT THE ARG PSEUDO OP
+ TAD I L41 /GET OPERAND ONE
+ JMP I MIRET /JUMP TO RETURN ROUTINE
+/ COME HERE IF OP IS **
+EXP, JMS I CHECK /CHECK WHATS IN THE AC
+ JMP FEXP /TWO IS IN AC
+ JMS I STORE /THERES SOMETHING IN THE AC...STORE IT
+ SKP /NOW NOTHING IS IN AC
+ JMS I STORE /THERES SOMETHING IN THE AC...STORE IT
+ JMS I MADDTW /GET TWO IN AC
+FEXP, TAD I L41
+ JMS I MODE
+ TAD C6
+ DCA FDV
+ TAD I L43 /GET OPERAND TWO
+ JMS I MODE /WHAT IS ITS MODE
+ TAD C3 /FLOATING POINT
+ TAD C6207 /INTEGER
+ TAD FDV
+ DCA FEX /SAVE REOUTINE POINTER
+ IAC
+ JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE
+FEX, 0
+ TAD I L41 /GET OPERAND ONE
+ DCA I L43 /SAVE IN OPERAND TWO
+ TAD FEX /GET THE OP CODE JUST PUT OUT
+ TAD CM6207 /SUBTRACT THE INTEGER TO INTEGER CASE
+ SZA CLA /WAS THIS THE INTEGER INTEGER CASE
+ TAD L50 /NO, GET A FLOATING POINT POINTER
+ DCA I L41 /AND SUBSTITUTE IT FOR OPERAND ONE
+ JMS I ARG /PUT OUT THE PSEUDO OP ARG
+\f TAD I L43 /GET THE REAL OPERAND ONE IN THE AC
+ JMP I MIRET /JUMP TO THE RETURN ROUTINE
+/COMES HERE IF THE VARIABLE TO THE LEFT OF THE '=' IS SUBSCRIPTED
+EIND, TAD C132 /GET AN ASTERISK
+ DCA L60 /PUT IT IN SIXTY
+/COMES HERE IF THE OPERATOR IS AN '='
+EQU, JMS I CHECK /CHECK WHATS IN THE AC
+ NOP /TWO IS IN THE AC
+ JMS I STORE /THERES SOMETHING IN THE AC...STORE IT
+ JMS I TADDON /NOTHING IS IN AC...ADD ONE TO IT
+ TAD I L43 /GET OPERA ND TWO
+ JMS I MODE /WHAT IS ITS MODE
+ JMP FEQU /ITS FLOATING POINT
+ TAD L46 /GET THE AC
+ JMS I MODE /WHAT MODE IS IT
+ JMP I LFIX /ITS FLOATING POINT
+EFIX, TAD L60 /GET EQUALS INDIRECT LOCATION
+ TAD C6071 /ADD A DCA
+ DCA ASTOP /AND SAVE OPCODE
+ JMS I PROP /POT OUT THE OPCODE
+ASTOP, 3
+EQRET, DCA L46 /ZERO THE AC
+ TAD I L43 /GET OPERAND TWO
+ JMS I PRSYM /PRINT IT
+ JMS I PRINT /PUT OUT A CRLF
+ DCA L60 /ZERO SIXTY
+ JMP I .+1 /AND RETURN
+ ARET
+FEQU, TAD L46 /GET THE AC
+ JMS I MODE /WHAT MODE IS IT
+ SKP /ITS FLOATING POINT
+ JMS I LFLOAT /ITS INTEGER...FLOAT IT
+ JMP I .+1
+ XXX
+
+LARG, 0
+ JMS I PROP
+ 6201
+ JMP I LARG
+
+TADDON, ADDONE
+E41, 41
+MADDTW, ADDTWO
+FM6, -6
+C6025, 6025
+MIRET, IRET
+C6, 6
+C6207, 6207
+LFIX, FIX
+C6071, 6071
+LFLOAT, FLOAT
+CM6207, -6207
+C132, 132
+\f *5200
+XXX, TAD L60 /GET THE INDIRECT EQUALS SWITCH
+ SNA CLA /IS THE SWITCH ON
+ TAD CM140 /NO, FLOATING POINT STORE
+ TAD C6146 /YES...ISTO
+ DCA FSTOP /SAVE OPCODE
+ IAC /WE ONLY HAVE ONE ARG
+ JMS I FPROP /PUT OUT A CALL TO A FLOATING POINT ROUTINE
+FSTOP, 6146
+ JMS I ARG /PUT OUT THE ARG PSEUDO OP
+ JMP I .+1 /JUMP BACK
+ EQRET
+/ THIS ADDS OPERAND ONE TO THE AC
+ADDONE, 0
+ TAD I L41 /GET OPERAND ONE
+ JMS I LADDL /PUT OUT OPCODES FOR AN ADD
+ TAD I L41 /GET FIRST OPERAND
+ JMS I PRSYM /PUT OUT SYMBOL
+ JMS I PRINT /PUT OUT CR LF
+ TAD I L41 /GET OPERAND ONE
+ DCA L46 /PUTN THE AC
+ JMP I ADDONE /RETURN
+UMIN, JMS I CHECK /CHECK WHATSN THE AC
+ NOP /TWOSN AC
+ JMS I STORE /THERES SOMETHINGN THE AC...STORET
+ JMS ADDONE /NOTHINGSN AC NOW...PUT ONEN AC
+ JMS I MCOMP /AND COMPLEMENTT
+ JMP RETURN /AND RETURN
+AADD, JMS I SMODE
+ JMS I CHECK /CHECK WHATSN THE AC
+ JMP AONE /TWOSN AC
+ JMS I STORE /THERES SOMETHINGN THE AC...STORET
+ JMS ADDONE /GET ONEN AC
+ JMS ADDTWO /ONESN AC
+ JMP RETURN /RETURN
+AONE, JMS ADDONE /ADD ONE TO TWO
+ JMP RETURN /AND RETURN
+LPROP, 0
+ CDF 10
+ TAD I LPROP
+ CDF 00
+ JMS I PRSYM /AND PRINT THE SYMBOL
+ TAD C40 /GET A SPACE
+ JMS I PRINT /PUT OUT
+ ISZ LPROP /INCREMENT RETURN
+ JMP I LPROP /AND RETURN
+/ THIS ADDS OPERAND TWO TO THE AC
+ADDTWO, 0
+ TAD I L43 /GET OPERAND TWO
+ JMS I LADDL /PUT OUT OPCODES FOR AN ADD
+ TAD I L43 /GET SECOND OPERAND
+ JMS I PRSYM /PRINT THE SYMBOL
+ JMS I PRINT /PUT OUT CR LF
+ TAD I L43 /GET OPERAND TWO
+ DCA L46 /AND PUTN AC
+ JMP I ADDTWO /RETURN
+LXZQ, 0 /CHECK FOR EXPRESSION LEFT OF =
+ CLA
+ TAD L22 /GET SUBSCRIPT NESTING DEPTH
+ TAD L44 /GET EQUALS SIGN SWITCH
+ SNA CLA /ARE THEY BOTH ZERO
+ERR42, JMS I LUNCH /N YES ...THATS AN ERROR
+ JMP I LXZQ /RETURN
+RETURN, TAD I L41 /THISS THE RETURN...GET OPERAND ONE
+ JMS I MODE /WHAT MODEST
+ TAD G400 /ITS FLOATING POINT...TURN F.P. BIT ON
+ TAD L40 /ADD CURRENT TRIPLE NUMBER
+ DCA L46 /PUTN AC SW
+ JMP I NARET /AND NOW RETURN FROM THE ROUTINE
+FLOAT, 0
+ JMS I FPROP /PUT OUT A CAL TO THE FLOAT ROUTINE
+ 6127
+ JMP I FLOAT /AND RETURN
+FIX, JMS I FPROP /PUT OUT A CAL
+ 6143 /TO THE FIX ROUTINE
+ JMP I .+1 /AND JUMP BACKLADDL, ADDL
+ EFIX
+C6146, 6146
+LADDL, ADDL
+MCOMP, COMP
+G400, 400
+NARET, ARET
+LSMODE, 0
+ TAD I L43 /GET FIRST OPERAND
+ JMS I MODE /FIND WHAT ITS MODE IS
+ JMP IBM /ITS FLOATING POINT
+ TAD I L41 /GET OPERAND TWO
+ JMS I MODE /THIS BETTER BE INTEGER TOO
+ JMP .+5 /ITS NOT, LUNCH
+ JMP I LSMODE /GREAT, RETURN
+IBM, TAD I L41 /GET OPERAND TWO
+ JMS I MODE /THIS BETTER BE F.P. TOO
+ JMP I LSMODE /IT IS RETURN
+ERR43, JMS I LUNCH /ERROR
+LPUNCH, 0
+ PSF /IS PUNCH READY
+ JMP .-1 /NO, TRY AGAIN
+ PLS /YES, PUNCH THE CHARACTER
+ CLA /CLEAR THE ACCUMULATOR
+ JMP I LPUNCH /AND RETURN
+CM140, -140
+
+LFINI, 0 /FINAL CLEANUP AT END OF COMPILATION
+ JMS I FPROP /PUNCH 'CALL 0,OPEN'
+ OPEN
+ JMS I PROP /PUNCH A 'PAUSE'
+ 6060
+ JMS I PRINT
+ JMS I PRINT /FORCE LAST LINE OUT
+ TAD CM100
+ JMS I LEADR /PUNCH SOME LEADER
+ CDF 10
+XFINI, HLT /JMP I LFINI, FOR DISK SYSTEM ...
+ CIF 0
+ JMP I D1000 /BEGIN NEXT COMPILATION
+D1000, 1000
+CM100, -100
+LEADR, LLEAD
+
+FORST, JMS I PRINT /FORTRAN STARTING POINT
+ JMS I (LIST
+ DCA .-1
+ TAD (LPUNCH
+ DCA PUNCH
+ TAD CM50
+ JMS I LEADR
+ JMS I PROP
+ FORTR
+ JMS I PRINT
+ JMP I .+1
+ START1
+
+PAGE
+\f *5400
+LLAST, TAD C4000 /END OF COMPILATION, SET CHK SO THAT
+ DCA CHK /LGTC WILL NOT READ ANOTHER LINE...
+ JMS I GNB
+ SZA
+ JMP I ASSIGN
+ JMS I (OSTOP /PUNCH A 'HLT' ETC.
+ TAD L55
+ TAD C25
+ SZA CLA /IS DO LIST EMPTY?
+ERR44, JMS I LUNCH /NO, COMPLAIN...
+MORDUM, TAD L56 /GET POINTER INTO SYMBOL TABLE
+ TAD C2 /ADD TWO TO IT FOR CONTROL BITS
+ DCA L72 /SAVE ADDRESS OF CONTROL BITS
+ TAD I L72 /GET THE CONTROL BITS
+ AND E10 /MASK ALL BUT THE DUMMY ARG BIT
+ SNA CLA /IS THE DUMMY ARG BIT ON
+ JMP LEDOUT /NO, PUT OUT DUMMY SUBSCRIPT DEFNS
+ JMS I DEFN /YES, PUT OUT THE VARIABLE NAME
+ JMS I PROP /PUT OUT THE OP CODE
+ 6154 /WHICH IS BSS
+ TAD C2 /RESERVE TWO LOCATIONS
+ JMS I PROTAC /PRINT THE TWO
+ JMS I PRINT
+ ISZ L56 /ADVANCE THE POINTER
+ ISZ L56
+ ISZ L56
+ JMP MORDUM /GO BACK AND DO THE NEXT ONE
+LEDOUT, DCA L72 /ZERO LOCATION 72
+LEDOT1, TAD L25 /GET THE NUMBER OF SUBSCRIPT TEMPS
+ CMA
+ TAD L72 /SUBTRACT FROM THE NUMBER WEVE DEFINED
+ SNA CLA /HAVE WE DEFINED THEM ALL YET
+ JMP GOOON /YES, NOW PUT OUT THE END
+ TAD K5200 /GET SUBSCRIPT DESIGNATOR
+ TAD L72 /GET WHICH SUBSCRIPT
+ JMS I PRSYM /AND PRINT IT
+ TAD C7240 /GET THE TERMINATOR
+ JMS I P2 /PRINT IT
+ JMS I PROP /PRINT THE OP CODE
+ 6154 /WHICH IS BSS
+ TAD C2 /RESERVE TWO LOCATIONS
+ JMS I PROTAC
+ JMS I PRINT /CRLF
+ ISZ L72 /GO ON TO THE NEXT ONE
+ JMP LEDOT1
+GOOON, JMS I PROP
+ 6157 /PUT OUT AN END
+ JMS I PRINT /PUT OUT A CRLF
+ DCA L65 /ZERO THE PSEUDO LOCATION COUNTER
+ TAD START /CLA = -600
+ JMS I LEAD /PUT OUT LOTS OF LEADER CODE
+ JMS I PROP
+ 6162 /PUT OUT A LAP
+ JMS I PRINT
+SYM, TAD L57
+ CIA
+ TAD L56
+ SZA CLA /ARE THERE ANY SYMBOLS
+ JMP SYM1
+ TAD MIKE8
+ SZA CLA /NO, IS THERE ANY EQUIVALENCING?
+ JMP I LPTEMP
+ JMP I .+1
+ PTEMP
+SYM1, TAD L56
+ TAD C2
+ DCA L72
+ TAD I L72 /GET THE CONTROL BITS
+ DCA L72 /SAVE THEN
+ TAD L72 /GET THE BITS
+ AND E7 /MASK
+ SZA CLA /ARE THEY FUNCT NAME,
+ JMP UP /YES
+ JMS I DEFN /PUT IT OUT
+ TAD L72
+ AND E20 /MASK ALL BUT THE DIMEN
+ SNA CLA /IS EITHER ONE ON
+ JMP NORM /NO
+ TAD L56
+ JMS I DIM
+ DCA L26
+ TAD I L14 /GET THE SECOND DIMENSION
+ CLL CIA /AND NEGATE
+ DCA L73 /SAVE
+ SZL
+ERR36, JMS I LUNCH
+ TAD L26
+ ISZ L73
+ JMP .-4
+ACK, DCA L26
+ TAD L56
+ JMS I MODE /DETERMINE MODE OF SYMBOL
+ TAD L26
+ RAL CLL
+ TAD L26
+ SZL
+ JMP ERR36
+ DCA L26
+ TAD L72
+ AND C40
+ SZA CLA
+ JMP COM
+ JMS I BSS
+UP, ISZ L56
+ ISZ L56
+ ISZ L56
+ JMP SYM
+NORM, IAC
+ JMP ACK
+C25, 25
+E7, 7
+K5200, 5200
+DEFN, LDEFN
+E20, 20
+E10, 10
+LPTEMP, EEK
+LEAD, LLEAD
+COM, JMS I PROP
+ 6165
+ TAD L26
+ JMS I PROTAC
+ JMS I PRINT
+ JMP UP
+\f *5600
+C7600, 7600
+C177, 177
+LBSS, 0
+ TAD L65 /GET THE LOCATION COUNTER
+ TAD L26 /ADD THE CURRENT AMOUNT TO IT
+ AND C7600 /MASK ALL BUT THE PAGE BITS
+ DCA L64 /SAVE THE NUMBER OF PAGES
+ TAD L65 /GET THE LOCATION COUNTER AGAIN
+ TAD L26 /ADD THE CURRENT DISPLACEMENT AGAIN
+ AND C177 /NOW GET THE NUMBER OF LOCATIONS OVER A PAGE
+ DCA L65 /AND SAVE
+L, TAD L64 /GET THE NUMBER OF PAGES TO BE RESERVED
+ SNA /ARE THERE ANY TO BE RESERVED
+ JMP CRAM /NO...JUST PUT OUT STRAIGHT NUMBER OF LOCATIONS
+ TAD C7600 /YES...SUBTRACT ONE FROM THE PAGE COUNT
+ DCA L64 /AND SAVE IT
+ TAD L65 /GET THE NUMBER OF EXTRA LOCATIONS
+ DCA L26 /AND PUT IN THE DISPLACEMENT LOCATION
+ JMS I PROTAC /PUT OUT A ZERO
+ JMS I PRINT /PUT OUT A CRLF
+ JMS I PROP /PUT OUT THE OPCODE
+ 6151 /WHICH IS THE PAGE PSEUDO OP
+ JMS I PRINT /PUT OUT A CRLF
+ JMP L /NOW SEE IF WE HAVE PUT OUT ENOUGH PAGES
+CRAM, JMS I PROP /NOW PUNCH 'BLOCK <N>'
+ BLCK
+ TAD L26
+ JMS I PROTAC
+ JMS I PRINT
+ JMP I LBSS
+LDEFN, 0
+ TAD L56 /GET THE POINTER TO THE SYMBOL
+ JMS I PRSYM /PRINT THE SYMBOL
+ TAD C7240 /GET THE TERMINATOR
+ JMS I P2 /PRINT IT
+ JMP I LDEFN /AND RETURN
+AFCON, TAD L47 /GET START OF FCON TABLE
+ TAD C3 /UPDATE IT
+ DCA L56 /SAVE UPDATED ADDRESS
+FLOOP, TAD L50 /GET END OF FCON TABLE
+ CIA
+ TAD L56 /SUBTRACT FROM CURRENT POINTER
+ SNA CLA /ARE WE DONE
+ JMP ALTHRU /YES
+ TAD CM3 /NO, GET MINUS THREE
+ DCA L63 /TO USE AS A COUNTER
+ JMS LDEFN /DEFINE IT
+ TAD I L56 /GET THE FIRST WORD
+ ISZ L56 /ADVANCE THE POINTER TO THE NEXT WORD
+ JMS I PROTAC /PRINT THE WORD
+ JMS I PRINT /PUT OUT A CRLF
+ ISZ L63 /HAVE WE PUT OUT ALL THREE WORDS
+ JMP .-5 /NO...PUT OUT ANOTHER
+ JMP FLOOP /YES...GET THE NEXT CONSTANT
+PTEMP, TAD K561
+ DCA L56
+FTLOOP, TAD L45
+ CMA
+ TAD L56
+ SNA CLA
+ JMP ITEMP
+ TAD C3
+ DCA L26
+ TAD K5400 /GET F.P. DESIGNATOR
+ JMS LDEFN /PRINT THE SYMBOL
+ JMS I BSS /RESERVE THE LOCATIONS FOR IT
+ ISZ L56 /INCREMENT THE POINTER
+ JMP FTLOOP
+ITEMP, TAD K531
+ DCA L56
+ILOOP, TAD L51
+ CMA
+ TAD L56
+ SNA CLA
+ JMP SUBOUT
+ IAC
+ DCA L26
+ TAD K5000 /GET THE INTEGER TEMP DESIGNATOR
+ JMS LDEFN /PRINT IT
+ JMS I BSS /RESERVE LOCATIONS FOR IT
+ ISZ L56 /INCREMENT THE POINTER
+ JMP ILOOP
+ALTHRU, TAD D6 /PUNCH AN 'IFF 6'
+ JMS I PIFF /SO THAT ENTRY WILL NOT BE AT END OF THE PAGE
+ JMS I PROP
+ 6055 /PUT OUT AN EAP
+ JMS I PRINT
+ TAD L70 /GET THE SUBROUTINE FUNCTION POINTER
+ SZA CLA /IS IT ZERO
+ JMP THRU /NO...WE MUST BE IN A SUBR OR A FUNC
+ JMS I PROP /YES ...WERE IN A MAIN PROGRAM
+ 6052 /PUT OUT ENT
+ TAD C6000 /POINTER TO THE SYMBOL MAIN
+ JMS I PRSYM /PRINT THE SYMBOL
+ JMS I PRINT /PUT OUT A CRLF
+ TAD C6000 /GET THE POINTER TO MAIN AGAIN
+ JMS I PRSYM /PRINT IT
+ TAD C7240 /GET A COLON
+ JMS I P2 /PRINT THEM
+ JMS I PROP
+ 6047
+ JMS I PRINT /PUT OUT A CRLF
+THRU, JMS I FINI
+ 6201 /CDF FIELD 0
+ JMP I C7600 /AND RETURN TO THE MONITOR ...
+C6000, 6000
+SUBOUT, DCA L56
+SUBOT1, TAD L25
+ CMA
+ TAD L56
+ SNA CLA
+ JMP AFCON
+ JMS I PROP /PUT OUT THE OP CODE
+ 6176 /WHICH IS DUMMY
+ TAD X5200 /GET SUBSCRIPT DESIGNATOR
+ TAD L56 /GET THE POINTER
+ JMS I PRSYM /PRINT THE SYMBOL
+ JMS I PRINT /CRLF
+ ISZ L56
+ JMP SUBOT1
+K5000, 5000-ITTAB
+K5400, 5400-FTTAB
+K531, ITTAB+1
+K561, FTTAB+1
+X5200, 5200
+FINI, LFINI
+D6, 6
+\f *6000
+/FUNCTION AND SUBROUTINE STATEMENT PROCESSOR
+LFUNC, JMS I LOOK /CHECK REST OF STATEMENT
+MFOUR, -4 /
+ -24 /T
+ -11 /I
+ -17 /O
+ -16 /N
+ CLA IAC /SET SWITCH
+TART, DCA L67 /THIS IS THE SWITCH
+ TAD FIRSTF
+ SNA CLA /INSURE SUBR. OR FUNCT. IS FIRST STMT.
+ERR47, JMS I LUNCH
+ JMS SUBB
+ CLA CMA
+ TAD C6275 /THIS IS THE PLACE TO STORE FUNCTION NAME
+ DCA L11 /USE AUTO INDEXING TO STORE THE NAME
+ TAD L30 /GET THE FIRST WORD
+ DCA I L11 /PUT IT IN THE SYMBOL TABLE
+ TAD L31 /GET THE SECOND WORD
+ DCA I L11 /PUT IT IN THE TABLE
+ TAD L32 /GET THE THIRD WORD
+ IAC /TURN THE EXTERNAL SYMBOL BIT ON
+ DCA I L11 /AND PUT IT IN THE TABLE
+ TAD C6275 /GET THE POINTER
+ DCA L70 /AND PUT IT IN LOC 70
+ JMS I PROP
+ 6052 /PUT OUT AN ENT
+ TAD L70 /GET THE SUBROUTINE NAME
+ JMS I PRSYM /PRINT IT
+ JMS I PRINT /PUT OUT A CRLF
+ CLA CMA
+ DCA READY /SET SWITCH
+ TAD L70 /GET THE SUB NAME
+ JMS I PRSYM /PUT IT OUT
+ TAD C7240
+ JMS I P2 /PUT IT OUT
+ JMS I PROP /PUT OUT THE OP CODE 'BLOCK 2'
+ BLCK
+ TAD C2
+ JMS I PROTAC
+ JMS I PRINT
+ DCA WHICH /ZERO THE SWITCH WHICH TELLS WHICH WORD
+MORE, JMS I GNB
+ SNA /CHECK FOR END OF CARD
+ JMP CKCR
+ TAD CM50 /CHECK FOR LEFT PAREN
+ SNA /IS IT A LPAR
+ JMP GET1 /YES
+ TAD MFOUR
+ SNA /IS IT A COMMA
+ JMP XGET /YES
+ TAD C3
+ SNA CLA /IS IT A LPAR
+ JMP START /YES
+ JMP ERR48 /NO
+GET1, ISZ READY /WERE WE READY FOR LPAR
+ JMP ERR48 /NO, ERROR ...
+XGET, JMS SUBB
+ TAD L32
+ TAD TEN
+ DCA L32
+ TAD C77 /GET MASK FOR SYMBOL TABLE
+ DCA L21 /AND PUT INTO THE SWITCH
+ JMS I SYMTAB /AND PUT IN SYMBOL TABLE
+ JMS I PROP
+ DUMMY
+ TAD L77
+ JMS I PRSYM
+ JMS I PRINT
+DLOOP, JMS I PROP
+ 6063 /PUT OUT A TAD*
+ TAD L70 /GET THE FUNCTION NAME
+ JMS I PRSYM /AND PRINT IT
+ JMS I PRINT /PUT OUT A CRLF
+ JMS I PROP
+ 6071 /PUT OUT A DCA
+ TAD L77 /GET ADDRESS OF SYMBOL
+ JMS I PRSYM /PRINT IT
+ TAD WHICH /GET THE WHICH SWITCH
+ RAR /GET THE LOW BIT INTO THE LINK
+ SNL CLA /IS THE WHICH SWITCH BIT SWITCHED
+ JMP NEXT /NO...THAT MEANS WERE ON THE FIRST WORD
+ TAD E43 /YES...WERE ON SECOND WORD...GET A "#"
+ JMS I PRINT /PRINT IT
+NEXT, JMS I PRINT
+ JMS I PROP /PUT OUT AN INC (ISZ WHICH DOES NOT SKIP)
+ 6237
+ TAD L70 /GET THE FUNCTION NAME
+ JMS I PRSYM /AND PRINT IT
+ TAD E43
+ JMS I PRINT
+ JMS I PRINT /PUT OUT A CRLF
+ ISZ WHICH /INCREMENT THE SHICH SWITCH
+ TAD WHICH /GET THE SWITCH
+ RAR /GET LOW BIT IN THE LINK
+ SZL CLA /IS THE LOW BIT ON
+ JMP DLOOP /YES...WORK ON THE SECOND WORD
+ JMP MORE /GO GET SOME MORE
+READY, 0
+SUBB, 0
+ JMS I ENTITY
+ SKP
+ JMP I SUBB
+E43, 43
+TEN, 10
+ JMP ERR48
+WHICH, 0
+C6275, 6275 /SUBROUTINE OR FUNCTION NAME POINTER
+CKCR, ISZ READY
+ERR48, JMS I LUNCH
+ JMP START
+
+IOEQL, CLA CMA /ROUTINE TO TERMINATE IMPLIED DO LOOPS
+ TAD IMPDO
+ DCA IMPDO /REDUCE THE DEPTH BY 1
+ JMS I DONEXT /GENERATE END-OF-LOOP CODE
+ JMS I GNB
+ TAD CM51
+ SZA CLA /SKIP TO A RIGHT PAREN
+ JMP .-3
+ JMP I .+1
+ IOH0
+DONEXT, LDNEXT
+\f *6172
+C6030, 6030
+LWRIT, JMS I LOOK /LOOK FOR REST OF STATEMENT
+ -1
+ -5
+ TAD C3
+LREAD, TAD C6030 /GET THE POINTER TO READ AND WRITE
+ DCA IOP /USE AS A PARAMETER WITH FPROP
+ JMS I GNB
+ TAD CM50
+ SZA CLA /IS THIS A LEFT PAREN?
+ JMP I ASSIGN
+ JMS SUBA
+ JMS I ZZZ
+ TAD C2
+ JMS I FPROP
+IOP, 0
+ JMS I ARG
+ TAD L32
+ JMS I PRSYM
+ JMS I PRINT
+ JMS I ARG
+ JMS I GNB
+ TAD CM54 /IS IT A COMMA
+ SZA CLA
+ JMP ERR50 /NO, ERROR ...
+ JMS SUBA
+ TAD L32 /GET FORMAT
+ SMA
+ JMS I PLAB
+ SPA
+ JMS I PRSYM
+ JMS I GNB
+ TAD CM51 /CHECK FOR A RIGHT PAREN
+ SZA CLA /IS IT?
+ERR50, JMS I LUNCH
+ JMS I PRINT
+IOH0, JMS I GNB
+ SNA
+ JMP IOH2
+ TAD CM54
+ SNA CLA /IS IT A COMMA
+ JMP IOH3 /YES ...
+IOH1, JMS I PUTCH /NO...PUT IT BACK
+ JMS I GNB /THIS STMT IS TRANSFERRED TO!
+ TAD CM50
+ SNA CLA
+ JMP I IOPEN /OPEN PAREN - MAY BE IMPLIED DO-LOOP
+IOH1BK, JMS I PUTCH
+ DCA L52 /SET SWITCHES FOR GENER
+ DCA L46
+ ISZ L44
+ JMS I GENER /START PROCESSING THE IO LIST
+ TAD L41
+ DCA L42
+ TAD L53
+ DCA L73 /SAVE CREATED LABEL LOC
+ DCA L23 /ZERO TEMPORARY FOR "DUMARG"
+ JMS I LCHNG /TEST FOR 0 OR DUMMY ARG
+ DCA I L41
+ TAD L23 /GET TEMPORARY FROM "DUMARG"
+ SZA CLA /ZERO MEANS NON-VARIABLE NAME
+ TAD I L23 /NON-ZERO POINTS TO FLAG WORD OF VAR
+ AND Q20
+ SNA CLA /DO WE HAVE AN ARRAY NAME?
+ JMP NOSYMB /NO
+ JMS I PROP
+ OPCMA /PUT OUT A "CMA" TO DISTINGUISH THIS CALL
+ JMS I PRINT /FROM A REGULAR CALL TO "IOH"
+ TAD C2
+ JMS I FPROP
+ 6036 /OUTPUT A "CALL 2,IOH"
+ JMS I ARG
+ TAD L23
+ TAD CM2
+ JMS I DIM /GET THE DIMENSIONS
+ DCA IOP
+ TAD I L14
+ CIA
+ DCA L44
+ TAD L23
+ TAD CM2
+ JMS I MODE /GET THE MODE OF THE ARRAY
+ TAD C4000 /FLOATING POINT - ADD 4000 TO AC
+ TAD IOP
+ ISZ L44
+ JMP .-2 /COMPUTE PRODUCT OF DIMENSIONS PLUS MODE BIT
+ JMS I PROTAC /PRINT IT
+ JMS I PRINT
+ JMP IOHRSM /GO PRINT ARRAY NAME
+NOSYMB, TAD L46
+ SZA CLA
+ JMS I STORE
+ IAC /THERE WILL BE ONE ARGUMENT
+ JMS I FPROP /PUT OUT THE CALL TO IOH
+ 6036
+IOHRSM, TAD L73
+ DCA L53 /RESTORE CREATED LABEL LOC
+ TAD I L41
+ JMS I QSYMOT
+ TAD L63 /GET TERMINATING CHAR
+ SNA CLA /WAS IT A <CR>?
+ JMP IOH2 /YES
+IOH3, JMS I GNB /GENTLY LOOK AHEAD ...
+ SNA CLA /DO WE HAVE A ',<CR>' ?
+ JMP START /YES, DO NOT TERMINATE YET ...
+ JMP IOH1 /NO, PUSH IT BACK & PROCESS NEXT ITEM
+IOH2, IAC /THERE WILL BE ONE ARGUMENT
+ JMS I FPROP /PUT OUT A CALL TO IOH
+ 6036
+ JMS I ARG /PUT OUT THE PSEUDO OP ARG
+ JMS I PROTAC
+ JMS I PRINT
+ JMP START
+SUBA, 0
+ JMS I ENTITY
+ JMP ERR51 /ITS A CR
+ JMP ERR51+1 /ITS A VARIABLE
+ JMP I SUBA
+Q20, 20
+ERR51, JMS I LUNCH
+ DCA L21 /ZERO THE SYMBOL TABLE SWITCH
+ JMS I SYMTAB
+ TAD L77
+ JMS I MODE
+ JMP ERR51
+ TAD L77
+ DCA L32
+ TAD L32
+ JMS I DUMARG
+ JMP ERR51
+ JMP I SUBA
+IOPEN, IOOPEN
+QSYMOT, SYMOUT
+\f *6400
+LRET, JMS I LOOK /CHECK REST OF STATEMENT
+ -2
+ -22
+ -16
+ JMS I ZZZ
+ TAD L70
+ SNA CLA /ARE WE COMPILING MAIN PROGRAM?
+ERR60, JMS I LUNCH /YES
+ TAD L67
+ SNA CLA
+ JMP INT /ITS A SUBROUTINE
+ TAD L70 /GET HE NAME OF THE FUNCTION
+ JMS I MODE /IS IT FP OR INTEGER
+ JMP .+4 /ITS FP
+ JMS I PROP
+ 6066 /OPCODE IS TAD
+ JMP .+5 /PUT OUT THE SYMBOL
+ IAC /THERE IS ONE ARGUMENT
+ JMS I FPROP
+ 6003
+ JMS I ARG
+ TAD F34 /GET A BACK SLASH
+ JMS I PRINT
+ TAD L70 /GET THE NAME OF THE FUNCTION
+ JMS I PRSYM /PRINT THE NAME
+ JMS I PRINT /PUT OUT A CRLF
+INT, JMS I PROP
+ 6077 /OPCODE IS RTN
+ TAD L70 /GET THE FUNCTION NAME
+ JMS I PRSYM /PRINT IT
+ JMS I PRINT /PUT OUT A CRLF
+ JMP START /WERE DONE
+
+LGETHI, 0 /PUNCH 'TAD ACH'
+ JMS I PROP
+ 6066
+ JMS I PROP /PRINT THE OP CODE
+ 6226 /WHICH IS ACH (HIGH ORDER AC)
+ JMS I PRINT
+ JMS I FPROP /PUNCH 'CALL 0,CLEAR'
+ 6204
+ JMP I LGETHI
+LDIM, 0 /GETS THE 1ST DIMENSION OF THIS VARIABLE
+ DCA LGETHI /SYMBOL TABLE ADDRESS IS IN THE AC
+ CMA
+ TAD L50
+ DCA L14
+LK, TAD I L14 /SEARCH THE DIMENSION TABLE
+ CIA
+ TAD LGETHI
+ SNA CLA
+ JMP .+4
+ ISZ L14
+ ISZ L14
+ JMP LK
+ TAD I L14 /EXIT WITH DIMENSION IN THE AC
+ JMP I LDIM
+/ THIS PROCESSES SUBSCRIPTS
+SUBRET, JMP I LSUBSC /RETURN FROM SUBSC
+LSBTEM, 0 /THIS ROUTINE MAKES AN ENTRY
+ DCA TRIP /IN SUBSCRIPT TEMPORARY TABLE
+ TAD FBASE
+ DCA POINT
+ TAD CM40
+ DCA PCTR
+LOOP, TAD I POINT /LOOK FOR CURRENT TRIPLE NR
+ SNA /OR END OF TABLE...
+ JMP YES
+ CIA
+ TAD TRIP
+ SNA CLA
+ JMP GOT
+ ISZ POINT
+ ISZ PCTR
+ JMP LOOP
+ERR53, JMS I LUNCH
+YES, TAD TRIP
+ DCA I POINT
+GOT, TAD FBASE
+ CIA
+ TAD POINT
+ DCA POINT
+ TAD POINT
+ CIA
+ TAD L25
+ SPA CLA /IF TEMPORARY NR > L25
+ ISZ L25 /BUMP L25
+ TAD POINT
+ JMP I LSBTEM
+LWIPE, 0 /ZERO THE SUBSCRIPT TEMP. TABLE
+ TAD FBASE
+ DCA POINT
+ TAD CM40
+ DCA PCTR
+LOOP2, DCA I POINT
+ ISZ POINT
+ ISZ PCTR
+ JMP LOOP2
+ JMP I LWIPE
+LZER, 0
+ ISZ LZER /INCREMANT
+ JMS I PROTAC /PUT OUT A ZERO
+ JMP I LZER /AND REUTURN
+LCLAB, 0
+ SNA /IF NO LABEL IN AC,
+ JMS I CREATE /CREATE A LABEL
+ JMS I PRCRL /AND PRINT IT
+ TAD C7240 /PUT OUT A COLON AND SPACE
+ JMS I P2
+ JMP I LCLAB /RETURN
+FBASE, 4600
+POINT, 0
+PCTR, 0
+TRIP, 0
+F34, 34
+LSUBSC, 0
+ TAD L46
+ SZA /IS THERE ANYTHING IN THE AC?
+CHANGE, SKP CLA /********************************
+/ TRY CHANGING THIS LOCATION TO A "JMS I MODE"
+/ TO LIMIT THE CHECK TO THE INTEGER AC!
+/ COULD SAVE UP TO 30% IN HEAVILY SUBSCRIPTED F.P.
+/ EXPRESSIONS! (IMPORTANT - TEST WITH F.P. SUBSCRIPTS)
+ SKP /NOTHING IN THE AC
+ JMS I STORE /YES - STORE IT
+ IAC
+ DCA L63
+ TAD L53
+ DCA L73
+ TAD L41
+ DCA L42
+ ISZ L41
+ TAD I L41
+ TAD CM4046
+ SNA CLA /WAS IT A PRIME
+ JMP BACK
+ JMS I LCHNG
+ DCA L63
+ ISZ L41
+ ISZ L41
+ ISZ L42
+\f ISZ L42
+ IAC
+BACK, ISZ L41
+ DCA SYMOUT
+ JMS CHNG
+ DCA L65
+ ISZ L42
+ ISZ L42
+ JMS CHNG
+ DCA LDUM /SAVE ARRAY POINTER (OR 0 IF DUMMY)
+ TAD L73 /NOW RESTORE THE CREATED LABEL LOC
+ DCA L53
+ TAD SYMOUT
+ SNA CLA /HOW MANY SUBSCRIPTS?
+ JMP .+7 /ONE - SKIP OUTPUTTING "TAD"
+ JMS I PROP
+ 6066
+ TAD I L41
+ JMS I DIM
+ JMS I PRSYM
+ JMS I PRINT
+ TAD I L41
+ JMS I MODE
+ JMP FP
+CASUB, TAD H200
+ TAD L40
+ DCA I L41 /STORE TRIPLE NUMBER WITH MODE BITS IN PD STACK
+ TAD SYMOUT /GET NUMBER OF ARGUMENTS (2 OR 3)
+ TAD C2
+ JMS I FPROP /PUT OUT A CALL TO THE SUBSCRIPTING ROUTINE
+ 6173 /TO THE SUBSCRIPTING ROUTINE
+ TAD SYMOUT
+ SNA CLA /ONLY ONE ARG?
+ JMP .+3 /YES - DON'T OUTPUT FIRST SUBSCRIPT
+ TAD L63
+ JMS SYMOUT
+ TAD L65
+ JMS SYMOUT
+ TAD LDUM /GET THE ARRAY NAME
+ JMS SYMOUT /OUTPUT IT AS AN ARGUMENT
+ TAD I L41
+ JMS I PRSYM /OUTPUT THE DESTINATION TEMPORARY
+ JMS I PRINT
+ TAD I L41
+ DCA L12 /MARK IT AS THE CONTENTS OF THE LAST LINE
+ JMP I FSUBSC /RETURN
+FP, JMS I PROP
+ OPCMA /OPCODE IS CMA
+ JMS I PRINT
+ TAD H400 /SET MODE TO FLOATING POINT
+ JMP CASUB
+SYMOUT, 0
+ DCA CHNG
+ TAD CHNG
+ SNA CLA
+ JMS I CLAB /CREATE LABEL IF DUMMY ARG
+ JMS I ARG
+ TAD CHNG
+ SNA /IS IT ZERO
+ JMS I ZER /YES PUT OUT A ZERO
+ JMS I PRSYM /OTHERWISE PUT OUT SUBSCRIPT
+ JMS I PRINT /PUT OUT A CRLF
+ JMP I SYMOUT
+
+LDSPCL, DCA L24
+ JMS I CREATE
+ JMS I PRCRL /CHANGE LAST LINE TO STORE IN NEW DESTINATION
+ DCA L12 /MARK LAST LINE USELESS FOR OPTOMIZATION
+ JMP LDMRET
+LDUM, 0
+ ISZ LDUM /INCREMENT RETURN
+ TAD I L42 /GET THE THING WHICH IS DUMMY
+ CIA
+ TAD L12 /DID WE JUST PUT THIS OUT AS A SUBSCRIPT
+ SNA CLA /DESTINATION??
+ JMP LDSPCL /YES - SAVE OODLES OF CODE
+ JMS I PROP
+ 6066 /PUT OUT A TAD
+ TAD I L42
+ JMS I PRSYM /PUT IT OUT
+ JMS I PRINT /PUT OUT A CRLF
+ JMS I PROP
+ 6071 /PUT OUT A DCA
+ JMS I CREATE /CREATE A LABEL
+ JMS I PRCRL /AND PRINT IT
+ JMS I PRINT /PUT OUT A CRLF
+ JMS I PROP
+ 6066
+ TAD I L42
+ JMS I PRSYM
+ TAD H43
+ JMS I PRINT
+ JMS I PRINT
+ JMS I PROP
+ 6071
+ TAD L53
+ JMS I PRCRL
+ TAD H43
+ JMS I PRINT
+LDMRET, JMS I PRINT
+ JMP I LDUM /RETURN
+CHNG, 0
+ TAD I L42 /NO...THERES TWO SUBSCRIPTS
+ SNA
+ TAD H6041
+ DCA I L42
+ TAD I L42
+ JMS I DUMARG /SEE IF SECOND SUBSC IS A DUMMY ARG
+ JMS I DUM /YES IT IS A DUMMY ARG
+ TAD I L42 /GET THE SECOND SUBSC
+ JMP I CHNG
+
+H400, 400
+H200, 200
+H43, 43
+FSUBSC, SUBRET
+H6041, 6041
+\f *7000
+IOHTMP,MCHAR, 0
+NPOINT,LLUNCH, 0
+ CLA
+ DCA L75
+ DCA L24 /ZERO "BUFFER WAITING TO PRINT" FLAG
+ DCA IMPDO /ZERO IMPLIED DO LOOP FLAG
+ TAD TTYPE /CHANGE TO TTY OUTPUT
+ DCA PUNCH
+ JMS I LLIST /TYPE THE CURRENT LINE
+ CLL CMA RAL
+ TAD KOUNT /USE THE BUFFER POINTER AS AN INDEX
+ SMA
+ CMA
+ DCA L7
+ TAD C40 /NOW PUT OUT SOME SPACES...
+ JMS I PRINT
+ ISZ L7
+ JMP .-3
+ TAD D36 /AND AN '^'
+ JMS I PRINT
+ JMS I PRINT
+ TAD LELIST /NOW TYPE THE ERROR MESSAGE
+ DCA L10
+UNCH1, TAD I L10
+ SZA /END OF TABLE?
+ TAD LLUNCH
+ SNA CLA /IS THIS THE MSG WE WANT?
+ JMP UNCH2
+ ISZ L10 /NO
+ JMP UNCH1
+UNCH2, TAD BASE
+ CIA
+ TAD I L10
+ JMS I LLIST /FAKE LISTER INTO PRINTING ERROR MESG
+ JMS I PRINT /FORCE BUFFER
+ TAD EPNCH /BACK TO PUNCH OUTPUT
+ DCA PUNCH
+ ISZ L75 /SET THE NON-PRINT SWITCH
+ TAD CHK /IF ERROR OCCURED WHILE PROCESSING END STMT.
+ TAD C4000 /CHK WILL BE 4000-WANT TO ABORT IMMEDIATELY
+ SZA CLA /WAS IT END STMT?
+ JMP START /NO-GO PROCESS NEXT STMT.
+ JMP I (THRU /YES-CLEAN UP AND ABORT
+LLIST, LIST
+D36, 36
+LELIST, ELIST-1 /ERROR LIST ...
+TTYPE, LTTYPE
+EPNCH, LPUNCH
+CTR, 0
+TEM, 0
+/ THIS ROUTINE PRINTS THE CONTENTS OF THE AC IN DECIMAL
+PARCT,LDCOUT, 0
+ DCA TEM /SAVE THE AC
+ TAD CM3 /WE WILL PUT OUT FOUR CHARACTERS
+ DCA CTR
+ TAD ASE /THIS IS THE ASE OF THE CONVERSION TABLE
+ DCA NPOINT /SAVE IT IN THE POINTER
+ DCA FLAG
+LOP, DCA MCHAR /ZERO OUT THE CHARACTER
+ TAD TEM /GET THE NUMBER AGAIN
+ TAD I NPOINT /TO GET THE ITEM IN THE TABLE
+ SPA /IS THE RESULT POSITIVE
+ JMP LOPRST /NO...RESTORE THE NUMBER
+ DCA TEM /AND SAVE THIS VALUE
+ TAD D60
+ DCA FLAG /SET FLAG TO SHOW THAT WE HAVE SOMETHING
+ ISZ MCHAR /YES...INCREMENT THE OUTPUT CHARACTER
+ JMP LOP+1 /TRY THE SEQUENCE AGAIN
+LOPRST, CLA
+ TAD MCHAR
+ TAD FLAG
+ SZA /DO WE HAVE A SIGNIFICANT DIGIT?
+ JMS I PRINT /YES - PRINT IT
+ ISZ NPOINT
+ ISZ CTR
+ JMP LOP /AND GET THE NEXT DIGIT
+ TAD TEM /GET THE CHARACTER TO OUTPUT
+ TAD D60 /PUT IT IN TRIMMED ASCII FORM
+ JMS I PRINT /PRINT IT
+ JMP I LDCOUT /YES...RETURN TO CALLING PROGRAM
+ASE, THOU
+FLAG, 0
+
+
+IOOPEN, TAD KOUNT
+ DCA IOHTMP /SAVE POINTER TO LEFT PAREN +1
+ CLA CMA
+ DCA PARCT /INITIALIZE PAREN COUNTER
+ TAD KOUNT
+ DCA TEM /TEM POINTS TO ENTITY (OR PREV ONE IF A VAR)
+IOPENL, JMS I ENTITY /GET SOMETHING
+ERR52, JMS I LUNCH /END OF STMT - BAD
+ JMP IOPENL /VARIABLE - DON'T UPDATE TEM
+D60, 60
+ JMP IOPENL-2 /CONSTANT - UPDATE TEM
+ TAD CM51 /PUNCTUATION - TEST FOR RIGHT PAREN
+ SNA
+ JMP IORPAR /YES
+ IAC
+ SNA /LEFT PAREN?
+ JMP IOLPAR
+ TAD CM25
+ SNA CLA /IF CHAR IS AN EQUAL SIGL
+ TAD PARCT
+ IAC
+ SZA CLA /AND WE ARE ON THE TOP LEVEL OF PARENTHESES
+ JMP IOPENL-2
+ TAD TEM /THEN WE HAVE AN IMPLIED DO
+ DCA KOUNT
+ JMS I DO /GENERATE DO LOOP CODE
+ JMP ERR52 /NOT TERMINATED WITH RPAR - ERROR
+ ISZ IMPDO /BUMP IMPLIED DO COUNT
+ TAD IOHTMP
+ DCA KOUNT /RESTORE CHAR PTR TO BEGINNING OF LOOP
+ JMP I .+1
+ IOH1+1 /COMPILE INNARDS OF LOOP
+
+IOLPAR, CLA CMA
+ TAD PARCT
+ JMP IOPENL-3 /BUMP PAREN COUNT UP AND LOOP
+
+IORPAR, ISZ PARCT /BUMP PAREN COUNT DOWN
+ JMP IOPENL-2 /LOOP IF NOT BALANCED
+ TAD IOHTMP
+ DCA KOUNT /BALANCED - NOT AN IMPLIED DO
+ JMP I .+1
+ IOH1BK /COMPILE NORMALLY
+CM25, -25
+DO, XDO
+\f *7200
+EQUI, JMS I LOOK /CHECK REST OF STATEMENT TYPE
+ -7 /THERE ARE 7 MORE CHARACTERS
+ -26 /V
+ -1 /-A
+ -14 /-L
+ -5 /-E
+ -16 /-N
+ -3 /-C
+ -5 /-E
+RETA, ISZ SNUM /INCREMENT THE STRING NUMBER
+ JMS CCCC /GET AND CHECK THE NEXT NON-BLANK CHARACTER
+ SKP /ONLY LEGAL CHAR HERE IS A "("
+ JMP RETB /WE GOT THE "("
+ NOP
+ JMP ERR59
+RETB, JMS I ENTITY /LOOK FOR A VARIABLE
+ SKP
+ JMP LA /GOT IT, ANYTHING ELSE IS AN ERROR
+ NOP
+ NOP
+ JMP ERR59
+LA, ISZ L32 /TURN EQUIVALENCE BIT ON
+ ISZ L32
+ TAD K57 /GET MASK FOR SYMBOL TABLE
+ DCA L21 /PUT IN THE SYMBOL TABLE SWITCH
+ JMS I SYMTAB /PUT IN SYMBOL TABLE
+ TAD L77 /GET THE POINTER
+ ISZ MIKE4 /AND PUT IN EQUIVALENCE TABLE
+ DCA I MIKE4
+ TAD SNUM /GET THE CURRENT STRING NUMBER
+ ISZ MIKE4 /AND PUT IT IN THE EQUIVALENCE TABLE
+ DCA I MIKE4
+ ISZ MIKE8 /INCREMENT NUMBER OF ENTRIES
+ JMS CCCC /GET NEXT PUNCTUATION
+ JMP ERR59 /C/R, THAT'S AN ERROR ...
+ JMP .+3 /LEFT PAREN, VARIABLE IS SUBSCRIPTED
+ JMP LB /COMMA, NOT SUBSCRIPTED, STRING CONTINUES
+ JMP LC /RIGHT PAREN, NOT SUBSCRIPTED, END OF STRING
+ JMS I ENTITY /LOOK FOR SUBSCRIPT
+ NOP
+ SKP
+ JMP LD /GOT IT, ANYTHING ELSE IS ERROR
+ NOP
+ JMP ERR59
+LD, CLA CMA /SUBTRACT ONE FROM
+ TAD L32 /FIRST SUBSCRIPT
+ DCA INTA /AND SAVE
+ JMS CCCC /GET NEXT PUNCTUATION
+ NOP /CR IS ILLEGAL HERE
+ JMP RETB-1 /SO IS LEFT PAREN
+ SKP /COMMA, DOUBLY SUBSCRIPTED
+ JMP LF /RIGHT PAREN, SINGLY SUBSCRIPTED
+ JMS I ENTITY /GET OTHER SUBSCRIPT
+ NOP
+ SKP
+ JMP LG /GOT IT
+ NOP
+ JMP LD-1
+LG, TAD L32 /SET IT NEGATIVE
+ CIA
+ DCA INTB /AND SAVE IT
+ JMS CCCC /GET NEXT PUNCTUATION
+ NOP
+ NOP
+ERR59, JMS I LUNCH
+ TAD L77 /RIGHT PAREN IS ONLY LEGAL CHARACTER
+ JMS I DIM /GET DIMENSION INFORMATION
+ DCA CCCC /AND SAVE
+ SKP /GO TO TEST PART OF LOOP
+ TAD CCCC /THIS LOOP IS A MAKESHIFT MULTIPLY
+ ISZ INTB /ARE WE DONE
+ JMP .-2 /NO
+ TAD INTA /YES, ADD FIRST SUBSCRIPT
+ DCA INTA /AND SAVE
+LF, TAD L77 /GET POINTER TO VARIABLE
+ JMS I MODE /WHAT MODE IS IT
+ TAD INTA /F.P., MULTIPLY BY THREE
+ RAL CLL /INTEGER
+ TAD INTA
+ IAC /ADD ONE TO ANSWER
+ ISZ MIKE4 /AND PUT IN EQUIVALENCE TABLE
+ DCA I MIKE4
+ JMS CCCC /GET NEXT PUNCTUATION
+ NOP
+ JMP RETB-1 /CR AND "(" ARE ILLEGAL HERE
+ JMP RETB /COMMA MEANS STRING NOT FINISHED
+ JMP LI /")" MEANS STRING FINISHED
+LC, CLA IAC /HERE WE CRAM A ONE INTO EQUIVALENCE
+ ISZ MIKE4
+ DCA I MIKE4
+LI, JMS CCCC /WE FINISHED A STRING, ARE THERE MORE
+ JMP START /NO
+ SKP
+ JMP RETA /YES
+ JMP RETB-1 /"(" AND ")" ARE ILLEGAL HERE
+LB, CLA IAC /CRAM A ONE INTO TABLE
+ ISZ MIKE4
+ DCA I MIKE4
+ JMP RETB /AND GO BACK
+/
+/ THIS"ROUTINE GETS AND CHECKS THE NEXT NON-BLANK CHAR
+/
+CCCC, 0
+ JMS I GNB
+ SNA /PUNCTUATION IS WHAT WE WANT
+ JMP I CCCC /ITS A CR
+ TAD CM54
+ SNA /IS IT A COMMA
+ JMP XCOMMA /YES
+ TAD C3
+ SNA /IS IT A ")"
+ JMP XRPAR /YES
+ IAC
+ SNA /IS IT A "("
+ JMP XLPAR /YES
+ JMP RETB-1 /NONE OF THE ABOVE
+XRPAR, ISZ CCCC
+XCOMMA, ISZ CCCC
+XLPAR, ISZ CCCC
+ JMP I CCCC
+K57, 57
+
+LFIN, JMS I GNB
+ SZA CLA
+ JMP I ASSIGN
+ JMS I ZZZ /PRINT LABEL ON "FINI"
+ JMP I .+1
+ IOH2
+
+/THE FOLLOWING CODE IS TO PROCESS THE EQUIVALENCE TABLE
+/AT THE END OF A COMPILATION
+\f *7376
+EEK, ISZ MIKE4
+ ISZ MIKE4
+ DCA I MIKE4 /SET END OF LIST
+ JMS INIT /INITIALIZE POINTERS
+AAB, TAD MA /SET POINTERS TO STRING NUMBERS
+ TAD C3
+ DCA MB
+ ISZ MA
+ ISZ MA
+AAC, ISZ MB
+AA, ISZ MB
+ TAD I MA /GET FIRST STRING NUMBER
+ CIA
+ TAD I MB /SUBTRACT FROM SECOND
+ SZA CLA /ARE THEY THE SAME
+ JMP KICK1 /NO, ADVANCE POINTERS
+ ISZ MA /YES, MOVE TO LINEAR SUBSCRIPT
+ ISZ MB
+ TAD I MA /GET FIRST SUBSC
+ CIA
+ TAD I MB /SUBTRACT FROM SECOND
+ SPA CLA SNA /IS FIRST ONE SMALLER
+ JMP KICK2 /NO, JUST ADVANCE POINTERS
+ TAD MA /YES, SWITCH PLACES
+ TAD CM2
+ DCA MA
+ TAD MB
+ TAD CM2
+ DCA MB
+ TAD CM3
+ DCA INIT
+RAUCH, TAD I MA
+ DCA L76
+ TAD I MB
+ DCA I MA
+ TAD L76
+ DCA I MB
+ ISZ MA
+ ISZ MB
+ ISZ INIT
+ JMP RAUCH
+ TAD MA
+ TAD CM2
+ DCA MA
+ JMP AA /NOW THEYRE SWITCHED, CHECK AGAIN
+KICK2, CLA CMA /MOVE BACK FIRST POINTER
+ TAD MA
+ DCA MA
+ JMP AAC
+KICK1, ISZ MA /MOVE UP FIRST POINTER
+ ISZ MIKE7 /ARE WE OUT OF ENTRIES
+ JMP AAB /NO
+/
+/ NOW THE SORTING IS DONE
+/
+ JMS INIT /INITIALIZE POINTERS
+ DCA TOTAL /ZERO OUT TOTAL
+MIKE2, ISZ MA
+ TAD I MA
+ JMS I PRSYM /PUT OUT THE SYMBOL
+ TAD C7240
+ JMS I P2 /PUT OUT THE TERMINATOR
+ IAC
+ TAD I MA
+ DCA L14
+ TAD I L14 /GET CONTROL BITS FROM SYMBOL TABLE
+ AND P20
+ SNA CLA /IS IT DIMENSIONED
+ JMP MIKE5 /NO
+ TAD I MA /YES, COMPUTE THE TOTAL LENGTH
+ JMS I DIM
+ DCA L26
+ TAD I L14
+ CIA
+ DCA L73
+ TAD L26
+ ISZ L73
+ JMP .-2
+ SKP /GOT IT
+MIKE5, IAC /IF NOT DIMENSIONED, USE ONE A LENGTH
+ DCA MB /SAVE LENGTH
+ TAD I MA
+ JMS I MODE /WHAT IS THE MODE OF THE SYMBOL
+ TAD MB /FP, MULTIPLY BY THREE
+ RAL CLL
+ TAD MB
+ DCA INIT /SAVE IT
+ TAD TOTAL /GET TOTAL REMAINING LENGTH OF STRING
+ CIA
+ TAD INIT /SUBTRACT CURRENT LENGTH FROM IT
+ SPA CLA /WHICH IS BIGGER
+ JMP .+3 /REMAINING PORTION IS BIGGER
+ TAD INIT /CURRENT PORTION IS BIGGER, REPLACE REMAINING PORTION
+ DCA TOTAL
+ ISZ MA
+ TAD MA
+ TAD C3
+ DCA MB
+ TAD I MB /GET NEXT ENTRY STRING NUMBER
+ CIA
+ TAD I MA /SUBTRACT CURRENT STRING NUMBER
+ SZA CLA /ARE THEY EQUAL
+ JMP MIKE1 /NO
+ ISZ MA /YES, GET THE DIFFERENCE
+ ISZ MB
+ TAD I MB
+ CIA
+ TAD I MA
+ DCA MB /AND SAVE
+ TAD MB /SUBTRACT DIFFERENCE FROM TOTAL REMAINING
+ CIA
+ TAD TOTAL
+MIKE6, DCA TOTAL /SAVE
+ TAD MB /GET THE DIFFERENCE
+ DCA L26
+ JMS I BSS /RESERVE THAT MANY LOCATIONS
+ ISZ MIKE7 /ARE WE DONE
+ JMP MIKE2 /NO
+ JMP I ROGER /YES
+MIKE1, TAD TOTAL /SWITCH TOTAL TO THE CURRENT LOCATION
+ DCA MB
+ ISZ MA /EQUALIZE POINTERS
+ JMP MIKE6
+/
+INIT, 0
+ TAD MIKE8 /GET ENTRY COUNT
+ CIA /SET NEGATIVE
+ DCA MIKE7 /SAVE
+ TAD POINTZ /GET TABLE POINTER
+ DCA MA /SAVE
+ JMP I INIT
+/
+ROGER, PTEMP
+P20, 20
+$
+
+\f