Added version 10 of basic. master
authorRichard Cornwell <rcornwell@github.com>
Sat, 2 Jan 2021 01:09:30 +0000 (20:09 -0500)
committerRichard Cornwell <rcornwell@github.com>
Sat, 2 Jan 2021 01:09:30 +0000 (20:09 -0500)
src/basic.mac [new file with mode: 0644]

diff --git a/src/basic.mac b/src/basic.mac
new file mode 100644 (file)
index 0000000..c650c36
--- /dev/null
@@ -0,0 +1,5982 @@
+TITLE  BASIC   V010\r
+SUBTTL         PARAMETERS AND TABLE\r
+\r
+;***COPYRIGHT 1969, 1970, 1971, 1972, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.***\r
+\r
+       JOBVER=137\r
+       LOC     JOBVER\r
+       OCT 10\r
+\r
+IFNDEF PURESW,<PURESW==1>\r
+\r
+;CONDITIONAL ASSEMBLY PARAMETERS\r
+;  THE VERSION OF BASIC SUPPLIED BY APPLIED LOGIC CORPORATION\r
+;  IS ASSEMBLED WITH THE PARAMETERS BELOW SET TO -1.  APPLIED\r
+;  LOGIC CORPORATION HAS NOT NECESSARILY TESTED VERSIONS OF\r
+;  BASIC ASSEMBLED OTHERWISE AND DOES NOT GUARANTEE TO\r
+;  MAINTAIN ANY SUCH VERSIONS.\r
+\r
+FTRND=-1               ;-1 IF RANDOM FACILITY, ELSE 0\r
+FTMAT=-1               ;-1 IF MATRIX FACILITY, ELSE 0\r
+FTSTR=-1               ;-1 IF STRING FACILITY, ELSE 0\r
+\r
+IFE PURESW,< RELOC >\r
+IFN PURESW,< HISEG >\r
+\r
+;AC DEFINITIONS\r
+                       ;PRINCIPAL USES:\r
+\r
+N=0                    ;RUNTIME ACCUMULATOR REGISTER\r
+T=1                    ;POINTER TO NXCH\r
+T1=2\r
+A=3                    ;SEARCH ARGUMENT\r
+B=4                    ;POINTER AFTER SEARCH\r
+C=5                    ;XWD CHARACTER-FLAGS,CHAR\r
+D=6                    ;BUILD INSTS HERE\r
+F=7                    ;FLAGS\r
+E=10\r
+G=11\r
+R=12                   ;POINTER TO ROLL BEING USED\r
+X1=13                  ;)\r
+X2=14                  ;)TEMP REGS\r
+Q=15                   ;PUSHDOWN LIST FOR FNX ARGS.\r
+L=16\r
+LP=16\r
+P=17                   ;PUSHDOWN LIST\r
+\r
+\f\r
+STAFLO:\r
+       Z       XCHAN+60000(SIXBIT /   CHA/)\r
+       Z       XDATA+40000(SIXBIT /   DAT/)\r
+       Z       XDEF+40000(SIXBIT /   DEF/)\r
+       Z       XDIM+0(SIXBIT /   DIM/)\r
+       Z       XEND+0(SIXBIT /   END/)\r
+       Z       XFNEND+60000(SIXBIT /   FNE/)\r
+       Z       XFOR+20000(SIXBIT /   FOR/)\r
+       Z       XGOSUB+60000(SIXBIT /   GOS/)\r
+       Z       XGOTO+60000(SIXBIT /   GOT/)\r
+       Z       XIF+20000(SIXBIT /   IF /)\r
+       Z       XINPUT+60000(SIXBIT /   INP/)\r
+       Z       XLET+20000(SIXBIT /   LET/)\r
+IFN FTMAT,<\r
+       Z       XMAT+20000(SIXBIT /   MAT/)\r
+>\r
+       Z       XNEXT+60000(SIXBIT /   NEX/)\r
+       Z       XON+20000(SIXBIT /   ON /)\r
+       Z       XPRINT+60000(SIXBIT /   PRI/)\r
+IFN FTRND,<\r
+       Z       XRAN+60000(SIXBIT /   RAN/)\r
+>\r
+       Z       XREAD+60000(SIXBIT /   REA/)\r
+       Z       NXTST1+0(SIXBIT /   REM/)\r
+       Z       XREST+40000(SIXBIT /   RES/)\r
+       Z       XRETRN+60000(SIXBIT /   RET/)\r
+       Z       XSTOP+40000(SIXBIT /   STO/)\r
+STACEI:\r
+\f;TABLE OF BASIC COMMANDS\r
+\r
+DEFINE YYY (A,B)<\r
+       EXP     SIXBIT /A/ + 'A'ER + 'B'0000>\r
+\r
+CMDFLO: YYY DEL,4\r
+       YYY LEN,4\r
+       YYY LIS,4\r
+       YYY NEW\r
+       YYY OLD\r
+       YYY REN,4\r
+       YYY REP,4\r
+       YYY RES,4\r
+       YYY RUN\r
+       YYY SAV,4\r
+       YYY SCR,4\r
+       YYY SYS,4\r
+       YYY WEA,4\r
+CMDCEI:\r
+\f;CHARACTER TYPE TABLE.\r
+;FLAGS IN LEFT HALF OF CTTAB+<LETTER> FOR <LETTER> BELOW 100,\r
+;FLAGS IN RIGHT HALF OF CTTAB+<LETTER-100> OTHERWISE.\r
+\r
+DEFINE WWW (FL,VAL)<\r
+       XLIST\r
+FL=<   Z       0,(VAL)>\r
+       LIST>\r
+\r
+WWW F.APOS,1B0         ;       '\r
+WWW F.COMA,1B1         ;       ,\r
+WWW F.CR,1B2           ;       <RETURN,        OR      LF,VT,FFEED>\r
+WWW F.DIG,1B3          ;       <NUMERAL>\r
+WWW F.DOLL,1B17\r
+WWW F.EQAL,1B4         ;       =\r
+WWW F.ESC,1B5          ;       <ESCAPE OR      ALTMODE>\r
+WWW F.LCAS,1B6         ;       <LOWER  CASE    LETTER>\r
+WWW F.LETT,1B7         ;       <LOWER  OR      UPPER   CASE    LETTER>\r
+WWW F.STR,1B8          ;       (\r
+WWW F.MINS,1B9         ;       -\r
+WWW F.PER,1B10         ;       .\r
+WWW F.PLUS,1B11                ;       +\r
+WWW F.QUOT,1B12                ;       "\r
+WWW F.RPRN,1B13                ;       )\r
+WWW F.SLSH,1B14                ;       /\r
+WWW F.STAR,1B15                ;       *\r
+WWW F.SPTB,1B16                ;       <SPACE  OR      TAB>\r
+\r
+F.NU=0                 ;ASCII CODES THAT ARE TREATED AS NULLS.\r
+F.OTH=0                        ;OTHER CHARACTERS ANALYSED BY BASIC WITHOUT THE USE OF FLAGS.\r
+\r
+F.TERM=F.CR+F.APOS     ;EITHER TERMINATES THE ANALYZABLE PORTION OF A BASIC STATEMENT.\r
+\r
+\fCTTAB:\r
+       XWD     F.NU,   F.STR   ;NULL   , @\r
+       XWD     F.STR,  F.LETT  ;       , A\r
+       XWD     F.STR,  F.LETT  ;       , B\r
+       XWD     F.STR,  F.LETT  ;       , C\r
+       XWD     F.STR,  F.LETT  ;       , D\r
+       XWD     F.STR,  F.LETT  ;       , E\r
+       XWD     F.STR,  F.LETT  ;       , F\r
+       XWD     F.STR,  F.LETT  ;       , G\r
+       XWD     F.STR,  F.LETT  ;       , H\r
+       XWD     F.SPTB, F.LETT  ;TAB    , I\r
+       XWD     F.CR,   F.LETT  ;LF     , J\r
+       XWD     F.CR,   F.LETT  ;VER.TAB, K\r
+       XWD     F.CR,   F.LETT  ;FFEED  , L\r
+       XWD     F.CR,   F.LETT  ;CR     , M\r
+       XWD     F.STR,  F.LETT  ;       , N\r
+       XWD     F.STR,  F.LETT  ;       , O\r
+       XWD     F.STR,  F.LETT  ;       , P\r
+       XWD     F.STR,  F.LETT  ;       , Q\r
+       XWD     F.STR,  F.LETT  ;       , R\r
+       XWD     F.STR,  F.LETT  ;       , S\r
+       XWD     F.STR,  F.LETT  ;       , T\r
+       XWD     F.STR,  F.LETT  ;       , U\r
+       XWD     F.STR,  F.LETT  ;       , V\r
+       XWD     F.STR,  F.LETT  ;       , W\r
+       XWD     F.STR,  F.LETT  ;       , X\r
+       XWD     F.STR,  F.LETT  ;       , Y\r
+       XWD     F.STR,  F.LETT  ;       , Z\r
+       XWD     F.ESC,  F.STR   ;ESC    , [\r
+       XWD     F.STR,  F.STR   ;       , \\r
+       XWD     F.STR,  F.STR   ;       , ]\r
+       XWD     F.STR,  F.OTH   ;       , ^\r
+       XWD     F.STR,  F.OTH   ;       , _\r
+\f      XWD     F.SPTB, F.STR           ;SPACE  , <ACCENT GRAVE>\r
+       XWD     F.STR,  F.LETT+F.LCAS   ;       !       , <LOWER CASE>  A\r
+       XWD     F.QUOT, F.LETT+F.LCAS   ;       "       , <LOWER CASE>  B\r
+       XWD     F.STR,  F.LETT+F.LCAS   ;       #       , <LOWER CASE>  C\r
+       XWD     F.DOLL, F.LETT+F.LCAS   ;       $       , <LOWER CASE>  D\r
+       XWD     F.STR,  F.LETT+F.LCAS   ;       %       , <LOWER CASE>  E\r
+       XWD     F.OTH,  F.LETT+F.LCAS   ;       &       , <LOWER CASE>  F\r
+       XWD     F.APOS, F.LETT+F.LCAS   ;       '       , <LOWER CASE>  G\r
+       XWD     F.OTH,  F.LETT+F.LCAS   ;       (       , <LOWER CASE>  H\r
+       XWD     F.RPRN, F.LETT+F.LCAS   ;       )       , <LOWER CASE>  I\r
+       XWD     F.STAR, F.LETT+F.LCAS   ;       *       , <LOWER CASE>  J\r
+       XWD     F.PLUS, F.LETT+F.LCAS   ;       +       , <LOWER CASE>  K\r
+       XWD     F.COMA, F.LETT+F.LCAS   ;       ,       , <LOWER CASE>  L\r
+       XWD     F.MINS, F.LETT+F.LCAS   ;       -       , <LOWER CASE>  M\r
+       XWD     F.PER,  F.LETT+F.LCAS   ;       .       , <LOWER CASE>  N\r
+       XWD     F.SLSH, F.LETT+F.LCAS   ;       /       , <LOWER CASE>  O\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       0       , <LOWER CASE>  P\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       1       , <LOWER CASE>  Q\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       2       , <LOWER CASE>  R\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       3       , <LOWER CASE>  S\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       4       , <LOWER CASE>  T\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       5       , <LOWER CASE>  U\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       6       , <LOWER CASE>  V\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       7       , <LOWER CASE>  W\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       8       , <LOWER CASE>  X\r
+       XWD     F.DIG,  F.LETT+F.LCAS   ;       9       , <LOWER CASE>  Y\r
+       XWD     F.OTH,  F.LETT+F.LCAS   ;       :       , <LOWER CASE>  Z\r
+       XWD     F.OTH,  F.STR           ;       ;       , <LEFT BRACE>\r
+       XWD     F.OTH,  F.STR           ;       <       , <VERTICAL BAR>\r
+       XWD     F.EQAL, F.STR           ;       =       , <RIGHT BRACE>\r
+       XWD     F.OTH,  F.STR           ;       >       , <TILDE>\r
+       XWD     F.STR,  F.STR           ;       ?       , <RUBOUT>\r
+\fDEFINE FAIL (A,AC)<\r
+       XLIST\r
+       XWD     001000+AC'00,[ASCIZ /A/]\r
+       LIST\r
+>\r
+\r
+%OPD=1 ;OPDEF UUO COUNTER\r
+DEFINE OPCNT (A)<\r
+%OPD=%OPD+1\r
+IFG %OPD-37,<PRINTX <TOO MANY UUO'S>>\r
+OPDEF A [<%OPD>B8]>\r
+       OPCNT   (PRNM)\r
+       OPCNT   (PRDL)\r
+       OPCNT   (GOSUB)\r
+       OPCNT   (ARFET1)\r
+       OPCNT   (ARFET2)\r
+       OPCNT   (ARSTO1)\r
+       OPCNT   (ARSTO2)\r
+       OPCNT   (ARSTN1)\r
+       OPCNT   (ARSTN2)\r
+       OPCNT   (DATA)\r
+       OPCNT   (ADATA1)\r
+       OPCNT   (ADATA2)\r
+       OPCNT   (SDIM)\r
+IFN FTMAT,<\r
+       OPCNT   (MATRD)\r
+       OPCNT   (MATPR)\r
+       OPCNT   (MATSCA)\r
+       OPCNT   (MATCON)\r
+       OPCNT   (MATIDN)\r
+       OPCNT   (MATTRN)\r
+       OPCNT   (MATINV)\r
+       OPCNT   (MATADD)\r
+       OPCNT   (MATSUB)\r
+       OPCNT   (MATMPY)\r
+       OPCNT   (MATZER)\r
+>\r
+       OPCNT   (PRNTB)\r
+IFN FTSTR,<\r
+       OPCNT   (STRUUO)\r
+       OPCNT   (SVRADR)\r
+       OPCNT   (PRSTR)\r
+>\r
+       OPCNT   (DONFOR)\r
+       OPCNT   (MATINP)\r
+\r
+MAXUUO=%OPD\r
+\r
+UUOHAN: PUSH   P,UUOH          ;RETURN ADDRS ON PUSH-DOWN LIST\r
+       LDB     X1,[POINT 9,40,8]\r
+UUOTBL: JRST   .(X1)\r
+\r
+       JRST    FAILER\r
+       JRST    PRNMER\r
+       JRST    PRDLER\r
+       JRST    GOSBER\r
+       JRST    AFT1ER\r
+       JRST    AFT2ER\r
+       JRST    AST1ER\r
+       JRST    AST2ER\r
+       JRST    ASN1ER\r
+       JRST    ASN2ER\r
+       JRST    DATAER\r
+       JRST    ADT1ER\r
+       JRST    ADT2ER\r
+       JRST    SDIMER\r
+IFN FTMAT,<\r
+       JRST    MTRDER\r
+       JRST    MTPRER\r
+       JRST    MTSCER\r
+       JRST    MTCNER\r
+       JRST    MTIDER\r
+       JRST    MTTNER\r
+       JRST    MTIVER\r
+       JRST    MTADER\r
+       JRST    MTSBER\r
+       JRST    MTMYER\r
+       JRST    MTZRER\r
+>\r
+       JRST    PRNTBR\r
+IFN FTSTR,<\r
+       JRST    SUUOEX\r
+       JRST    SAD1ER\r
+       JRST    PRSTRR\r
+>\r
+       JRST    FORCOM\r
+       JRST    MATIN\r
+IFN FTSTR,<\r
+SUUOEX:\r
+       LDB X1,[POINT 4,40,12]          ;STRING UUOS USE THE AC FIELD\r
+       CAILE X1,MASUUO                 ;AS AN EXTENSION OF THE OPCODE.\r
+       HALT .\r
+UUOSTR:        JRST    .(X1)\r
+       JRST    GETSTR\r
+       JRST    STRCHA\r
+       JRST    IFSTR\r
+       JRST    SDATAE\r
+       JRST    GETVEC\r
+       JRST    PUTVEC\r
+MASUUO=.-UUOSTR-1\r
+       OPDEF   STRIN   [STRUUO 1,]     ;33040\r
+       OPDEF   STRSTO  [STRUUO 2,]     ;33100\r
+       OPDEF   STRIF   [STRUUO 3,]     ;33140\r
+       OPDEF   STOCHA  [STRUUO 4,]     ;33200\r
+       OPDEF   VECFET  [STRUUO 5,]     ;33240\r
+       OPDEF   VECPUT  [STRUUO 6,]     ;33300\r
+>;ASSEMBLE ABOVE IF INCLUDING STRING FACILITY\r
+\f;TABLE OF INTRINSIC FUNCTIONS\r
+\r
+IFNFLO:\r
+       Z       ABSB+0(SIXBIT /   ABS/)\r
+       Z       ATANB+0(SIXBIT /   ATN/)\r
+       Z       COSB+0(SIXBIT /   COS/)\r
+       Z       COTB+0(SIXBIT /   COT/)\r
+       Z       DETB+40000(SIXBIT /   DET/)\r
+       Z       EXPB+0(SIXBIT /   EXP/)\r
+       Z       INTB+0(SIXBIT /   INT/)\r
+       Z       LOGB+0(SIXBIT /   LOG/)\r
+       Z       NUMB+40000(SIXBIT /   NUM/)\r
+IFN FTRND,<\r
+       Z       RANB+40000(SIXBIT /   RND/)\r
+>\r
+       Z       SGNB+0(SIXBIT /   SGN/)\r
+       Z       SINB+0(SIXBIT /   SIN/)\r
+       Z       SQRTB+0(SIXBIT /   SQR/)\r
+       Z       TANB+0(SIXBIT /   TAN/)\r
+IFNCEI:\r
+\r
+\f;TABLE OF RELATIONS FOR IFSXLA\r
+\r
+DEFINE ZZZ. (X,Y)<\r
+OPDEF ZZZZ.    [X]\r
+               ZZZZ.   (Y)>\r
+RELFLO: ZZZ.   3435B11,CAML\r
+       ZZZ.    3436B11,CAME\r
+       ZZZ.       74B6,CAMLE\r
+       ZZZ.    3635B11,CAMG\r
+       ZZZ.    75B6,CAMN\r
+       ZZZ.       76B6,CAMGE\r
+RELCEI:\r
+\r
+BASIC: CALLI\r
+       MOVE    P,PLIST\r
+       SETOM   RENFLA\r
+       SKIPN   ONCESW\r
+       JRST    BASI1\r
+       SETZM   ONCESW\r
+       HLRZ    T,JOBSA\r
+       MOVEM   T,FLTXT\r
+       MOVEM   T,CETXT\r
+       MOVE    T,JOBREL\r
+       MOVEM   T,FLLIN\r
+       MOVEM   T,CELIN\r
+       HRLM    T,JOBSA\r
+       HRRZI   T,REENTR\r
+       HRRM    T,JOBREN\r
+       SETOM   174\r
+       JFOV    .+1\r
+       JRST    .+1\r
+       JFOV    .+2\r
+       SETZM   174\r
+BASI1: PUSHJ   P,TTYIN         ;SET UP BUFFERS AND INIT TTY\r
+       SKIPE   CURNAM\r
+       JRST    UXIT\r
+       SETZM   RUNFLA\r
+ASKNEW:        PUSHJ   P,INLMES\r
+       ASCIZ   /\r
+NEW OR OLD--/\r
+FIXUP: OUTPUT\r
+       MOVEI   X1,OVFLCM               ;IGNORE OVFLOW DURING COMMANDS.\r
+       HRRM    X1,JOBAPR\r
+       MOVEI   X1,10           ;SETUP ARITH OVFLOW TRAP\r
+       CALL    X1,[SIXBIT /APRENB/]\r
+       MOVEI   X1,TXTROL\r
+       MOVEM   X1,TOPSTG       ;EDIT TIME. ONLY TXTROL IS STODGY.\r
+                               ;OTHER ROLLS MOVE.\r
+       MOVE    T,CELIN ;CLOBBER ALL COMPILE ROOLS WITH "CELIN"\r
+       MOVEI   X1,LINROL       ;PROTECT TXTROL +LINROL FROM CLOBBER:\r
+       PUSHJ   P,CLOB\r
+                               ;FALL INTO MAINLP\r
+;MAIN LOOP FOR EDITOR/MONITOR\r
+\r
+MAINLP:        MOVE    P,PLIST\r
+       PUSHJ   P,LOCKOF        ;TURN OFF REENTR LOCK\r
+       PUSHJ   P,INLINE        ;READ A LINE\r
+       PUSHJ   P,GETNUM        ;LOOK FOR SEQUENCE NO\r
+       JRST    COMMAN          ;NONE.  GO INTERPRET COMMAND\r
+       SKIPN   CURNAM          ;MAKE SURE THERE IS A CURRENT FILE NAME\r
+       JRST    ASKNEW\r
+\r
+;HERE, WE HAVE SEQUENCED LINE INPUT.  NUMBER IS IN N,\r
+;POINTER TO FIRST CHAR AFTER NUMBER IS IN T\r
+\r
+       PUSHJ   P,LOCKON\r
+       PUSHJ   P,ERASE\r
+       PUSHJ   P,INSERT\r
+       PUSHJ   P,LOCKOF\r
+       JRST    MAINLP\r
+\r
+;HERE ON COMMAND\r
+\r
+COMMAN:        MOVEI   R,CMDROL\r
+       TLNE    C,F.TERM        ;TEST FOR NULL COMMAND\r
+       JRST    MAINLP\r
+       PUSHJ   P,SCNLT1        ;SCAN COMMAND\r
+       PUSHJ   P,SCNLT2\r
+       JRST    COMM1           ;SECOND CHAR NOT A LETTER\r
+       PUSHJ   P,SCNLT3\r
+       JRST    COMM1           ;THIRD CHAR NOT A LETTER\r
+\r
+;NOW THE FIRST THREE LETTERS OF THE COMMAND ARE PACKED IN LH OF A.\r
+\r
+       PUSHJ   P,SEARCH        ;LOOK FOR COMMAND\r
+       JRST    COMM1           ;NOT FOUND\r
+       HRRZ    X1,(B)\r
+       SKIPE   CURNAM\r
+       JRST    COM1\r
+       CAIE    X1,OLDER\r
+       CAIN    X1,NEWER\r
+       JRST    COM1\r
+       JRST    ASKNEW\r
+COM1:  TRZN    X1,40000\r
+       JRST    (X1)\r
+       PUSHJ   P,QST\r
+       JRST    COMM1\r
+       JRST    1(X1)\r
+\f\r
+;DELETE (DEL) ROUTINE\r
+DELER: ASCIZ   /ETE/\r
+       TLNE    C,F.TERM\r
+       JRST    BADDEL\r
+       PUSHJ   P,LIMITS\r
+       MOVE    A,FRSTLN\r
+       MOVS    B,LASTLN\r
+       CAIN    B,1\r
+       MOVEM   A,LASTLN\r
+       PUSHJ   P,DELL1\r
+       JRST    N,UXIT\r
+DELL1: MOVE    A,FLLIN         ;FIND FIRST LINE TO DELETE\r
+DELL2: CAML    A,CELIN\r
+       POPJ    P,              ;TEHRE IS NONE\r
+       HLRZ    N,(A)           ;GET LINE NO\r
+       CAMLE   N,LASTLN        ;DONE?\r
+       POPJ    P,\r
+       CAMGE   N,FRSTLN\r
+       AOJA    A,DELL2\r
+       PUSHJ   P,LOCKON\r
+       PUSHJ   P,ERASE\r
+       PUSHJ   P,LOCKOF\r
+       JRST    DELL1\r
+\r
+\f;WEAVE COMMAND\r
+WEAER: ASCIZ   /VE/\r
+       SETZM   BADGNN\r
+       PUSHJ   P,FILNAM\r
+       JUMP    N,WEAV\r
+       OPEN    N,WEAVI\r
+       JRST    NOGETD\r
+       LOOKUP  FILDIR\r
+       JRST    NOGETF\r
+GETT2: INBUF   1\r
+GETT1: PUSHJ   P,INLINE+1\r
+       PUSHJ   P,GETNUM\r
+       JRST    BADGET\r
+       MOVEM   N,BADGNN\r
+       PUSHJ   P,LOCKON\r
+       PUSHJ   P,ERASE\r
+       PUSHJ   P,INSERT\r
+       PUSHJ   P,LOCKOF\r
+       JRST    GETT1\r
+\r
+;LENGTH OF PROGRAM IN CORE.\r
+\r
+LENER: ASCIZ   /GTH/\r
+       PUSHJ   P,LOCKON\r
+       PUSHJ   P,PRESS\r
+       PUSHJ   P,LOCKOF\r
+       MOVE    T,CETXT\r
+       SUB     T,FLTXT\r
+       IMULI   T,5\r
+       PUSHJ   P,PRTNUM\r
+       PUSHJ   P,INLMES\r
+       ASCIZ   / CHARACTERS/\r
+       PUSHJ   P,PCRLF\r
+       JRST    N,FIXUP\r
+\r
+\f;ROUTINE TO LIST FILE\r
+\r
+LISER: ASCIZ   /T/\r
+       SETZI   F,              ;ASSUME NO HEADINER DESIRED.\r
+       PUSHJ   P,QSA\r
+       ASCIZ   /NH/\r
+       SETOI   F,              ;HEADER IS DESIRED, OR CMD ERROR\r
+       PUSHJ   P,LIMITS\r
+       JUMPE   F,LIST1         ;SKIP HEADING-\r
+       PUSHJ   P,INLMES        ;NO, PRINT IT.\r
+       ASCIZ /\r
+\r
+/\r
+       PUSHJ   P,LIST01                ;TYPE THE HEADING\r
+       PUSHJ   P,INLMES                ;AND A FEW BLANK LINES\r
+       ASCIZ /\r
+\r
+\r
+\r
+/\r
+       JRST N,LIST1\r
+LIST01:        PUSH P,T                ;SAVE POINTER TO INPUT LINE\r
+       PUSH P,C                ;SAVE CURRENT CHAR.\r
+       HLRZ T,CURDEV\r
+       CAIN T,(SIXBIT /DSK/)   ;PRINT DEVICE ONLY IF UNCOMMON.\r
+       JRST LIST02\r
+       HRLZ T,T\r
+       TRO T,320000\r
+       PUSHJ P,PRNSIX          ;PRINT THE DEVICE NAME\r
+LIST02:        MOVE T,CURNAM\r
+       PUSHJ P,PRNSIX\r
+       HLRZ T,CUREXT           ;DONT PRINT EXT. UNLESS UNCOMMON\r
+       CAIN T,(SIXBIT /BAS/)\r
+       JRST LIST03\r
+       TLO T,16                ;INSERT SIXBIT "." BEFORE EXT\r
+       PUSHJ P,PRNSIX\r
+LIST03:        PUSHJ P,TABOUT          ;EXECUTE A FORMAT ","\r
+       CALL X2,[SIXBIT /TIMER/]\r
+       IDIVI X2,^D3600\r
+       IDIVI X2,^D60\r
+       MOVEI A,":"             ;THE SEPARATION CHAR BETWEEN FIELDS.\r
+       PUSHJ P,PRDE2\r
+       PUSHJ P,TABOUT                  ;ANOTHER FORMAT ","\r
+       CALL X2,[SIXBIT /DATE/]\r
+       IDIVI X2,^D31\r
+       AOJ Q,\r
+       MOVE X1,X2\r
+       IDIVI X1,^D12\r
+       AOJ X2,\r
+       MOVEI A,57\r
+       ADDI X1,^D64\r
+       EXCH X1,X2\r
+       EXCH X2,Q\r
+       PUSHJ P,PRNS2\r
+       POP P,C\r
+       POP P,T\r
+       POPJ P,\r
+LIST1: MOVE A,FLLIN\r
+LIST2: CAML A,CELIN\r
+       JRST N,LIST3\r
+       HLRZ T,(A)\r
+       CAMG T,LASTLN\r
+       CAMGE T,FRSTLN\r
+       AOJA A,LIST2\r
+       PUSHJ P,PRTNUM\r
+LIST25:        MOVE T,(A)\r
+       MOVEI D,15              ;QUOTE CHAR\r
+       PUSHJ P,PRINT\r
+       PUSHJ P,INLMES\r
+       ASCIZ /\r
+/\r
+       AOJA A,LIST2\r
+LIST3: CLOSE\r
+       JRST BASIC\r
+NEWER: SETZM   OLDFLA          ;FLAG WOULD BE -1 FOR "OLD" REQUEST.\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /NEW /\r
+       JRST    NEWOLD\r
+OLDER: SETOM   OLDFLA\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /OLD /\r
+NEWOLD:        PUSHJ   P,INLMES\r
+       ASCIZ /FILE NAME--/\r
+       OUTPUT\r
+       PUSHJ   P,INLINE\r
+       PUSHJ   P,FILNAM\r
+       JUMP    NEWOL1\r
+       SKIPN   OLDFLA\r
+       JRST    NEWOL2\r
+       OPEN    SPEC\r
+       JRST    NOGETD\r
+       SKIPE   OLDFLA\r
+       JRST    NEWOL3\r
+       LOOKUP  FILDIR\r
+       JRST    NEWOL2\r
+NEWOL3:        LOOKUP  FILDIR\r
+       JRST    NOGETF\r
+NEWOL2:        MOVE    C,[XWD  F.CR,15]\r
+       PUSHJ   P,LIMIT1\r
+       PUSHJ   P,SCRER1\r
+       PUSHJ   P,NAMOVE        ;ACCEPT NEW CURRENT FILNAME\r
+       MOVE    X1,NEWOL1\r
+       MOVEM   X1,CURDEV\r
+       SKIPE   OLDFLA\r
+       JRST    GETT2           ;OLD FILE. FINISH BY GETTING IT.\r
+       JRST    BASIC\r
+       ;ROUTINE TO CHANGE CURRENT NAME\r
+\r
+RENER: ASCIZ /AME/\r
+       TLNN    C,F.TERM        ;IS THERE A NAME TO RENAME TO?\r
+       JRST    N,RENA1         ;YES\r
+       PUSHJ   P,INLMES        ;PROMPT USER FOR A NAME\r
+       ASCIZ /FILE NAME--/\r
+       OUTPUT\r
+       PUSHJ   P,INLINE        ;THERE BETTER BE A NAME NOW.\r
+RENA1: PUSHJ   P,FILNAM        ;REQUEST FOR NEW FILE\r
+       JUMP    CURDEV          ;SAVE DEVICE IN CURNAM\r
+       TLNN    C,F.TERM\r
+       JRST    COMM1\r
+       PUSHJ   P,NAMOVE        ;SET CURINFO FROM FILDIR\r
+       JRST    UXIT\r
+                               ;ROUTINE TO SAVE NEW COPY OR AN OLD FILE\r
+REPER: ASCIZ /LACE/\r
+       SETOM   OLDFLA\r
+       JRST    SAVFIL\r
+\f;ROUTINE TO RENUMBER THE BASIC PROGRAM THAT IS IN CORE.\r
+;THE COMMAND IS\r
+;      RESEQUENCE NN,MM,LL\r
+;WHERE NN IS THE FIRST NUMBER AND LL IS THE STEP VALUE.\r
+;IF OMITTED, LL, OR BOTH NUMBERS=10\r
+\r
+;ALL LINE NUMBERS LESS THAN MM WILL NOT BE RESEQUENCED. MM MUST NOT\r
+;BE GREATER THAN NN\r
+\r
+;A NUMBER IS A LINE NUMBER IF:\r
+;IT IS THE FIRST ATOM ON A LINE.\r
+;      IT FOLLOWS AN ATOM BEGINNING WITH THE LETTERS:\r
+;              "GOS"   OR   "GOT"   OR   "THE"\r
+;ALSO, AFTER THE ATOM "GOTO" HAS BEEN IDENTIFIED, THE NUMBER\r
+\r
+;FOLLOWING A COMMA IS A LINE NUMBER.\r
+;REENTRY IS NOT ALLOWED DURING "RESEQUENCE".\r
+\r
+RESER: ASCIZ /EQUENCE/\r
+       PUSHJ   P,LIMITS\r
+       MOVE    LASTLN          ;GET THE SECOND NUMBER(::=LOWEST)\r
+       HRRZM   N,LOWEST\r
+       MOVEI   N,^D10          ;IF FIRST ARG=0, ASSUME FIRST LINE=10\r
+       SKIPN   FRSTLN\r
+       MOVEM   N,FRSTLN\r
+       TLNN    C,F.COMA        ;IS THERE A THIRD ARG (THE INCREMENT)?\r
+       JRST    RES1            ;NO. LET INCREMENT =^D10\r
+       PUSHJ   P,NXCH\r
+       PUSHJ   P,GETNUM\r
+       JRST    COMM1\r
+RES1:  MOVEM   N,LASTLN\r
+       HRLZ    A,LOWEST        ;SEARCH FOR FIRST LINE TO CHANGE\r
+       MOVEI   R,LINROL\r
+       PUSHJ   P,SEARCH\r
+       JFCL\r
+       CAMN    B,FLLIN         ;RESEQ ALL LINES?\r
+       JRST    SEQ0            ;YES\r
+       HLRZ    N,-1(B)         ;NO. MAKE SURE LINE ORDER WILL NOT CHANGE\r
+       CAML    N,FRSTLN\r
+       JRST    RESERR\r
+SEQ0:  MOVN    X2,B\r
+       ADD     X2,CELIN        ;THIS IS THE NUMBER OF LINES TO RESEQ\r
+       SUBI    X2,1\r
+       IMUL    X2,LASTLN\r
+       ADD     X2,FRSTLN\r
+       CAILE   X2,^D99999\r
+       JRST    N,SEQOV\r
+       PUSHJ   P,LOCKON        ;DONT ALLOW REENTRY.\r
+       MOVE    E,CELIN         ;COMPUTE NUMBER OF LINES\r
+       SUB     E,B\r
+       JUMPE   E,UXIT          ;NOTHING TO RENUMBER\r
+       MOVN    LP,E\r
+       MOVSI   LP,(LP)\r
+       SUB     B,FLLIN\r
+       MOVEM   B,LOWSTA\r
+       HRR     LP,B\r
+       PUSH    P,LP            ;SAVE LP FOR SECOND LOOP.\r
+       HRL     B,B\r
+       SUB     LP,B\r
+\r
+;THE LOOP THAT COPIES EACH LINE FOLLOWS:\r
+SEQ2:  MOVE    D,[POINT 7,LINB0]       ;BUILD EACH LINE IN LINB0. THEN RESINSERT IT.\r
+       MOVEM   D,SEQPNT\r
+       HRRZ    F,LP\r
+       ADD     F,FLLIN\r
+       HRRZ    T,(F)\r
+       HRLI    T,440700        ;POINTER TO OLD LINE IS IN G\r
+                               ;F USED AS A FLAG REGISTER FOR " ' ETC.\r
+;THE FLAGS ARE\r
+                       REST.F=1        ;COPY  THE REST (APOST SEEN)\r
+                       TOQU.F=2        ;COPY TO QUOTE SIGN\r
+                       COMM.F=4        ;LINE NUMBER FOLLOWS ANY COMMA\r
+                       NUM.F=10        ;NEXT NUMBER IS LINE NUMBER\r
+\r
+\f;THE CHARACTER/ATOM LOOP:\r
+SEQ3:  PUSHJ   P,NXCHS         ;GET NEXT CHAR, EVEN IF SPACE OR TAB\r
+SEQ31: TLNE    C,F.CR\r
+       JRST    SEQCR\r
+       TLNE    C,F.QUOT        ;TEST FOR QUOTE CHAR\r
+       TLCA    F,TOQU.F        ;REVERSE QUOTE SWITCH AND COPY THIS CHAR\r
+       TLNE    F,TOQU.F\r
+       JRST    SEQCPY\r
+       TLNE    C,F.APOS\r
+       TLOA    F,REST.F        ;APOST SEEN, COPY REST\r
+       TLNE    F,REST.F\r
+       JRST    SEQCPY\r
+       MOVE    G,T             ;SAVE POINTER\r
+       TLNN    F,NUM.F         ;EXPECTING A LINE NUMBER?\r
+       JRST    SEQ4            ;NO. LOOK FOR KEYW ATOMS\r
+       TLNN    C,F.DIG\r
+       JRST    SEQCPY\r
+       JRST    SEQNUM\r
+SEQ4:  TLNE    F,COMM.F\r
+       TLNN    C,F.COMA\r
+       JRST    SEQ5\r
+       TLO     F,NUM.F         ;THIS COMMA IMPLIES NUMBER TO FOLLOW\r
+       JRST    SEQCPY\r
+SEQ5:  PUSHJ   P,ALPHSX        ;PUT NEXT ALL-LETTER ATOM IN A\r
+       MOVEI   B,SEQTND-SEQTBL ;SET INDEX FOR TABLE OF KEYWORDS PRECEDIING LINE NUMBERS\r
+       MOVE    T,G             ;RESET CHAR POINTER TO START OF ATOM.\r
+       CAMN    A,SEQTBL(B)\r
+       TLOA    F,NUM.F+COMM.F  ;WE FOUND A KEYBOARD\r
+       SOJGE   B,.-2\r
+       LDB     C,T\r
+SEQCPY:        IDPB    C,SEQPNT\r
+       JRST    SEQ3\r
+\f\r
+SEQTBL:        SIXBIT /GOSUB/\r
+       SIXBIT /GOTO/\r
+SEQTND:        SIXBIT /THEN/\r
+\r
+SEQNUM:        PUSH    P,G             ;SAVE POINTER IN CASE OF "GLOBAL" LINE NUMBER\r
+       PUSHJ   P,GETNUM\r
+       HALT    .\r
+       CAMGE   N,LOWEST\r
+       JRST    SEQT1           ;DONT RESEQ THIS NUMBER\r
+       MOVEI   R,LINROL\r
+       HRLZ    A,N\r
+       PUSHJ   P,SEARCH\r
+       JRST    SEQBAD\r
+       SUB     B,FLLIN\r
+       SUB     B,LOWSTA\r
+       IMUL    B,LASTLN\r
+       ADD     B,FRSTLN        ;THIS IS THE NEW LINE NUMBER\r
+       MOVE    X1,B\r
+       PUSHJ   P,MAKNUM        ;DEPOSITE THE NUMBER IN LINB0\r
+       POP     P,X1            ;CLEAR PLIST A LITTLE\r
+       TLZ     F,NUM.F\r
+       LDB     C,T\r
+       PUSHJ   P,NXCHD\r
+       JRST    N,SEQ31\r
+SEQBAD:        MOVE    T,N\r
+       PUSHJ   P,PRTNUM\r
+       PUSHJ   P,INLMES\r
+       ASCIZ / IN LINE /\r
+       HLRZ    T,0(7)\r
+       PUSHJ   P,PRTNUM\r
+       PUSHJ   P,PCRLF\r
+SEQT1: POP     P,1\r
+       LDB     C,1\r
+       TLZ     F,10\r
+       JRST    SEQCPY\r
+\r
+SEQCR: IDPB    C,SEQPNT\r
+       HLRZ    N,(F)\r
+       PUSHJ   P,ERASE         ;ERASE OLD LINE COPY\r
+       MOVE    T1,SEQPNT       ;POINT TO END OF LINE FOR NEWLIN\r
+       PUSHJ   P,NEWLIN        ;INSERT NEW ONE WITH OLD LINE NUMBER\r
+       AOBJN   LP,SEQ2         ;DO NEXT LINE\r
+       POP     P,LP\r
+       ADD     LP,FLLIN\r
+       MOVE    N,FRSTLN\r
+       HRLM    N,(LP)\r
+       ADD     N,LASTLN\r
+       AOBJN   LP,.-2\r
+       JRST    N,UXIT          ;FINISHED. ALLOW REENTRY.\r
+\r
+SEQOV: PUSHJ P,INLMES\r
+       ASCIZ /COMMAND ERROR (LINE NUMBERS MAY NOT EXCEED 99999)\r
+/\r
+       JRST N,FIXUP\r
+\f;ROUTINE TO SAVE PROGRAM\r
+\r
+SAVER: ASCIZ   /E/\r
+       SETZM   OLDFLA          ;SAVE "NEW" FILE ONLY\r
+SAVFIL:        PUSHJ   P,FILNAM\r
+SAVER0:        JUMP    SAVEX\r
+       PUSHJ   P,LIMITS\r
+       OPEN    SAVI\r
+       JRST    NOGETD\r
+       PUSHJ   P,LOCKON\r
+       SKIPE   OLDFLA\r
+       JRST    SAVE1\r
+       LOOKUP  FILDIR\r
+       JRST    SAVE2\r
+       JRST    NOTNEW\r
+SAVE1: LOOKUP  FILDIR\r
+       JRST    NOGETF\r
+SAVE2: CLOSE\r
+       SETZM   N,FILDIR+2\r
+       ENTER   FILDIR\r
+       JRST    NOSAVE\r
+       OUTBUF  1\r
+       JRST    LIST1\r
+\f;ROUTINE TO CLEAR TXTROL.\r
+\r
+SCRER: ASCIZ /ATCH/\r
+       PUSH    P,[EXP UXIT]\r
+SCRER1:        MOVE    X1,FLTXT        ;WIPE OUT LINROL AND TXTROL\r
+       MOVEM   X1,CETXT\r
+       MOVE    X1,FLLIN\r
+       MOVEM   X1,CELIN\r
+       POPJ    P,\r
+\r
+;ROUTINE TO RETURN TO THE SYSTEM.\r
+\r
+SYSER: ASCIZ /TEM/\r
+       CALLI   12              ;EXIT\r
+\r
+\fSUBTTL               COMMAND SUBROUTINES\r
+\r
+;ROUTINE TO PICK UP FILE NAME AND SET UP FOR DSK ACTION.\r
+;THE FLAG COPFLG IS EXPLAINED AT THE COPY ROUTINE COPER.\r
+\r
+\r
+FILNAM:        POP     P,B             ;COPER ENTERS HERE, WITH COPFLG = -1.\r
+       PUSHJ   P,FILNMO\r
+FILN7: PUSHJ   P,ATOMSX\r
+       MOVEI   Q,":"\r
+       CAIE    Q,(C)\r
+       JRST    N,FILN1\r
+       MOVEM   A,@(B)\r
+       JRST    N,FILN1A\r
+FILN1: TLNN    C,F.PER         ;PERIOD SEEN?\r
+       JRST    N,FILN2\r
+       JUMPE   A,COMM1\r
+       CAIE    X2,FILDIR\r
+       JRST    N,COMM1\r
+       MOVEM   A,FILDIR\r
+       MOVEI   X2,FILDIR+1\r
+FILN1A:        PUSHJ   P,NXCH\r
+       JRST    N,FILN7\r
+FILN2: JUMPN   A,FILN3\r
+       HRRZ    A,B\r
+       CAIN    A,SAVER0\r
+       CAIE    X2,FILDIR\r
+       JRST    N,COMM1\r
+       SKIPN   A,CURNAM\r
+       JRST    N,COMM1\r
+       MOVEM   A,(X2)\r
+       HLLZ    A,CUREXT\r
+       HLR     A,CURDEV\r
+       PUSHJ   P,FILNM1\r
+       CAIA\r
+FILN3: MOVEM   A,(X2)\r
+       MOVEI   A,DRMBUF\r
+       MOVEM   A,JOBFF\r
+       JRST    1(B)\r
+\r
+;ROUTINE TO CONVERT NEXT ATOM TO SIXBIT\r
+\r
+ALPHSX:        SKIPA   D,[Z (F.LETT)]\r
+ATOMSX:        HRLZI   D,F.DIG+F.LETT\r
+       TLZ     B,777777        ;SET LH OF A+1 TO 0\r
+       MOVEI   A,0\r
+       MOVE    X1,[POINT 6,A]\r
+ATOMS1:        TDNN    C,D\r
+       POPJ    P,\r
+       PUSHJ   P,SCNLTN        ;PACK THIS LETTER INTO A.\r
+       JFCL                    ;SCNLTN HAS SKIP RETURN.\r
+       TLNE    X1,770000\r
+       JRST    N,ATOMS1\r
+       POPJ    P,\r
+FILNMO:        MOVEI   A,(SIXBIT /DSK/)\r
+       HRLI    A,(SIXBIT /BAS/)\r
+FILNM1:        HRLZM   A,@(B)\r
+       HLLZM   A,FILDIR+1\r
+       MOVEI   X2,FILDIR\r
+       POPJ    P,\r
+\f\r
+NAMOVE:        MOVE    X1,FILDIR\r
+       MOVEM   X1,CURNAM\r
+       MOVE    X1,FILDIR+1\r
+       MOVEM   X1,CUREXT\r
+       POPJ    P,\r
+\r
+;ROUTINES TO SET LINE LIMITS\r
+LIMITS:        TLNE    C,F.TERM\r
+       JRST    LIMIT1\r
+       PUSHJ   P,QSA\r
+       ASCIZ   /--/\r
+       JRST    .+1\r
+       PUSHJ   P,GETNUM\r
+LIMIT1:        MOVEI   N,0\r
+       MOVEM   N,FRSTLN\r
+       TLNE    C,F.TERM\r
+       JRST    LIMIT2\r
+       TLNN    C,F.COMA\r
+       JRST    N,COMM1\r
+       PUSHJ   P,NXCH\r
+       PUSHJ   P,GETNUM\r
+LIMIT2:        MOVSI   N,1\r
+       MOVEM   N,LASTLN\r
+       POPJ    P,\r
+\r
+\f;A NONPRINTING ROUTINE SIMILAR TO PRTNUM:\r
+\r
+MAKNUM:        IDIVI   X1,^D10\r
+       JUMPE   X1,MAKN1\r
+       PUSH    P,X2\r
+       PUSHJ   P,MAKNUM\r
+       POP     P,X2\r
+MAKN1: MOVEI   X2,60(X2)\r
+       IDPB    X2,SEQPNT\r
+       POPJ    P,\r
+;ROUTINE TO ERASE LINE.         LINE NO IN N.\r
+\r
+ERASE: HRLZ    A,N             ;LOOK FOR LINE\r
+       MOVEI   R,LINROL\r
+       PUSHJ   P,SEARCH\r
+       POPJ    P,                      ;NONE.  GO TO INSERTION\r
+\r
+       MOVE    D,(B)           ;PICK UP LOC OF LINE\r
+       HRLI    D,440700                ;MAKE BYTE POINTER\r
+       MOVEI   T1,0            ;TO USE IN DEPOSITING\r
+ERAS1: ILDB    C,D             ;GET CHAR\r
+       DPB     T1,D            ;CLOBBER IT\r
+       CAIE    C,15            ;CARRIAGE RET?\r
+       JRST    ERAS1           ;NO.  GO FOR MORE\r
+\r
+       SETOM   PAKFLA          ;MARK FACT THAT THERE IS A HOLE\r
+\r
+       MOVEI   E,1             ;REMOVE ENTRY FROM LINE TABLE\r
+       JRST    CLOSUP\r
+\r
+;HERE WE HAVE A LINE OF INPUT AND THERE IS NO EXISTING LINE\r
+\r
+INSERT:        MOVE    T1,[POINT 7,LINB0]\r
+       MOVE    T,G             ;RESTORE PNTR TO 1ST CHR\r
+INSE2: ILDB    C,T             ;GET NEXT CHAR\r
+       CAIN    C,15            ;CHECK FOR CAR RET\r
+       JRST    N,INSE4\r
+       IDPB    C,T1\r
+       JRST    N,INSE2\r
+\r
+INSE4: JUMPL   T1,CPOPJ        ;CR SEEN.  DONE IF JUST DELETION\r
+       IDPB    C,T1            ;STORE THE CR\r
+       MOVEI   C,0             ;CLEAR REST OF WORK\r
+       TLNE    T1,760000\r
+       JRST    .-3\r
+       JRST    N,NEWLIN\r
+\r
+;AT THIS POINT, N CONTAINS A LINE NUMBER AND LINB0 CONTAINS\r
+;A NON-EMPTY INSERTED LINE.  T1 CONTAINS ADDRESS OF LAST\r
+;WORD OF THE LINE.\r
+\r
+NEWLIN:        MOVEI   T1,(T1)         ;COMPUTE LINE LENGTH\r
+       SUBI    T1,LINB0-1\r
+\r
+       ADD     T1,CETXT        ;COMPUTE NEW CEILING OF TEXT ROLL\r
+       CAMGE   T1,FLLIN        ;ROOM FOR LINE PLUS LINROL ENTRY?\r
+       JRST    NEWL1           ;YES\r
+       SUB     T1,CETXT        ;ASK FOR MORE CORE\r
+       MOVE    E,T1\r
+       ADDI    E,1\r
+       PUSHJ   P,PANIC\r
+       ADD     T1,CETXT\r
+\r
+NEWL1: MOVE    D,CETXT ;LOC OF NEW LINE\r
+       MOVE    T,D             ;CONSTRUCT BLT PNTR\r
+       HRLI    T,LINB0\r
+       BLT     T,-1(T1)        ;MOVE THE LINE\r
+       MOVEM   T1,CETXT        ;STORE NEW CEILING\r
+\r
+\r
+;HERE, LINE IS IN PLACE, ITS LOC IN D, LINE NUMBER IN N.\r
+;MUST STILL PUT LINE NUMBER IN LINROL.\r
+\r
+NEWNBR:        PUSH    P,D             ;*****JUST IN CASE*****\r
+       MOVEI   R,LINROL\r
+       HRLZ    A,N\r
+       PUSHJ   P,SEARCH\r
+       JRST    .+2\r
+       HALT    .               ;*****IMPOSSIBLE CONDITION*****\r
+\r
+       MOVEI   E,1\r
+       PUSHJ   P,OPENUP        ;MAKE ROOM FOR IT\r
+       POP     P,D             ;*****OTHER HALF OF JUST IN CASE*****\r
+       HRRI    A,(D)           ;CONTRUCT LINROL ENTRY\r
+       MOVEM   A,(B)           ;STORE ENTRY\r
+       POPJ    P,              ;ALL DONE\r
+\r
+COMM1: PUSHJ   P,INLMES\r
+       ASCIZ /WHAT?\r
+/\r
+COMM1A:        SKIPE   CURNAM\r
+       JRST    FIXUP\r
+       JRST    ASKNEW\r
+BADDEL:        PUSHJ P,INLMES\r
+       ASCIZ /DELETE COMMAND MUST SPECIFY WHICH LINES TO DELETE\r
+/\r
+       JRST    COMM1A\r
+NOSAVE:        PUSHJ   P,TTYIN\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /NO ROOM IN DIRECTORY/\r
+       OUTPUT\r
+       JRST    BASIC\r
+NOGETF:        PUSHJ   P,TTYIN\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /FILE NOT SAVED/\r
+        OUTPUT\r
+       JRST    BASIC\r
+TTYIN: MOVEI   T,TTYBUF                ;SET UP TTY BUFFS\r
+       MOVEM   T,JOBFF\r
+       INIT    1\r
+       SIXBIT  /TTY/\r
+       XWD     TYO,TYI\r
+       HALT    .-3\r
+       INBUF   1\r
+       OUTBUF  1\r
+       POPJ    P,\r
+\r
+BADGET:        MOVEI   T,BADMSG\r
+       MOVE    X1,[POINT 7,BADGNN]\r
+       MOVEM   X1,SEQPNT\r
+       MOVE    X1,BADGNN                       ;LAST GOOD LINE NUMBER\r
+       TLNN    X1,-1                   ;HAS IT BEEN CHANGED ALREADY?\r
+       PUSHJ P,MAKNUM          ;NO, MAKE THE NUMBER\r
+       CALL    T,[SIXBIT /DDTOUT/]\r
+       MOVEI   T,CRLFMS\r
+       CALL    T,[SIXBIT /DDTOUT/]\r
+       JRST    GETT1\r
+\r
+NOGETD:        PUSHJ   P,TTYIN\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /NO SUCH DEVICE/\r
+       OUTPUT\r
+       JRST    BASIC\r
+NOTNEW:        PUSHJ   P,TTYIN\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /DUPLICATE FILE NAME. REPLACE OR RENAME/\r
+       OUTPUT\r
+       JRST    BASIC\r
+RESERR:        PUSHJ   P,INLMES\r
+       ASCIZ /COMMAND ERROR (YOU MAY NOT OVERWRITE LINES OR CHANGE THEIR ORDER)\r
+/\r
+       OUTPUT\r
+       JRST    BASIC\r
+RUNER: MOVEI   A,0\r
+       CAIA    N,QSA           ;IS IT RUNNH\r
+       ASCIZ /NH/\r
+       MOVEI   A,1             ;NO, PRINT HEADING\r
+       TLNN    C,F.TERM        ;IS THERE A LINE NUMBER ARGUMENT?\r
+       JRST    COMM1\r
+       JUMPE   A,RUNNH         ;SHALL WE PRINT THE HEADING?\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /\r
+/\r
+       PUSHJ   P,LIST01                ;PRINT HEADING SANS <RETURN>\r
+       OUTPUT\r
+       PUSHJ   P,INLMES\r
+       BYTE (7) 15,12,12\r
+RUNNH: PUSHJ   P,LOCKON                ;PROTECT REST OF COMPILATION\r
+       PUSHJ   P,PRESS         ;GUARANTEE SOURCE DOESN'T MOVE!!!\r
+       MOVEI   X1,CODROL               ;COMPILE TIME.\r
+       MOVEM   X1,TOPSTG               ;TXT,LIN,CODROLS ARE STODGY. OTHERS MOVE\r
+       MOVEI   R,LINROL\r
+       PUSHJ   P,SLIDRL        ;SLIDE LINROL DOWN NEXT TO TXTROL.\r
+       JRST    RUNER1\r
+\r
+SLIDRL:        MOVE    X2,CEIL(R)\r
+       HRRZ    X1,CEIL-1(R)    ;SLIDE ROLL DOWN NEXT TO LOWER ROLL\r
+       ADD     X2,X1\r
+       HRL     X1,FLOOR(R)     ;SET UP BLT TO MOVE ROLL\r
+       SUB     X2,FLOOR(R)\r
+       HRRZM   X1,FLOOR(R)     ;SET NEW ROLL FLOOR\r
+       BLT     X1,(X2)\r
+       MOVEM   X2,CEIL(R)\r
+       POPJ    P,\r
+\r
+RUNER1:        MOVEM   X2,FLCOD\r
+       MOVEM   X2,CECOD        ;CODROL IS ALSO PACKED IN PLACE\r
+       MOVEI   X1,CODROL       ;PREPARE TO CLOBBER ALL ROLLS ABOVE CODROL\r
+       MOVE    T,JOBREL                ;USE THIS VALUE.\r
+       PUSHJ   P,CLOB          ;DO THE CLOBBERING.\r
+       MOVEI   F,0             ;CLEAR COMPILATION FLAGS\r
+       MOVEI   T,0             ;SET UP AC FOR RUNTIM.\r
+       CALL    T,[SIXBIT /RUNTIM/]     ;GETY TIME OF START.\r
+       MOVEM   T,MTIME         ;SAVE TIME AT START OF RUNER\r
+       MOVEM   T,RUNFLA\r
+       SETZM   N,DATAFF\r
+       SETOM   N,TMPLOW\r
+       MOVEI   F,REFROL        ;CREATE A ROLL OF ZEROS\r
+       PUSHJ   P,ZERROL\r
+\r
+;NOW MARK THIS ROLL TO SHOW WHAT PARTS OF THIS PROG ARE INSIDE OF FUNCTIONS.\r
+LUKDEF:        MOVEI   A,LUKDEF+1      ;SCAN FOR NEXT "DEF" STA\r
+       PUSHJ   P,NXLINE        ;PREPARE TO READ THE NEXT LINE\r
+       PUSHJ   P,LUKD4\r
+       MOVEI   X1,[ASCIZ/DEFFN/]\r
+       PUSHJ   P,QST           ;IS IT A "DEF" STA?\r
+       JRST    N,LUKD3         ;NO. GO ON TO NEXT LINE\r
+\r
+       HRRZ    B,C             ;YES. SAVE FN NAME.\r
+\r
+       MOVEI   A,LUKD2\r
+LUKD1: PUSHJ   P,NXCH          ;NOW LOOK FOR EQUAL SIGN\r
+       TLNE    C,F.TERM\r
+       JRST    N,LUKD3         ;NO EQUAL. ITS A MULTILINE DEF.\r
+       TLNN    C,F.EQAL\r
+       JRST    N,LUKD1         ;TRY NEXT CHAR.\r
+       JRST    N,LUKD3-1       ;ITS A ONE LINE DEF. IGNORE IT.\r
+\r
+LUKD2: MOVEI   A,LUKD2+2               ;MARK EVERY LINE OF TIS MULTILINE FNT.\r
+       ROT     B,-7            ;PUT FUNCTION NAME IN FIRST CHAR POISTION\r
+       PUSHJ   P,NXLINE\r
+       MOVEM   B,(G)           ;NOW THIS LINE CONTAINS THE NAME OF ITS FN.\r
+       PUSHJ   P,LUKD4\r
+       MOVEI   X1,[ASCIZ /FNEND/]\r
+       PUSHJ   P,QST           ;END OF THE FN?\r
+       CAIA\r
+       MOVEI   A,LUKDEF+1      ;YES. SCAN FOR NEXT DEF.\r
+\r
+LUKD3: AOBJN   L,(A)           ;GET NEXT LINE, IF THERE IS ONE\r
+       JRST    RUNER2\r
+LUKD4: POP     P,D\r
+       TLNE    C,F.TERM\r
+       JRST    LUKD5\r
+       PUSHJ   P,QSA\r
+       ASCIZ /REM/\r
+       JRST    (D)\r
+LUKD5: AOS     (G)\r
+       JRST    LUKD3\r
+\r
+;FINISHED MARKING FUN LINES. NOW SET UP A CLEAR LADROL...\r
+RUNER2:        MOVEI   F,LADROL\r
+       PUSHJ   P,ZERROL\r
+       JRST    EACHLN\r
+\r
+;ROUTINE TO MAKE A ROLL OF ZEROS =IN LNTH TO LINROL\r
+ZERROL:        MOVE    R,F\r
+       MOVE    E,CELIN ;COMPUTE LENGTH OF ROLL\r
+       SUB     E,FLLIN\r
+       JUMPE   E,NOEND         ;NOTHING TO DO\r
+\r
+       MOVN    L,E             ;SAVE FOR LINE CNTR.\r
+       MOVSI   L,(L)\r
+       PUSHJ   P,BUMPRL        ;ADD TO (EMPTY) ROLL\r
+       MOVE    T,FLOOR(F)      ;CLEAR IT TO 0S\r
+       SETZM   (T)\r
+       HRL     T,T\r
+       ADDI    T,1\r
+       MOVE    T1,CEIL(F)\r
+       CAILE   T1,(T)          ;SUPPRESS BLT IF ONLY 1 LINE\r
+       BLT     T,-1(T1)\r
+       POPJ    P,\r
+\f;SO FAR, WE HAVE SET UP LADROL FOR ADDRESSES & CHAINS FOR LABLES\r
+;ALSO, L IS A WORD TO AOBJN & COUNT THROUGH LINES.\r
+;BEGIN COMPILATION OPERATIONS FOR EACH LINE\r
+\r
+EACHLN:        MOVE    P,PLIST         ;FIX P LIST IN CASE LAST INST FAILED\r
+       PUSHJ   P,LOCKOF        ;CHECK REENTER REQUEST\r
+       PUSHJ   P,LOCKON\r
+       MOVE    X1,TMPLOW\r
+       MOVEM   X1,TMPPNT       ;NO UNPROTECTED TEMPORARIES USED YET.\r
+       SETZM   N,LETSW\r
+       SETZM   N,REGPNT\r
+       SETZM   N,PSHPNT\r
+       SETOM   N,IFFLAG\r
+       SKIPE   N,FUNAME\r
+       JRST    EACHL2\r
+       MOVE    X1,FLARG\r
+       MOVEM   X1,CEARG\r
+EACHL2:        PUSHJ   P,NXLINE        ;SET UP POINTER TO THIS LINE.\r
+       MOVSI   A,(SIXBIT /REM/)        ;PREPARE FOR COMMENT\r
+       TLNE    C,F.TERM        ;NULL STATEMENT?\r
+       JRST    EACHL1          ;YES. ELIDED "REM" (FIRST CHAR WAS A APOSTROPHE)\r
+       PUSHJ   P,SCNLT1                ;SCAN FIRST LTR\r
+       CAIE    C,"("\r
+       TLNE    C,F.EQAL+F.DIG+F.DOLL   ;ELIDED LETTER?\r
+       JRST    ELILET          ;YES.  POSSIBLE ASSUMED "LET"\r
+       PUSHJ   P,SCNLT2                ;SCAN SECOND LETTER.\r
+       JRST    ILLINS          ;SECOND CHAR WAS NOT A LETTER.\r
+       MOVS    X1,A\r
+       CAIE    X1,(SIXBIT /IF/)\r
+       CAIN    X1,(SIXBIT /ON/)\r
+       JRST    EACHL1\r
+       CAIE    X1,(SIXBIT /FN/)        ;ELIDED LET FNX=  ?\r
+       JRST    EACHL3          ;NO.\r
+       PUSHJ   P,SCNLT3\r
+       JRST    N,ILLINS\r
+       TLNE    C,F.EQAL        ;IS FOURTH CHAR AN '=' SIGN?\r
+       JRST    ELILET          ;YES, ELIDED STATEMENT\r
+       JRST    EACHL1          ;NO, BETTER BE FNEND.\r
+\r
+EACHL3:        PUSHJ   P,SCNLT3                ;ASSEMBLE THIRD LETTER OF STATEMENT IN A\r
+       JRST    ILLINS          ;THIRD CHAR WAS NOT A LETTER\r
+       JRST    EACHL1\r
+\r
+ELILET:        MOVSI   A,(SIXBIT /LET/)        ;ASSUME A "LET" STATMENT.\r
+       MOVS    T,D                     ;GO BACK TO THE FIRST LETTER.\r
+       HRLI    T,440700\r
+       PUSHJ   P,NXCHK\r
+\r
+;HERE, FIRST 3 LTRS OF VERB (SIXBIT) ARE IN A. USE TBL LOOKUP AND DISPATCH.\r
+\r
+EACHL1:        MOVEI   R,STAROL\r
+       PUSHJ   P,SEARCH        ;LOOK IN STATEMENT TYPE TABLE\r
+       JRST    ILLINS          ;NO SUCH, GO BITCH\r
+       HRRZ    A,(B)           ;FOUND.\r
+\r
+       MOVE    Q,CECOD         ;PUT REL ADDRS IN LADROL\r
+       SUB     Q,FLCOD\r
+       MOVE    X2,FLLAD\r
+       ADDI    X2,(L)\r
+       HRLM    Q,(X2)\r
+       HRLI    D,(MOVEI L,)\r
+       TRZE    A,20000         ;EXECUTABLE?\r
+       PUSHJ   P,BUILDI\r
+\r
+       MOVE    X1,A\r
+       TRZN    X1,40000        ;MORE TO COMMAND?\r
+       SOJA    X1,EACHL5       ;NO. JUST DISPATCH\r
+       PUSHJ   P,QST           ;CHECK REST OF COMMAND\r
+       JRST    ILLINS\r
+\r
+EACHL5:        TLNE    C,1000\r
+       FAIL    <ILLEGAL CHARACTER>\r
+       JRST    1(X1)\r
+;HERE ON END OF STATEMENT XLATION\r
+\r
+NXTSTA:        TLNN    C,F.TERM\r
+       JRST    GRONK\r
+\r
+\r
+;ENTER HERE FROM ERROR ROUTINE\r
+\r
+NXTST1:        AOBJN   LP,EACHLN\r
+NOEND: PUSHJ   P,INLMES\r
+       ASCIZ /\r
+NO END INSTRUCTION\r
+/\r
+\r
+UXIT:  SETZM   RUNFLA\r
+       SKIPE   MTIME\r
+       PUSHJ   P,PTIME\r
+       PUSHJ   P,TTYIN\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /\r
+READY\r
+/\r
+       JRST N,FIXUP\r
+\fSUBTTL               PROGRAM "LOADER"\r
+;HERE AFTER END STATEMENT\r
+\r
+LINKAG:        MOVEI   R,CONROL        ;SLIDE RUNTIME ROLLS DOWN INTO PLACE.\r
+       PUSHJ   P,SLIDRL\r
+       CAIGE   R,TMPROL\r
+       AOJA    R,.-2           ;SLIDE NEXT ROLL\r
+       MOVEM   X2,VARFRE       ;FIRST FREE LOC IS CEIL OF TMPROL.\r
+\r
+       MOVE    E,CETMP ;CHECK ARRAY REQUIREMENTS\r
+       MOVE    T,FLARA\r
+       JRST    LK2A\r
+\r
+LK1:   HLRZ    X1,(T)          ;KNOW SIZE?\r
+       JUMPN   X1,LK2          ;YES, JUMP\r
+       MOVSI   X2,^D11         ;(11,1) IS STANDARD DIM.\r
+       AOJ     X2,\r
+       MOVEI   X1,^D11\r
+       MOVE    Q,1(T)\r
+       CAMGE   T,FLSVR ;DEFAULT SIZE OF STRING VECTORS IS (11,1)\r
+       AOJE    Q,.+2           ;IMPLICIT 2-DIM ARRAY?\r
+       JRST    N,.+3\r
+       HRRI    X2,^D11\r
+       MOVEI   X1,^D121\r
+       MOVEM   X2,1(T)\r
+       HRLM    X1,(T)          ;STORE SIZE\r
+LK2:   ADD     E,X1            ;ADD LENGTH TO IT\r
+       ADDI    T,2             ;ON TO NEXT ENTRY\r
+       CAMG    T,FLSVR         ;IS THIS ONE A STRING VECTOR?\r
+       JRST    LK2A            ;NO.\r
+       HLRZ    X2,-1(T)                ;LOOK AT FIRST DIMENSION\r
+       SOJLE   X2,LK2A         ;IS IT 1(AND THUS A VECTOR)?\r
+       HRRZ    X2,-1(T)        ;NO. LOOK AT SECOND DIMENSION\r
+       SOJLE   X2,LK2A         ;IS IT 1(AND THUS A VECTOR)?\r
+       SETZM   RUNFLA          ;NO. FATAL ERROR.\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /STRING VECTOR IS 2-DIM ARRAY\r
+/\r
+LK2A:  CAMN    T,FLSVR         ;BEGINNING OF SVRROL SCAN?\r
+       MOVEM   E,SVRBOT                ;YES, REMEMBER BOTTOM OF VECTOR POINTERS\r
+       CAMGE   T,CESVR\r
+       JRST    LK1\r
+\r
+       SETOM   VPAKFL          ;DONT TRY TO PRESS VARAIBLE SPACE NOW!\r
+       SUB     E,CESVR         ;WE NEED THIS MANY LOCS\r
+       PUSHJ   P,VCHCK1\r
+       ADD     E,CETMP         ;CALCULATE TOP OF ARRAY SPACE.\r
+       MOVEM   E,SVRTOP        ;SAVE IT.\r
+       MOVEM   E,VARFRE        ;THIS IS ALSO FIRST FREE WORD.\r
+\r
+       MOVE    T,FLFCL\r
+       MOVEI   R,FCNROL\r
+LINK0A:        CAML    T,CEFCL\r
+       JRST    LINK0C          ;NO MORE FCN CALLS\r
+       HLLZ    A,(T)           ;LOOK UP FUNCTION\r
+       PUSHJ   P,SEARCH\r
+       JRST    LINK0B          ;UNDEFINED\r
+       MOVE    A,(B)           ;DEFINED. GET ADDRESS.\r
+       HRLM    A,(T)\r
+       AOJA    T,LINK0A\r
+\fLINK0B:       SETZM   RUNFLA\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /UNDEFINED FUNCTION -- FN/\r
+       LDB     C,[POINT 7,A,6]\r
+       ADDI    C,40\r
+       PUSHJ   P,OUCH\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /\r
+/\r
+       AOJA    T,LINK0A\r
+LINK0C:        MOVE    B,FLFOR ;UNSAT FORS?\r
+       CAML    B,CEFOR\r
+       JRST    LINK0D\r
+       MOVEI   T,[ASCIZ /FOR WITHOUT NEXT/]\r
+       MOVE    L,(B)           ;GET POINTER TO LINE NUMBER\r
+       PUSHJ   P,FAILR         ;PRINT ERROR MSG\r
+       ADDI    B,5             ;MORE UNSAT FORS?\r
+       JRST    LINK0C+1\r
+LINK0D:        SKIPG   DATAFF\r
+       JRST    LINK0E\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /NO DATA/\r
+       SETZM   RUNFLA\r
+LINK0E:        SKIPN   RUNFLA          ;GO INTO EXECUTION?\r
+       JRST    UXIT            ;NO\r
+\r
+       MOVE    C,FLCOD\r
+\r
+;CODE ROLL IS IN PLACE.         C CONTAINS ITS FLOOR\r
+\r
+       MOVE    T,FLFCL ;LINK FCN CALLS\r
+       MOVE    T1,CEFCL\r
+       MOVE    A,FLCOD\r
+       MOVEI   B,0\r
+       PUSHJ   P,LINKUP\r
+\r
+       MOVE    T,FLARA ;LINK ARRAY REFS\r
+       MOVE    T1,CESVR\r
+       MOVE    A,T\r
+       MOVEI   B,2\r
+       PUSHJ   P,LINKUP\r
+\r
+       MOVE    T,FLARA ;STORE ARRAY ADDRESSES IN APAROL\r
+       MOVE    G,CETMP\r
+       JRST    N,LINK1D\r
+LINK1C:        HLRZ    X1,(T)          ;GET ARRAY LENGTH\r
+       HRRM    G,(T)           ;STORE ABS ADDRS\r
+       ADD     G,X1            ;COMPUTE ADDRS OF NEXT ARRAY\r
+       ADDI    T,2             ;GO TO NEXT ENTRY\r
+LINK1D:        CAMGE   T,T1\r
+       JRST    N,LINK1C\r
+\r
+LINK1: MOVE    T,FLCAD ;LINK CONST REFS\r
+       MOVE    T1,CECAD\r
+       MOVE    A,FLCON\r
+       MOVEI   B,1\r
+       PUSHJ   P,LINKUP\r
+\r
+LINK2: MOVE    T,FLPTM ;LINK TEMPORARY REFS (PERM AND TEMP)\r
+       MOVE    T1,CETMP\r
+       MOVE    A,T\r
+       MOVEI   B,1\r
+       PUSHJ   P,LINKUP\r
+\r
+LINK3: MOVE    T,FLLAD ;LINK GOTO DESTINATIONS\r
+       MOVE    T1,CELAD\r
+       MOVE    A,FLCOD\r
+       MOVEI   B,0\r
+       PUSHJ   P,LINKUP\r
+\r
+LINK4: MOVE    T,FLSCA ;LINK SCALARS\r
+       MOVE    T1,CEVSP\r
+       MOVE    A,T\r
+       MOVEI   B,1\r
+       PUSHJ   P,LINKUP\r
+\r
+LINK6: MOVE    T,FLGSB ;LINK GOSUB REFS\r
+       MOVE    T1,CEGSB\r
+       MOVE    A,T\r
+       MOVEI   B,1\r
+       PUSHJ   P,LINKUP\r
+       MOVE    T,FLGSB\r
+LINK7: CAML    T,T1            ;PUT SUBRTN ADDRSES IN GSBROL\r
+       JRST    N,LINK8\r
+       HLRZ    X1,(T)\r
+       ADD     X1,FLLAD\r
+       HLRZ    X1,(X1)\r
+       ADD     X1,C\r
+       MOVEM   X1,(T)\r
+       AOJA    T,LINK7\r
+\r
+LINK8: MOVE    T,FLNXT ;LINK REVERSE REFS IN FORS\r
+       MOVE    T1,CENXT\r
+       MOVE    A,FLCOD\r
+       MOVEI   B,0\r
+       PUSHJ   P,LINKUP\r
+\r
+       MOVE    T,FLSAD         ;LINK POINTERS TO LITROL\r
+       MOVE    T1,CESAD\r
+       MOVE    A,FLLIT\r
+       MOVEI   B,1\r
+       PUSHJ   P,LINKUP\r
+\r
+LINKZ: MOVE    X1,FLSCA        ;ZERO OUT SCALARS AND STRING VARS\r
+       MOVE    X2,CEVSP\r
+       PUSHJ   P,BLTZER\r
+       MOVE    X1,CETMP        ;ZERO OUT ARRAY ELEMENTS AND STRING VECTORS.\r
+       MOVE    X2,SVRTOP\r
+       PUSHJ   P,BLTZER\r
+\r
+       SETZM   N,FMTPNT\r
+       SETZM   N,FCNLNK\r
+       PUSHJ   P,RESTOR\r
+       MOVEI   R,0\r
+       PUSHJ   P,PCRLF\r
+       PUSHJ   P,PCRLF\r
+       SETZM   N,INPFLA\r
+       SETZM   N,TABVAL\r
+       SETOM   N,NUMRES\r
+       SETZB   N,STRFCN\r
+IFN FTRND,<\r
+       PUSHJ   P,WRANB\r
+>\r
+       MOVEI   X1,OVTRAP\r
+       HRRM    X1,JOBAPR\r
+       PUSHJ   P,LOCKOF\r
+       JRST    N,@FLCOD\r
+\r
+;SUBROUTINE TO LINK ROLL ENTRIES\r
+\r
+;CALL WITH A=ORG OF VALUE ROLL, B=INCREMENT (0 IF EXPLICIT REL LOC)\r
+;T=FLOOR OF SRC ROLL, T1=CEIL OF SRC ROLL\r
+\r
+\r
+LINKUP:        MOVE    X2,A\r
+       MOVSI   X1,C\r
+\r
+LNKP1: CAML    T,T1            ;FINISHED ROLL?\r
+       POPJ    P,\r
+       HRRZ    Q,(T)           ;FIRST LOC IN CHAIN\r
+       JUMPN   B,.+3           ;EXPLICIT ADDRS?\r
+       HLRZ    X2,(T)          ;YES.  COMPUTE IT\r
+       ADD     X2,C\r
+       JUMPE   Q,LNKP3         ;SPECIAL CASE--CHAIN VOID\r
+\r
+LNKP2: HRR     X1,Q            ;ONE LINK IN CHAIN\r
+       HRRZ    Q,@X1\r
+       HRRM    X2,@X1\r
+       JUMPN   Q,LNKP2\r
+\r
+LNKP3: JUMPN   B,.+2           ;EXPLICT ADDRS?\r
+       AOJA    T,LNKP1         ;YES, JUST BUMP ROLL PNTR\r
+       ADD     T,B             ;NO, ADD EXPLICIT INCREMENT\r
+       ADD     X2,B            ;  (ALSO TO DEST ROLL)\r
+       JRST    N,LNKP1\r
+\r
+BLTZER:        HRL     X1,X1           ;ZERO OUT CORE\r
+       SETZM   N,(X1)\r
+       AOJ     X1,\r
+       BLT     X1,-1(X2)\r
+       POPJ    P,\r
+\f\r
+IFN FTSTR,<\r
+;CHANGE STATEMENT\r
+\r
+; CHANGE <VECTOR> TO <STRING>\r
+;              OR\r
+;CHANGE <STRING> TO <VECTOR>\r
+\r
+;COMPILES A FETCH AND PUT WHICH INTERFACE WITH THE "PUTSTR" ROUTINE\r
+>\r
+\r
+XCHAN: ASCIZ   /NGE/           ;CHANGE?\r
+       HRLI    F,1\r
+       TLNE    C,40\r
+       JRST    XCHAN1\r
+       PUSHJ   P,VECTOR\r
+       CAIN    A,4\r
+       JRST    GRONK\r
+       JUMPE   A,.+3\r
+       PUSHJ   P,FLET2\r
+       JRST    XCHAN3\r
+       MOVSI   D,(VECFET)\r
+       PUSHJ   P,BUILDA\r
+       PUSHJ   P,QSF\r
+       ASCIZ   /TO/\r
+       PUSHJ   P,FORMLB\r
+       MOVSI   D,(STRSTO)\r
+XCHAN2:        SKIPE   N,IFFLAG\r
+       JRST    ILFORM\r
+       PUSHJ   P,BUILDA\r
+       JRST    NXTSTA\r
+XCHAN1:        PUSHJ   P,FORMLB\r
+XCHAN3:        PUSHJ   P,FLET3\r
+       PUSHJ   P,QSF\r
+       ASCIZ /TO/\r
+       PUSHJ   P,VECTOR\r
+       MOVSI   D,(VECPUT)\r
+       JRST    XCHAN2\r
+\f;DATA STATEMENT\r
+\r
+;<DATA STA>::= DATA <DEC NBR!STRING> [,<DEC NBR!STRING>...]\r
+\r
+;NOTE: A DATA STRING ::= "  <ANY CHARS EXCEPT CR,LF>  "\r
+;      OR      ::= <A LETTER><ANY CHARS EXCEPT COMMA OR APOST,CR,LF>\r
+\r
+;NO CODE IS GENERATED FOR A DATA STATEMENT\r
+;RATHER, THE DATA STATEMENT IN THE SOURCE\r
+;TEXT ARE REREAD AT RUN TIME.\r
+\r
+XDATA: ASCIZ /A/\r
+       SKIPL   DATAFF          ;ALREADY SEEN DATA?\r
+       MOVEM   L,DATAFF        ;NO.  REMEMBER WHERE FIRST ONE IS\r
+       PUSHJ   P,DATCHK\r
+       FAIL    <DATA NOT IN CORRECT FORM>\r
+       JRST    NXTSTA\r
+\r
+;SUBROUTINE TO CHECK DATA LINE\r
+;ALSO CALLED AT RUN TIME TO CHECK INPUT LINE\r
+;(NOTE.. <RETURN> NOT CHECKED AFTER INPUT LINE)\r
+\r
+\r
+DATCHK:        TLNN    C,F.LETT+F.QUOT ;LETTER OR QUOT SIGN FIRST\r
+       JRST    DATCH2          ;NO, EVALUATE NUMBER\r
+       PUSH    P,[DATCH3]      ;YES, ASSUME STRING AND SKIP OVER\r
+       JRST    N,SKIPDA\r
+DATCH2:        PUSHJ   P,EVANUM\r
+DATCH3:        POPJ    P,\r
+       CAIE    C,"&"           ;IF "&", ASSUME MATINPUT TERM\r
+       TLNE    C,F.TERM        ;MORE?\r
+       JRST    CPOPJ1          ;NO. RETURN\r
+       TLNN    C,F.COMA        ;DID FIELD END CORRECTLY?\r
+       POPJ    P,              ;NO ERROR\r
+       PUSHJ   P,NXCH          ;YES. SKIP COMMA\r
+       JRST    N,DATCHK\r
+\f;DEF STATEMENT\r
+\r
+;<DEF STA> ::= DEF FN<LETTER>(<ARGUMENT>) = <EXPRESSION>\r
+\r
+;GENERATED CODE IS:\r
+;      JRST    <A>             ;JUMP AROUND DEF\r
+;      XWD     0,0             ;CONTROL WORD\r
+;      MOVEM   N,(B)           ;SAVE ARGUMENT IN TEMPORARY\r
+;      ...\r
+;      (EVALUATE EXPRESSION)\r
+;      JRST    RETURN          ;GO TO RETURN SUBROUTINE\r
+;<A>:  ...                     ;INLINE CODING CONTINUES...\r
+\r
+;SEE GOSUB STATEMENT FOR USE OF CONTROL WORD.\r
+\r
+;DURING EXPRESSION EVALUATION, LOCATION\r
+;FUNARG CONTAINS ASCII REPRESENTATION OF ARGUMENT NAME.\r
+;ROUTINES CALLED BY FORMLN CHECK FOR USE OF ARGUMENT AND RETURN POINTER\r
+;TO FIRST WORD ON TEMPORARY ROLL.\r
+\r
+;PRIOR TO GEN OF FIRST EXPRESSION EVALUATION, THE "REAL" TEMPORARY\r
+;ROLL IS SAVED ON "STMROL" AND AN EMPTY "TEMROL" IS CREATED.\r
+;AFTERWARDS, THE NEW "TEMROL" ENTRIES ARE ADDED TO THE PERMANENT\r
+;TEMPORARY ROLL "PTMROL" AND "TEMROL" IS RESTORED.\r
+;THUS EACH DEFINED FUNCTION HAS ITS OWN SET OF TEMPORARIES\r
+;AND CANNOT CONFLICT WITH TEMPORARIES USED BY THE EXPRESSION\r
+;BEING EVALUATED AT THE POINT OF THE CALL.\r
+\r
+;NOTE. SPECIAL CASE:  CHECK FOR FUNCTION DEF AS LAST LINE OF PROGRAM\r
+;SUPPRESSES GEN OF "JRST" INSTR.  COMPILATION WILL FAIL\r
+;("NO END STATEMENT"); HOWEVER THE WORD AFTER LADROL WOULD BE\r
+;CLOBBERED IF "JRST" WERE GENNED.\r
+\r
+XDEF:  ASCIZ /FN/              ;HANDLE THE FN PART AUTOMATICALLY\r
+       SKIPE   FUNAME          ;ARE WE IN MIDST OF MULTI-LINE DEF?\r
+       FAIL <NESTED DEF>\r
+       MOVSI   D,(JFCL)        ;MAKE SURE NOT FIRST WRD OF CODE\r
+       MOVE    X1,CECOD\r
+       CAMG    X1,FLCOD\r
+       PUSHJ   P,BUILDI\r
+       TLNN    C,F.LETT        ;MAKE SURE LETTER FOLLOWS\r
+       JRST    GRONK\r
+       PUSHJ   P,SCNLT1        ;SCAN FCN NAME.\r
+       PUSH    P,A             ;SAVE FCN NAME WITH COUNT OF ZERO ARGUMENTS\r
+       MOVEM   A,FUNAME        ; FN'NAME IN BODY OF FUNCTION\r
+\f;ADD FUNCTION NAME TO FCNROL\r
+\r
+       MOVEI   R,FCNROL        ;LOOK FOR FNC NAME IN FCNROL\r
+       PUSHJ   P,SEARCH\r
+       JRST    .+2\r
+       FAIL    <FUNCTION DEFINED TWICE>\r
+       MOVEI   E,1             ;ADD TO FCNROL\r
+       PUSHJ   P,OPENUP\r
+       ADD     A,CECOD ;CONSTRUCT PNTR TO CONTROL WORD\r
+       SUB     A,FLCOD ;STORE IN FCNROL ENTRY.\r
+       ADDI    A,1\r
+       MOVEM   A,(B)\r
+\r
+       MOVE    B,L             ;GET JRST DESTINATION\r
+       AOBJP   B,.+1           ;DONT GEN JRST IF LAST LINE OF SOURCE.\r
+       MOVSI   D,(JRST)\r
+       PUSHJ   P,BUILDI        ;GEN JRST INSTR.\r
+       MOVEM   B,FUNSTA        ;REMEMBER WHERE THIS JRST IS\r
+       MOVEI   D,0             ;BUILD ZERO CONTROL WORD\r
+       PUSHJ   P,BUILDI\r
+\r
+;SCAN FOR ARGUMENT NAME.\r
+\r
+       CAIE    C,"("   ;ANY ARGUMENTS?\r
+       JRST    XDEF4           ;NO\r
+\r
+XDEF2: PUSHJ   P,NXCHK         ;SKIP "("\r
+       PUSHJ   P,SCNLT1        ;ASSEMBLE ARGUMENT NAME\r
+       TLNN    C,F.DIG\r
+       JRST    .+3\r
+       DPB     C,[POINT 7,A,13]\r
+       PUSHJ   P,NXCHK\r
+\r
+       MOVEI   R,ARGROL        ;NOW ADD THIS NAME TO THE ARGUMENT LIST\r
+       MOVE    B,FLARG         ;NOW CHECK ARGROL, FOR TWO IDENTICAL ARGS\r
+XDEF2C:        CAML    B,CEARG\r
+       JRST    N,XDEF2D\r
+       CAMN    A,(B)\r
+       JRST    GRONK\r
+       AOJA    B,XDEF2C\r
+\r
+XDEF2D:        MOVEI   E,1             ;ADD NEW ARG TO ROLL\r
+       PUSHJ   P,OPENUP\r
+       MOVEM   A,(B)\r
+       AOS     (P)             ;COUNT THE ARGUMENT\r
+       TLNE    C,F.COMA        ;ANY MORE ARGS?\r
+       JRST    XDEF2           ;YES\r
+\r
+       TLNN    C,F.RPRN        ;FOLLOWING PARENTHESIS?\r
+       JRST    GRONK           ;NO.\r
+       PUSHJ   P,NXCHK         ;YES. SKIP IT.\r
+XDEF4: PUSHJ   P,ARGCHK        ;CHECK FOR RIGHT NUMBER OF ARGUMENTS\r
+;GEN CODE TO EVALUATE EXPRESSION.\r
+\r
+       MOVE    X1,FLTMP        ;SAVE TEMP ROLL AS STMROL\r
+       MOVEM   X1,FLSTM\r
+       MOVEM   X1,CETMP        ;AND EMPTY TMPROL\r
+       MOVE    X1,TMPLOW       ;SAVE TEMP POINTER\r
+       MOVEM   X1,FUNLOW\r
+       SETOM   TMPLOW\r
+       SETOM   TMPPNT\r
+       TLNN    C,F.EQAL        ;MULTI LINE FN?\r
+       JRST    N,XDEFM         ;YES\r
+       PUSHJ   P,NXCHK         ;NO. SKIP EQUAL SIGN\r
+       SETZM   N,FUNAME        ;SIGNAL THAT THIS IS NOT A MULTI-LINE FN\r
+\r
+       PUSHJ   P,FORMLN        ;GET THE EXPRESSION\r
+       PUSHJ   P,EIRGNP\r
+\r
+;NOW BUILD AN INSTRUCTION THAT WILL TELL RETURN HOW MANY ARGS TO POP\r
+;OFF THE PUSH LIST\r
+\r
+       POP     P,B             ;ARGCHK PUT THE ADDRESS OF A CONSTANT IN HERE\r
+XDEFE: MOVSI   D,(MOVE T,)\r
+       PUSHJ   P,BUILDA\r
+       MOVE    X2,CETMP        ;RESTORE TMPROL, SAVE TEMPORARIES FOR FNC\r
+       MOVE    Q,CESTM\r
+       MOVEM   X2,CEPTM\r
+       MOVEM   X2,FLTMP\r
+       MOVEM   Q,CETMP\r
+       MOVEM   Q,FLSTM\r
+\r
+       HRRE    X1,FUNLOW       ;RESTORE TMPLOW\r
+       MOVEM   X1,TMPLOW\r
+       HRRZ    X1,FUNSTA       ;-1(X1) IS LOC OF JRST AROUND FUNCTION\r
+       ADD     X1,FLCOD\r
+       HRRZ    X2,CECOD        ;JRST TO THE NEXT INST TO BE CODED\r
+       ADDI    X2,1\r
+       HRRM    X2,(X1)\r
+       MOVE    D,[JRST N,FRETRN]\r
+       JRST    N,XRET1         ;USE RETURN CODE TO BUILD INST\r
+\r
+XDEFM: POP     P,X1            ;MULTI-LINE DEF. SAVE THE ARGCOUNT PARAMETER FOR FNEND\r
+       HRLM    X1,FUNSTA\r
+       MOVE    X1,CEFOR                ;SAVE NUMBER OF ACTIVE FORS\r
+       SUB     X1,FLFOR                ;FOR A CHECK OF FORS HALF IN DEF\r
+       HRLM    X1,FUNLOW\r
+       JRST    NXTSTA\r
+\f;DIM STATEMENT\r
+;<DIM STA> ::= DIM <LETTER>[$](<NUMBER>[,<NUMBER>])[,<LETTER>[$](<NUMBER>[,<NUMBER>])...]\r
+\r
+;FOR EACH ARRAY, HAVE ONE-WORD ENTRY IN VARROL\r
+;WHICH POINTS TO THREE-WORD ENTRY IN ARAROL\r
+;WHOSE FORMAT IS:\r
+;      (<LENGTH OF ARRAY>)<PNTR>\r
+;      (<LEFT DIM>+1)<RIGHT DIM>+1\r
+;THE THIRD WORD IS < 0 IF THE MATRIX IS SET EQUAL TO ITS OWN TRN,\r
+;>0 IF THIS IS THE FAKE MATRIX USED FOR TMP STORAGE DURING MATA=\r
+;TRN(A), OTHERWISE IT IS 0.\r
+\r
+;DURING COMPILATION, <PNTR> IS CHAIN OF REFERENCES.\r
+;DURING EXECUTION, <PNTR> IS ADDRS OF FIRST WORD.\r
+\r
+XDIM:  SETZI   F,              ;ALLOW STRING VECTORS.\r
+       PUSHJ   P,ARRAY         ;REGISTER ARRAY NAME\r
+       CAIE    A,5             ;STRING VECTOR? ELSE..\r
+       JUMPN   A,GRONK         ;NON-0 RESULT FLAG-SYNTAX ERROR.\r
+       CAIE    C,"("   ;CHECK OPENING PAREN\r
+       JRST    GRONK\r
+       ADD     B,FLOOR(F)      ;COMPUTE LOC OF ROLL ENTRY\r
+       SKIPLE  1(B)            ;DIMENSION FLAG SHOULD BE 0 OR -1 OR -2\r
+       FAIL    <VARIABLE DIMENSIONED TWICE>\r
+       PUSHJ   P,NXCHK         ;SKIP PARENTHESIS\r
+       PUSHJ   P,GETNU ;FIRST DEMENSION\r
+       JRST    GRONK           ;NOT A NUMBER\r
+       HRRZ    D,N             ;SAVE FIRST DIM\r
+       AOBJN   D,.+1           ;D::= XWD <FIRST DIM+1>,1\r
+       MOVEM   D,1(B)          ;STORE IN ARAROL (IN CASE 1 DIM)\r
+       MOVEI   N,1             ;IN CASE ONE DIMENSION\r
+       TLNN    C,F.COMA        ;TWO DIMS?\r
+       JRST    N,XDIM1         ;NO\r
+       PUSHJ   P,NXCHK         ;YES. SKIP COMMA.\r
+       JUMPN   A,GRONK         ;STRING VECTOR HAS TWO DIMS?\r
+       PUSHJ   P,GETNU ;GET SECOND DIM\r
+       JRST    GRONK           ;NOT A NUMBER\r
+       ADDI    N,1\r
+       HRL     D,N             ;NOW D HAS XWD <COLS+1>,<ROWS+1>\r
+       MOVSM   D,1(B)          ;STORE IN ROLL SWAPPED\r
+XDIM1: IMULI   N,(D)           ;COMPUTE LENGTH OF ARRAY\r
+       HRLM    N,0(B)          ;STORE IN ROLL\r
+\r
+       TLNN    C,F.RPRN        ;CHECK CLOSING PAREN\r
+       JRST    GRONK\r
+       PUSHJ   P,NXCHK         ;LOOK FOR COMMA\r
+       TLNN    C,F.COMA\r
+       JRST    NXTSTA          ;NO. DONE WITH THIS STATEMENT.\r
+       PUSHJ   P,NXCHK         ;SKIP THE COMMA.\r
+       JRST    XDIM\r
+\f;END STATEMENT\r
+\r
+;<END STA> ::= END\r
+\r
+XEND:  MOVE    X1,FLLIN        ;CHECK THAT IT IS LAST STA\r
+       ADDI    X1,1(L)\r
+       CAME    X1,CELIN\r
+       FAIL    <END IS NOT LAST>\r
+\r
+       MOVE    D,[JRST UXIT]   ;COMPILE TERMINAL EXIT\r
+       PUSHJ   P,BUILDI\r
+       JRST    LINKAG          ;GO FINISH UP AND EXECUTE\r
+\f;FOR STATEMENT\r
+\r
+;CALCULATE INITIAL, STEP, AND FINAL VALUES\r
+;\r
+;SET INDUCTION VARIABLE TO INITIAL VALUE\r
+;AND JUMP TO END IF IND VAR > FINAL\r
+;INCREMENTING IS HANDLED AT CORRESPONDING NEXT.\r
+\r
+;FIVE WORD ENTRY PLACED ON FORROL FOR USE\r
+;BY CORRESPONDING NEXT STATEMENT:\r
+\r
+;      CURRENT VALUE OF L (FOR "FOR WITHOUT NEXT" MESSAGE)\r
+;<REL. ADRS IN CODROL OF JUST TO END OF-NEXT>\r
+;      <POINTER TO INDUCTION VARIABLE>\r
+;      <POINTER TO INCREMENT>\r
+;      <CURRENT VALUE OF TMPLOW>\r
+\r
+\r
+XFOR:  TLNN    C,F.LETT        ;MAKE SURE VARIABLE IS FIRST.\r
+       JRST    GRONK\r
+       MOVE    A,L             ;SAVE L FOR POSSIBLE ERROR MSG\r
+       MOVEI   R,FORROL\r
+       PUSHJ   P,RPUSH\r
+       PUSHJ   P,REGLTR        ;REGISTER ON SCAROL\r
+       CAIN    A,1             ;BETTER BE SCALAR\r
+       TLNN    C,F.EQAL        ;BETTER HAVE EQUAL\r
+       JRST    GRONK\r
+       PUSHJ   P,NXCHK         ;SKIP EQUAL SIGN.\r
+       PUSH    P,B             ;SAVE THE VARIABLE POINTER\r
+       PUSHJ   P,FORMLN        ;GEN THE INITIAL VALUE\r
+       PUSHJ   P,EIRGNP\r
+       MOVSI   D,(MOVEM N,)    ;GEN STORE INITIAL IN VARIABLE\r
+       MOVE    B,(P)\r
+       PUSHJ   P,BUILDA\r
+       PUSHJ   P,QSF           ;LOOK FOR "TO"\r
+       ASCIZ   /TO/\r
+       PUSHJ   P,FORMLN        ;GEN THE UPPER BOUND.\r
+       PUSHJ   P,GPOSGE        ;PERMANENT\r
+       PUSHJ   P,SIPGEN        ;TEMPORARY.\r
+       PUSH    P,B             ;REMEMBER WHERE IT IS\r
+       TLNN    C,F.TERM        ;IS THERE A STEP CLAUSE?\r
+       JRST    XFOR2           ;LOOK FOR EXPLICIT "STEP"\r
+       MOVE    T,[POINT 7,[BYTE (35)"STEP1"(7)15]]\r
+       PUSHJ   P,NXCHK         ;GET "S" IN CASE OF CR          ;IMPLICIT "STEP1"\r
+XFOR2: PUSHJ   P,QSF           ;LOOK FOR "STEP"\r
+       ASCIZ /STEP/\r
+\r
+       PUSHJ   P,FORMLN        ;XLATE AND GEN INCREMENT\r
+       PUSHJ   P,SIPGEN        ;SAVE STEP\r
+       EXCH    B,0(P)          ;EXCH WITH TOP OF ROL\r
+       PUSH    P,B             ;SAVE LOC OF UPPER BOUND\r
+       MOVE    B,-2(P)         ;GET INDUCTION VAR IN REG\r
+       PUSHJ   P,EIRGEN\r
+       MOVE    B,-1(P)\r
+       HLRZ    X1,B\r
+       ANDI    X1,377777\r
+       CAIN    X1,31\r
+       JRST    XFOR3\r
+       MOVSI   D,(DONFOR)\r
+       PUSHJ   P,BUILDA\r
+XFOR3: MOVE    X1,-1(P)\r
+       POP     P,B             ;BUILD COMPARE INSTR (IT\r
+       MOVSI   D,(CAMLE N,)    ;DOESN'T MATTER WHAT IT\r
+       SKIPGE  N,X1            ;IS IF DONFOR IS THERE).\r
+       MOVSI   D,(CAMGE)\r
+       PUSHJ   P,BUILDA\r
+       MOVSI   D,(JRST)        ;DUMMY JRST INSTRUCTION\r
+       PUSHJ   P,BUILDI\r
+\r
+       MOVE    A,CECOD\r
+       SUB     A,FLCOD         ;SAVE LOC FOR NEXT'S JRST\r
+       SKIPE   N,RUNFLA        ;WHAT JRST ACUTALLY\r
+       MOVEI   A,-2(A)         ;NO. DONT ALLOW SPACE FOR IT.\r
+       MOVEI   R,FORROL\r
+       PUSHJ   P,RPUSH\r
+       POP     P,A\r
+       EXCH    A,(P)\r
+       PUSHJ   P,RPUSH         ;SAVE INDUCTION VARIABLE\r
+       EXCH    A,(P)           ;GET INCREMENT\r
+       PUSHJ   P,RPUSH\r
+       POP     P,B             ;GET POINTER TO INDUCTION VARIABLE.\r
+       MOVSI   D,(MOVEM N,)    ;BUILD THE STORE THAT WILL BE USED\r
+       PUSHJ   P,BUILDA        ;BY NEXT.\r
+\r
+       MOVEI   R,FORROL\r
+       MOVE    A,TMPLOW        ;SAVE THIS LEVEL OF PROTECTION TO BE RESTORED\r
+       PUSHJ   P,RPUSH\r
+       MOVE    A,TMPPNT        ;PROTECT TEMPS USED BY THIS "FOR"\r
+       MOVEM   A,TMPLOW        ;IN THE RANGE OF THE FOR.\r
+       JRST    N,NXTSTA\r
+\f;FNEND STATEMENT\r
+\r
+;<FNEND STA> ::= FNEND\r
+\r
+XFNEND:        ASCIZ /ND/\r
+       SKIPN   A,FUNAME        ;MUST FOLLOW A MULTI-LINE FN DEF\r
+       FAIL <FNEND BEFORE DEF>\r
+       SETZM   FUNAME          ;SIGNAL END OF FN\r
+       TLO     A,(177B13)      ;ASSEMBLE THE SCALAR NAME OF THE RESULT\r
+       PUSHJ   P,SCAREG        ;REGISTER IT AS A SCALAR\r
+       PUSHJ   P,EIRGNP        ;GET THE RESULT IN REG\r
+       HLRZ    B,FUNSTA        ;RECOVER THE ADDRESS OF THE ARGUMENT COUNT\r
+       HRLI    B,CADROL\r
+       HLRZ    X1,FUNLOW       ;THIS IS # OF WDS IN FORROL AT START OF DEF\r
+       ADD     X1,FLFOR\r
+       CAME    X1,CEFOR        ;ARE ALL NEXTS INSIDE OF DEF COMPLETE?\r
+       FAIL <FNEND BEFORE NEXT>\r
+       JRST    XDEFE\r
+\f\r
+;GOSUB STATEMENT XLATE\r
+\r
+XGOSUB:        ASCIZ   /UB/\r
+       PUSHJ   P,GETNUM        ;READ STATEMENT NUMBER\r
+       JRST    GRONK\r
+       HRLZ    A,N\r
+       MOVEI   R,LINROL        ;LOOK UP LINE NO\r
+       PUSHJ   P,SEARCH\r
+       FAIL    <UNDEFINED LINE NUMBER >,1\r
+       SUB     B,FLLIN ;SUCCESS.  SAVE REL LOC IN LINROL\r
+       HRLZ    A,B\r
+       MOVEI   R,GSBROL\r
+       PUSHJ   P,SEARCH\r
+       JRST    N,.+2\r
+       JRST    N,XGOS1\r
+       MOVEI   E,1\r
+       PUSHJ   P,OPENUP\r
+       MOVEM   A,(B)\r
+XGOS1: SUB     B,FLGSB\r
+       HRLI    B,GSBROL\r
+       MOVSI   D,(GOSUB)\r
+       PUSHJ   P,BUILDA\r
+       JRST    N,NXTSTA\r
+\r
+\r
+;GOTO STATEMENT\r
+\r
+\r
+XGOTO: ASCIZ   /O/\r
+XGOFIN:        PUSH    P,[Z NXTSTA]    ;BUILD GOTO AND END STA\r
+XGOFR: PUSHJ   P,GETNUM        ;BUILD GOTO AND RETURN\r
+       FAIL    <ILLEGAL LINE REFERENCE >\r
+       HRLZ    A,N             ;LOOK FOR DESTINATION\r
+       MOVEI   R,LINROL\r
+       PUSHJ   P,SEARCH\r
+       FAIL    <UNDEFINED LINE NUMBER >,1\r
+       SUB     B,FLLIN ;NOW CHECK FOR JUMP INTO/OUTOF FUNCTION\r
+       MOVE    X1,FLREF\r
+       ADD     X1,B\r
+       MOVE    X1,(X1)\r
+       CAME    X1,FUNAME       ;BOTH MUST BE ZERO OR SAME FUNCTION\r
+       FAIL    <ILLEGAL LINE REFERENCE >,1\r
+       HRLI    B,LADROL\r
+       MOVSI   D,(JRST)\r
+       PUSHJ   P,BUILDA        ;BUILD INSTR\r
+       POPJ    P,\r
+\f;IF STATEMENT\r
+\r
+;<IF STA>::=IF <NUM FORMULA> <RELATION> <NUM FORMULA> THEN <LINE NUMBER>\r
+;      OR\r
+;      ::= IF <STRING FORMULA><RELATION><STRING FORMULA> THEN <LINE NUMBER>\r
+\r
+\r
+;RELATION IS LOOKED UP IN TABLE (RELROL)\r
+;WHICH RETURNS INSTRUCTION TO BE EXECUTED\r
+;IF ONE OF THE EXPRESSIONS BEING COMPARED IS\r
+;IN THE REG, THAT ONE WILL BE COMPARED AGAINST\r
+;THE OTHER IN MEMORY.  IF NECESSARY, THE\r
+;INSTRUCTION IS CHANGED TO ITS CONTRAPOSITIVE\r
+;BY FUDGING BITS IN THE OP CODE\r
+\r
+;IF STATEMENT\r
+\r
+XIF:   PUSHJ   P,FORMLB        ;LEFT SIDE, MY BE A STRING\r
+       PUSHJ   P,GPOSGE        ;SAVE TYPE.\r
+       PUSHJ   P,PUSHPR        ;MAKE SURE IT IS POSITIVE\r
+       PUSHJ   P,SCNLT1        ;SAVE IT\r
+       MOVEI   X1,">"\r
+       CAIE    X1,(C)          ;NEXT CHAR ">"?\r
+       TLNE    C,F.EQAL        ;OR "="?\r
+       PUSHJ   P,SCN2          ;PUT TWO CHAR RELATION IN A(SIXBIT)\r
+       JFCL\r
+       MOVEI   R,RELROL        ;RELATION TABLE\r
+       PUSHJ   P,SEARCH\r
+       FAIL    <ILLEGAL RELATION>\r
+       HRLZ    D,(B)           ;SAVE RELATION INSTR\r
+       PUSH    P,D\r
+       PUSHJ   P,FORMLB        ;RIGHT SIDE, MAY ALSO BE A STRING\r
+       SKIPN   IFFLAG\r
+       FAIL <MIXED STRINGS AND NUMBERS>\r
+       PUSHJ   P,GPOSGE\r
+       TLNN    B,ROLMSK        ;IS RIGHT SIDE IN REG?\r
+       JRST    IFSX4           ;YES, LEAVE IT\r
+       PUSHJ   P,EXCHG         ;NO. SWAP WITH LEFT SIDE.\r
+       MOVE    D,(P)           ;FUDGE INSTRUCTION FOR CONTRAPOSITIVE RELATION\r
+       TLNE    D,1000          ;(EQUAL, NOT EQUAL DON'T CHANGE.)\r
+       TLC     D,6000          ;(OTHERS DO).\r
+       MOVEM   D,(P)\r
+\r
+IFSX4:\r
+IFN FTSTR,<\r
+       SKIPL   IFFLAG          ;NUMERIC COMPARE?\r
+       JRST    IFSX6           ;NO, STRING.\r
+>\r
+       PUSHJ   P,EIRGNP        ;MOVE TO REG\r
+       PUSHJ   P,POPPR         ;GET OTHER SIDE BACK\r
+       POP     P,D             ;GET STASHED OP CODE\r
+       PUSHJ   P,BUILDA        ;BUILD COMPARE INSTRUCTION\r
+IFSX5: PUSHJ   P,THENGO        ;LOOK FOR "THEN" OR "GOTO"\r
+       JRST    N,XGOFIN        ;USE GOTO CODE TO GEN JRST INSTR\r
+\r
+IFN FTSTR,<\r
+IFSX6: PUSHJ   P,FLET3\r
+       PUSHJ   P,POPPR         ;GET OTHER ONE BACK\r
+       MOVSI   D,(STRIF)       ;STRING COMPARE UUO\r
+       PUSHJ   P,BUILDA        ;COMPARE UUO WITH OTHER STRING ADDRESS\r
+       POP     P,D\r
+       PUSHJ   P,BUILDI        ;BUILD THE RELATION\r
+       JRST    N,IFSX5         ;FINISH UP (THE OTHER STR POINTER WILL BE IN N)\r
+>;ASSEMBLE ABOVE IF INCLUDING STRING FACILITY\r
+\f;INPUT STATEMENT\r
+\r
+;<INPUT STA> ::= INPUT (<SCALAR> ! <ARRAY REF>)[,(<SCALAR>!<ARRAY REF>)...]\r
+\r
+\r
+XINPUT:        ASCIZ /UT/\r
+       MOVE    D,[PUSHJ P,DOINPT]\r
+XINP0: PUSHJ   P,BUILDI        ;CONTRUCT SETUP INSTR\r
+XINP1: TLNN    C,F.LETT        ;CHECK THAT LETTER IS NEXT.\r
+       JRST    GRONK\r
+       SETZI   F,              ;STRINGS MAY BE INPUT\r
+       PUSHJ   P,REGLTR        ;GET VARIABLE\r
+       JUMPE   A,XINP2\r
+       CAIG    A,4             ;STRING VARIABLE?\r
+       JRST    XINP1A          ;NO\r
+IFN FTSTR,<\r
+       CAIG    A,6             ;VARIABLE?\r
+       JRST    XINP6           ;YES\r
+>\r
+\r
+       JRST    ILFORM          ;NO, ATTEMPT TO BOMB A LITERAL\r
+\r
+XINP1A:        CAILE   A,1             ;ONLY ARRAY AND SCALAR ALLOWED\r
+       JRST    ILVAR\r
+       MOVSI   D,13000\r
+       PUSHJ   P,BUILDA\r
+       JRST    N,XINP3\r
+XINP2: PUSH    P,B             ;SAVE VARIABLE POINTER\r
+       PUSHJ   P,XARG          ;XLATE ARGS\r
+       MOVSI   D,14000\r
+       JUMPE   B,XINP2A\r
+       HRRZ    X1,(P)          ;GET ADDRESS OF VARIABLE 2-WD BLOCK\r
+       ADD     X1,FLARA\r
+       SKIPN   1(X1)           ;MARK   2-DIM\r
+       SETOM   1(X1)\r
+       MOVSI   D,15000\r
+XINP2A:        EXCH    B,(P)           ;SAVE NO OF ARGS, GET VARIABLE\r
+       PUSHJ   P,BUILDA        ;BUILD DATA INSTR\r
+       POP     P,B             ;GET NO OF ARGS\r
+       PUSHJ   P,GENARG\r
+\r
+XINP3: TLNN    C,F.COMA        ;MORE?\r
+       JRST    NXTSTA          ;NO\r
+       PUSHJ   P,NXCHK         ;YES. SKIP COMA\r
+       JRST    XINP1\r
+IFN FTSTR,<\r
+XINP6: PUSHJ   P,FLET2         ;STRING. FINISH REGISTERING\r
+       MOVSI   D,33200\r
+       PUSHJ   P,BUILDA        ;BUILD, WITH ADDRESS\r
+       JRST    XINP3\r
+>\r
+\f;LET STATEMENT\r
+\r
+XLET:  TLNN    C,2000\r
+       JRST    GRONK\r
+       SETZI   F,\r
+       SETOM   LETSW           ;LOOK FOR A LHS.\r
+XLET0B:        PUSHJ   P,FORMLB\r
+       SKIPGE  LETSW           ;FAIL IF THIS FORMULA IS NOT A VARIABLE\r
+       TLNN    C,220000\r
+       JRST    XLET0A\r
+       SKIPL   IFFLAG\r
+       JRST    XLET3\r
+       PUSH    P,[EXP 1]       ;FLAG ON PLIST. IF THE LHS IS A SCALER,\r
+       PUSH    P,B             ;PUT THE FLAG AND AC B ON PLIST HERE.\r
+XLET0: PUSHJ   P,NXCHK         ;SKIP EQUAL SIGN.\r
+       SOS     LETSW           ;COUNT THIS LHS, AND\r
+       JRST    XLET0B          ;LOOK FOR ANOTHER.\r
+XLET0A:        MOVMS   LETSW           ;FINISHED SCANNING\r
+       SOSG    LETSW\r
+       JRST    GRONK\r
+       SKIPL   E,IFFLAG        ;STRING LET STA?\r
+       JRST    XLET3A          ;YES.\r
+\r
+       PUSHJ   P,EIRGEN        ;NO, GET RESULT IN REG\r
+       MOVEM   B,TEMP1         ;SAVE THE NEGATIVE RESULT CHECK\r
+XLET1: MOVE    D,[MOVEM N, (MOVNM N,)]\r
+       SKIPG   -1(P)           ;FLAGS ON PLIST ARE --\r
+       MOVE    D,[ARSTO1 N, (ARSTN1 N,)]       ; 0 FOR LIST\r
+       SKIPL   -1(P)                           ; 1 FOR SCALAR\r
+       JRST    XLET2                           ; -1 FOR TABLE.\r
+       MOVE    D,[ARSTO2 N, (ARSTN2 N,)]\r
+       MOVE    X1,(P)          ;DEFAULT ARRAY SIZE (10,10)\r
+       ADD     X1,FLARA\r
+       SKIPN   1(X1)\r
+       SETOM   1(X1)\r
+XLET2: SKIPGE  TEMP1           ;CHECK FOR NEGATIVE RESULT\r
+       MOVS    D,D             ;NEGATIVE. GET CORRECT INSTR.\r
+       POP     P,B             ;RESTORE RESULT PNTR\r
+       PUSHJ   P,BUILDA        ;BUILD STORE INSTR\r
+       POP     P,B             ;CHECK TRASH FROM PUSHLIST.\r
+       JUMPG   B,XLET2B        ;ARRAY REF?\r
+       PUSHJ   P,GENARG        ;YES. GEN ARGS FIRST.\r
+XLET2B:        SOSLE   LETSW\r
+       JRST    XLET1           ;THERE IS ANOTHER LHS.\r
+       JRST    NXTSTA\r
+\r
+XLET3: PUSHJ   P,PUSHPR\r
+       JRST    N,XLET0\r
+XLET3A:        CAME    E,LETSW\r
+       FAIL    <MIXED STRINGS AND NUMBERS>\r
+XLET4: PUSH    P,B\r
+       PUSHJ   P,FLET3\r
+       PUSHJ   P,POPPR\r
+       MOVSI   D,(STRSTO)      ;BUILD THE STRING MOVE INSTRUCTION.\r
+       PUSHJ   P,BUILDA\r
+       POP     P,B\r
+       SOSLE   LETSW\r
+       JRST    XLET4           ;THERE IS ANOTHER LHS.\r
+       JRST    NXTSTA\r
+\fIFN FTMAT,<\r
+;MAT STATEMENT\r
+\r
+;MAT STATEMENTS DIVIDE INTO A NUMBER OF DIFFERENT\r
+;STATEMENTS (MAT READ, ...)   THESE POSSIBILITIES ARE TESTED\r
+;ONE AT A TIME BY CALLS TO QSA.\r
+\r
+;<MAT READ STA> ::= MAT READ <LETTER>[(<EXP>,<EXP>)] [,<LETTER>[(<EXP>,<EXP>...]]\r
+\r
+XMAT:  HLLI    F,              ;ALLOW STRINGS FOR READ,PRINT,PRINT\r
+       PUSHJ   P,QSA           ;MAT READ?\r
+       ASCIZ   /READ/\r
+       JRST    XMAT2           ;NO.  GO TRY MAT PRINT\r
+XMAT1: PUSHJ   P,ARRAY         ;GET ARRAY NAME\r
+       CAIE    A,5             ;STRING VECTOR?\r
+       JUMPN   A,GRONK\r
+       MOVSI   D,(MATRD)\r
+       SKIPL   DATAFF          ;DATA SEEN?\r
+       HLLOS   DATAFF          ;NO.  SET NO DATA FLAG\r
+       PUSHJ   P,XMACOM                ;GO CHECK DIMENSIONS AND BUILD UUO.\r
+       TLNN    C,F.COMA        ;IS THERE ANOTHER ARRAY TO READ?\r
+       JRST    NXTSTA          ;NO.\r
+       PUSHJ   P,NXCHK         ;YES. SKIP COMMA\r
+       TLNE    C,F.TERM        ;END OF ARRAY LIST?\r
+       JRST    N,NXTSTA        ;YES.\r
+       JRST    N,XMAT1\r
+\r
+;<MAT PRINT STA>::= MAT PRINT <LETTER>[(<EXP>,<EXP>)] [[;!,] <LETTER>[(<EXP>,<EXP>)...]\r
+\r
+XMAT2: PUSHJ   P,QSA           ;MAT PRINT?\r
+       ASCIZ /PRINT/\r
+       JRST    N,XMAT3         ;NO. MUST HAVE VARIABLE NAME.\r
+XMAT2A:        PUSHJ   P,ARRAY         ;REGISTER NAME\r
+       CAIE    A,5             ;STRING VECTOR?\r
+       JUMPN   A,GRONK\r
+       MOVSI D,(MATPR)\r
+       PUSHJ   P,CHKFMT\r
+       TLNN    D,140\r
+       JRST    GRONK           ;FAIL IF ILLEGAL\r
+       PUSHJ   P,XMACOM        ;GO CHECK DIMENSIONS AND BUILD UUO\r
+       TLNE    C,F.TERM        ;IS FORMAT CHAR FOLLOWED BY END OF STA?\r
+       JRST    NXTSTA          ;YES.\r
+       JRST    XMAT2A\r
+\r
+;<MAT SCALE STA> ::= MAT <LETTER>=(<EXPRESSION>)*<LETTER>\r
+\r
+XMAT3: PUSH    P,[Z NXTSTA]    ;ALL REMAINING MAT STATEMENTS MAY HAVE\r
+                               ;ONE OPERAND, BUT NOT A LIST OF THEM.\r
+       PUSHJ   P,QSA\r
+       ASCIZ /INPUT/\r
+       JRST    XMAT3A\r
+       PUSHJ   P,VECTOR        ;REGISTER VECTOR NAME\r
+       CAIE    A,5             ;STRING VECTOR?\r
+       JUMPN   A,GRONK         ;OR NUMBER VECTOR?\r
+       MOVSI   D,(MATINP)      ;YES. BUILD MAT INPUT\r
+       JRST    BUILDA\r
+\r
+\r
+XMAT3A:        HRLI    F,-1            ;REMAINING MATOPS CANT HAVE STRINGS.\r
+       PUSHJ   P,ARRAY         ;REGISTER THE VARIABLE\r
+       JUMPN   A,GRONK         ;CHECK FOR ILLEGAL ARRAY NAME.\r
+       TLNN    C,F.EQAL        ; CHECK FOR EQUAL SIGN.\r
+       JRST    GRONK\r
+       PUSHJ   P,NXCHK         ;SKIP EQUAL.\r
+       CAIE    C,"("   ;SCALAR MULTIPLE?\r
+       JRST    XMAT4           ;NO\r
+       PUSHJ   P,NXCHK         ;SKIP PARENTHESIS\r
+       PUSH    P,B\r
+       PUSHJ   P,FORMLN        ;YES.  GEN MULTIPLE\r
+       PUSHJ   P,EIRGNP\r
+       PUSHJ   P,QSF           ;SKIP MULTIPLY SING\r
+       ASCIZ /)*/\r
+       PUSH    P,[MATSCA]      ;GET OP CODE.\r
+       JRST    N,XMAT9A\r
+\f;<MAT SETUP STA> ::= MAT ZER!CON!IDN <LETTER>[(<EXPRESSION>,<EXPRESSION>)]\r
+\r
+XMAT4: PUSHJ   P,QSA           ;MAT ZER?\r
+       ASCIZ /ZER/\r
+       JRST    XMAT5           ;NO.\r
+       MOVSI   D,(MATZER)      ;YES.\r
+       JRST    XMACOM\r
+\r
+XMAT5: PUSHJ   P,QSA           ;MAT CON?\r
+       ASCIZ /CON/\r
+       JRST    XMAT6\r
+       MOVSI   D,(MATCON)      ;YES.\r
+       JRST    XMACOM\r
+\r
+XMAT6: PUSHJ   P,QSA           ;MAT IDN?\r
+       ASCIZ /IDN/\r
+       JRST    XMAT7           ;NO\r
+       MOVSI   D,(MATIDN)      ;YES.\r
+\r
+;COMMON GEN FOR MAT ZER,CON,IDN,REA\r
+\r
+XMACOM:        CAIE    C,"("           ;EXPLICIT DIMENSIONS?\r
+       JRST    XMAT9D          ;NO.\r
+       PUSH    P,B             ;SAVE B,D.\r
+       PUSH    P,D\r
+       PUSHJ   P,XARG          ;TRANSLATE ARGUMENTS\r
+       PUSH    P,B             ;SAVE COUNT OF ARGUMENTS\r
+       MOVE    B,-2(P)         ;GET BACK THE REGISTERY OF THE ARRAY.\r
+       MOVSI   D,(SDIM)                ;BUILD SDIM INSTR.\r
+       PUSHJ   P,BUILDA\r
+       POP     P,B             ;GET THE ARGUMENT COUNT.\r
+       JUMPN   B,XMACO1        ;ONE ARG OR TWO?\r
+       MOVE    D,[JUMP T1,ONCESW]      ;ONE. FAKE DIMENSIONS OF (0,N)\r
+       PUSHJ   P,BUILDI\r
+       SETZI   B,\r
+\r
+XMACO1:        PUSHJ   P,GENARG                ;GEN ARGS\r
+       JRST    XMAT9C          ;RESTORE AC,S AND BUILD\r
+\r
+;<MAT FCN STA> ::= MAT<LETTER> = INV!TRN (<LETTER>)\r
+\r
+XMAT7: PUSHJ   P,QSA           ;MAT INV?\r
+       ASCIZ /INV(/\r
+       JRST    XMAT8           ;NO\r
+       MOVSI   D,(MATINV)      ;YES. GET OP CODE.\r
+       JRST    XMITCM\r
+\r
+XMAT8: PUSHJ   P,QSA           ;MAT TRN?\r
+       ASCIZ /TRN(/\r
+       JRST    XMAT9           ;NO.\r
+       MOVSI   D,(MATTRN)      ;YES. GET OP CODE\r
+XMITCM:        PUSH    P,B             ;FINISH MAT INV,TRN.\r
+       PUSH    P,D\r
+       PUSHJ   P,ARRAY\r
+       JUMPN   A,GRONK\r
+       PUSHJ   P,QSF\r
+       ASCIZ /)/\r
+       JRST    XMAT9B\r
+\f;<MAT OPERATOR STA>::=MAT <LETTER>=<LETTER>+!-!*<LETTER>\r
+\r
+XMAT9: PUSH    P,B             ;SAVE RESULT LOCATION\r
+       PUSHJ   P,ARRAY\r
+       JUMPN   A,GRONK\r
+       MOVEI   D,0             ;LETTER FOLLOWED BY OPERATOR\r
+       TLNN    C,F.PLUS+F.MINS+F.STAR\r
+       JRST    N,XMAT10        ;NO OPERATOR. MUST BE MAT COPY\r
+       TLNN    C,F.MINS+F.STAR\r
+       MOVSI   D,(MATADD)\r
+       TLNN    C,F.PLUS+F.STAR\r
+       MOVSI   D,(MATSUB)\r
+       TLNN    C,F.PLUS+F.MINS\r
+       MOVSI   D,(MATMPY)\r
+       PUSH    P,D             ;SAVE OPERATION\r
+       PUSHJ   P,NXCHK         ;SKIP OPERATOR\r
+       MOVSI   D,(MOVEI T,)    ;GEN T:= ADRS OF FIRST ARRAY\r
+\r
+       PUSHJ   P,BUILDA        ;ENTER HERE FROM SCALAR MULTIPLE\r
+\r
+XMAT9A:        PUSHJ   P,ARRAY         ;SECOND ARRAY\r
+       JUMPN   A,GRONK         ;NOT ARRAY NAME\r
+\r
+;ENTER HERE FROM MAT INV, TRN\r
+\r
+XMAT9B:        MOVSI   D,(MOVEI T1,)\r
+       PUSHJ   P,BUILDA\r
+XMAT9C:        POP     P,D\r
+       POP     P,B\r
+XMAT9D:        PUSHJ   P,BUILDA\r
+       POPJ    P,              ;RETURN TO NXTSTA (OR TO PROCESS NEXT ITEM IN PRINT,READ, OR INPUT LIST.)\r
+\r
+XMAT10:        PUSH    P,B             ;FOR MAT COPY, FAKE MAT B=(1)*A\r
+       MOVE    D,[MOVSI N,(1.0)];PUT CONSTANT 1.0 IN REG FOR SCALE\r
+       PUSHJ   P,BUILDI        ;BUILD INSTR TO GET SCAL FACTOR\r
+       POP     P,B             ;GET SOURCE MAT BACK\r
+       PUSH    P,[MATSCA]\r
+       JRST    N,XMAT9B\r
+>;ASSEMBLE ABOVE IF INCLUDING MATRIX FACILITY\r
+\f;;NEXT STATEMENT\r
+\r
+;<NEXT STA> ::= NEXT <SCALAR>\r
+\r
+;EXPECT TO FIND 5-WORD ENTRY ON TOP OF FORROL\r
+;DISCRIBING INDUCTION VARIABLE AND LOOP ADDRESS\r
+\r
+;WORD IS PUSHED ON NXTROL OF FOLLOWING FORM:\r
+;      (<REL ADRS OF TOP OF LOOP>) <REL ADRS OF JRST TO IT>\r
+;THIS WORD USED TO FIX UP REFERENCE AT END OF\r
+;COMPILATION\r
+XNEXT: ASCIZ /T/\r
+       PUSHJ   P,REGLTR\r
+       CAIE    A,1             ;BETTER BE SCALAR\r
+       JRST    GRONK\r
+       MOVE    X1,CEFOR        ;UNSAT FOR?\r
+       CAMG    X1,FLFOR\r
+       FAIL    <NEXT WITHOUT FOR>\r
+       CAME    B,-3(X1)        ;CHECK INDUCTION VARIABLE\r
+       FAIL    <NEXT WITHOUT FOR>\r
+\r
+       PUSHJ   P,POPFOR\r
+       MOVEM   B,TMPLOW        ;RESTORE PREVIOUS LEVEL OF TEMPORARY PROTECTION.\r
+       MOVEM   B,TMPPNT        ;BECAUSE THIS IS THE END OF THE "FOR" RANGE .\r
+       PUSHJ   P,POPFOR        ;GEN INCREMENT TO REG\r
+       PUSHJ   P,EIRGEN\r
+       PUSHJ   P,POPFOR        ;FADR TO INDUCTION VAR\r
+       MOVSI   D,(FADR)\r
+       PUSHJ   P,BUILDA\r
+       PUSHJ   P,POPFOR        ;GET LOC OF RETURN\r
+\r
+       MOVEI   X1,1(B)         ;ADD TO ADDRESS CHAIN OF NEXT WORD\r
+       ADD     X1,FLCOD\r
+       MOVE    X2,L\r
+       AOBJP   X2,XNEX2        ;DONT LINK IF LAST STATEMENT!\r
+       ADD     X2,FLLAD\r
+       MOVE    Q,(X2)\r
+       HRRM    Q,(X1)\r
+       MOVEI   Q,1(B)\r
+       HRRM    Q,(X2)\r
+\r
+XNEX2: MOVSI   A,(B)           ;ADD WORD TO NXTROL FOR LINKAGE\r
+       MOVEI   R,NXTROL\r
+       PUSHJ   P,RPUSH\r
+       SUB     B,FLNXT\r
+       HRLI    B,NXTROL\r
+       MOVSI   D,(JRST)        ;BUILD JRST INSTR\r
+       PUSHJ   P,BUILDA\r
+       PUSHJ   P,POPFOR        ;POP OFF THE SAVED VALUE OF L\r
+       JRST    NXTSTA\r
+\f;SUBR TO POP TOP OF FORROL. USED ONLY BY XNEXT.\r
+\r
+\r
+POPFOR:        SOS     X1,CEFOR        ;POP TOP OF FORROL\r
+       MOVE    B,(X1)\r
+       POPJ    P,\r
+\r
+\r
+\f;ON STATEMENT\r
+\r
+;<ON STA> ::= ON <EXPRESSION> GOTO!THEN <STA NUMBER> [,<STA NUMBER>...]\r
+\r
+;CREATES A CALL TO A RUNTIME ROUTINE THAT CHECKS THE RANGE OF THE ARGUMENT\r
+;AND RETURNS TO THE APPROPRIATE JRST:\r
+;      JSP     A,XCTON\r
+;      Z       (ADDRESS OF NEXT STATEMENT)\r
+;      <NEST OF>\r
+;      <GOTO'S >\r
+\r
+\r
+XON:   PUSHJ   P,FORMLN        ;EVALUTE INDEX\r
+       PUSHJ   P,EIRGNP        ;GET IN REG\r
+       MOVE    D,[JSP Q,XCTON]\r
+       PUSHJ   P,BUILDI        ;BUILD THE RUNTIME CALL\r
+       SETZI   D,              ;BUILD ADDRESS OF NEXT STATEMENT\r
+       MOVE    B,L\r
+       AOBJP   B,.+3           ;DONT BUILD IF LAST STATEMENT\r
+       HRLI    B,LADROL\r
+       PUSHJ   P,BUILDA\r
+       PUSHJ   P,THENGO        ;TEST FOR "THEN" OR "GOTO"\r
+\r
+XON1:  PUSHJ   P,XGOFR         ;BUILD A JRST TO THE NEXT NAMED STATMENT\r
+       TLNN    C,F.COMA        ;MORE?\r
+       JRST    N,NXTSTA        ;NO\r
+       PUSHJ   P,NXCHK         ;YES. SKIP COMMA\r
+       JRST    N,XON1          ;PROCESS NEXT LINE NUMBER\r
+\f;PRINT STATEMENTS CAUSES DATA TO BE OUTPUT TO THE DISK OR TTY.\r
+\r
+XPRINT:        ASCIZ /NT/\r
+       TLNE    C,F.TERM\r
+       JRST    N,XPCRLF\r
+XPRI1: SETOM   IFFLAG\r
+       TLNE    C,40\r
+       JRST    N,XPRTA2\r
+       PUSHJ   P,QSA\r
+       ASCIZ   /TAB/           ;TAB FIELD?\r
+       CAIA                    ;NO, ASSUME EXPRESSION OR DELIMENTER.\r
+       JRST    XPRTAB          ;YES, DO THE TAB\r
+       TLNE    C,F.COMA\r
+       JRST    N,XPRI2\r
+       PUSHJ   P,FORMLB\r
+       SKIPL   N,IFFLAG\r
+       JRST    N,PRNDEL\r
+       PUSHJ   P,GPOSNX\r
+       MOVSI   D,(PRNM)        ;SET UP OP CODE\r
+       PUSHJ   P,CHKFMT        ;SET FORMAT CODE\r
+       PUSHJ   P,BUILDA        ;GEN PRINT UUO\r
+       JRST    XPRFIN\r
+XPRI2: MOVE    D,[PRNTB  ONCESW]\r
+       JRST    XPRTA1\r
+\r
+;PRINT TAB\r
+\r
+XPRTAB:        PUSHJ   P,FORMLN        ;EVALUATE TAB SUBEXPRESSION\r
+       PUSHJ   P,EIRGNP        ;MOVE IT INTO REG\r
+       MOVSI   D,(PRNTB)       ;CALL THE TAB INTERPRETER\r
+XPRTA1:        PUSHJ   P,CHKFMT\r
+       PUSHJ   P,BUILDI        ;YES, BUILD THE INST.\r
+       JRST    XPRFIN\r
+XPRTA2:        PUSH    P,T\r
+       PUSHJ   P,QSKIP\r
+       JRST    GRONK\r
+       MOVSI   D,3000\r
+       PUSHJ   P,CHKFMT\r
+       PUSHJ   P,BUILDI\r
+       POP     P,D\r
+       PUSHJ   P,BUILDI\r
+XPRFIN:        TLNE    C,F.TERM        ;CR AT END OF LINE?\r
+       JRST    NXTSTA\r
+       JRST    XPRI1\r
+\r
+;HERE FOR PRINT WITH NO ARGUMENTS.  GEN CARRIAGE RETURN.\r
+\r
+XPCRLF:        MOVE    D,[PUSHJ P,PCRLF]\r
+       PUSHJ   P,BUILDI\r
+       JRST    NXTSTA\r
+\r
+;CHECK FORMAT CHAR (PRINT AND MAT PRINT)\r
+\r
+CHKFMT:        TLNE    C,F.TERM\r
+       TLO     D,40            ;CR ... AC = 1\r
+       CAIN    C,";"           ;SC ... AC = 2\r
+       TLO     D,100           ;CMA ... AC = 3\r
+       TLNE    C,F.COMA        ;<PA> ... AC = 4\r
+       TLO     D,140\r
+       TLNN    D,140           ;WAS THERE A FMT CHAR?\r
+       TLO     D,100           ;NO. ASSUME ";"\r
+       CAIE    C,";"\r
+       TLNE    C,F.COMA        ;SKIP FMT CHAR IF THERE WAS ONE.\r
+       JRST    NXCHK           ;YES. SKIP\r
+       POPJ    P,\r
+\r
+PRNDEL:        MOVSI   D,(PRSTR)\r
+       PUSHJ   P,CHKFMT\r
+       PUSHJ   P,BUILDA\r
+       JRST    XPRFIN\r
+\f;RANDOM IZE STATEMENT\r
+\r
+IFN FTRND,<\r
+XRAN:  ASCIZ /DOM/\r
+       PUSHJ   P,QSA\r
+       ASCIZ /IZE/\r
+       JFCL\r
+       TLNN    C,F.TERM\r
+       JRST    N,ILLINS\r
+       MOVE    D,[PUSHJ P,RANDER]\r
+       PUSHJ   P,BUILDI                ;BUILD CALL TO RUTIME RANDOMIZER\r
+       JRST    N,NXTSTA\r
+>;ASSEMBLE ABOVE IF INCLUDING RANDOM FACILITY\r
+\r
+\r
+;READ STATEMENT\r
+\r
+\r
+XREAD: ASCIZ /D/\r
+       SKIPL   DATAFF          ;DATA SEEN YET?\r
+       HLLOS   DATAFF  ;NO.  SET NO DATA FLAG\r
+       MOVE    D,[PUSHJ P,DOREAD]\r
+       JRST    XINP0           ;GO FINISH WITH INPUT CODE\r
+\r
+\f;RESTORE STATEMENTS.\r
+\r
+\r
+XREST: ASCIZ /TORE/\r
+       MOVE    D,[PUSHJ P,RESTON]\r
+       TLNN    C,F.STAR+F.DOLL\r
+       SOJA    D,XRES1\r
+       TLNE    C,F.DOLL        ;RESTORE ONLY STIRNGS?\r
+       ADDI    D,1\r
+       PUSHJ   P,NXCHK         ;SKIP $ OR *\r
+XRES1: PUSHJ   P,BUILDI\r
+       JRST    NXTSTA\r
+\f\r
+\r
+;RETURN STATEMENT XLATE\r
+\r
+\r
+XRETRN:        ASCIZ /URN/\r
+       MOVE    D,[JRST RETURN]\r
+XRET1: PUSHJ   P,BUILDI        ;XDEFS ENTERS HERE TO COMPLETE A FN DEF.\r
+       JRST    N,NXTSTA\r
+\r
+\r
+\r
+;STOP STATEMENT\r
+\r
+XSTOP: ASCIZ /P/\r
+       MOVE    D,[JRST UXIT]\r
+       PUSHJ   P,BUILDI\r
+       JRST    NXTSTA\r
+\f;GEN CODE TO EVALUATE FORMULA\r
+;POINTER TO (POSSIBLY NEGATIVE) RESULT RETURNED IN B\r
+\r
+;THIS LOOP HANDLES SUMS OF TERMS, CALLS TERM TO HANDLE PRODUCTS\r
+;AND SO ON\r
+;THE ENTRY POINT FORMLN REGARDS ONLY NUMERIC FORMULAS AS LEGAL.\r
+;THE ENTRY POINT FORMLS REGARDS ONLY STRING FORMULAS AS LEGAL.\r
+;THE ENTRY POINT FORMLB WILL ACCEPT EITHER A STRING OR A NUMERIC FORMULA.\r
+;THE ENTRY POINT FORMLU EXPECTS THE LEGALITY TO BE DEFINED EXTERNALLY.\r
+\r
+FORMLB:        SETZI   F,\r
+       TLNE    C,40\r
+       JRST    N,REGSL1\r
+       TLNN    C,2000\r
+FORMLN:        SETOI   F,\r
+       PUSHJ   P,TERM          ;GET FIRST TERM\r
+\r
+;ENTER HERE FOR MORE SUMMANDS\r
+\r
+FORM1: TLNN    C,F.PLUS+F.MINS\r
+       POPJ    P,\r
+       MOVMS   N,LETSW         ;THIS CANT BE LH(LET)\r
+       TLO     F,777777\r
+       PUSHJ   P,PUSHPR        ;PART RESLT TO SEXROL\r
+       PUSHJ   P,TERM          ;GET SECOND TERM\r
+       TLNE    B,ROLMSK        ;IS SECOND TERM IN REG?\r
+       PUSHJ   P,EXCHG         ;NO.  LETS DO FIRST TERM FIRST\r
+       PUSHJ   P,EIRGEN        ;FIRST SUMMAND TO REG\r
+       PUSH    P,B             ;SAVE SIGN INFORMATION\r
+       PUSHJ   P,POPPR         ;GET SECOND SUMMAND\r
+       SKIPGE  (P)             ;IS CONTENT OR REG NEGATIVE?\r
+       TLC     B,MINFLG        ;YES, NEGATE SECOND SUMMAND\r
+       MOVSI   D,(FADR N,)     ;FETCH INSTRUCTION\r
+       PUSHJ   P,BUILDS        ;BUILD ADD OR SUB INSTR\r
+       POP     P,B             ;REG PNTR WITH SIGN\r
+       AND     B,[XWD MINFLG,0]\r
+       JRST    FORM1\r
+\f;LOOP TO GEN CODE FOR MULTIPLY AND DIVIDE\r
+;CALLS FACTOR TO HANDLE EXPRESSIONS INVOLVING ONLY INFIX OPS AND "^"\r
+\r
+\r
+TERM:  PUSHJ   P,FACTOR\r
+\r
+;ENTER HERE FOR MORE FACTORS\r
+\r
+TERM1: TLNN    C,F.STAR+F.SLSH ;MUL OR DIV FOLLOWS?\r
+       POPJ    P,              ;NO, DONE WITH TERM.\r
+       MOVMS   LETSW           ;THIS CANT BE LH(LET)\r
+       TLO     F,777777\r
+       HRRZS   0(P)            ;SET MUL FLAG.\r
+       TLNN    C,F.STAR        ;IS IT MULTIPLY?\r
+       HRROS   0(P)            ;NO. SET DIV FLAG\r
+       PUSHJ   P,NXCHK         ;SKIP OVER CONNECTIVE\r
+       PUSHJ   P,PUSHPR        ;STASH PARTIAL RESULT ON SEXROL\r
+       PUSHJ   P,FACTOR        ;GET NEXT FACTOR\r
+       SKIPGE  (P)             ;IS SECOND FACTOR A DIVISOR?\r
+       PUSHJ   P,SITGEN        ;YES. IT CANNOT STAY IN REG.\r
+       TLNE    B,ROLMSK        ;IS SECOND FACTOR IN REG?\r
+       PUSHJ   P,EXCHG         ;NO. LETS GET FIRST FACTOR\r
+       MOVE    X1,CESEX        ;PEEK AT DIVISOR OR SECOND FACTOR.\r
+       MOVE    X2,-1(X1)\r
+       TLZE    X2,MINFLG       ;IS IT MINUS?\r
+       TLC     B,MINFLG        ;YES. CHANGE SIGNS OF BOTH.\r
+       MOVEM   X2,-1(X1)       ;NOW DIVISOR OR SECOND FACTOR IS PLUS.\r
+       PUSHJ   P,EIRGEN        ;GEN FIRST FACTOR OR DIVIDEND\r
+       PUSH    P,B             ;SAVE SIGN INFORMATION\r
+       PUSHJ   P,POPPR         ;GET SECOND OPERAND\r
+       MOVSI   D,(FMPR N,)     ;GET CORRECT INSTRUCTION\r
+       SKIPGE  -1(P)\r
+       MOVSI   D,(FDVR N,)\r
+       PUSHJ   P,BUILDA        ;BUILD MUL OR DIV INSTR\r
+       POP     P,B             ;REG PNTR WITH SIGN\r
+       JRST    N,TERM1         ;GO LOOK FOR MORE FACTORS\r
+\f;GEN CODE FOR ATOMIC FORMULAS, EXPONENTIATION, AND INFIX SIGNS\r
+;SIGN IS STASHED IN LH OF PUSH-DOWN LIST WORD WITH RETURN ADDRS\r
+;EXPLICIT SIGN IS NOT USED UNTIL AFTER EXPONENTIATION\r
+;IS CHECKED FOR.\r
+\r
+\r
+FACTOR:        PUSH    P,C             ;STASH SIGN IN PUSH LIST.\r
+       TLNE    C,F.MINS\r
+       TLC     C,F.PLUS+F.MINS ;YES. PRETEND IT WAS PLUS CALLING ATOM.\r
+\r
+       PUSHJ   P,ATOM          ;GEN FIRST ATOM\r
+\r
+FACT2A:        CAIE    C,"^"           ;EXPONENT FOLLOWS?\r
+       JRST    SNOEXI          ;NO.  GO NOTE SIGN AND RETURN.\r
+       MOVMS   LETSW           ;THIS CANT BE LH(LET)\r
+       PUSHJ   P,NXCHK         ;YES.  SKIP EXPONENTIATION SIGN\r
+       PUSHJ   P,PUSHPR        ;STASH BASE ON SEXROL\r
+       PUSHJ   P,ATOM          ;GEN THE EXPONENT\r
+       PUSHJ   P,EXCHG         ;EXCHANGE BASE AND EXPONENT\r
+       PUSHJ   P,EIRGNP        ;GET POSITIVE BASE IN REG\r
+       PUSHJ   P,POPPR         ;GET EXPONENT IN AC1\r
+       MOVSI   D,(MOVE 1,)\r
+       PUSHJ   P,BUILDS\r
+       MOVE    D,[PUSHJ P,EXP3.0]\r
+       PUSHJ   P,BUILDI        ;BUILD CALL TO EXPONENTIATION ROUTINE\r
+       MOVEI   B,0             ;ANSWER LANDS IN REG\r
+       JRST    FACT2A\r
+\r
+;SIGN NOTE AND EXIT\r
+;COMPLEMENT SIGN IF "-" AND APPROPRIATE FLAGS ON PD LIST.\r
+;THEN RETURN FROM SUBROUTINE.\r
+\r
+SNOEXI:        POP     P,X1\r
+       TLNE    X1,F.MINS       ;IS SAVED SIGN MINUS?\r
+       TLC     B,MINFLG        ;YES. COMPLEMENT\r
+       POPJ    P,\r
+\f;GEN CODE FOR SIGNED ATOM.\r
+\r
+ATOM:  PUSH    P,C             ;SAVE SIGN INFO.\r
+       TLNE    C,F.PLUS+F.MINS\r
+       PUSHJ   P,NXCHK         ;YES. SKIP SIGN\r
+       TLNE    C,F.LETT        ;LETTER?\r
+       JRST    FLETTR          ;YES. VARIABLE OR FCN CALL.\r
+       TLNE    C,F.DIG+F.PER   ;NUMERAL OR DECIMAL POINT?\r
+       JRST    FNUMBR          ;YES. LITERAL OCCURRENCE OF NUMBER\r
+       CAIE    C,F.SLSH+F.QUOT ;STR CONSTANT.\r
+       JRST    ILFORM          ;NO.  ILLEGAL FORMULA\r
+\r
+       PUSHJ   P,NXCHK         ;SUBEXPR IN PARENS.  SKIP PAREN\r
+       PUSHJ   P,FORMLN        ;GEN THE SUBEXPRESSION\r
+       TLNN    C,F.RPRN        ;BETTER HAVE MATCHING PAREN\r
+       JRST    ILFORM          ;NO.  GRONK.\r
+       PUSHJ   P,NXCHK         ;SKIP PARENTHESIS\r
+       JRST    N,SNOEXI        ;GO TEST SIGN AND RETURN\r
+\r
+FNUMBR:        PUSHJ   P,EVANUM        ;EVALUATE NUMBER (IN N)\r
+       FAIL <ILLEGAL CONSTANT>\r
+       MOVE    X1,0(P)         ;GET SIGN FLAG\r
+       CAIE    C,"^"           ;EXPONENT FOLLOWS?\r
+       TLNN    X1,F.MINS       ;OR IS IT PLUS ANYWAY?\r
+       JRST    FNUM1           ;YES.  DONT FUDGE SIGN\r
+       MOVN    N,N             ;NEGATE NUMBER\r
+       SETZM   0(P)            ;AND CLEAR SIGN INFO.\r
+\r
+FNUM1: MOVE    B,FLCON ;SEARCH CONSTANT ROLL\r
+FNUM2: CAML    B,CECON ;(UNSORTED--CANT USE SEARCH)\r
+       JRST    FNUM3           ;NOT FOUND\r
+       CAME    N,(B)           ;THIS ONE?\r
+       AOJA    B,FNUM2         ;NO. GO TO NEXT.\r
+       SUB     B,FLCON ;FOUND. CALC REL ADDRESS IN CONROL\r
+       JRST    FNUM4\r
+\r
+FNUM3: MOVEI   R,CONROL        ;PUSH ON CONROL\r
+       MOVE    A,N\r
+       PUSHJ   P,RPUSH\r
+       MOVEI   R,CADROL        ;PUT ADDRS ON CONST ADDRS ROLL\r
+       MOVEI   A,0\r
+       PUSHJ   P,RPUSH\r
+       SUB     B,FLCAD ;GET REL ADDRS\r
+\r
+FNUM4: HRLI    B,CADROL        ;MAKE POINTER\r
+       JRST    N,SNOEXI        ;GO LOOK AT SIGN AND RETURN\r
+\r
+NNUM:  PUSH    P,[EXP 1]       ;REGISTER THE CONSTANT IN "N"\r
+       JRST    N,FNUM1\r
+\f;XLATE AND GEN ATOMIC FORMULA BEGINNING WITH LETTER\r
+\r
+FLETTR:        PUSHJ   P,REGLTR\r
+FLET1: CAILE   A,4\r
+       AOS     IFFLAG\r
+       JRST    .+1(A)\r
+       JRST    XARFET          ;ARRAY REF\r
+       JRST    SNOEXI          ;SCALAR.  JUST RETURN\r
+       JRST    XINFCN          ;INTRINSIC FCN\r
+       JRST    XDFFCN          ;DEFINED FCN\r
+       JRST    ILVAR\r
+IFN FTSTR,<\r
+       JRST    XARFET\r
+       JRST    XINF3+1\r
+       JRST    XINF3\r
+>\r
+FLET2: PUSH    P,[EXP 1]       ;PUSH AN IMPLICIT PLUS SIGN ON PLIST\r
+       JRST    FLET1           ;FINISH REGISTERING VARIABLE.\r
+\r
+FLET3: SKIPGE  IFFLAG\r
+       POPJ    P,\r
+       MOVSI   D,33040\r
+       JRST    N,BUILDA\r
+\r
+XARFET:        PUSH    P,B\r
+       PUSH    P,F\r
+       PUSHJ   P,REGFRE        ;FREE REG\r
+       PUSHJ   P,XARG\r
+       POP     P,F\r
+       SKIPGE  IFFLAG\r
+       SKIPL   LETSW           ;IS IT LH OF ARRAY-LET?\r
+       JRST    XARF1\r
+       TLNN    C,220000        ;IS IT DEFINITELY LH OF ARRAY-LET?\r
+       JRST    XARF1           ;NO.\r
+\r
+       POP     P,X1\r
+       SUB     P,[XWD 6,6]     ;ADJUST THE PUSHLIST TO ESC FORMLS\r
+       PUSH    P,B             ;SAVE THE ARGUMENT FLAG\r
+       PUSH    P,X1            ;SAVE THE ARRAY POIUNTER\r
+       JRST    N,XLET0\r
+\r
+XARF1: PUSH    P,B\r
+       MOVSI   D,(ARFET1)\r
+IFN    FTSTR,<\r
+       SKIPL   IFFLAG          ;STR VECTOR?\r
+       MOVSI   D,(SVRADR)      ;YES. FETCH STRING POINTER ADDRESS.\r
+>\r
+       JUMPE   B,XARFFN\r
+       SKIPL   IFFLAG\r
+       FAIL <STRING VECTOR HAS 2 DIMS>\r
+       MOVSI   D,(ARFET2)\r
+       MOVE    X1,-1(P)        ;MARK DOUBLE ARRAY\r
+       ADD     X1,FLOOR(F)\r
+       SKIPN   1(X1)\r
+       SETOM   1(X1)\r
+XARFFN:        POP     P,B\r
+       EXCH    B,0(P)\r
+       PUSHJ   P,BUILDA\r
+       POP     P,B\r
+       PUSHJ   P,GENARG\r
+       MOVEI   B,0             ;REG POINTER\r
+       SKIPL   IFFLAG          ;STRING VECTORS?\r
+       PUSHJ   P,SITGEN        ;YES,SAVE ADDRESS POINTER\r
+       JRST    N,SNOEXI\r
+\f;GEN FUNCTION CALLS\r
+\r
+XDFFCN:        PUSH    P,D             ;SAVE FCN NAME\r
+       PUSHJ   P,REGFRE        ;SAVE ANY SUBEXPRESSION\r
+       PUSHJ   P,PUSHPR        ;SAVE FUNCTION LOCATION\r
+       CAIE    C,"("           ;ANY ARGS?\r
+       JRST    N,XDFF2         ;NO\r
+       SETZM   PSHPNT          ;INITIALIZE COUNT OF PUSH INSTS GENNED\r
+XDFF1: PUSHJ   P,NXCHK\r
+       PUSHJ   P,FORMLN        ;GEN THE ARGUMENT IN REG\r
+       PUSHJ   P,GPOSGE\r
+       MOVSI   D,(PUSH P,)     ;BUILD ARGUMENT PUSH\r
+       PUSHJ   P,BUILDA\r
+       AOS     PSHPNT          ;COUNT THE PUSH\r
+       AOS     (P)             ;ALSO SAVE THE COUNT FOR CHECK OF ARGS\r
+       TLNE    C,F.COMA                ;MORE ARGS?\r
+       JRST    XDFF1           ;YES\r
+\r
+       TLNN    C,F.RPRN                ;CHECK FOR MATCHING PAREN\r
+       JRST    GRONK\r
+       SETZM   PSHPNT          ;RESET THE PUSH COUNT AGAIN\r
+       PUSHJ   P,NXCHK         ;SKIP PAREN\r
+\r
+XDFF2: PUSHJ   P,ARGCHK        ;CHECK FOR RIGHT NUMBER OF ARGUMENTS\r
+       POP     P,X1            ;GET RID OF POINTER TO ARG# CONSTANT\r
+       PUSHJ   P,POPPR         ;GET BACK FUNCTION LOC\r
+       MOVSI   D,(GOSUB)\r
+       PUSHJ   P,BUILDA        ;GEN THE CALL\r
+       MOVEI   B,0             ;ANSWER IS IN REG\r
+       JRST    SNOEXI\r
+\r
+;ROUTINE TO CHECK NUMBER OF ARGUMENTS AND CREATE A CONSTANT TO POP THEM\r
+;OFF THE PUSH LIST.  CALLED WITH       XWD FCNAME,# OF ARGS\r
+;AT LOCATION -1(P)     RETURNS WITH A POINTER TO CONSTANT\r
+;AT THAT LOCATION.\r
+\r
+ARGCHK:        HRRZ    N,-1(P)\r
+       HRL     N,N             ;N NOW CONTAINS THE CONSTANT TO SUBTRACT FROM P\r
+       PUSHJ   P,NNUM          ;REGISTER THIS CONSTANT\r
+       MOVE    N,-1(P)         ;GET FCN NAME\r
+       MOVEM   B,-1(P)         ;SAVE ADDREESS OF CONSTANT\r
+       HRR     N,B             ;ASSEMBLER FADROL ENTRY...\r
+       HLLZ    A,N             ;SETUP SEARCH ARGUMENT\r
+       MOVEI   R,FADROL        ; XWD FCNAME,CONSTANT ADDRESS\r
+       PUSHJ   P,SEARCH\r
+       JRST    ARGCH1          ;FIRST TIME FCN SEEN. PUT ENTRY IN ROLL\r
+       CAME    N,0(B)          ;FCN SEEN BEFORE. SAVE NUMBER OF ARGS.\r
+       FAIL    <INCORRECT NUMBER OF ARGUMENTS>\r
+       POPJ    P,\r
+\r
+ARGCH1:        MOVEI   E,1             ;ADD FCN REF TO FADROL\r
+       PUSHJ   P,OPENUP\r
+       MOVEM   N,(B)\r
+       POPJ    P,\r
+\r
+;INTRINSIC FUNCTION GENERATOR.\r
+XINFCN:        PUSH    P,B             ;SAVE FCN LOC\r
+       PUSHJ   P,REGFRE        ;PROTECT ANY PARTIAL RESULTS\r
+       CAIN    C,50\r
+       JRST    N,XINF1\r
+       TRNN    B,40000\r
+       FAIL    <INCORRECT NUMBER OF ARGUMENTS>\r
+       JRST    N,XINF2\r
+XINF1: PUSHJ   P,NXCHK\r
+       PUSHJ   P,FORMLN\r
+       PUSHJ   P,EIRGNP\r
+       PUSHJ   P,XARG1+1\r
+XINF2: POP     P,D\r
+       TRZ     D,40000\r
+       HRLI    D,260740\r
+       PUSHJ   P,BUILDI\r
+       MOVEI   B,0\r
+       JRST    SNOEXI\r
+XINF3: PUSH    P,[EXP 1]\r
+       JRST    SNOEXI\r
+\f;ROUTINE TO XLATE ARGUMENTS\r
+;RETURNS WITH ARGS ON SEXROL.  B IS O IF ONE ARG, -1 IF TWO.\r
+\r
+XARG:  PUSHJ   P,NXCHK         ;SAVE PARENTHESIS.\r
+       PUSH    P,LETSW         ;SAVE LETSW WHILE TRANSL ARGS\r
+       MOVMS   LETSW           ;THE COMMA FOLLOWING AN ARG IS NOT LH(LET)!\r
+       PUSHJ   P,FORMLN\r
+       PUSHJ   P,GPOSNX\r
+       PUSHJ   P,SITGEN\r
+       PUSHJ   P,PUSHPR\r
+       MOVEI   B,0\r
+       TLNN    C,F.COMA        ;COMMA FOLLOWS?\r
+       JRST    N,XARG1         ;NO. ONE ARG.\r
+       PUSHJ   P,NXCHK         ;YES GEN AND SAVE SECOND ARG\r
+       PUSHJ   P,FORMLN\r
+       PUSHJ   P,GPOSNX\r
+       PUSHJ   P,SITGEN\r
+       PUSHJ   P,PUSHPR\r
+       MOVNI   B,1             ;DBL ARG FLAG\r
+XARG1: POP     P,LETSW         ;RESTORE LETSW\r
+       TLNN    C,F.RPRN        ;MUST HAVE PARENTHESIS\r
+       JRST    N,ILFORM\r
+       JRST    N,NXCHK         ;IT DOES. SKIP RPAREN AND RETURN.\r
+\r
+;ROUTINE TO GEN ARGUMENTS\r
+\r
+GENARG:        JUMPE   B,GENAFN                ;ONE OR TWO ARGS?\r
+       PUSHJ   P,POPPR         ;TWO\r
+       PUSHJ   P,EXCHG\r
+       PUSHJ   P,GENAF1\r
+\r
+GENAFN:        PUSHJ   P,POPPR\r
+GENAF1:        MOVSI   D,(JUMP 2,)\r
+       JRST    N,BUILDA\r
+\f;ROUTINE TO ANALYZE NEXT ELEMENT\r
+;CALL: PUSHJ   P,REGLTR\r
+;RETURNS ROLL PNTR IN B, CODE IN A\r
+;CODE IS: 0-ARRAY, 1-SCALAR, 2-INTRINSIC FCN, 3-DEFINED FCN, 4-FAIL\r
+;              5-STRING VECTOR, 6-STRING VARIABLE, 7-STRING LITERAL.\r
+\r
+REGLTR:        PUSHJ   P,SCNLT1        ;LTR TO A, LEFT JUST 7 BIT\r
+       HRRI    F,SCAROL        ;ASSUME SCALAR\r
+       TLNE    C,F.LETT        ;ANOTHER LETTER?\r
+       JRST    REGFCN          ;YES.  GO LOOK FOR FCN REF\r
+       TLNN    C,F.DIG         ;DIGIT FOLLOWS?\r
+       JRST    REGARY          ;NO, GO CHECK FOR ARRAY\r
+       DPB     C,[POINT 7,A,13];ADD DIGIT TO NAME\r
+       PUSHJ   P,NXCHK         ;GO ON TO NEXT CHAR\r
+IFN FTSTR,<\r
+       TLNE    C,F.DOLL        ;STRING VARIABLE?\r
+       JRST    REGSTR          ;YES. REGISTER IT.\r
+>\r
+\r
+;RETURN HERE IF REGARY SAYS NOT ARRAY\r
+;RETURN HERE IF REGFCN SAYS FOLLOWED BY KEYWORD.\r
+\r
+REGL1: TLNE    A,17            ;IS THIS A SCALAR?\r
+       JRST    REGL1A          ;NO. DON'T LOOK FOR FCN ARGUMENT\r
+       MOVE    B,FLARG         ;IS THIS A FN ARG?\r
+       CAML    B,CEARG         ;SEARCH UNORDERED ARGROL\r
+       JRST    REGL1A          ;NOT A FN ARG\r
+       CAME    A,(B)\r
+       AOJA    B,.-3           ;TRY NEXT ROLL ENTRY.\r
+\r
+       JRST    FARGRF          ;YES\r
+REGL1A:        MOVEI   R,VARROL        ;NO. SCALAR\r
+       PUSHJ   P,SEARCH        ;IN VARIABLE ROLL?\r
+       JRST    N,REGL2         ;NO\r
+\r
+       HRRZ    D,(B)           ;YES.  GET PNTR TO SCAROL\r
+       JRST    REGL3\r
+\r
+REGL2: MOVEI   E,1             ;ADD TO SCALAR ROLL OR VSPROL\r
+       PUSHJ   P,OPENUP\r
+       ADD     A,CEIL(F)       ;COMPUTE PNTR TO ROLL\r
+       SUB     A,FLOOR(F)\r
+       HRRZ    D,A             ;SAVE ROLL POINTER\r
+       MOVEM   A,(B)\r
+       MOVEI   R,(F)   ;PUT NULL ENTRY ON ROLL\r
+       MOVEI   A,0\r
+       PUSHJ   P,RPUSH\r
+\r
+;      B ::= REL LOC OF ROLL ENTRY\r
+\r
+REGL3: MOVE    B,D             ;B ::= REL LOC OF ROLL ENTRY\r
+       TLO     B,(F)   ;MAKE ROLL POINTER AND SKIP\r
+       JRST    REGSCA\r
+\r
+;COME HERE ON REF TO FCN ROL\r
+\r
+;CALCULATE ADDRESS OF THIS FUNCTION ARGUMENT.\r
+FARGRF:        SUB     B,CEARG ;NOW ADDRESS IS -NN FOR FIRST ARG, -1 FOR NNTH ARG, ETC.\r
+       HRLI    B,PSHROL\r
+\r
+REGSCA:        MOVEI   A,1             ;CODE SAYS SCALAR\r
+       POPJ    P,              ;RETURN\r
+\r
+SCAREG:        MOVEI   F,SCAROL        ;REGISTER THE CONTENTS OF A AS SCALAR\r
+       JRST    REGL1A\r
+REGARY:        CAIE    C,"("\r
+       TLNE    C,F.DOLL        ;ARRAY OR POSSIBLE SRVECTOR REF?\r
+       CAIA\r
+       JRST    REGL1\r
+       TLNE    C,F.DOLL\r
+       JRST    REGSTR\r
+REGA0: HRRI    F,ARAROL        ;NUMERICAL ARRAY GOES ON ARAROL\r
+\r
+REGA1: TLO     A,1             ;MAKE ARRAY NAME DIFFERENT FROM SCALAR\r
+       MOVEI   R,VARROL        ;LOOK FOR VARIABLE NAME\r
+       PUSHJ   P,SEARCH\r
+       JRST    N,REGA2         ;NOT ALREADY USED\r
+       HRRZ    D,(B)           ;GET POINTER TO ARAROL\r
+       JRST    N,REGA3\r
+\r
+REGA2: MOVEI   E,1             ;ADD NEW ARRAY NAME TO VARIABLE ROLL\r
+       PUSHJ   P,OPENUP\r
+       ADD     A,CEIL(F)       ;COMPUTE ARRAY OR STRING VECTOR ROLL POINTER\r
+       SUB     A,FLOOR(F)\r
+       IORI    A,400000        ;SET ARRAY FLAG\r
+       MOVEM   A,(B)\r
+       HRRZ    D,A             ;SAVE ARAROL POINTER\r
+       MOVEI   R,(F)           ;THREE ZEROS ON ARAROL (NULL ENTRY)\r
+       MOVEI   A,0\r
+       PUSHJ   P,RPUSH\r
+       PUSHJ   P,RPUSH\r
+\r
+REGA3: MOVE    B,D             ;RECONSTRUCT PNTR\r
+       ANDI    B,377777        ;B := REL ADDRS IN ARRAY ROLL\r
+       HRLI    B,(F)   ;B := POINTER TO ENTRY ON ROLL\r
+       MOVEI   A,0             ;ARRAY CODE\r
+       POPJ    P,\r
+\r
+\r
+;SUBROUTINE TO REGISTER ARRAY NAME.\r
+;(USED BY DIM,MAT)\r
+\r
+ARRAY: HRRI    F,ARAROL                ;ASSUME ITS NOT A STRING\r
+       TLNN    C,F.LETT\r
+       JRST    REGFAL\r
+       PUSHJ   P,SCNLT1        ;NAME TO A\r
+       TLNE    C,F.DOLL        ;STRING VECTOR?\r
+       JRST    N,ARRAY2        ;YES, HANDLE DIFFERENTLY\r
+       PUSHJ   P,REGA0\r
+ARRAY1:        MOVE    X1,B            ;FINISH REGISTERING\r
+       ADD     X1,FLOOR(F)\r
+       SKIPN   1(X1)\r
+       SETOM   1(X1)\r
+       POPJ    P,\r
+\r
+ARRAY2:        PUSHJ   P,NXCHK\r
+       CAIN    C,50\r
+       JRST    N,ARRAY3\r
+       TLNE    F,1\r
+       JRST    REGSTR\r
+ARRAY3:        PUSHJ   P,REGSVR        ;REGISTER STRING VECTOR\r
+       JRST    ARRAY1          ;SET DEFAULT, IF NECESSARY\r
+\r
+VECTOR:        PUSHJ   P,ARRAY         ;REGISTER VECTOR\r
+       CAIE    A,5             ;WAS A STRING REGISTERED?\r
+       JUMPN   A,CPOPJ         ;WAS AN ARRAY REGISTERED?\r
+       MOVE    X2,1(X1)\r
+       JUMPG   X2,.+4          ;EXPLICIT DIMENSION?\r
+       MOVNI   X2,777776       ;NO.  CALL IT A VECTOR OF UNKNONW DIM.\r
+       MOVEM   X2,1(X1)\r
+       POPJ    P,\r
+       JUMPLE  X2,CPOPJ\r
+       TLNE    X2,777776       ;IS THIS A ROW VECTOR?\r
+       TRNN    X2,777776       ;OR A COLUMN VECTOR?\r
+       POPJ    P,              ;YES.\r
+       FAIL <USE VECTOR, NOT ARRAY,>\r
+\r
+IFN FTSTR,<\r
+REGSTR:        JUMPL   F,GRONK\r
+       TLO     A,10            ;MAKE STRING NAME DIFFERENT FROM OTHER NAMES.\r
+       HRRI    F,VSPROL        ;POINT WILL GO ON VARIABLE SPACE ROLL\r
+       TLNE    C,F.DOLL        ;SKIP DOLLAR SIGN?\r
+       PUSHJ   P,NXCHK         ;SKIP DOLLAR SIGN\r
+       CAIN    C,"("   ;IS IT A STRING VECTOR?\r
+       JRST    REGSVR          ;YES.\r
+       PUSHJ   P,REGL1         ;FIX VARIABLE TYPE CODE.\r
+       JRST    REGS1\r
+\r
+REGSL1:        MOVEI   R,11\r
+       AOS     IFFLAG\r
+       MOVE    A,1\r
+       PUSHJ   P,RPUSH\r
+       MOVEI   R,SADROL        ;MOVE LITROL ADDRESS ON STR-LIT-ADR ROLL\r
+       MOVEI   A,0\r
+       PUSHJ   P,RPUSH\r
+       SUB     B,FLSAD ;GET REL ADRESS\r
+       HRLI    B,SADROL        ;SET UP POINTER.\r
+       PUSHJ   P,QSKIP\r
+       JRST    GRONK\r
+       JRST    XINF3\r
+\f>\r
+\r
+QSKIP: PUSHJ   P,NXCH          ;SKIP TO NEXT QUOTE CHAR.\r
+       TLNE    C,F.CR          ;TERMINAL QUOTE MISSING?\r
+       POPJ    P,              ;YES\r
+       TLNN    C,F.QUOT        ;END OF STRING?\r
+       JRST    QSKIP           ;NO, GO ON.\r
+       PUSHJ   P,NXCH          ;YES. GET NEXT CHAR AND RETURN.\r
+       JRST    CPOPJ1\r
+\r
+IFN FTSTR,<\r
+REGSVR:        HRRI    F,SVRROL        ;REGISTER STRING VECTOR\r
+       TLO     A,11            ;MAKE NAME DIFFERENT FROM THE OTHERS\r
+       TLNE    C,F.DOLL        ;DOLLAR SIGN?\r
+       PUSHJ   P,NXCHK         ;YES, SKIP IT\r
+\r
+       PUSHJ   P,REGA1         ;REGISTER AS AN ARRAY\r
+\r
+REGS1: CAIE    A,4             ;DID REGISTRATION FAIL?\r
+       ADDI    A,5             ;NO. FIX TYPE CODE.\r
+       POPJ    P,\r
+>\r
+\r
+;NOTE: IF THE SAME VARIABLE NAME IS USED AS A SCALAR, ARRAY,\r
+;      STRING VECTOR, AND STRING, IT WILL BE DISTINGUISHED IN "VARROL"\r
+;      BY THE FOLLOWING 4-BIT ENDINGS:\r
+;      SCALAR 0;  ARRAY 1;  STRING 10;  STRING VECTOR 11.\r
+\f;TABLE OF MIDSTATEMENT KEYWORDS:\r
+\r
+KWTBL: ASCII /GOTO/\r
+       ASCII /STEP/\r
+       ASCII /THEN/\r
+       ASCII /TO/\r
+       Z\r
+\r
+;REGISTER FUNCTION NAME\r
+;FIRST LETTER HAS BEEN SCANNED\r
+\r
+;IT IS POSSIBLE THAT WE HAVE SCANNED A ONE-LETTER VARIABLE NAME\r
+;FOLLOWED BY ONE OF THE KEYWORDS "TO" , "THEN", OR "STEP".\r
+;FIRST WE LOOK AHEAD TO SEE IF THIS IS SO;\r
+;IF IT IS WE GO BACK TO SCALAR CODE.\r
+\r
+REGFCN:        PUSH    P,C             ;SAVE T,C AROUND LOOK-AHEAD.\r
+       PUSH    P,T\r
+       MOVEI   X1,KWTBL        ;TBL OF KEYWORDS\r
+\r
+REGF1: PUSHJ   P,QST   ;TEST THIS KEYWORD.\r
+       JRST    N,REGF2\r
+       POP     P,T\r
+       POP     P,C\r
+       JRST    REGL1\r
+\r
+REGF2: MOVEI   X1,1(X1)        ;NOT CURRENT KEYWORD\r
+       MOVE    T,(P)           ;RESTORE POINTERS DESTROYED BY QST\r
+       MOVE    C,-1(P)\r
+       SKIPE   (X1)            ;MORE TO TEST?\r
+       JRST    REGF1   ;YES\r
+       POP     P,T     ;NO, NOT KEYWORD.\r
+       POP     P,C\r
+;HAVE DETERMINED THAT WE MUST BE SCANNING A FUNCTION NAME\r
+;IF SYNTAX IS LEGAL.\r
+\r
+;WE SCAN THE SECOND LETTER AND CHECK FOR\r
+;INTRINSIC OR DEFINED FUNCTION.\r
+\r
+\r
+       PUSHJ   P,SCNLT2\r
+       JRST    REGFAL          ;NOT A LETTER\r
+       CAMN    A,[SIXBIT /FN/]         ;DEFINED FUNCTION?\r
+       JRST    REGDFN          ;YES. GO REGISTER DEFINED NAME.\r
+\r
+       PUSHJ   P,SCNLT3\r
+       JRST    REGFAL\r
+       MOVEI   R,4\r
+       PUSHJ   P,SEARCH\r
+       JRST    REGFAL\r
+       MOVMS   LETSW           ;CAN'T BE LH(LET)\r
+       HRRZ    B,(B)\r
+       MOVEI   A,2             ;INTRINSIC FCN CODE.\r
+       POPJ    P,              ;RETURN "XINFNC" DOES ITS OWN ")" CHECK.\r
+\f;HERE TO REGISTER DEFINED FUNCTION NAME\r
+;THE "FN" HAS ALREADY BEEN SCANNED\r
+\r
+;SCAN IDENTIFYING LETTER AND PUTTING ENTRY IN\r
+;FUNCTION CALL ROLL\r
+\r
+REGDFN:        PUSHJ   P,SCNLT1        ;PUT FUNCTION NAME IN A\r
+       CAMN    A,FUNAME        ;IS THIS THE NAME OF THE CURRENT MULTI-LINE FN?\r
+       JRST    REGFNA          ;YES. REGISTER IT AS A SCALAR.\r
+       MOVE    D,A             ;NO, REAL FUNCTION CALL.  SAVE NAME FOR ARGCHK\r
+       MOVEI   R,FCLROL        ;FUNCTION CALL ROLL\r
+       PUSHJ   P,SEARCH        ;USED THIS ONE YET?\r
+       JRST    .+2\r
+       JRST    REGFC1          ;ALREADY SEEN A REF\r
+       MOVEI   E,1\r
+       PUSHJ   P,OPENUP\r
+       MOVEM   A,(B)\r
+       PUSHJ   P,REGFC1        ;SET B UP FOR KLUDGE TEST\r
+       MOVE    X1,FLSEX        ;FIX UP SAVED FCN REFS\r
+REGFC0:        CAML    X1,CESEX        ;KLUDGE!!!\r
+       JRST    N,REGFC1+1\r
+       HLRZ    X2,(X1)         ;GET THE ROLL NUMBER\r
+       CAIN    X2,FCLROL       ;FCLROL?\r
+       CAMLE   B,(X1)          ;YES. IS SEXREF NOW WRONG?\r
+       AOJA    X1,REGFC0\r
+       AOS     (X1)            ;YES. CORRECT IT\r
+       AOJA    X1,REGFC0\r
+\r
+REGFC1:        SUB     B,FLFCL\r
+       HRLI    B,FCLROL\r
+       MOVEI   A,3             ;DEFINED FCN CODE\r
+       POPJ    P,              ;DON'T CHECK FOR () YET\r
+\r
+CHKPRN:        CAIE    C,"("\r
+REGFAL:        MOVEI   A,4             ;FAIL IF NO PAREN\r
+       POPJ    P,\r
+\r
+REGFNA:        TLO     A,(177B13)      ;CREATE SPECIAL NAME FOR CURRENT FUNCTION\r
+       JRST    N,SCAREG        ;REGISTER IT AS A SCALAR\r
+\f      SUBTTL  SUBROUTINES USED BY GEN ROUTINES\r
+\r
+;PUSHPR - PUSH PARTIAL RESULT ON SEXROL\r
+\r
+PUSHPR:        MOVEI   R,SEXROL\r
+       MOVE    A,B             ;SAVE POINTER IN A\r
+       PUSHJ   P,RPUSH\r
+       SUB     B,FLSEX ;MAKE POINTER\r
+       TLNN    A,ROLMSK        ;IS IT A POINTER TO REG?\r
+       HRROM   B,REGPNT        ;YES, SET POINTER FOR SITGEN TO USE\r
+       POPJ    P,\r
+\r
+;POPPR - POP PARTIAL RESULT FROM SEXROL\r
+\r
+POPPR: MOVEI   R,SEXROL\r
+       MOVE    B,CESEX\r
+       SUBI    B,1             ;COMPUTE ADDRS OF TOP OF SEXROL\r
+       PUSH    P,(B)           ;SAVE THE CONTENT\r
+       MOVEI   E,1\r
+       PUSHJ   P,CLOSUP\r
+       POP     P,B             ;POPPED POINTER TO B\r
+POPPFN:        TLNN    B,ROLMSK        ;POINTER TO REG?\r
+       SETZM   REGPNT          ;YES.  CLEAR MEMORY\r
+       POPJ    P,\r
+;EXCHG - EXCHANGE CURRENT PNTR WITH TOP OF SEXROL\r
+\r
+EXCHG: MOVE    X1,CESEX\r
+       MOVEI   X2,-1(X1)       ;FIX PNTR IF REG SAVED\r
+       SUB     X2,FLSEX\r
+       TLNN    B,ROLMSK\r
+       HRROM   X2,REGPNT\r
+       EXCH    B,-1(X1)\r
+       JRST    POPPFN          ;GO FIX PNTR IF REG POPPED\r
+\r
+;REGFRE - GUARANTEE THAT NO PART RESULT IS IN REG\r
+\r
+REGFRE:        SKIPN   REGPNT  ;SUBEXP IN THE REG?\r
+       POPJ    P,              ;NO\r
+       MOVE    X1,FLSEX        ;YES.  COMPUTE WHERE\r
+       ADD     X1,REGPNT\r
+       EXCH    B,(X1)          ;GET THE POINTER, SAVE CURR PNTR\r
+       PUSHJ   P,SITGEN        ;STORE IN TEMP\r
+       MOVE    X1,FLSEX        ;RECOMPUTE LOC IN SEXROL\r
+       ADD     X1,REGPNT\r
+       EXCH    B,(X1)\r
+       SETZM   REGPNT          ;CLOBBER REGPNT SINCE REG IS EMPTY\r
+       POPJ    P,\r
+\f;GPOSGE - GUARANTEE POSITIVE GEN\r
+\r
+GPOSGE:        JUMPGE  B,CPOPJ         ;RETURN IF ALREADY POSITIVE\r
+                               ;FALL INTO EIRGEN\r
+\r
+;EIRGEN - EXP IN REG GEN\r
+\r
+EIRGEN:        TLNN    B,ROLMSK        ;ALREADY IN REG?\r
+       POPJ    P,              ;DO NOTHING\r
+ERGNFN:        PUSHJ   P,REGFRE        ;FREE UP REG\r
+       MOVSI   D,(MOVE N,)     ;GET MOVE INSTR\r
+       PUSHJ   P,BUILDS        ;BUILD MOVE INSTR\r
+       MOVEI   B,0             ;POSITIVE REG POINTER\r
+       POPJ    P,\r
+\r
+;EIRGNP - EXP IN REG GEN POSITIVE\r
+\r
+EIRGNP:        JUMPGE  B,EIRGEN        ;POSITIVE?\r
+       TLNE    B,ROLMSK        ;NO. IN REG?\r
+       JRST    ERGNFN          ;NO.  GO MOVE\r
+       MOVSI   D,(MOVN N,)     ;YES,NEGATIVE N\r
+       PUSHJ   P,BUILDI\r
+       MOVEI   B,0             ;POSITIVE REG PNTR\r
+       POPJ    P,\r
+\r
+;SIPGEN - STORE IN PERMANENT TEM GEN\r
+\r
+SIPGEN:        MOVEI   R,PTMROL\r
+       JRST    SITGN1\r
+\r
+;SITGEN - STORE IN TEMP GEN\r
+\r
+SITGEN:        MOVEI   R,TMPROL\r
+SITGN1:        TLNE    B,ROLMSK        ;IS EXPR IN REG?\r
+       POPJ    P,              ;NO.  DONT DO ANYTHING\r
+       MOVEI   A,0             ;PREPARE ZERO TO PUSH ON ROLL\r
+       MOVSI   D,(MOVEM N,)    ;GET CORRECT INSTR\r
+       JUMPGE  B,.+2\r
+       MOVSI   D,(MOVNM N,)\r
+       CAIE    R,TMPROL        ;STORE ON TMPROL?\r
+       JRST    N,SITG2         ;NO. USE PTMROL\r
+       AOS     B,TMPPNT        ;WHICH TEMP TO USE?\r
+       MOVE    X1,FLTMP\r
+       ADD     X1,B\r
+       CAML    X1,CETMP        ;NEED MORE TMP SPACE?\r
+       PUSHJ   P,RPUSH ;YES.  PUSH Z ZERO ONTO TMPROL\r
+       MOVE    B,TMPPNT        ;CONSTRUCT TMP ROLL POINTER\r
+SITG1: HRLI    B,(R)\r
+       PUSH    P,B     ;SAVE ADRESS POINTER\r
+       PUSHJ   P,BUILDA        ;BUILD STORE INSTR\r
+       POP     P,B             ;RECONSTRUCT POINTER\r
+       POPJ    P,\r
+\r
+SITG2: PUSHJ   P,RPUSH         ;PUSH A ZERO ONTO PTMROL\r
+       SUB     B,FLPTM\r
+       JRST    SITG1           ;FINISH CONSTRUCTING ADRESS POINTER\r
+;GPOSNX - GUARANTEE POSITIVE AND UNINDEXED GEN\r
+\r
+GPOSNX:        TLNE    B,400000+PSHROL ;NEGATIVE OR INDEXED BY (P)?\r
+       PUSHJ   P,EIRGNP        ;YES. FORCE INTO REG\r
+       POPJ    P,\r
+\fBUILDP:       TLO     D,P             ;INSTRUCTION IS INDEXED BY PLIST POINTER\r
+       SUB     B,PSHPNT        ;ADJUST THE ADDRESS FOR ANY PUSH INSTS GENNED BY\r
+       HRR     D,B             ;       A CURRENT FN CALL\r
+\r
+;ROUTINE TO ADD CODE TO CODROL.\r
+;A WORD IS ASSUMED IN D\r
+;RETURN REL ADDRS IN B\r
+\r
+BUILDI:        SKIPN   RUNFLA          ;ARE WE GOING TO RUN?\r
+       POPJ    P,              ;NO.  DONT GEN CODE\r
+       MOVEI   E,1\r
+       MOVEI   R,CODROL\r
+       PUSHJ   P,BUMPRL\r
+       MOVEM   D,(B)\r
+       SUB     B,FLCOD\r
+       POPJ    P,\r
+\r
+\r
+;BUILD SIGNED INSTRUCTION WITH ADDRESS\r
+;CHECK SIGN IN B AND CHANGE UP CODE BITS\r
+\r
+BUILDS:        JUMPGE  B,BUILDA        ;POSITIVE?\r
+       TLC     D,10000         ;NO.  CHANGE MOVE TO MOVN, ETC.\r
+                               ;FALL INTO BUILDA\r
+\r
+;BUILDA - BUILD INSTRUCTION WITH LINKED ADDRESS\r
+;INSTRUCTION SKELETON IS IN D, ADDRESS POINTER IS IN B\r
+\r
+BUILDA:        SKIPN   RUNFLA          ;ARE WE GOING TO RUN?\r
+       POPJ    P,              ;NO.  DONT BUILD\r
+       TLZE    B,PSHROL                ;SPECIAL TEST FOR ROLL WITH ABSOLUTE ADDRESS\r
+       JRST    BUILDP          ;YES. PSHROL. DO BUILDI INDEXED BY (Q)\r
+       JUMPE   B,BUILDI        ;ITEM IS IN REG . USE ADDRESS ZERO\r
+\r
+       PUSH    P,B             ;SAVE THE POINTER\r
+       PUSHJ   P,BUILDI        ;ADD INSTR WITH 0 ADDRS TO CODE\r
+       MOVE    X1,CECOD        ;LOC+1 OF THE INSTR\r
+       POP     P,X2            ;COMPUTE ADDRS LOCATION\r
+       LDB     R,[POINT 17,X2,17]\r
+       ADD     X2,FLOOR(R)\r
+       MOVE    Q,(X2)          ;GET NEXT ADDRS IN CHAIN\r
+       HRRM    Q,-1(X1)        ;STORE IT IN THE INSTR\r
+       SUB     X1,FLCOD\r
+       SUBI    X1,1\r
+       HRRM    X1,(X2)         ;STORE CURR ADDRS IN ROLL PNTD TO\r
+       POPJ    P,\r
+\f      SUBTTL UTILITY SUBROUTINES\r
+;SUBROUTINES FOR GENERAL ROLL MANIPULATION\r
+\r
+CLOSUP:        MOVN    X1,E            ;COMPUTE NEW END OF ROLL\r
+       ADDB    X1,CEIL(R)      ;AND STORE IT\r
+       MOVE    X2,B            ;CONSTRUCT BLT WORD\r
+       ADD     X2,E\r
+       MOVS    X2,X2\r
+       HRR     X2,B\r
+       BLT     X2,-1(X1)               ;MOVE DOWN TOP OF ROLL\r
+       POPJ    P,\r
+\r
+CLOB:  MOVEI   T1,COMTOP       ;ROUTINE TO CLOBBER ALL MOVEABLE ROLLS.\r
+       MOVEM   T,FLOOR(T1)\r
+       MOVEM   T,CEIL(T1)\r
+       CAILE   T1,1(X1)        ;DO NOT CLOBBER ROLLS <=(X1)\r
+       SOJA    T1,CLOB+1\r
+       POPJ    P,\r
+\r
+\r
+\r
+OPEN2: MOVE    X2,E            ;IS THERE ROOM ABOVE THIS STODGY ROLL?\r
+       ADD     X2,CEIL(R)      ;THE NEW CEILING\r
+       CAMLE   X2,FLOOR+1(R)\r
+       JRST    N,OPENU0        ;NO ROOM, PACK OTHER ROLLS UP\r
+       ADDM    E,CEIL(R)       ;THERE IS ROOM, INCREMENT CEILING\r
+       POPJ    P,\r
+\r
+OPENU0:        SUB     B,FLOOR(R)\r
+       PUSHJ   P,PANIC\r
+       ADD     B,FLOOR(R)\r
+\r
+OPENUP:        CAMG    R,TOPSTG        ;OPEN UP THE TOP STODGY ROLL?\r
+       JRST    N,OPEN2         ;YES.  OPEN UPWARDS, NOT DOWN\r
+       MOVN    X2,E\r
+       MOVE    Q,TOPSTG        ;DO NOT MOVE STODGY ROLLS\r
+       ADD     X2,FLOOR+1(Q)\r
+       CAMGE   X2,CEIL+0(Q)\r
+       JRST    N,OPENU0        ;NEED MORE ROOM\r
+       HRL     X2,FLOOR+1(Q)   ;CONTRUCT BLT WORD\r
+       SUB     B,E             ;FIRST WORD OF GAP\r
+       BLT     X2,-1(B)        ;MOVE ROLLS DOWN\r
+\r
+       MOVEI   X1,1(Q)         ;ADJUST POINTERS FOR ROLLS JUST BLT'D\r
+       MOVN    X2,E\r
+OPEN1: ADDM    X2,FLOOR(X1)\r
+       CAML    X1,R\r
+       POPJ    P,\r
+       ADDM    X2,CEIL(X1)\r
+       AOJA    X1,OPEN1\r
+\r
+\r
+;RPUSH - PUSH A ON TOP OF DESIGNATED ROLL\r
+\r
+RPUSH: MOVEI   E,1\r
+       PUSHJ   P,BUMPRL        ;MAKE ROOM\r
+       MOVEM   A,(B)           ;STORE WORD\r
+       POPJ    P,\r
+\r
+;ROUTINE TO ADD TO END OF ROLL\r
+;E CONTAINS SIZE, R CONTAINS ROLL NUMBER\r
+\r
+BUMPRL:        MOVE    B,CEIL(R)\r
+       ADD     B,E\r
+       CAIE    R,ROLTOP\r
+       SKIPA   X1,FLOOR+1(R)\r
+       HRRZ    X1,JOBREL\r
+       CAMLE   B,X1\r
+       JRST    N,BUMP1\r
+       EXCH    B,CEIL(R)\r
+       POPJ    P,\r
+BUMP1: MOVE    B,CEIL(R)\r
+       CAIE    R,CODROL\r
+       CAIN    R,SEXROL\r
+       JRST    N,.+2\r
+       JRST    N,OPENUP\r
+       ADDI    E,^D10          ;***EXTRA 10 LOCS\r
+       PUSHJ   P,OPENUP\r
+       MOVNI   X1,^D10 ;TAKE BACK THE 10 LOCS\r
+       ADDM    X1,CEIL(R)\r
+       POPJ    P,\r
+\r
+\r
+;BINARY SEARCH OF SORTED ROLL\r
+;CALL WITH KEY IN A\r
+;RETURN IN B ADDRS OF FIRST\r
+;ENTRY NOT LESS THAN KEY\r
+;SKIP RETURN IF LEFT SIDES EQUAL\r
+\r
+SEARCH:        MOVE    B,FLOOR(R)\r
+       SKIPA   X1,CEIL(R)\r
+SEAR1: MOVEI   B,1(X2)\r
+       CAIGE   B,(X1)\r
+       JRST    SEAR2\r
+       CAML    B,CEIL(R)\r
+       POPJ    P,\r
+       JRST    SEAR3\r
+\r
+SEAR2: MOVEI   X2,@X1\r
+       ADD     X2,B\r
+       ASH     X2,-1\r
+       CAMLE   A,(X2)\r
+       JRST    SEAR1\r
+       HRRI    X1,0(X2)\r
+       CAIGE   B,0(X1)\r
+       JRST    SEAR2\r
+\r
+SEAR3: HLLZ    Q,(B)\r
+       CAMN    Q,A\r
+       AOS     (P)\r
+       POPJ    P,\r
+\r
+\f;ROUTINE TO QSA FOR "THEN" OR "GOTO" (USED IN "IF", "ON" STATEMENTS)\r
+THENGO:        PUSHJ   P,QSA\r
+       ASCIZ /THEN/\r
+       CAIA\r
+       POPJ    P,\r
+       PUSHJ   P,QSA\r
+       ASCIZ /GOTO/\r
+       FAIL    <ILLEGAL FORMAT>\r
+       POPJ    P,\r
+\r
+;COMMON SUBROUTINE RETURNS\r
+\r
+CPOPJ1:        AOS     (P)\r
+CPOPJ: POPJ    P,\r
+\r
+;ERROR RETURNS\r
+\r
+ILFORM:        FAIL    <ILLEGAL FORMULA>\r
+ILVAR: FAIL    <ILLEGAL VARIABLE>\r
+GRONK: FAIL    <ILLEGAL FORMAT>\r
+ILLINS:        FAIL    <ILLEGAL INSTRUCTION>\r
+\r
+\r
+;COMPILATION ERROR\r
+\r
+\r
+FAILER:        SKIPN   RUNFLA          ;IS THIS THE FIRST ERROR IN COMPILATION?\r
+       JRST    FAIL0           ;NO.\r
+       PUSHJ   P,INLMES        ;YES. SETUP <CRLF> TO FOLLOW HEADING.\r
+       ASCIZ /\r
+/\r
+FAIL0: PUSHJ   P,FAIL1\r
+       JRST    NXTST1\r
+FAIL1: MOVE    T,40\r
+FAILR: MOVEI   D,0\r
+       PUSHJ   P,PRINT\r
+       LDB     X1,[POINT 4,40,12]      ;IS AC FIELD NONZERO?\r
+       JUMPE   X1,FAIL2\r
+       MOVE    T,N                     ;ATTACH NUMBER IN 'N' TO MSG\r
+       PUSHJ   P,PRTNUM\r
+FAIL2: PUSHJ   P,INLMES\r
+       ASCIZ   / IN /\r
+       MOVE    T,L\r
+       ADD     T,FLLIN\r
+       HLRZ    T,(T)\r
+       PUSHJ   P,PRTNUM\r
+       PUSHJ   P,INLMES\r
+       ASCIZ   /\r
+/\r
+       SETZM   RUNFLA\r
+       POPJ    P,\r
+\r
+;ROUTINES TO ALLOW AND DELAY REENTRY.\r
+;LOCKON TEMPORARILY PREVENTS REENTRY\r
+;LOCKOF ALLOWS REENTRY AND REENTERS IF THERE IS A STANDING REQUEST\r
+;REENTR MAKES A REENTRY OR MAKES A REQUEST AND CONTINUES\r
+\r
+LOCKON:        SKIPGE  RENFLA\r
+       SETZM   RENFLA          ;TURN ON REENETER PROTECT\r
+       POPJ    P,\r
+LOCKOF:        SKIPLE  RENFLA\r
+       JRST    BASIC           ;ACT ON OLD REENTER REQUEST\r
+       SETOM   RENFLA          ;ALLOW REENTER\r
+       POPJ    P,\r
+REENTR:        SKIPGE  RENFLA\r
+       JRST    BASIC\r
+       AOS     RENFLA\r
+       JRST    2,@JOBOPC\r
+\f;ROUTINE TO READ CHARACTER, SKIPPING BLANKS\r
+;CALL: MOVE    T,<POINTER TO CHAR BEFORE FIRST>\r
+;      PUSHJ   P,NXCH\r
+;      ...     RETURN, C:= (<FLAGS>)CHARACTER\r
+\r
+NXCHS: ILDB    C,T     ;DOESNT SKIP TAB OR BLANK\r
+NXCHD: CAIE    C," "\r
+       CAIN    C,11\r
+       POPJ    P,\r
+       CAIA            ;SKIP INTO NXCH\r
+NXCH:  ILDB    C,T     ;FETCH NEXT CHARACTER\r
+       HLL     C,CTTAB(5)\r
+       TRNE    C,100\r
+       HRL     C,CTTAB-100(5)\r
+       TLNE    C,F.SPTB        ;SPACE OR TAB?\r
+       JRST    N,NXCH  ;YES. IGNORE\r
+       POPJ    P,\r
+;GET NEXT CHAR, BUT CHECK FOR ILLEGAL CHARS (CHARS THAT COULD ONLY BE IN A STRING)\r
+NXCHK: PUSHJ   P,NXCH\r
+       TLNE    C,F.STR\r
+       FAIL    <ILLEGAL CHARACTER>\r
+       POPJ    P,\r
+\r
+;SCAN INITIAL LETTER, LETTER IS PLACED LEFT\r
+;JUSTIFIED IN A, 7-BIT ASCII.\r
+\r
+SCNLT1:        HRRZ    A,C\r
+       ROT     A,-7\r
+       JRST    NXCH\r
+\r
+;SCAN SECOND LETTER, NON-SKIP RETURN IF NOT LETTER.\r
+;MAKE 7-BIT LETTER LEFT JUST IN A\r
+;INTO 6-BIT. THAN PUT 6-BIT CURRENT LETTER IN A.\r
+\r
+SCNLT2:        TLNN    C,F.LETT\r
+       POPJ    P,\r
+SCN2:  TLNN    A,400000                ;ENTER HERE TO PROCESS NON-LETTER CHARS\r
+       TLZA    A,200000\r
+       TLO     A,200000\r
+       LSH     A,1\r
+       MOVE    X1,[POINT 6,A,5]\r
+       JRST    SCNLTN\r
+\r
+;ENTER HERE TO SCAN SECOND CHAR EVEN IF BOTH ARE NOT LETTERS.\r
+\r
+\r
+;SCAN THIRD LETTER, NON-SKIP IF NOT LETTER.\r
+;PUT 6-BIT LETTER TO 3RD 6-BIT FIELD IN A.\r
+\r
+SCNLT3:        TLNN    C,F.LETT\r
+       POPJ    P,0\r
+       MOVE    X1,[POINT 6,A,11]\r
+\r
+;NOW PUT 6-BIT LETTER INTO A, ADJUSTING LOWER CASE, INCREMENTING POINTER.\r
+\r
+SCNLTN:        TLNN    C,F.LCAS\r
+       TRC     C,40\r
+       IDPB    C,X1\r
+       AOS     (P)\r
+       JRST    NXCH\r
+\f;QUOTE SCAN AND TEST\r
+;CALL WITH PATTERN ADDRS IN X1\r
+;SKIP IF EQUAL. C,T UPDATED TO LAST CHAR SCANNED.\r
+QST:   HRLI    X1,440700       ;MAKE BYTE PNTR TO PATTERN\r
+QST1:  ILDB    X2,X1           ;GET PATTERN CHAR\r
+       JUMPE   X2,CPOPJ1       ;DONE ON NULL\r
+       SUBI    X2,(C)\r
+       JUMPE   X2,.+4          ;DO CHARACTERS MATCH?\r
+       TLNE    C,F.LCAS        ;NO. LOWER CASE LETTER?\r
+       CAME    X2,[ EXP -40]   ;YES. SAME LETTER OF ALPHABET?\r
+       JRST    QST2            ;NO. MATCH FAILS\r
+       PUSHJ   P,NXCH\r
+       JRST    QST1\r
+QST2:  ILDB    X2,X1           ;ON FAIL\r
+       JUMPN   X2,.-1          ;SKIP TO NULL\r
+       POPJ    P,\r
+\r
+\r
+;QUOTE SCAN OR FAIL\r
+;CALL WITH INLINE PATTERN\r
+;GO TO GRONK IF NO MATCH\r
+\r
+QSF:   POP     P,X1\r
+       PUSHJ   P,QST\r
+       JRST    GRONK\r
+       JRST    1(X1)\r
+\r
+;QUOTE SCAN WITH ANSWER\r
+;CALL WITH INLINE PATTERN\r
+;SKIP ON SUCCESS               ;ON FAIL, RETURN WITH C,T RESTORED\r
+\r
+QSA:   POP     P,X1            ;GET PATTERN ADDRESS\r
+       PUSH    P,C             ;SAVE C,T\r
+       PUSH    P,T\r
+       PUSHJ   P,QST           ;SAVE STRING\r
+       JRST    .+2\r
+       JRST    QSA1            ;MATCH\r
+       POP     P,T             ;NO MATCH.  BACK UP\r
+       POP     P,C\r
+       JRST    1(X1)\r
+\r
+QSA1:  POP     P,14\r
+       POP     P,14\r
+       JRST    2(X1)\r
+\r
+;ROUTINE TO READ NEXT INTEGER FROM SCANNED LINE\r
+;CALL: MOVE    T,POINTER TO FIRST CHAR\r
+;      PUSHJ   P,GETNUM\r
+;      ...     FAIL RETURN\r
+;      ...     SUCCESS RETURN, INTEGER IN N\r
+\r
+GETNU: TDZA    X1,X1           ;GET A NUMBER OF ANY LENGTH\r
+GETNUM:        MOVEI   X1,5            ;GET A NUMBER OF AT MOST 5 DIGS\r
+       TLNN    C,F.DIG         ;NUMERAL?\r
+       POPJ    P,              ;NO.  FAIL RETURN\r
+       MOVEI   N,-60(C)        ;YES.  ACCUMULATE FIRST DIGIT\r
+GETN1: MOVE    G,T             ;SAVE PNTR FOR USE BY INSERT\r
+       PUSHJ   P,NXCH          ;GET NEXT CHAR\r
+       SOJE    X1,CPOPJ1       ;EXIT IF FIVE DIGITS ALREADY\r
+       TLNN    C,F.DIG         ;NUMERAL?\r
+       JRST    CPOPJ1          ;NO.  RETURN.\r
+       IMULI   N,^D10          ;YES.  ACCUMULATE NUMBER\r
+       ADDI    N,-60(C)\r
+       JRST    GETN1           ;GO FOR MORE\r
+;ROUTINE TO READ A LINE INTO LINB0\r
+;CALL: PUSHJ   P,INLINE\r
+\r
+INLINE:        SETOM   TYI+2\r
+       MOVE    T,[POINT 7,LINB0]\r
+       MOVEI   T1,0\r
+       JRST    N,INLI1A\r
+\r
+INLI1: ILDB    C,TYI+1         ;GET CHAR\r
+       CAIN    C,15            ;CR??\r
+       JRST    INLI1A\r
+       JUMPE   C,INLI1A\r
+       CAIN    C,"_"           ;DELETE?\r
+       JRST    INLI3           ;YES\r
+       CAIE    C,30\r
+       CAIN    C,FUNSTA\r
+       JRST    N,INLI4\r
+       CAIE    C,21            ;IGNORE XON,XOFF\r
+       CAIN    C,23\r
+       SOJA    T1,INLI1A\r
+       CAIG    C,14            ;LINE TERMINATOR?\r
+       CAIGE   C,12\r
+       CAIA\r
+       JRST    INLI2           ;YES.  GO FINISH UP\r
+       CAIGE   T1,^D94         ;ROOM FOR CHAR+1 MORE?\r
+       IDPB    C,T             ;STORE CHAR\r
+INLI1A:        SOSLE   TYI+2           ;MORE INPUT?\r
+       AOJA    T1,INLI1        ;YES.  BUMP COUNT AND GO GET MORE\r
+       INPUT\r
+       STATZ   20000\r
+       JRST    BASIC\r
+       STATO   740000\r
+       AOJA    T1,INLI1\r
+       PUSHJ   P,TTYIN\r
+       PUSHJ   P,INLMES\r
+       ASCIZ   /SYSTEM ERROR/\r
+       JRST    N,BASIC\r
+INLI2: MOVEI   C,15            ;DONE.  PUT CR IN BFR\r
+       IDPB    C,T\r
+       MOVE    T,[POINT 7,LINB0]\r
+       SETZM   HPOS\r
+       JRST    NXCH\r
+INLI3: JUMPE   T1,INLI1A       ;BACKARROW HANDLER, IGNORE IF AT LEFT\r
+       MOVEI   C,4\r
+       IBP     T\r
+       SOJG    C,.-1\r
+       SUBI    T1,2\r
+       SOJA    T,INLI1A\r
+INLI4: MOVEI   T,INLI5\r
+       CALL    T,[SIXBIT /DDTOUT/]\r
+       JRST    INLINE\r
+INLI5: ASCIZ   / DELETED\r
+/\r
+\r
+;ROUTINE TO START READING NEXT LINE OF PROGRAM\r
+NXLINE:        MOVE    T,FLLIN\r
+       ADDI    T,(L)\r
+       MOVE    T,(T)\r
+       MOVS    D,T             ;SAVE LINE START\r
+       HRLI    T,440700\r
+       MOVE    G,FLREF ;SETUP REFROL REFERENCE.\r
+       ADDI    G,(L)\r
+       JRST    NXCH\r
+;PRINTING SUBROUTINES\r
+\r
+;PRINT TO QUOTE CHAR\r
+;CALL: MOVE    T,<ADDRS OF MSG>\r
+;      MOVE    D,<QUOTE CHAR>\r
+;      PUSHJ   P,PRINT\r
+;CALL: MOVE    T,<ADDRS OF MSG>\r
+;      MOVE    D,<QUOTE CHAR>\r
+;      PUSHJ   P,PRINT\r
+;ALTERNATE CALL: PRINT1, IF BYTE PNTR IN T.\r
+\r
+\r
+PRINT: HRLI    T,440700\r
+PRINT1:        ILDB    C,T\r
+       CAMN    C,D\r
+       POPJ    P,\r
+       PUSHJ   P,OUCH          ;OUTPUT THE CHAR\r
+       JRST    PRINT1\r
+OUCH:  SOSG    TYO+2\r
+       OUTPUT\r
+       IDPB    C,TYO+1\r
+       CAIE    C,12\r
+       AOSA    HPOS\r
+       SETZM   HPOS\r
+       POPJ    P,\r
+\f;ROUTINE TO PRINT SIXBIT CHARACTERS IN ACCUM "T".\r
+;IGNORES BLANKS.\r
+\r
+\r
+PRNSIX:        MOVE T1,[POINT 6,T]\r
+       ILDB    C,T1\r
+       JUMPE   C,PRNS1         ;SKIP A BLANK\r
+       ADDI    C,40\r
+       PUSHJ   P,OUCH\r
+PRNS1: TLNE    T1,770000               ;ALL SIX PRINTED?\r
+       JRST    PRNSIX+1\r
+       POPJ    P,\r
+PRNS2: JUMPE   X1,PRDE2\r
+       MOVE    T,X1\r
+       PUSHJ   P,PRDE1\r
+       MOVE    C,A\r
+       PUSHJ   P,OUCH\r
+\f;SPECIAL DECIMAL PRINT ROUTINE.  PRINTS X1,X2 AS DECIMAL NUMBERS\r
+;SEPARATED BY THE CHARACTER IN ACCUM "A".\r
+;IF X1 OR X2 ARE ZERO, THEY PRINT AS "00".\r
+\r
+PRDE2: MOVE    T,X2\r
+       PUSHJ   P,PRDE1\r
+       MOVE    C,A\r
+PRDE2A:        PUSHJ   P,OUCH\r
+       MOVE    T,Q\r
+       MOVEI   A,177\r
+PRDE1: MOVEI   C,"0"           ;A ONE DIGIT NUMBER?\r
+       CAIG    T,^D9\r
+       PUSHJ   P,OUCH          ;YES. PUT OUT LEADING ZERO.\r
+       JRST    PRTNUM\r
+PTIME: SKIPE   N,174\r
+       SKIPN   MTIME\r
+       POPJ    P,\r
+RTIME: PUSHJ   P,INLMES\r
+       ASCIZ   /\r
+\r
+TIME:  /\r
+       CALL    X2,[SIXBIT /RUNTIM/]    ;GET TIME NOW.\r
+       SUB     X2,MTIME                ;GET ELAPSED TIME.\r
+       IDIVI   X2,^D10                 ;REMOVE THOUSANDS.\r
+       IDIVI   X2,^D100                ;SECS TO X1, THENTS AND HUNDREDS TO X2.\r
+       MOVE    T,X2                    ;OUTPUT THE\r
+       JUMPE   X2,.+2\r
+       PUSHJ   P,PRTNUM                ;SECONDS.\r
+       MOVEI   C,"."                   ;OUTPUT ., THE TENTHS,\r
+       PUSHJ   P,PRDE2A                ;AND THE HUNDREDTHS.\r
+       PUSHJ   P,INLMES\r
+       ASCIZ / SECS.\r
+/\r
+       SETZM   MTIME\r
+       OUTPUT\r
+       POPJ    P,\r
+\r
+;NUMBER PRINTER (PRINTS INTERGER IN T)\r
+\r
+\r
+PRTNUX:        TDZA    X1,X1\r
+PRTNX1:        MOVE    X1,B\r
+       MOVEI   X1,5(X1)\r
+       PUSHJ   P,CHROOM\r
+       PUSHJ   P,PSIGN\r
+PRTNUM:        IDIVI   T,^D10\r
+       JUMPE   T,PRTN1\r
+       PUSH    P,T1\r
+       PUSHJ   P,PRTNUM\r
+       POP     P,T1\r
+PRTN1: MOVEI   C,60(T1)\r
+       JRST    OUCH\r
+PSIGN: MOVEI   C," "           ;PRINT "SIGN" (BLANK OR MINUS)\r
+       JUMPGE  N,.+2\r
+       MOVEI   C,55\r
+       JRST    OUCH\r
+\r
+\r
+;MESSAGE PRINTER\r
+\r
+INLMES:        EXCH    T,(P)           ;GET MSG ADR AND SAVE T.\r
+       MOVEI   D,0             ;END ON NULL\r
+       PUSHJ   P,PRINT\r
+       EXCH    T,(P)\r
+       JRST    CPOPJ1          ;RTN AFTER MSG.\r
+\f      SUBTTL CORE COMPRESSION AND EXPANSION\r
+;PANIC - ROUTINE TO COMPRESS CORE\r
+\r
+PANIC: PUSHJ   P,PRESS         ;COMPRESS MEMORY\r
+       MOVE    Q,TOPSTG        ;IS THERE ROOM BETWEEN STODGY AND\r
+       MOVE    X1,FLOOR+1(Q)   ;MOVEABLE ONES?\r
+       SUB     X1,CEIL(Q)\r
+       CAML    X1,E            ;ENOUGH ROOM?\r
+       POPJ    P,\r
+\r
+       MOVE    X1,JOBREL       ;EXPAND BY 1K\r
+       ADDI    X1,2000\r
+       CALL    X1,[SIXBIT /CORE/]\r
+       JRST    N,PANIC1\r
+       JRST    N,PANIC\r
+PANIC1:        PUSHJ   P,INLMES\r
+       ASCIZ   /OUT OF ROOM/\r
+       JRST    N,UXIT\r
+\r
+PRESS: PUSH    P,G             ;SAVE AC\r
+       SKIPN   PAKFLA          ;ARE LINES PACKED?\r
+       JRST    PRESS5          ;YES\r
+       SETZM   PAKFLA\r
+\r
+       MOVE    X1,FLTXT        ;LOOK FOR EMPTY SPACE\r
+PRESS2:        CAML    X1,CETXT        ;THROUGH LOOKING?\r
+       JRST    PRESS5\r
+       SKIPE   (X1)            ;A FREE WORD?\r
+       AOJA    X1,PRESS2       ;NO\r
+\r
+       MOVEI   X2,1(X1)        ;YES\r
+PRESS3:        CAML    X2,CETXT\r
+       JRST    PRESS4          ;FREE TO END\r
+       SKIPN   (X2)\r
+       AOJA    X2,PRESS3\r
+\r
+       SUB     X1,X2           ;X1 :=-LNG OF MOVE\r
+       MOVE    Q,FLLIN\r
+PRES3A:        CAML    Q,CELIN         ;MOVE DOWN THE REFERENCES\r
+       JRST    PRES3B          ;IN THE LINE ROLL\r
+       HRRZ    G,(Q)\r
+       CAML    G,X2\r
+       ADDM    X1,(Q)\r
+       AOJA    Q,PRES3A\r
+\r
+PRES3B:        MOVE    G,CETXT         ;MOVE DOWN THE TEXT ROLL\r
+       ADD     G,X1\r
+       MOVEM   G,CETXT\r
+       ADD     X1,X2\r
+       HRL     X2,X1\r
+       MOVSS   X2\r
+       BLT     X2,-1(G)\r
+       JRST    PRESS2\r
+\r
+PRESS4:        MOVE    Q,X1\r
+\r
+;ROUTINE TO MOVE ROLLS UP\r
+\r
+       SUB     Q,X1\r
+       ADDM    Q,CETXT\r
+PRESS5:        MOVEI   G,ROLTOP        ;HIGHEST MOVABLE ROLL\r
+       MOVE    X1,JOBREL       ;X1 IS PREVIOUS FLOOR\r
+                               ;NOTE: TOP WORD OF USR CORE IS LOST\r
+\r
+PRESS6:        MOVE    X2,CEIL(G)      ;GET OLD CEIL AND FLOOR\r
+       MOVE    Q,FLOOR(G)\r
+       SUBI    X2,1            ;SET UP X2 FOR POP LOOP\r
+       ORCMI   X2,777777\r
+       MOVEM   X1,CEIL(G)      ;NEW CEILING\r
+\r
+PRESS7:        CAILE   Q,(X2)          ;DONE?\r
+       JRST    N,PRESS8\r
+       POP     X2,-1(X1)       ;MOVE ONE WORD\r
+       SOJA    X1,PRESS7\r
+\r
+PRESS8:        MOVEM   X1,FLOOR(G)     ;NEW FLOOR\r
+       SOS     G               ;GO TO NEXT LOWER ROLL\r
+       CAMLE   G,TOPSTG        ;IS THIS ROLL MOVEABLE?\r
+       JRST    PRESS6          ;YES. GO PRESS IT.\r
+PRESS9:        POP     P,G     ;RESTORE G\r
+       POPJ    P,      ;RETURN\r
+\r
+\f;THIS ROUTINE OBTAINS SPACE IN THE "FREE CORE AREA" FOR REAL STRINGS,\r
+;APPEND BLOCKS, THE TEMPORARY STRINGS WHICH ARE THE RESULTS OF\r
+;STRING FUNCTIONS, AND BUFFERS FOR DATA FILES. IT HAS SIX ENTRY POINTS:\r
+;VCHCKC AND VCHCKW FOR REAL STRINGS, VCHTSC AND VCHTSW FOR TEMPORARY\r
+;STRINGS, VCHAPP FOR APPEND BLOCKS, AND VCHBUF FOR DATA FILES.\r
+;STRINGS HAVE TWO ENTRY POINTS SO THAT THEY MAY REQUEST SPACE IN UNITS\r
+;OF EITHER CHARACTERS OR WORDS.         THE REQUEST IS IN AC T.  NO OTHER\r
+;AC'S ARE DESTROYED. THE LOCATION OF THE LOWER BOUND OF THE OBTAINED\r
+;SPACE IS RETURNED IN AC T.\r
+\r
+\r
+VCHCKC:        MOVEI   E,25\r
+       SKIPG   G\r
+       PUSHJ   P,VCHCK9\r
+VCHCK1:        MOVE    X1,VARFRE\r
+       ADD     X1,E\r
+       CAMGE   X1,JOBREL\r
+       POPJ    P,\r
+       SKIPE   VPAKFL\r
+       JRST    N,VCHCK2\r
+       PUSHJ   P,VCHCK3\r
+       JRST    N,VCHCK1\r
+VCHCK2:        MOVE    X1,JOBREL\r
+       ADDI    X1,2000\r
+       CALL    X1,[SIXBIT /CORE/]\r
+       JRST    N,PANIC1\r
+       JRST    N,VCHCK1\r
+VCHCK3:        PUSH    P,G\r
+       PUSH    P,E\r
+       MOVE    G,SVRTOP\r
+VCHCK4:        HRRZI   X2,-1\r
+       MOVE    Q,FLVSP\r
+       SETZI   X1,0\r
+VCHCK5:        CAML    Q,SVRTOP\r
+       JRST    N,VCHCK7\r
+       CAMN    Q,CEVSP\r
+       MOVE    Q,SVRBOT\r
+       HRRZ    E,(Q)\r
+       JUMPE   E,VCHCK6\r
+       CAML    E,G\r
+       CAMG    X2,E\r
+VCHCK6:        AOJA    Q,VCHCK5\r
+       MOVE    X1,Q\r
+       MOVE    X2,E\r
+       AOJA    Q,VCHCK5\r
+VCHCK7:        JUMPE   X1,VCHCKE\r
+       HLRE    E,(X1)\r
+       JUMPN   E,VCHCK8\r
+       SETZM   N,(X1)\r
+       JRST    N,VCHCK4\r
+VCHCK8:        HRL     G,(X1)\r
+       MOVN    C,E\r
+       CAIL    C,1000\r
+       MOVEI   C,0\r
+       ADDI    C,4\r
+       IDIVI   C,5\r
+       MOVE    E,C\r
+       ADDI    E,(G)\r
+       HRRZ    X2,(X1)\r
+       CAIN    X2,(F)\r
+       HRRM    G,F\r
+       HRRM    G,(X1)\r
+       BLT     G,(E)\r
+       AOS     G,E\r
+       MOVEM   E,VARFRE\r
+       JRST    N,VCHCK4\r
+VCHCKE:        POP     P,E\r
+       SETOM   N,VPAKFL\r
+       JRST    N,PRESS9\r
+\fSUBTTL DECIMAL NUMBER EVALUATE/PRINT\r
+;ROUTINE TO EVALUATE NUMBER\r
+;T: PNTR TO FIRST CHAR, C: FIRST CHAR\r
+;NON-SKIP IS FAIL RETURN\r
+;RETURN NUMBER IN N\r
+\r
+;N: ACCUM NBMR, B: SCA FAC, D: DIG CNT, USE FLGS IN LEFT OF F\r
+\r
+EVANUM:        SETZB   N,B             ;CLEAR ACS\r
+       MOVEI   D,8\r
+       MOVEI   F,0(F)          ;CLEAR LH OF F\r
+\r
+       TLNE    C,F.PLUS        ;SKIP +\r
+       JRST    EVAN1\r
+       TLNN    C,F.MINS        ;CHECK FOR -\r
+       JRST    EVAN2           ;NO\r
+       TLO     F,F.MIN         ;SET MINUS FLG\r
+EVAN1: PUSHJ   P,NXCH\r
+EVAN2: TLNN    C,F.DIG         ;DIGIT?\r
+       JRST    N,EVAN3\r
+       TLO     F,F.NUM         ;DIGIT SEEN FLAG\r
+       JUMPE   N,EVAN2A        ;DONT COUNT LEADING ZEROS\r
+       SOJG    D,EVAN2A        ;COUNT DIGIT,  GO ACCUM IF OK\r
+;                      REST OF DIGITS ARE INSIGNIFIGANT.\r
+       AOJA    B,EVAN2B        ;LEAD OR TRAIL 0, FUDGE SCA FAC\r
+\r
+EVAN2A:        IMULI   N,^D10          ;ACCUMULATE DIGIT\r
+       ADDI    N,-60(C)\r
+EVAN2B:        TLNE    F,F.DOT         ;DECIMAL SEEN?\r
+       SUBI    B,1             ;YES.  COUNT DOWN SCALE FACT\r
+       JRST    EVAN1           ;GO TO NEXT CHAR\r
+\r
+EVAN3: TLNN    C,F.PER         ;NOT DIGIT.  DEC PNT?\r
+       JRST    EVAN4           ;NO.\r
+       TLOE    F,F.DOT         ;YES, SET FLG & CHK ONLY ONE\r
+       POPJ    P,              ;2 DEC PNTS\r
+       JRST    EVAN1\r
+EVAN4: TLNN    F,F.NUM         ;DID WE SEE A DIGIT?\r
+       POPJ    P,              ;NO.  WHAT A LOUSY NUMBER\r
+\r
+       MOVEI   X1,"E"\r
+       CAIE    X1,(C)          ;EXPLICIT SCALE FACTOR?\r
+       JRST    EVAN8           ;NO\r
+       PUSHJ   P,NXCH          ;DO LOOK AHEAD\r
+       TLNE    C,F.PLUS        ;SCALE FACTOR SIGN\r
+       JRST    EVAN5\r
+       TLNN    C,F.MINS\r
+       JRST    EVAN6\r
+       TLO     F,F.MXP\r
+EVAN5: PUSHJ   P,NXCH\r
+EVAN6: TLNN    C,F.DIG         ;CHK FOR DIGIT\r
+       POPJ    P,\r
+       MOVEI   A,-60(C)        ;SAVE FIRST EXPON DIGIT\r
+       PUSHJ   P,NXCH\r
+       TLNN    C,F.DIG         ;IS THERE A SECOND DIGIT\r
+       JRST    EVAN7           ;NO\r
+       IMULI   A,^D10          ;YES.  ACCUMULATE IT\r
+       ADDI    A,-60(C)\r
+       PUSHJ   P,NXCH          ;DO LOOK AHEAD\r
+\r
+EVAN7: TLNE    F,F.MXP         ;NEG EXPON?\r
+       MOVN    A,A             ;YES. NEGATE IT\r
+       ADD     B,A             ;ADD TO SCALE FACTOR\r
+EVAN8: JUMPE   N,CPOPJ1        ;IGNORE SCALE IF NUMBER IS ZERO\r
+EVAN8A:        MOVE    X1,N            ;)\r
+       IDIVI   X1,^D10         ;)REMOVE ANY TRAILING ZEROS\r
+       JUMPN   X2,EVAN8B       ;)  IN MANTISSA.. (REASON:\r
+       MOVE    N,X1            ;)  SO THAT, E.G.,   .1,\r
+       AOJA    B,EVAN8A        ;)  .10, .100,... ARE THE SAME)\r
+EVAN8B:        MOVM    A,B\r
+       CAILE   A,46\r
+       POPJ    P,\r
+       TLO     N,233000        ;FLOAT N\r
+       FAD     N,[0]\r
+       JOV     .+1             ;CLEAR OVER/UNDERLFOW FLAG\r
+EVAN8C:        CAIGE   B,^D15          ;SCALE UP IF .GE. 10^15\r
+       JRST    EVAN8D\r
+       SUBI    B,^D14          ;SUBTRACT 14 FROM SCALE FACTOR\r
+       FMPR    N,D1E14         ;MULTIPLY BY 10^14\r
+       JRST    EVAN8C          ;GO LOOK AT SCALE AGAIN\r
+EVAN8D:        CAML    B,[EXP -^D4]    ;SCALE DONW IF .LT. 10^-4\r
+       JRST    N,EVAN8E\r
+       ADDI    B,^D18          ;ADD 18 TO SCALE\r
+       FMPR    N,D1EM18        ;MULTIPLY BY 10^-18\r
+       JRST    N,EVAN8D        ;GO LOOK AT SCALE AGAIN\r
+EVAN8E:        FMPR    N,DECTAB(B)     ;SCALE N\r
+       TLNE    F,F.MIN         ;MINUS\r
+       MOVN    N,N             ;YES.  NEGATE IT.\r
+       JOV     CPOPJ\r
+       JRST    CPOPJ1          ;SUCCESS RETURN, NUMBER IN N\r
+\f;ROUTINE TO PRINT NUMBER\r
+\r
+OUTNUM:        SETOM   STRFCN\r
+       MOVM    T,N\r
+       JUMPE   T,PRTNUX\r
+       PUSH    P,E             ;DO NOT CLOBBER E (FOR MATRIX)\r
+       MOVEI   E,0             ;CHANGE IN EXPONENT\r
+OUTN1A:        CAMG    T,D1E14         ;SCALE IF .GT. 10^14\r
+       JRST    OUTN1B\r
+       ADDI    E,^D18          ;ADD 18 TO SCALE\r
+       FMPR    T,D1EM18        ;AND MULTIPLY BY 10^-18\r
+       JRST    OUTN1A\r
+OUTN1B:        CAML    T,D1EM4         ;SCALE IF .LT. 10^-4\r
+       JRST    OUTN1C\r
+       SUBI    E,^D14          ;SUBTRACT 14 FROM SCALE\r
+       FMPR    T,D1E14         ;AND MULT BY 10^14\r
+       JRST    OUTN1B          ;GOT SEE IF MORE SCALING\r
+OUTN1C:        MOVE    A,T             ;LOOK UP IN DEC ROLL\r
+       MOVEI   R,DECROL\r
+       PUSHJ   P,SEARCH\r
+       JFCL                    ;DONT CARE IF FOUND\r
+       CAME    A,(B)           ;FUDGE BY 1 IF EXACT MATCH\r
+       SUBI    B,1\r
+       SUBI    B,DECTAB        ;FIND DIST FROM MIDDLE\r
+       JUMPN   E,OUTN2         ;(NOT INTEGER IF WE SCALED)\r
+       CAIGE   B,^D8           ;CHK 8 DIG NUMBER\r
+       CAIGE   B,0\r
+       JRST    OUTN2\r
+       CAML    T,FIXCON        ;IS THIS 2^26?\r
+       JRST    OUTN1D          ;YES, ITS 27 BIT INT.\r
+       MOVE    X1,T\r
+       FAD     X1,FIXCON       ;INTEGER?\r
+       FSB     X1,FIXCON\r
+       CAME    X1,T\r
+       JRST    OUTN2           ;NOT SUCH (LOST FRACTIONAL PART)\r
+       FAD     T,FIXCON        ;SUCH.  FIX NUMBER\r
+       TLZ     T,377400\r
+OUTN1D:        TLZ     T,377000        ;(IN CASE 27-BIT INTEGER)\r
+       POP     P,E             ;RESTORE E\r
+       JRST    PRTNX1\r
+\r
+OUTN2: FDVR    T,DECTAB(B)     ;GET MANTISSA\r
+       FMPR    T,DECTAB+5\r
+       FADR    T,FIXCON\r
+       TLZ     T,377400        ;FIX\r
+       CAMGE   T,[EXP ^D1000000]\r
+       JRST    .+3\r
+       IDIVI   T,^D10          ;ROUNDING MADE 7 DIGITS\r
+       ADDI    B,1             ;MAKE IT 6 AGAIN\r
+       CAIL    T,^D100000      ;ROUNDING MADE 5 DIGITS?\r
+       JRST    .+3\r
+       IMULI   T,^D10          ;YES.  MAKE 6 AGAIN\r
+       SUBI    B,1\r
+       ADDB    B,E             ;ADD TOGETHER TWO PARTS OF SCALE\r
+       AOJL    E,.+2           ;BETWEEN 10^-1 AND 10^6?\r
+       CAILE   E,6\r
+       SKIPA   E,[EXP 1]               ;NO. PRINT 1 DIG BEFORE POINT\r
+       PUSHJ   P,CHKNEF        ;PRINT WITHOUT EXP (CHK ROOM FOR ^8 SP)\r
+       PUSHJ   P,CHKEF         ;PRINT WITH EXP (CHK ROOM FOR ^14 SP)\r
+       PUSHJ   P,PSIGN         ;PRINT "SIGN"\r
+       JUMPN   E,OUTN3         ;SHOULD DEV. POINT PRECEDE NUMER?\r
+       MOVEI   C,"0"           ;YES,SEND OUT LEADING ZERO.\r
+       PUSHJ   P,OUCH\r
+       PUSHJ   P,DNPRN2\r
+OUTN3: PUSHJ   P,DNPRNT        ;GO PRINT NUMBER WITH DECIMAL\r
+\r
+;HERE TO PRINT EXPONENT\r
+\r
+\r
+       POP     P,E             ;RESTORE E\r
+       JUMPE   B,CPOPJ\r
+       PUSHJ   P,INLMES\r
+       MOVEM   T1,@N\r
+       MOVEI   C,"+"\r
+       JUMPGE  B,.+2           ;SPIT OUT SIGN\r
+       MOVEI   C,"-"\r
+       PUSHJ   P,OUCH\r
+       MOVM    T,B             ;USE PRTNUM TO PRINT EXPON\r
+       JRST    N,PRTNUM\r
+\r
+\r
+;SUBROUTINE USED BY OUTNUM TO PRINT DECIMAL NUMBER.  PRINTS\r
+;SIX DIGITS (INTEGER IN T) WITH CONTENTS(E) DIGITS\r
+;TO THE LEFT OF DECIMAL POINT\r
+\r
+DNPRNT:        MOVEI   D,-1            ;SIGNAL TRAILING ZERO UNLESS...\r
+       JUMPE   B,.+2           ;E-NOTATION\r
+       MOVEI   D,0\r
+DNPRN0:        IDIVI   T,^D10          ;GET LAST DIGIT\r
+       JUMPE   T,DNPRN1        ;IS IT FIRST?\r
+       JUMPN   T1,.+2          ;NON ZERO DIGIT?\r
+       SKIPA   T1,D            ;NO, STASH ZERO OR TRAILZERO\r
+       MOVEI   D,0             ;YES. TRAILER IS OVER.\r
+       HRLM    T1,(P)          ;NO.  STASH DIGIT\r
+       PUSHJ   P,DNPRN0        ;CALL DNPRNT RECURSIVELY\r
+       HLRE    T1,(P)          ;RESTORE DIGIT\r
+       JUMPGE  T1,.+3          ;ORDINARY DIGIT?\r
+       JUMPLE  E,CPOPJ         ;NO, TRAILZERO. AFTER DECIMAL POINR?\r
+       MOVEI   T1,0            ;NO, STASH A ZERO.\r
+\r
+DNPRN1:        MOVEI   C,60(T1)        ;PRINT DIGIT\r
+       PUSHJ   P,OUCH\r
+       SOJN    E,CPOPJ         ;COUNT DIGITS.  PRINT NEXT?\r
+DNPRN2:        MOVEI   C,"."           ;YES. PRINT POINT\r
+       JRST    N,OUCH\r
+\r
+;CHECK FOR ROOM ON A LINE FOR E-FORM NUMBER:\r
+CHKEF: MOVEI   X1,^D14         ;NEED 14 SP TO PRINT THIS NUMBER\r
+       PUSH    P,B             ;SAVE EXPONENT\r
+       PUSHJ   P,CHROOM\r
+       POP     P,B\r
+       POPJ    P,\r
+CHKNEF:        MOVEI   X1,^D9\r
+       PUSHJ   P,CHROOM\r
+       MOVEI   B,0             ;NO EXPONENT.\r
+       JRST    CPOPJ1          ;SKIP-RTN\r
+\r
+;POWER-OF-TEN TABLE.\r
+\r
+D1EM18:        OCT     105447113564    ;10^-18\r
+\r
+DECFLO:\r
+D1EM4: OCT     163643334273\r
+       OCT     167406111565\r
+       OCT     172507534122\r
+       OCT     175631463146\r
+DECTAB:        DEC     1.0             ;10^0\r
+       DEC     1.0E1\r
+       DEC     1.0E2\r
+       DEC     1.0E3\r
+       DEC     1.0E4\r
+       DEC     1.0E5\r
+       DEC     1.0E6\r
+       DEC     1.0E7\r
+       OCT     1.0E8\r
+       DEC     1.0E9\r
+       DEC     1.0E10\r
+       DEC     1.0E11\r
+       OCT     250721522451    ;10^12\r
+       OCT     254443023471\r
+D1E14: OCT     257553630410    ;10^14\r
+DECCEI:\r
+\r
+MAXEXP=^D38\r
+DECFIX:        EXP 225400000000\r
+FIXCON:        EXP 233400000000\r
+\r
+;FLAGS USED BY DECIMAL READER/PRINTER\r
+\r
+F.NUM=200000   ;DIGIT SEEN\r
+F.MIN=100000   ;MINUS SEEN\r
+F.MXP=40000    ;MINUS EXPONENT\r
+F.DOT=20000    ;DECIMAL POINT SEEN\r
+\f      SUBTTL RUN-TIME ROUTINES\r
+\r
+;RUN-TIME GOSUB ROUTINES\r
+\r
+GOSBER:        MOVE    X1,@40\r
+       MOVE    R,FCNLNK\r
+       HRLM    R,@40           ;SAVE PRECEDING CALL\r
+       MOVE    R,40            ;FETCH CURRENT CALL\r
+       MOVEM   R,FCNLNK\r
+       TRNN    X1,777777       ;IF FCN, BEGINS AT CTRL WRD + 1\r
+       HRRI    X1,1(R)\r
+       TLNN    X1,777777       ;CHECK RECURSIVE CALL\r
+       JRST    (X1)\r
+\r
+       PUSHJ   P,INLMES        ;RECURSIVE CALL\r
+       ASCIZ /SUBROUTINE OR FUNCTION CALLS ITSELF IN /\r
+GOSR2: PUSH    P,[EXP UXIT]    ;PRINT LINE NUMBER AND END EXECUTION\r
+GOSR3: MOVE    T,LP\r
+       PUSHJ   P,PRTNUM\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /\r
+/\r
+       POPJ    P,\r
+\r
+FORCOM:        HRRZI   X1,313000       ;RUNTIME COMPARE FIX-DONT USE IF CONN\r
+       SKIPGE  @40\r
+       HRRZI   X1,315000       ;SET UP COMPARE FOR ENTIRE LOOP\r
+       HRLM    X1,@(P)\r
+       POPJ    P,\r
+\r
+XCTON: JUMPLE  N,XCTON1        ;IS ON ARGUMENT <=0?\r
+       FAD     N,FIXCON\r
+       HRRZ    T,N             ;GET INTEGER PART\r
+       JUMPE   T,XCTON1\r
+       ADDI    T,(Q)           ;GET THE "GOTO" ADDRESS\r
+       CAMGE   T,(Q)           ;IS IT IN RANGE?\r
+       JRST    @(T)            ;YES, GOGO\r
+\r
+XCTON1:        PUSHJ   P,INLMES\r
+       ASCIZ /ON EVALUATED OUT OF RANGE IN /\r
+       JRST    GOSR2\r
+\r
+\f;HERE ON OVFLOW ERROR\r
+OVTRAP:        PUSH    P,X1            ;SAVE THIS REG IN CASE FALSE ALARM.\r
+       MOVEI   X1,10\r
+       CALL    X1,[SIXBIT /APRENB/]\r
+       HRRZ    X1,JOBTPC       ;GET TRAP ADDRESS.\r
+       CAML    X1,FLCOD        ;TRAP IN USER PROG?\r
+       CAMLE   X1,CECOD\r
+       JRST    OVFLCM          ;NO. FALSE TRAP.(NOT BY USER)\r
+       MOVE    X1,JOBTPC       ;GET TRAP FLAGS.\r
+       SKIPE   N,174\r
+       JRST    OVTR0\r
+       TLNE    X1,(1B11)       ;UNDERFLOW?\r
+       JRST    UNTRAP          ;YES\r
+       TLNE    X1,(1B12)       ;ZERO DIVIDE?\r
+       JRST    DVTRAP          ;YES\r
+       TLNN    X1,(1B3)\r
+       JRST    OVFLCM          ;NOT OVFLOW EITHER. IGNORE\r
+OVTR0: PUSHJ   P,INLMES\r
+       ASCIZ /OVERFLOW IN /\r
+       SKIPL   N               ;NEG OVFLOW?\r
+OVTR2: HRLOI   N,377777        ;LRG NUMBER\r
+       SKIPG   N\r
+       MOVE    N,MIFI\r
+OVTR1: PUSHJ   P,GOSR3\r
+OVFLCM:        POP     P,X1\r
+       JRST    N,@JOBTPC\r
+\r
+UNTRAP:        PUSHJ   P,INLMES\r
+       ASCIZ /UNDERFLOW IN /\r
+       SETZI   N,              ;RESULT IS ZERO.\r
+       JRST    OVTR1\r
+DVTRAP:        PUSHJ   P,INLMES\r
+       ASCIZ /DIVISION BY ZERO IN /\r
+       JRST    OVTR2\r
+\r
+RETURN:        SETZI   T,0             ;GOSUB RETURN, NOTHING ON PLIST\r
+FRETRN:        MOVE    R,FCNLNK\r
+       JUMPE   R,BADRET        ;CHECK RETURN TOO FAR\r
+       MOVS    X1,(R)          ;FETCH LINK BACK\r
+       HRRZS   (R)             ;MARK SUBR NOT IN USE\r
+       MOVEI   R,(X1)\r
+       MOVEM   R,FCNLNK\r
+       POP     P,X2            ;SAVE REAL RETURN LOCATION\r
+       SUB     P,T             ;POP ANY ARGUMENTS OFF THE PUSH LIST\r
+       JRST    (X2)            ;RETURN\r
+\r
+BADRET:        PUSHJ   P,INLMES\r
+       ASCIZ /RETURN BEFORE GOSUB IN /\r
+       JRST    N,GOSR2\r
+\r
+IFN FTRND,<\r
+;RUN-TIME RANDOMIZER\r
+RANDER:        CALL    N,[SIXBIT /MSTIME/]\r
+       IMUL    N,N             ;USE THE 31 LOW ORDER BITS OF MILLISECS IN DAY ^2\r
+       TLZ     N,760000\r
+       JRST    WRANB           ;PRINT RANDOM FCN AND RETURN.\r
+>;ASSEMBLE ABOVE IF INCLUDING RANDOM FACILITY\r
+\r
+DOREAD:        MOVE    R,[XWD NXREAD,PREAD]\r
+       SETZM   N,INPFLA\r
+       POPJ    P,0\r
+DOINPT:        SETZM   N,PINPUT\r
+       SETZM   N,IFIFG\r
+       MOVE    R,[XWD NXINPT,PINPUT]\r
+       POP     P,INPFLA\r
+       JRST    N,@INPFLA\r
+\r
+;ROUTINE TO GET A DATA WORD\r
+\r
+DATAER:        SKIPN   T,(R)           ;MORE ON SAME LINE?\r
+       JRST    DATR1           ;NO\r
+       PUSHJ   P,NXCH          ;PUT FIRST CHAR OF NEXT NUMBER IN C\r
+DATAE0:        PUSHJ   P,EVANUM\r
+       PUSHJ   P,SSKIP\r
+       MOVEM   N,@40\r
+       TLNE    C,500000\r
+       SETZI   T,0\r
+       MOVEM   T,(R)           ;STORE THE DATA WORD.\r
+DATR0: POP     P,X1\r
+       SKIPN   T               ;END OF A LINE?\r
+       SKIPN   INPFLA          ;YES, IS THIS INPUT\r
+       JRST    (X1)            ;NO, RETURN\r
+       MOVEM   X1,INPFLA       ;YES, RESTART NEXT ERROR FROM HERE.\r
+       JRST    (X1)\r
+\r
+DATR1: MOVS    X1,R            ;DISPATCH ADDRS FOR MORE DATA\r
+       JRST    (X1)\r
+\r
+;ROUTINE TO GET A DATA STRING\r
+\r
+IFN FTSTR,<\r
+SDATAE:        MOVE    T,1(R)          ;GET CURRENT LINE POINTER\r
+       SKIPE   INPFLA          ;INPUT,INSTRUCTION?\r
+       MOVE    T,(R)           ;YES, SHARE POINTER WITH NUMBER DATA\r
+       SKIPN   T               ;MOVE ON CURRENT STRING DATA LINE?\r
+       JRST    SDATR1          ;NO. HUNT FOR NEXT DATA LINE\r
+       PUSHJ   P,NXCH          ;GET FIRST CHAR\r
+SDAT1: PUSHJ   P,REDSTR        ;READ THE STRING AND STORE IT\r
+       PUSHJ   P,SSKIP         ;BAD STRING\r
+       TLNE    C,F.TERM\r
+       SETZI   T,\r
+       MOVEM   T,1(R)          ;SAVE STRING DATA POINTER.\r
+       SKIPE   INPFLA          ;INPUT?\r
+       MOVEM   T,(R)           ;YES , SHARE POINTER\r
+       JRST    DATR0\r
+\r
+SDATR1:        MOVS    X1,R            ;DISPATCH ADDRESS FOR STRING DATA..\r
+       JRST    1(X1)\r
+>;ASSEMBLE ABOVE IF INCLUDING STRING FACILITY\r
+\r
+\f;GET AN ARRAY DATA WORD\r
+\r
+ADT1ER:        PUSH    P,40            ;DATAER NEEDS STORE LOC\r
+       SETZM   40\r
+       PUSHJ   P,DATAER\r
+       POP     P,40\r
+       JRST    AST1ER  ;GO STORE THE WORD\r
+\r
+ADT2ER:        PUSH    P,40\r
+       SETZM   40\r
+       PUSHJ   P,DATAER\r
+       POP     P,40\r
+       JRST    AST2ER\r
+\r
+;GO TO NEXT LINE OF DATA\r
+\r
+NXREAD:        TDZA    Q,Q             ;GET NEXT DATA LINE FOR NUMBER ITEM\r
+       MOVEI   Q,1             ;GET NEXT DATA LINE FOR STRING ITEM\r
+NSRSTR:        MOVE    T,DATLIN(Q)     ;GET NXT DATA LINE NO\r
+       AOBJP   T,NXRE2         ;JUMP IF OUT OF DATA\r
+       MOVEM   T,DATLIN(Q)\r
+       HRRZ    T,(T)           ;GET ADDRS OF SOURCE LINE\r
+       HRLI    T,440700\r
+       PUSHJ   P,NXCH\r
+       PUSHJ   P,QSA           ;LOOK FOR "DATA"\r
+       ASCIZ   /DATA/\r
+       JRST    NSRSTR\r
+IFN FTSTR,<\r
+       JUMPG   Q,SDAT1         ;GO GET STRING?\r
+>\r
+       JRST    DATAE0          ;NO, GO GET NUMBER\r
+\f;REQUEST NEXT LINE OF INPUT\r
+\r
+NXVINP:        SETOI   Q,              ;GET LINE AND RETURN TO "MATIN"\r
+       JRST    NXIN1\r
+NXINPT:        TDZA    Q,Q             ;GET A LINE OF INPUT; NUMBER ITEM NEXT\r
+       MOVEI   Q,1\r
+NXIN1: SKIPN   IFIFG\r
+       JRST    NXIN2\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /NOT ENOUGH INPUT--ADD MORE\r
+/\r
+NXIN2: PUSHJ   P,INLMES\r
+       ASCIZ / ?/\r
+       OUTPUT\r
+       MOVE    T,[POINT 7,LINB0]\r
+       MOVEM   T,PINPUT\r
+       PUSHJ   P,INLINE        ;READ THE LINE AND GET FIRST CHAR.\r
+       TLNE    C,F.CR          ;NULL LINE?\r
+       JUMPL   Q,CPOPJ1        ;YES. ALLOW THIS ON MAT INPUT\r
+       PUSHJ   P,DATCHK        ;CHECK\r
+       JRST    INPERP\r
+       JUMPE   Q,DATAER        ;GET NUMBER ITEM\r
+IFN FTSTR,<\r
+       JUMPG   Q,SDATAE                ;GET STRING ITEM\r
+>\r
+       POPJ    P,\r
+INPERP:        POP     P,X1            ;GET RID OF CALL TO NXVINP!\r
+INPERR:        PUSHJ   P,INLMES\r
+       ASCIZ /INPUT DATA NOT IN CORRECT FORM--RETYPE LINE\r
+/\r
+       SETZM   PINPUT\r
+INPER1:        HRRZ    X1,INPFLA\r
+       JRST    (X1)            ;START LINE OVER.\r
+\f;RESTORE DATA POINTER\r
+\r
+RESTOR:        PUSHJ   P,RESTOS        ;RESTORE BOTH NUMBER AND STRINGS\r
+RESTON:        TDZA    X1,X1           ;RESTORE NUMERIC DATA\r
+RESTOS:        MOVEI   X1,1            ;RESTORE STRINGS\r
+       MOVE    T,DATAFF\r
+       ADD     T,FLLIN\r
+       SUB     T,[XWD 1,1]\r
+       MOVEM   T,DATLIN(X1)\r
+       SETZM   PREAD(X1)               ;CLEAR CURRENT LINE POINTER\r
+       POPJ    P,\r
+\r
+NXRE2: PUSHJ   P,INLMES        ;OUT OF DATA\r
+       ASCIZ /OUT OF DATA IN /\r
+       HRRZ    T,L\r
+       PUSHJ   P,PRTNUM\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /\r
+/\r
+       JRST    UXIT\r
+\r
+\f;RUNTIME MAT INPUT ROUTINE\r
+\r
+MATIN: PUSHJ   P,DOINPT        ;SET INPUT LOOP\r
+       HRRZ    X1,40           ;GET VECTOR 2-WD BLOCK ADDRESS\r
+       HRRZ    X2,(X1)         ;GET ADDRESS OF FIRST ELEMENT\r
+       MOVEM   X2,NUMRES       ;SAVE THIS VALUE FOR COUNTING ELEMENT LATER\r
+       HLRZ    X1,(X1)         ;GET MAXIMUM VECTOR SIZE\r
+       ADD     X1,X2           ;UPPER BOUND OF VECTOR\r
+       MOVEM   X1,ELETOP       ;SAVE FOR COMPARISION LATER\r
+       HRRM    X2,40           ;SET UP ELEMENT ADDRESS FOR DATA ROUTINES\r
+\r
+MATIN1:        MOVEI   X1,MATIN4       ;POINT "INPUT ERR" TO SPECIAL ROUTINE\r
+       HRL     X1,40           ;REMEMBER FIRST ELEMENT ON LINE\r
+       MOVEM   X1,INPFLA\r
+       PUSHJ   P,NXVINP        ;INPUT THE LINE\r
+\r
+MATIN5:        CAIA            ;THERE IS ANOTHER ELEMENT.\r
+       JRST    MATIN6  ;NULL LINE. NO MORE ELEMENTS.\r
+       HRRZ    X1,40           ;MAY WE ACCEPT ANOTHER ELEMENT?\r
+       CAML    X1,ELETOP\r
+       JRST    MATIN3          ;NO\r
+       AOS     40              ;POINT TO NEXT ELEMENT\r
+       PUSH    P,[EXP MATIN2]  ;YES. SETUP RETURN FROMDATA ROUTINE\r
+IFN FTSTR,<\r
+       CAML    X1,SVRBOT       ;NUMBER OR STRING VECTOR?\r
+       JRST    SDATAE          ;STRING\r
+>\r
+       JRST    DATAER          ;NUMBER\r
+\r
+MATIN2:        SETOM   IFIFG\r
+       TLNE    C,F.COMA        ;END OF INPUT?\r
+       JRST    MATIN5\r
+       TLNE    C,F.TERM\r
+       JRST    MATIN6\r
+       CAIN    C,"&"\r
+       JRST    MATIN1\r
+       JRST    INPERR\r
+MATIN3:        PUSHJ   P,INLMES\r
+       ASCIZ /TOO MANY ELEMENTS -- RETYPE LINE\r
+/\r
+       JRST    INPER1\r
+\r
+MATIN4:        HLRZ    X1,INPFLA\r
+       HRRM    X1,40\r
+       JRST    MATIN1\r
+\r
+MATIN6:        HRRZ    X1,40\r
+       SUB     X1,NUMRES\r
+       TLO     X1,233400\r
+       FSB     X1,FIXCON\r
+       MOVEM   X1,NUMRES\r
+       POPJ    P,\r
+\r
+IFN FTSTR,<\r
+REDSTR:        TLNN    C,F.LETT+F.QUOT\r
+       POPJ    P,\r
+       AOS     (P)             ;THIS IS A LEGITIMATE STRING\r
+       PUSH    P,G\r
+       PUSH    P,E\r
+       PUSHJ   P,GETSTR\r
+       PUSHJ   P,VCHCKC\r
+       MOVEI   Q,F.COMA+F.TERM ;ASSUME A STRING WITHOUT QUOTES\r
+       TLNN    C,F.QUOT        ;IS IT A QUOT STRING?\r
+       JRST    REDS1\r
+       MOVEI   Q,F.QUOT\r
+       PUSHJ   P,NXCHS         ;SKIP QUOTE\r
+REDS1: SETZI   X2,             ;INITIALIZE COUNT.\r
+       SKIPE   (F)             ;NEW STRING?\r
+       SETZM   VPAKFL          ;NO, GARBAGE NEW EXISTS\r
+       HRR     F,VARFRE\r
+       HRRM    F,@N\r
+REDS2: TLNE    C,(Q)\r
+       JRST    REDS3\r
+       IDPB    C,F             ;STORE A CHAR\r
+       PUSHJ   P,NXCHS\r
+       SOJA    X2,REDS2\r
+REDS3: TLNE    C,F.QUOT\r
+       PUSHJ   P,NXCH\r
+       HRRZ    X1,F            ;GET NEW FREE LOCATION\r
+       POP     P,E\r
+       POP     P,G\r
+       JRST    REDS8\r
+\r
+SSKIP: SKIPE   INPFLA          ;IS THIS INPUT OR READ?\r
+       JRST    SSKP1           ;INPUT. CANT SKIP ANY FIELDS\r
+       PUSHJ   P,SKIPDA        ;SKIP OVER A DATA FIELD\r
+       HALT    .               ;IMPOSSIBLE ERROR\r
+       POP     P,X1\r
+       TLNE    C,F.TERM        ;END OF DATA LINE?\r
+       JRST    -4(X1)          ;YES. FORCE DATA SEARCH\r
+       JRST    -3(X1)          ;RETURN TO DATAERR OR SDATAE\r
+\r
+SSKP1: ADD     P,[XWD -2,-2]   ;CLEAN UP PUSH LIST\r
+       JRST    INPERR\r
+\r
+;ROUTINE THAT SKIPS OVER ONE DATA FIELD\r
+SKIPDA:        TLNE    C,F.QUOT        ;QUOTE STRING?\r
+       JRST    QSKIP           ;YES, USE QSKIP ROUTINE\r
+       TLNE    C,F.COMA+F.TERM ;FIELD TERMINATOR?\r
+       JRST    ,CPOPJ1\r
+       PUSHJ   P,NXCH\r
+       JRST    .-3\r
+>;ASSEMBLE ABOVE IF INCLUDING STRING FACILITY\r
+\r
+IFE FTSTR,<\r
+SKIPDA: POPJ   P,      ;STRINGS NOT ALLOWED. DATA ERROR\r
+SSKIP: ADD     P,[XWD -2,-2]   ;CLEAN UP PUSHLIST\r
+       JRST    INPERR\r
+>\r
+\r
+PRDLER:        PUSHJ   P,FIRCHK\r
+       SETZM   N,STRFCN\r
+       MOVEI   D,42\r
+       MOVE    T,@(P)\r
+       AOS     N,(P)\r
+       PUSHJ   P,PRINT1\r
+FINPNT:        MOVE    X1,FMTPNT       ;FINISH WITH CR?\r
+       CAIE    X1,1\r
+       JRST    N,PCRLF1\r
+PCRLF: PUSHJ   P,INLMES        ;ROUTINE TO END A LINE.\r
+       ASCIZ /\r
+/\r
+       SETZM   N,STRFCN\r
+       SETZM   TABVAL\r
+PCRLF1:        OUTPUT\r
+       POPJ    P,\r
+\f\r
+;RUN-TIME NUMBER PRINTER\r
+\r
+PRNMER:        PUSHJ   P,TABBR\r
+       MOVE    N,@40           ;GET THE NUMBER\r
+       PUSHJ   P,OUTNUM\r
+       AOS     TABVAL          ;CAUSE A SPACE TO FOLLOW NUMBER.\r
+       JRST    FINPNT\r
+\r
+PRNTBR:        PUSHJ   P,TABBR\r
+       SKIPGE  B,TABVAL\r
+       JUMPLE  N,FINPNT\r
+       FAD     N,FIXCON\r
+       TLZ     N,377400\r
+       SUB     N,HPOS\r
+       SUB     N,4\r
+       JUMPLE  N,FINPNT\r
+       ADDM    N,TABVAL\r
+       JRST    N,FINPNT\r
+FIRCHK:        PUSHJ   P,TABBR\r
+       MOVEI   X1,0\r
+\f;TAB CONTROL\r
+\r
+;"TABBR" ANALYSES THE LAST FORMAT CHARACTER USING "TABB0", "TABB1", AND\r
+;"TABB3", WHICH HANDLE THE <PA>, COMMA, AND SEMICOLON, RESPECTIVELY.\r
+;"TABVAL" CONAINS THE NUMBER OF SPACES WAITING TO BE TYPED OUT\r
+;(OR IS NEGATIVE IF A <RETURN> MUST FOLLOW.)\r
+\r
+\r
+CHROOM:        MOVE    B,TABVAL\r
+       ADD     X1,B            ;TOTAL SPACE NEEDED FOR FIELD\r
+       ADD     X1,HPOS\r
+       CAIL    X1,113\r
+       JRST    PCRLF           ;NO ROOM, GO TO NEXT LINE\r
+       JUMPL   B,PCRLF\r
+       JUMPE   B,CPOPJ         ;NO SPACING TO DO.\r
+       MOVEI   C," "           ;HERE TO PUT OUT SPACES\r
+       PUSHJ   P,OUCH\r
+       SOJG    B,.-2\r
+       SETZM   TABVAL\r
+       POPJ    P,\r
+\r
+TABBR: LDB     X1,[POINT 4,40,12]\r
+       EXCH    X1,FMTPNT       ;GET OLD POSITION AND SAVE NEW FORMAT\r
+TABB1: MOVE    A,TABVAL\r
+       JUMPL   A,SETCR\r
+       ADD     A,HPOS\r
+       JRST    .+1(X1)\r
+       POPJ    P,              ;NO FMT CHAR\r
+       POPJ    P,              ;<CR> WAS TYPED WHEN FIRST SEEN.\r
+       JRST    TABB3           ;SEMICOLON\r
+       CAILE   A,74\r
+       JRST    SETCR\r
+       IDIVI   A,^D15\r
+       JUMPE   B,TABB2\r
+       SUBI    B,^D15\r
+       MOVNS   B\r
+TABB2: ADDB    B,TABVAL\r
+       POPJ    P,\r
+\r
+TABB3: CAILE   A,112\r
+       JRST    N,SETCR\r
+       AOSGE   N,STRFCN\r
+       AOS     N,TABVAL\r
+       POPJ    P,\r
+\r
+SETCR: SETOM   TABVAL          ;FORCE <RETURN TO BE NEXT>\r
+       POPJ    P,\r
+TABOUT:        MOVEI   X1,3\r
+       PUSHJ   P,TABB1\r
+       JRST    FIRCHK+1\r
+\fIFN FTSTR,<\r
+       SUBTTL  RUN-TIME STRING MANIPULATION ROUTINES.\r
+\r
+\r
+;GETSTR IS CALLED WITH THE ADDRESS OF A POINTER IN REG.\r
+;THE ROUTINE SETS UP THE POINTER IN F, AND THE NEGATIVE COUNT OR\r
+;(FOR LITERAL STRINGS) A POSITIVE QUANTITY IN G. (G=0 IF NULL STRING)\r
+\r
+GETSTR:        PUSHJ   P,PNTADR        ;GET ADDRESS OF STRING POINTER\r
+       MOVE    F,@N\r
+       HLRE    G,F             ;PUT NEGATIVE CHAR LENGTH IN G, IF NOT APP BLK OR 0.\r
+       JUMPG   G,CPOPJ\r
+       HRLI    F,440700        ;NOTAPP BLK, INITIALIZE POINTER.\r
+       POPJ    P,\r
+\r
+;ROUTINE TO SET UP A NUMBER VECTOR INSTEAD OF A STRING\r
+GETVEC:        HRRZ    F,@40           ;THE LEFT SIDE OF (F) IS ZERO, IMPLYING VECTOR ADR,\r
+       MOVE    G,(F)           ;GET VECTOR LENGTH\r
+       JUMPL   G,GETVF         ;NEGATIVE?\r
+       FAD     G,FIXCON        ;FIX THE LENGTH\r
+       TLZ     G,777400\r
+       HLRZ    X1,@40          ;DOES THE LENGTH EXCEED VECTOR BOUNDS?\r
+       MOVNS   G\r
+       ADD     X1,G\r
+       JUMPLE  X1,GETVF\r
+       AOJA    F,CPOPJ         ;NO. POINT TO FIRST "CHAR" AND RETURN\r
+\r
+GETVF: PUSHJ   P,INLMES\r
+       ASCIZ /IMPOSSIBLE VECTOR LENGTH IN /\r
+       JRST    GOSR2\r
+\r
+GETC0: SETZI   G,\r
+GETCH: SETZI   C,\r
+       JUMPE   G,CPOPJ\r
+       ILDB    C,F\r
+       JUMPG   G,.+2\r
+       AOJA    G,CPOPJ1\r
+       CAIN    C,42            ;CHECK IF "\r
+       JRST    GETC0\r
+       JRST    CPOPJ1\r
+\r
+;ROUTINE TO GET NEXT VECTOR ELE AS A CHARACTER\r
+GETEL: AOJG    G,CPOPJ         ;IS THERE ANOTHER ELEMENT?\r
+       MOVE    C,(F)           ;YES. GET IT\r
+       JUMPL   C,GETELF                ;TOO SMALL TO BE AN ASCII\r
+       LDB     Q,[POINT 8,C,8]         ;GET EXPONENT\r
+       TLZ     C,777000                ;TURN IT OFF\r
+       LSH     C,-233(Q)               ;SHIFT INTO INTEGER POSISITON\r
+       TRNN    C,777600\r
+       AOJA    F,CPOPJ1                ;BUMP ELEMENT POINTER AND RETURN\r
+\r
+GETELF:        PUSHJ   P,INLMES\r
+       ASCIZ /NON-ASCII CHAR SEEN IN /\r
+       JRST    GOSR2\r
+\r
+;ROUTINE TO STORE "NUMERIC" CHARS INTO A STR.\r
+STRCHA:        PUSHJ   P,PNTADR\r
+       PUSHJ   P,VCHCKC\r
+       SKIPE   N,@N\r
+       SETZM   N,VPAKFL\r
+       MOVE    X1,VARFRE\r
+       MOVEM   X1,@N\r
+       HRLI    X1,440700\r
+       SETZI   X2,\r
+STRCH1:        PUSH    P,[XWD STRCH2]\r
+       TLNN    F,777777\r
+       JRST    GETEL\r
+       JRST    GETCH\r
+STRCH2:        JRST    REDS8\r
+       HRRM    X1,VARFRE\r
+       IDPB    C,X1\r
+       SOJA    X2,STRCH1\r
+\r
+REDS8: HRLM    X2,@N\r
+       AOJ     X1,\r
+       HRRM    X1,VARFRE\r
+       POPJ    P,\r
+\r
+PUTVEC:        HRRZ    X1,@40\r
+       MOVE    N,X1\r
+       HLRZ    X2,@40\r
+PUTV1: PUSHJ   P,GETCH\r
+       JRST    PUTV2\r
+       SOJL    X2,PUTVF\r
+       TLO     C,233400        ;YES. FLOAT IT\r
+       FSB     C,FIXCON\r
+       MOVEM   C,1(X1)\r
+       AOBJP   X1,PUTV1        ;COUNT CHARS IN LEFT HALF OF X1\r
+\r
+PUTV2: HLRZ    X1,X1           ;GET SIZE\r
+       HRLI    X1,233400       ;FLOAT IT\r
+       FSB     X1,FIXCON\r
+       MOVEM   X1,@N           ;FIRST ELEMENT GETS SIZE\r
+       POPJ    P,\r
+\r
+PUTVF: PUSHJ P,INLMES\r
+       ASCIZ /NO ROOM FOR STRING IN /\r
+       JRST    N,GOSR2\r
+\r
+; COMPARE TWO STRINGS.\r
+IFSTR: PUSH    P,F\r
+       PUSH    P,G\r
+       PUSHJ   P,GETSTR\r
+       POP     P,T1\r
+       POP     P,T\r
+IFST1: PUSHJ   P,GETPCH        ;GET PAIR OF CHARS IN (A) AND (C)\r
+       JUMPG   Q,IFST3         ;HAVE BOTH STRINGS ENDED?\r
+       JUMPE   Q,IFST2         ;HAS ONE STRING ENDED?\r
+       CAMN    C,A             ;ARE THESE TWO CHARS THE SAME?\r
+       JRST    IFST1           ;YES. LOOK AT NEXT PAIR\r
+\r
+IFST2: SETOI   Q,              ;CHECK BOTH STRINGS FOR TRAILING BLANKS\r
+       CAIN    C," "           ;IS THIS CHAR A BLANK?\r
+       PUSHJ   P,IFST4         ;YES, GO CHECK STRING\r
+       PUSHJ   P,EXCH6         ;LOOK AT OTHER STRING\r
+       AOJLE   Q,.-3\r
+\r
+IFST3: HLLZ    X1,@(P) ;GET RELATION\r
+       AOS     (P)\r
+       IOR     X1,[Z A,C]      ;SETUP COMPARE\r
+       XCT     X1\r
+       POPJ    P,              ;RETURN AND "GOTO"\r
+       JRST    CPOPJ1          ;RETURN AND STAY IN LINE\r
+\r
+IFST4: PUSHJ   P,GETCH\r
+       POPJ    P,\r
+       CAIN    C," "           ;IS NEXT CHAR A BLANK?\r
+       JRST    N,IFST4         ;YES KEEP LOOKING\r
+       MOVEI   C," "           ;NO. USE BLANK FOR COMPARE\r
+       POPJ    P,\r
+\r
+;ROUTINE TO GET A PAIR OF CHARS\r
+GETPCH:        SETOI   Q,              ;COUNT TERMINATED STRINGS IN X2\r
+       PUSHJ   P,GETCH\r
+       AOJ     Q,\r
+       PUSHJ   P,EXCH6\r
+       PUSHJ   P,GETCH\r
+       AOJ     Q,\r
+EXCH6: EXCH    T,F\r
+       EXCH    T1,G\r
+       EXCH    A,C\r
+       POPJ    P,\r
+\r
+\f;PRSTRR PRINTS A STRING WHOSE POINTER IS ADDRESSED IN (40)\r
+\r
+PRSTRR:        PUSH    P,G\r
+       PUSHJ   P,PNTADR\r
+       PUSHJ   P,GETSTR\r
+       PUSHJ   P,FIRCHK\r
+       SETZM   N,STRFCN\r
+PRST1: PUSHJ   P,GETCH\r
+       JRST    PRST2\r
+       PUSHJ   P,OUCH\r
+       JRST    PRST1\r
+PRST2: POP     P,G\r
+       JRST    FINPNT\r
+VCHCK9:        MOVN    X1,G\r
+       ADDI    X1,4\r
+       IDIVI   X1,5\r
+       MOVE    E,X1\r
+       POPJ    P,\r
+>;ASSEMBLE ABOVE FOR STRINGS\r
+\r
+IFN FTSTR,<\r
+;ROUTINE TO PUT ADDRESS OF POINTER IN REG\r
+PNTADR:        HRRZ    N,40            ;GET UUO ADDRESS\r
+       MOVE    X1,@N\r
+       JUMPGE  X1,CPOPJ        ;ALL DONE IF THIS IS 0 OR AN APP BLK.\r
+       TLNN    X1,377777       ;ALL DONE IF THIS IS NEGATIVE COUNT\r
+       HRRZ    N,X1\r
+       POPJ    P,\r
+>;ASSEMBLE ABOVE IF INCLUDING STRING FACILITY\r
+\r
+SAD1ER:        MOVE    D,[JRST SADEND] ;FETCH ADR OF ARRAY ELEMENT\r
+       JRST    AFT1ER+1\r
+\r
+ASN1ER:        MOVE    D,[MOVNM N,(A)] ;NEGATIVE ARRAY STORE\r
+       JRST    AFT1ER+1\r
+AST1ER:        SKIPA   D,[MOVEM N,(A)] ;POSITIVE ARRAY STORE\r
+AFT1ER:        MOVSI   D,A(MOVE N,)    ;ARRAY FETCH\r
+       MOVEI   A,0             ;PSEUDO LEFT HALF\r
+       MOVE    B,40            ;ARRAY ADDRESS\r
+       HRRZ    C,1(B)          ;TRY RIGHT DIMENSION\r
+       TRNN    C,777776        ;ROW VECTOR?\r
+       HLRZ    C,1(B)          ;NO, MUST BE COLUMN VECTOR\r
+       JRST    AFT2C           ;FINISH UP WITH 2-DIM CODE\r
+\r
+ASN2ER:        MOVE    D,[MOVNM N,(A)] ;NEGATIVE ARRAY STORE\r
+       JRST    N,.+3\r
+AST2ER:        SKIPA   D,[MOVEM N,(A)] ;POSITIVE ARRAY STORE\r
+AFT2ER:        MOVSI   D,A(MOVE N,)    ;ARRAY FETCH\r
+       MOVE    B,40            ;ARRAY ADDRESS\r
+       HLRZ    C,1(B)          ;LEFT DIMENSION\r
+       PUSHJ   P,SUBSCR        ;GET AND FIX SUBSCRIPT IN E\r
+       HRRZ    A,1(B)\r
+       IMUL    A,E             ;LEFT SCRIPT TIMES RIGHT DIM!\r
+       HRRZ    C,1(B)          ;RIGHT DIMENSION\r
+AFT2C: PUSHJ   P,SUBSCR        ;GET AND FIX SUBSCRIPT IN E\r
+       ADD     A,E             ;ADD TO LEFT DIM\r
+       ADD     A,(B)           ;ADD ARRAY ADDRS\r
+       XCT     D               ;DO THE OPERATION\r
+       POPJ    P,              ;RETURN\r
+\r
+IFN    FTSTR,  <\r
+SADEND:        HRRZI   N,(A)           ;PUT STRING VECTOR POINTER ADDRESS IN N\r
+       TLO     N,(1B0)         ;MAKE IT LOOK LIKE AN ADDRESS, NOT A POINTER\r
+       POPJ    P,\r
+>\r
+\f;ROUTINE TO FETCH AND CHECK SUBSCRIPT\r
+\r
+;CALL: MOVE    C,DIMENSION\r
+;      PUSHJ   P,SUBSCR\r
+\r
+\r
+SUBSCR:        MOVE    E,@-1(P)                ;GET SUBSCRIPT\r
+       AOS     N,-1(P)         ;SKIP ARGUMENT\r
+       MOVE    E,(E)\r
+       FAD     E,[XWD 233400,0];FIX SUBSCRIPT\r
+       TLZ     E,777400\r
+       CAMGE   E,C             ;CHECK DIMENSION\r
+       POPJ    P,\r
+                               ;ON ERROR, FALL INTO DIMERR\r
+\r
+\r
+;DIMENSION ERR ROUTINE\r
+\r
+\r
+\r
+DIMERR:        PUSHJ   P,INLMES\r
+       ASCIZ /DIMENSION ERROR IN /\r
+       JRST    GOSR2\r
+\f      SUBTTL  MATRIX OPERATION RUN-TIME ROUTINES\r
+\r
+IFN FTMAT, <\r
+;SET MATRIX DIMENSION -- SDIM UUO\r
+\r
+\r
+SDIMER:        MOVSI   C,1             ;DONT FAIL IN SUBSCR\r
+       PUSHJ   P,SUBSCR        ;FIRST DIM\r
+       HRLZ    A,E             ;SAVE IT\r
+       PUSHJ   P,SUBSCR        ;SECOND DIM\r
+       HRR     A,E\r
+       AOBJP   A,MS0CHK                ;GO CHECK DIMS AND STORE THEM\r
+>\r
+\fIFN FTMAT, <\r
+;MATRIX OPERATION SETUP ROUTINE\r
+;USE ENTRY POINT MS2 IF 2 ARGS, MS1 IF 1 ARG, MS0 OR MS0CHK IF 0 ARGS.\r
+;ALL ENTRIES EXPECT MS0 EXCEPT DIMENSION [XWD ROWS,COLS]\r
+;  OF DESTINATION TO BE SET UP IN A AND CHECK FOR ROOM\r
+;  AND SET DIMENSION OF DESTINATION.\r
+;AT CALL, LOCATION 40 CONTAINS THE ADDRS OF DESTINATION DOPE VECTOR,\r
+;  RIGHT SIDE OF T1 CONTAINS ADDRS OF DOPE VECTOR FOR ARG 1\r
+;  RIGHT SIDE OF T CONTAINS ADDRS OF DOPE VECTOR FOR ARG 2\r
+;RIGHT SIDES OF T1,T,B ARE REPLACED WITH ADDRESSES OF ELEMENTS 0,0\r
+;  OF ARG 1, ARG 2, DEST, RESPECTIVELY, WITHOUT CHANGING LEFT SIDES,\r
+;  AND THE RESULTS ARE STORED IN TEMP1, TEMP2, AND TEMP3, RESPECTIVELY.\r
+;THE MAXIMUM ROW NUMBER OF DEST IS STORED IN SB1M1, THE MAXIMUM\r
+;  COLUMN NUMBER OF DEST IS STORED IN SB2M1\r
+;E, T1, AND G ARE SET TO FIRST ROW NUMBER, FIRST COL NUMBER,\r
+;  AND RELATIVE LOCATION OF FIRST ELEMENT, RESPECTIVELY\r
+;IT IS INTENDED THAT E, T1, G, TEMP1, TEMP2, TEMP3 BE SET UP FOR\r
+;  IMMEDIATE CALL TO MLP, AND THAT ELEMENTS OF FIRST\r
+;  ARGUMENT, SECOND ARGUMENT, AND DESTINATION BE ACCESSED\r
+;  BY INDIRECT ADDRESSING THROUGH TEMP1, TEMP2, AND TEMP3, RESPECTIVELY.\r
+\r
+\r
+MS2:   HRR     T,(T)           ;ADDRS OF FIRST ARG\r
+MS1:   HRR     T1,(T1)         ;ADDRS OF SECOND OR ONLY ARG\r
+MS0CHK:        HRR     B,40            ;DOPE VECTOR OF DEST\r
+       HLLZ    X1,A            ;CHECK NEW DIMENSION\r
+       IMULI   X1,(A)          ;X1 := (TOTAL SIZE)0\r
+       CAMLE   X1,0(B)         ;IS THERE ROOM IN ARRAY?\r
+       JRST    DIMERR          ;NO.  DIMENSION ERROR\r
+       MOVEM   A,1(B)          ;STORE NEW DIMENSION\r
+\r
+MS0:   HRR     B,40            ;ENTER HERE FOR NO DIM CHECK\r
+       MOVE    A,1(B)          ;FETCH DIMENSIONS\r
+       SUB     A,[XWD 1,1]     ;E := (MAX ROW)MAX COL\r
+       HLRZM   A,SB1M1         ;FIRST DIMENSION -1\r
+       HRRZM   A,SB2M1         ;SECOND DIMENSION -1\r
+\r
+       HRR     B,(B)           ;ADDRS OF DEST (LEAVE IN B FOR MINV)\r
+       MOVEM   T1,TEMP1        ;STORE FIRST XCT INSTRUCTION\r
+       MOVEM   T,TEMP2         ;STORE SECOND XCT INSTRUCTION\r
+       MOVEM   B,TEMP3         ;STORE THIRD XCT INSTRUCTION\r
+\r
+;NOW SETUP E, T1, AND G FOR "MLP"\r
+\r
+       SKIPE   E,SB1M1         ;MORE THEN 0'TH ROW?\r
+       MOVEI   E,1             ;YES.  USE FIRST\r
+       SKIPE   T1,SB2M1                ;MORE THAN 0'TH COL\r
+       MOVEI   T1,1            ;YES.  USE FIRST\r
+       MOVE    G,SB2M1         ;CALCUATE FIRST ELT OF RESLT\r
+       ADDI    G,1\r
+       IMULI   G,(E)\r
+       ADDI    G,(T1)\r
+       POPJ    P,\r
+>\r
+\fIFN FTMAT, <\r
+;MATRIX OPERATION MAIN LOOP\r
+\r
+;ON CALLING, T, T1, G ARE SET UP TO ROW NUMBER, COL NUMBER, AND\r
+;  REL LOC OF CURRENT ELEMENT IN DESTINATION MATRIX.\r
+;MLP EXECUTES THE CONTENT OF TEMP1, TEMP2, TEMP3 FOR EACH\r
+;  ELEMENT OF CURRENT ROE.  AT END OF ROW, MLP RETURNS\r
+;  WITHOUT SKIP TO ALLOW ONCE-PER-ROW OPERATIONS TO BE PERFORMED.\r
+;  WHEN ALL ROWS HAVE BEEN PROCESSED, MLP RETURNS WITH SKIP.\r
+;NOTE SPECIAL CODING SO THAT ROW AND COLUMN VECTORS ARE\r
+;  HANDLED CORRECTLY.\r
+\r
+MLP:   XCT     TEMP1\r
+       XCT     TEMP2\r
+       XCT     TEMP3\r
+\r
+       ADDI    G,1\r
+       CAMGE   T1,SB2M1\r
+       AOJA    T1,MLP\r
+       SKIPE   SB2M1           ;MORE THAN A 0'TH COL?\r
+       AOJA    G,.+2           ;YES.  SKIP 0'TH COL\r
+       TDZA    T1,T1           ;NO. SET TO USE 0'TH COL\r
+       MOVEI   T1,1            ;YES AGAIN.  SET TO USE COL 1.\r
+\r
+       CAML    E,SB1M1         ;ALL ROWS USED?\r
+       AOS     (P)             ;YES.  SET FOR SKIP RETURN\r
+       AOJA    E,CPOPJ         ;BUMP ROW AND RETURN\r
+>\r
+\fIFN FTMAT,<\r
+;MATRIX READ ROUTINE\r
+\r
+;SET UP AND CALL MLP. FOR EACH ELEMENT, THE FOLLOWING\r
+;ARE PERFORMED:\r
+;      TEMP1:  PUSHJ   P,MTRELT\r
+;      TEMP2:  ...     ;(SKIPPED)\r
+;      TEMP3:  MOVEM   N,<DEST>(G)\r
+;MTRELT READS A NUMBER INTO N\r
+\r
+MTRDER:        MOVE    T1,[PUSHJ P,MTRELT]\r
+       PUSHJ   P,DOREAD\r
+       HRRZ    X1,@40          ;GET ADDRESS OF ZEROTH ELEMENT.\r
+       CAML    X1,SVRBOT       ;IS THIS A STRING VECTOR?\r
+       JRST    MTRDS           ;ELEMENTS WILL BE STRINGS.\r
+       HRLI    B,G(MOVEM N,)\r
+MTRD1: PUSHJ   P,MS0           ;SET UP FOR LOOP\r
+       SETZM   40              ;NOP THE STORE THAT DATAER USES\r
+MTRD2: PUSHJ   P,MLP           ;EXECUTE LOOP\r
+       JRST    .-1             ;NO ACTION ON ROW\r
+       POPJ    P,\r
+\r
+;ROUTINE CALLED BY MTRDER TO PRINT AN ELEMENT\r
+\r
+MTRELT:        PUSHJ   P,DATAER\r
+       JRST    CPOPJ1\r
+\r
+MTRDS: MOVSI   T1,(SKIPA)\r
+       MOVSI   B,G(STOCHA)\r
+       JRST    MTRD1\r
+\r
+;MATRIX PRINT ROUTINE\r
+\r
+;SET UP AND CALL MLP:\r
+;      TEMP1:  PUSH    P,T\r
+;      TEMP2:  PRNM    <FORMAT CODE>,<DEST>(G)\r
+;      TEMP3:  POP     P,T\r
+MTPRER:        MOVE    T1,[PUSH P,T1]  ;TO SAVE T1 AROUND PRNM\r
+       PUSHJ   P,MS0           ;SET UP FOR LOOP\r
+       HLL     B,40            ;PICK UP UUO AC FIELD\r
+       TLZ     B,777000        ;CONSTRUCT PRNM INSTR\r
+       SKIPE   SB1M1           ;COLUMN VECTOR?\r
+       SKIPN   SB2M1\r
+       JRST    .+3             ;YES. ALLOW <CR> FORMAT\r
+       TLNN    B,(Z 16,)       ;OH, NO.  TREAT <RET> FORMAT ==<COMA> FORMAT.\r
+       HRLI    B,(Z 3,)\r
+       HRRZ    X1,@40\r
+       CAMGE   X1,SVRBOT       ;NUMBER ARRAY?\r
+       TLO     B,G(PRNM)       ;YES, SETUP NUMBER UUO\r
+       CAML    X1,SVRBOT       ;STRING ARRAY?\r
+       TLO     B,G(PRSTR)      ;YSE SEUP STRING PRINT UUO.$\r
+       MOVEM   B,TEMP2         ;SET UP TEMP2 AND TEMP3\r
+       MOVE    X1,[POP P,T1]\r
+       MOVEM   X1,TEMP3\r
+MTP1D: PUSHJ   P,MTP3D         ;TOW BLANK LINES\r
+MTP2D: PUSHJ   P,MLP\r
+       JRST    MTP4D\r
+MTP3D: PUSHJ   P,PCRLF\r
+       PUSHJ   P,PCRLF\r
+       POPJ    P,\r
+MTP4D: SKIPE   SB1M1           ;VECTOR OR ARRAY?\r
+       SKIPN   SB2M1\r
+       JRST    MTP2D           ;ARRAY... SPACE BETW ROWS\r
+       JRST    MTP1D           ;VECTOR...DONT SPACE BETW ROWS\r
+>\r
+\fIFN FTMAT, <\r
+;MATRIX ADD AND SUBTRACT ROUTINES\r
+\r
+;SET UP AND CALL MLP:\r
+;      TEMP1:  MOVE    N,<ARG 2>(G)    ;OR MOVN\r
+;      TEMP2:  FADR    N,<ARG 1>(G)\r
+;      TEMP3:  MOVEM   N,<DEST>(G)\r
+MTADER:        TLOA    T1,G(MOVE N,)           ;MAKE ADD INSTR (T LOADED WITH MOVEI)\r
+MTSBER:        HRLI    T1,G(MOVN N,)           ;MAKE SUBTRACT INSTR\r
+       HRLI    T,G(FADR N,)            ;FETCH\r
+       HRLI    B,G(MOVEM N,)\r
+       MOVE    A,1(T)          ;GET AND CHECK DIMENSIONS OF ARGS\r
+       CAME    A,1(T1)\r
+       JRST    DIMERR\r
+       PUSHJ   P,MS2           ;SET UP MATRIX LOOP\r
+       JRST    MTRD2           ;FINISH -- NO EACH ROW RTN\r
+\r
+;MATRIX SCALE ROUTINE\r
+\r
+;SET UP AND CALL MLP:\r
+;      TEMP1:  MOVE    A,<ARG 1>(G)\r
+;      TEMP2:  FMPR    A,N\r
+;      TEMP3:  MOVEM   A,<DEST>(G)\r
+\r
+MTSCER:        HRLI    T1,G(MOVE A,)\r
+       MOVSI   T,(FMPR A,N)\r
+MTSC1: HRLI    B,G(MOVEM A,)\r
+       MOVE    A,1(T1)\r
+       PUSHJ   P,MS1\r
+       JRST    MTRD2\r
+>\r
+\fIFN FTMAT, <\r
+;MATRIX ZERO, IDENTITY, AND ONE ROUTINES\r
+\r
+;SET UP AND CALL MLP:\r
+;              ..IDEN..        ..ZERO..        ..ONE..\r
+;      TEMP1:  SETZM@TEMP3     SETZM @TEMP3    CAIA\r
+;      TEMP2:  CAMN T,T1       CAIA            ...\r
+;      TEMP3:  MOVEM A,<DEST>(G)......................\r
+\r
+\r
+MTIDER:        SKIPA   T,[CAMN E,T1]\r
+MTZRER:        MOVSI   T,(CAIA)\r
+       SKIPA   T1,[SETZM @TEMP3]\r
+MTCNER:        MOVSI   T1,(CAIA)\r
+       HRLI    B,G(MOVEM D,)\r
+       MOVSI   D,(DEC 1.0)     ;CONSTANT 1.0 TO STORE\r
+       JRST    N,MTRD1         ;GO FINISH WITH READ CODE\r
+\r
+\r
+;MATRIX TRANSPOSE ROUTINE\r
+\r
+;SET UP AND CALL MLP:\r
+;A CONTAINS RELATIVE LOC OF CURRENT ELE IN SOURCE\r
+;      TEMP1 : FETCH SOURCE ELEMENT\r
+;      TEMP2 : UPDATE SOURCE INDEX\r
+;      TEMP3 : STORE DESTINATION ELEMENT\r
+\r
+\r
+\r
+MTTNER:        MOVS    A,1(T1)         ;FETCH DESTINATION DIMENSION\r
+       HRLI    T1,200003\r
+       HLRZ    T,A             ;E := ADDI A,<NBR ROWS>\r
+       HRLI    T,(ADDI A,)\r
+       HRLI    B,G(MOVEM N,)\r
+       PUSHJ   P,MS1           ;SET UP CHK DIMENSION\r
+\r
+MTTN1: MOVE    A,SB1M1         ;A := <NBR ROWS>*COL + ROW\r
+       ADDI    A,1\r
+       IMUL    A,T1\r
+       ADD     A,E\r
+\r
+       PUSHJ   P,MLP           ;MOVE A ROW\r
+       JRST    MTTN1\r
+       POPJ    P,\r
+>\r
+\f\r
+IFN FTMAT, <\r
+;MATRIX MULTIPLY ROUTINE\r
+\r
+;SET UP AND CALL MLP\r
+;FOR EACH ELEMENT OF DESTINATION MATRIX, CALL SUBROUTINE\r
+;      MYELT TO FORM THE DOT PRODUCT OF THE APPROPRIATE ROW AND COLUMN\r
+\r
+\r
+MTMYER:        MOVE    A,1(T)          ;CHECK DIMENSIONS\r
+       HLRZ    D,1(T1)         ;D := INNER DIMENSION\r
+       CAIE    D,(A)           ;SAVE AS FIRST ARG?\r
+       JRST    DIMERR          ;NO\r
+       HRR     A,1(T1)\r
+\r
+       HRLI    T1,T1(MOVEI X2,)        ;TO COMPUTE ADDRESS OF 1ST ELT 2ND ARG\r
+       HRLI    T,(MOVEI X1,)   ;DITTO 1ST ARG\r
+       HRLI    B,G(MOVEM N,)   ;STORE INSTR\r
+       PUSHJ   P,MS2           ;SETUP NEW DIMENSIONS AND MLP ARGS\r
+       MOVEI   X1,1(A)         ;PREPARE TO SKIP ROW ZERO IF..\r
+       CAIE    D,1             ;INNER DIM=1?\r
+       ADDM    X1,TEMP1\r
+       MOVE    B,[PUSHJ P,MYELT]       ;CALL TO ELT COMPUTATION\r
+       EXCH    B,TEMP2\r
+\r
+       CAIE    D,1             ;INNER DIM 1?  (IE PROD OF VECTORS)\r
+       ADDI    B,1             ;NO.  SKIP 0'TH COL OF 1'ST ARG\r
+       JUMPE   E,MTMY2         ;DONT SKIP FIRST ROW IF ONLY 1\r
+\r
+MTMY1: ADDM    D,B             ;NEXT ROW OF FIRST ARG\r
+MTMY2: PUSHJ   P,MLP\r
+       JRST    MTMY1\r
+       POPJ    P,\r
+\r
+;SUBROUTINE TO COMPUTE ELEMENT OF PRODUCT\r
+;X1 CONTAINS ADDRS OF 1ST ELT OF 1ST ARG FOR DOT PRODUCT,\r
+;  AFTER FIRST XCT BELOW, X2 CONTAINS ADDRS OF SAME FOR 2ND ARG\r
+\r
+MYELT: XCT     B\r
+       MOVEI   N,0             ;TO ACCUMULATE DO PRODUCT\r
+       MOVEI   C,-1(D) ;NUMER OF ADDS= REAL INNER DIMENSION\r
+\r
+MYEL1: MOVE    Q,(X1)          ;PRODUCT OF 2 ELTS\r
+       FMPR    Q,(X2)\r
+       FADR    N,Q             ;ADD INTO DOT PRODUCT\r
+       ADDI    X2,1(A)         ;NEXT ROW OF 2ND ARG\r
+       SOJLE   C,CPOPJ         ;DONE?\r
+       AOJA    X1,MYEL1        ;NO.   TO NEXT ELT\r
+>\r
+\f      SUBTTL  RUN-TIME MATRIX INVERTER\r
+\r
+IFN FTMAT, <\r
+;SUBROUTINE TO CALL MATRIX INVERTER\r
+\r
+MTIVER:        MOVS    A,1(T1)         ;MAKE SURE SQUARE MATRIX\r
+       CAME    A,1(T1)\r
+       JRST    N,DIMERR\r
+\r
+       HRLI    T1,G(SKIPA A,)  ;MOVE DESTINATION\r
+       PUSHJ   P,MTSC1         ;(USE MTCNER CODE)\r
+       SKIPE   SB1M1   ;GO INVERT UNLESS ONLY ELT IS (0,0)\r
+       JRST    MINVB\r
+\r
+       SUBI    B,3\r
+       MOVEM   B,TEMP3         ;ONLY ELEMENT IS (0,0)\r
+       AOS     SB1M1           ;FOOL MINV INTO THINGING ITS (1,1)\r
+       JRST    MINVB\r
+\r
+;THIS PORTION OF THE MAT INVERSE PROG RUNS IN ACS 0-7\r
+\r
+JLOOP:\r
+       PHASE   0\r
+\r
+ZERO:  CAMN    JX,NT           ;SKIP SAME COL\r
+       JRST    JXIT\r
+       MOVE    TAC,@TEMP1      ;A(I,J)=A(I,J)+A(NT,J)*A(I,NT)\r
+       FMPR    TAC,(KX)        ;***\r
+MOD:   FADRM   TAC,0(JX)       ;ADDR MODIFIED BY OUTER LOOP\r
+JXIT:  CAMGE   JX,SB1M1        ;LOOP DONE?\r
+       AOJA    JX,ZERO\r
+       JRST    IXIT            ;YES RETURN\r
+\r
+       DEPHASE\r
+\r
+;SOME AC DEFS FOR MINV\r
+\r
+NT=10          ;OUTERMOST LOOP INDEX\r
+IX=11          ;I SUBSCRIPT\r
+JX=12          ;J SUBSCRIPT\r
+KX=13          ;SCRATCH INDEX REG\r
+LX=14          ;    "     "    "\r
+TAC=15\r
+TAC1=16                ;   "   (MUST BE SAVE & RESTORED)\r
+>\r
+\fIFN FTMAT, <\r
+;MAIN ROUTINE ENTERS HERE TO SET UP REGS\r
+;ROUTINE EXPECTS       1) ARRAY ADDR IN TEMP3\r
+;                      2) ORDER OF ARRAY IN SB1M1\r
+;ROUTINE USES  1) VECT1 & VECT2 AS SCRATCH\r
+;              2) SB2M1 AS CNT OF ELEMENTS / ROW\r
+\r
+MINVB: HRRZS   TEMP3           ;MAKE SURE ADDR ONLY\r
+       MOVE    TAC,SB1M1       ;GET ORDER\r
+       ADDI    TAC,1           ;ADD ONE FOR 0'TH ROW & COL\r
+       MOVEM   TAC,SB2M1       ;SAVE IN SB2\r
+       PUSH    P,TAC1\r
+       MOVSI   TAC,(1.0)       ;INIT DETERM.\r
+       MOVEM   TAC,DETER\r
+       HRLZI   TAC,JX          ;SET INDEX REG IN\r
+       HLLZM   TAC,TEMP1       ;TEMP1 FOR INDIRECT\r
+       MOVE    TAC,[XWD JLOOP,ZERO]\r
+       BLT     TAC,7           ;PUT JLOOP INTO ACS\r
+\r
+       MOVEI   NT,1            ;INITIALIZE OUTER LOOP\r
+MINVLP:        MOVE    TAC,NT\r
+       IMUL    TAC,SB2M1       ;CALC (NT,NT) SUBSCR\r
+       ADD     TAC,NT\r
+       ADD     TAC,TEMP3       ;***\r
+       MOVEM   TAC,TEMP2       ;SAVE IT FOR LATER\r
+       CAMN    NT,SB1M1        ;LAST ITER?\r
+       JRST    FOUND1          ;SAVE SEARCH STUFF\r
+       MOVM    TAC,(TAC)       ;GET A(NT,NT)\r
+       MOVE    IX,NT           ;INITIALIZE SEARCH\r
+\r
+LUPI:  MOVE    KX,SB2M1        ;CALC I INDEX\r
+       IMUL    KX,IX\r
+       ADD     KX,TEMP3        ;***\r
+       MOVE    JX,NT           ;INIT J INDEX\r
+LUPJ:  MOVE    LX,KX\r
+       ADD     LX,JX           ;FINISH INDEX FOR ELEMENT\r
+       MOVM    LX,(LX)         ;GET IT\r
+       CAMGE   LX,TAC          ;IS IT LARGER THAN PRESENT\r
+       JRST    LUPEND          ;NO\r
+       MOVE    TAC,LX          ;YES SAVE IT\r
+       MOVEM   IX,VECT1(NT)    ;AND INDEXES\r
+       MOVEM   JX,VECT2(NT)\r
+LUPEND:        CAMGE   JX,SB1M1        ;END OF J LOOP LOGIC\r
+       AOJA    JX,LUPJ\r
+       CAMGE   IX,SB1M1\r
+       AOJA    IX,LUPI\r
+>\r
+\fIFN FTMAT, <\r
+       PUSHJ   P,FSWAP\r
+FOUND1:        MOVE    TAC,@TEMP2      ;GET PIVOT ELEMENT\r
+       JUMPE   TAC,SING        ;TEST FOR SINGULARITY.\r
+       MOVEM   TAC,PIVOT       ;SAVE IT\r
+       FMPRM   TAC,DETER       ;PERPETUATE DETERM\r
+       MOVSI   TAC,(1.0)       ;1./A(NT,NT)\r
+       FDVRM   TAC,PIVOT       ;***\r
+\r
+       MOVEI   IX,1            ;SET UP I\r
+ILOOP: CAMN    IX,NT           ;SKIP SAME ROW\r
+       JRST    IXIT            ;AS PIVOT ROW\r
+       MOVE    LX,SB2M1        ;CALCUATE ALL ROW OFFSETS\r
+       IMUL    LX,IX\r
+       ADD     LX,TEMP3        ;LX= IX*N+A\r
+       MOVE    KX,LX\r
+       ADD     KX,NT           ;KX=LX+NT\r
+       MOVN    TAC,PIVOT       ;GET -PIVOT\r
+       FMPRM   TAC,(KX)        ;A(I,NT)=A(I,NT)/(-A(NT,NT))\r
+       MOVEI   JX,1            ;SET J LOOP START\r
+       MOVE    TAC,SB2M1\r
+       IMUL    TAC,NT\r
+       ADD     TAC,TEMP3       ;TAC=NT*N+A\r
+       HRRM    TAC,TEMP1       ;STORE FOR @TMEP1(JX)\r
+       HRR     MOD,LX  ;SAT ADDR IN INNER LOOP\r
+       JRST    ZERO            ;GO\r
+\r
+IXIT:  CAMGE   IX,SB1M1        ;RETURN HERE FROM ACS\r
+       AOJA    IX,ILOOP\r
+       MOVEI   JX,1            ;SET LOOP FOR LAST COL\r
+       MOVE    TAC,PIVOT       ;GET PIVOT\r
+LCOL:  FMPRM   TAC,@TEMP1      ;A(NT,J)=A(NT,J)/A(NT,NT)\r
+       CAMGE   JX,SB1M1        ;DONE\r
+       AOJA    JX,LCOL\r
+       MOVEM   TAC,@TEMP2      ;A(NT,NT)=PIVOT\r
+       CAMGE   NT,SB1M1        ;INVERSE DONE?\r
+       AOJA    NT,MINVLP\r
+>\r
+\fIFN FTMAT, <\r
+;HERE WHEN INVERSE DONE PUT MATRIX BACK TOGETHER\r
+\r
+       MOVE    NT,SB1M1        ;DO LOOP IN REVERSE ORDER\r
+INVFIX:        SOJLE   NT,OUT          ;FINISHED\r
+       PUSHJ   P,BSWAP         ;SWAP ROW - COL IN REV.\r
+       JRST    INVFIX\r
+BSWAP: MOVE    KX,VECT2(NT)\r
+       MOVE    LX,VECT1(NT)    ;SET REGS\r
+       JRST    SWAP\r
+FSWAP: MOVE    KX,VECT1(NT)\r
+       MOVE    LX,VECT2(NT)\r
+SWAP:  MOVE    TAC1,NT\r
+       IMUL    TAC1,SB2M1      ;CALC BOTH ROW OFFSETS\r
+       IMUL    KX,SB2M1\r
+       ADD     TAC1,TEMP3\r
+       ADD     KX,TEMP3        ;***\r
+       MOVEI   JX,1\r
+       HRLI    TAC1,JX\r
+       HRLI    KX,JX\r
+SWP1:  MOVE    TAC,@TAC1       ;EXCHANGE ITEMS IN ROWS\r
+       EXCH    TAC,@KX\r
+       MOVEM   TAC,@TAC1\r
+       CAMGE   JX,SB1M1\r
+       AOJA    JX,SWP1\r
+       MOVEI   IX,1\r
+       MOVE    TAC1,NT\r
+       MOVE    KX,SB2M1\r
+       ADD     KX,TEMP3        ;GET COL ADDR\r
+       HRLI    TAC1,KX\r
+       HRLI    LX,KX\r
+SWP2:  MOVE    TAC,@LX\r
+       EXCH    TAC,@TAC1\r
+       MOVEM   TAC,@LX\r
+       CAML    IX,SB1M1        ;CHECK DONE\r
+       POPJ    P,              ;RETURN\r
+       ADD     KX,SB2M1        ;TO NEXT COL\r
+       AOJA    IX,SWP2\r
+\r
+;HERE TO RETURN OR MAKE SINGULAR\r
+\r
+SING:  SETZB   ZERO,DETER\r
+OUT:   POP     P,TAC1\r
+DETB:  MOVE    ZERO,DETER\r
+       POPJ    P,\r
+\r
+ABSB:  MOVMS   N,N\r
+       POPJ    P,\r
+>\r
+\f      SUBTTL  INTRINSIC FUNCTIONS (ADAPTED FROM LIB4 V.005)\r
+\r
+;FLOATING POINT SINGLE PRECISION ARCTANGENT FUNCTION\r
+;ATAN(X) = X(B0+A1(Z+B1-A2(Z+B2-A3(Z+B3)**-1)**-1)**-1)\r
+;WHERE Z=X^2, IF 0<X<=1\r
+\r
+;IF X>1, THEN ATAN(X) = PI/2 - ATAN(1/X)\r
+;IF X>1, THEN RH(A) =-1, AND LH(A) = -SGN(X)\r
+;IF X<1, THEN RH(A) = 0, AND LH(A) =  SGN(X)\r
+\r
+ATANB:                         ;ENTRY TO ARCTANGENT ROUTINE\r
+       MOVM    T, N            ;GET ABSF OF ARGUMENT\r
+       CAMG    T, A1           ;IF A<2^33, THEN RETURN WITH...\r
+       POPJ    P,              ;ATAN(X)=X\r
+       HLLO    B, N            ;SAVE SIGN, SET PH(A) = -1\r
+       CAML    T, A2           ;IF A>2^33, THEN RETURN WITH\r
+       JRST    N, AT4          ;ATAN(X) = PI/2\r
+       MOVSI   T1, (1.0)       ;FORM 1.0 IN T1\r
+       CAMG    T, T1           ;IS ABSF(X)>1.0?\r
+       TRZA    B, -1           ;IF T .E. 1.0, THEN RH(A) = 0\r
+       FDVM    T1, T           ;B IS REPLACED BY 1.0/B\r
+       TLC     B, (B)          ;XOR SIGN WITH .G. 1.0 INDICATOR\r
+       MOVEM   T, C3           ;SAVE THE ARGUMENT\r
+       FMP     T, T            ;GET B^2\r
+       MOVE    T1, KB3         ;PICK UP N CONSTANT\r
+       FAD     T1, T           ;ADD B^2\r
+       MOVE    N, KA3          ;ADD IN NEXT CONSTANT\r
+       FDVM    N, T1           ;FORM -A3/(B^2 + B3)\r
+       FAD     T1, T           ;ADD B^2 TO PARTIAL SUM\r
+       FAD     T1, KB2         ;ADD B2 TO PARTIAL SUM\r
+       MOVE    N, KA2          ;PICK UP -A2\r
+       FDVM    N, T1           ;DIVIDE PARTIAL SUM BY -A2\r
+       FAD     T1, T           ;ADD B^2 TO PARTIAL SUM\r
+       FAD     T1, KB1         ;ADD  B1 TO PARTIAL SUM\r
+       MOVE    N, KA1          ;PICK UP A1\r
+       FDV     N, T1           ;DIVIDE PARTIAL SUM BY A1\r
+       FAD     N, KB0          ;ADD B0\r
+       FMP     N, C3           ;MULTIPLY BY ORIGINAL ARGUMENT\r
+       TRNE    B, -1           ;CHECK .G. 1.0 INDICATOR\r
+       FSB     N, PIOT         ;ATAN(N) = -(ATAN(1/A)-PI/2)\r
+       CAIA                    ;SKIP\r
+AT4:   MOVE    N, PIOT         ;GET PI/2 AS ANSWER\r
+NEGANS:        SKIPGE  B               ;LH(A)= -SGN(T) IF B>1.0\r
+       MOVNS   N               ;NEGATE ANSWER\r
+       POPJ    P,              ;EXIT\r
+\r
+A1:    145000000000            ;2**-33\r
+A2:    233000000000            ;2**33\r
+KB0:   176545543401            ;0.1746554388\r
+KB1:   203660615617            ;6.762139240\r
+KB2:   202650373270            ;3.316335425\r
+KB3:   201562663021            ;1.448631538\r
+KA1:   202732621643            ;3.709256262\r
+KA2:   574071125540            ;-7.106760045\r
+KA3:   600360700773            ;-0.2647686202\r
+PIOT:  201622077325            ;PI/2\r
+\f;FLOATING POINT TRUNCATION FUNCTION\r
+;TRUNCATES FRACTIONAL PART OF FLOATING POINT NUMBER\r
+;AND RETURNS ANSWER AS N FLOATING POINT NUMBER. THE\r
+;ALGORITHM MAKES USE OF THE NORMALIZING PROPERTIES OF FAD.\r
+;ROUTINE EXITS WITH (T)=ZERO IF NUMBER WAS AN INTEGER.\r
+\r
+INTB:\r
+       MOVE    B,N             ;SAVE ARGUMENT\r
+       MOVMS   N               ;GET ABSF(ARG)\r
+       SKIPGE  B               ;NEGATIVE?\r
+       FAD     N,ALMST1        ;YES. MAKE AINT[-2.3]=-3 ETC.\r
+       CAML    N,MOD1          ;IS ARGUMENT<=2**26?\r
+       JRST    NEGANS          ;YES; IT MUST BE AN INTERGER ALREADY\r
+       FAD     N,MOD1\r
+       FSB     N,MOD1          ;NOW FRACTIONAL PART HAS BEEN LOST.\r
+       JRST    NEGANS          ;CHECK SIGN AND EXIT.\r
+\r
+MOD1:  XWD 233400,000000       ; 2**26\r
+\r
+ALMST1:        XWD 200777,777777       ;1.0-<SMALLEST QUANTITY>\r
+\r
+\f;FLOATING POINT SINGLE PRECISION LOGARITHM FUNCTION\r
+;LOG(ABSF(X)) IS CALCULATED BY THE SUBROUTINE, AND AN\r
+;ARGUMENT OF ZERO IS RETURNED AS MINUS INFINITY. THE ALGORITHM IS\r
+\r
+;LOGE(X) = (I + LOG2(F))*LOGE(2)\r
+;WHERE X = (F/2)*2^(I+1), AND LOG2(F) IS GIVEN BY\r
+;LOG2(F) = C1*Z + C3*Z^3 + C5*Z^5 - 1/2\r
+;AND Z = (F-SQRT(2))/(F+SQRT(2))\r
+\r
+LOGB:\r
+       JUMPL   N, ALOGB1\r
+LOGB0: MOVMS   N, N            ;USE ABSOLUTE VALUE\r
+       JUMPE   N, LZERO                ;CHECK FOR ZERO ARGUMENT\r
+       CAMN    N, ONE          ;CHECK FOR 1.0 ARGUMENT\r
+       JRST    ZERANS          ;IT IS 1.0 RETURN ZERO ANS.\r
+       ASHC    N, -33          ;SEPARATE FRACTION FROM EXPONENT\r
+       ADDI    N, 211000       ;FLOAT THE EXPONENTY AND MULT. BY 2\r
+       MOVSM   N, C3           ;NUMBER NOW IN CORRECT FL. FORMAT\r
+       MOVSI   N, 567377       ;SET UP -401.0 IN N\r
+       FADM    N, C3           ;SUBTRACT 401 FORM EXP.*2\r
+       ASH     T, -10          ;SHIFT FRACTION FOR FLOATING\r
+       TLC     T, 200000       ;FLOAT THE FRACTION PART\r
+       FAD     T, L1           ;B = T-SQRT(2.0)/2.0\r
+       MOVE    N, T            ;PUT RESULTS IN N\r
+       FAD     N, L2           ;A = N+SQRT(2.0)\r
+       FDV     T, N            ;B = B/A\r
+       MOVEM   T, SX           ;STORE NEW VARIABLE IN LZ\r
+       FMP     T, T            ;MULTIPLY BY Z^2\r
+       MOVE    N, L3           ;PICK UP FIRST CONSTANT\r
+       FMP     N, T            ;MULTIPLY BY Z^2\r
+       FAD     N, L4           ;ADD IN NEXT CONSTANT\r
+       FMP     N, T            ;MULTIPLY BY Z^2\r
+       FAD     N, L5           ;ADD IN NEXT CONSTANT\r
+       FMP     N, SX           ;MULTIPLY BY Z\r
+       FAD     N, C3           ;ADD IN EXPONENT TO FORM LOG2(X)\r
+       FMP     N, L7           ;MULTIPLY TO FORM LOGE(X)\r
+       POPJ    P,              ;EXIT\r
+LZERO: PUSHJ   P,INLMES\r
+       ASCIZ /LOG OF ZERO IN /\r
+       PUSHJ   P,GOSR3\r
+       MOVE    N,MIFI\r
+       POPJ    P,\r
+ZERANS:        SETZI   N,              ;MAKE ARG ZERO\r
+       POPJ    P,\r
+\r
+;CONSTANTS FOR ALOGB\r
+\r
+\r
+ONE:   201400000000\r
+L1:    577225754146            ;-0.707106781187\r
+L2:    201552023632            ;1.414213562374\r
+L3:    200462532521            ;0.5989786496\r
+L4:    200754213604            ;0.9614706323\r
+L5:    202561251002            ;2.8853912903\r
+ALOGB1:        PUSH    P,N             ;SAVE ARGUMENT\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /LOG OF NEGATIVE NUMBER IN /\r
+       PUSHJ   P,GOSR3         ;PRINT LINE NUMBER\r
+       POP     P,N             ;GET ARGUMENT\r
+       JRST    LOGB0\r
+L7:    200542710300            ;0.69314718056\r
+MIFI:  XWD 400000,000001       ;GOAL POSTS. LARGEST NEGATIVE NUMBER.\r
+NUMB:  MOVE    N,NUMRES\r
+       POPJ    P,\r
+SGNB:\r
+       JUMPE   N,ZERANS        ;RETURN ZERO ANSWER\r
+       MOVE    B,N\r
+       MOVSI   N,(1.0)         ;RETURN 1.0\r
+       JRST    NEGANS          ;CHECK IF MINUS RESULT\r
+\r
+\f;FLOATING POINT SINGLE PRECISION SINE AND COSINE FUNCTION\r
+;THE ARGUMENT IS IN RADIANS.\r
+;ENTRY POINTS ARE SIN AND COS.\r
+;COS CALLS SIN TO CALCULATE SIN(PI/2 + X)\r
+\r
+;THE ROUTINE CALCULATES SINES AFTER REDUCING THE ARGUMENT TO\r
+;THE FIRST QUADRANT AND CHECKING THE OVERFLOW BITS TO DETERMINE\r
+;THE QUADRANT OF THE ORIGINAL ARGUMENT\r
+;000 - 1ST QUADRANT\r
+;001 - 2ND QUADRANT, X=-(X-PI)\r
+;010 - 3RD QUADRANT, X=-(X-PI)\r
+;011 - 4TH QUADRANT, X=X-3*PI/2-PI/2\r
+;THE ALGORITHM USES N MODIFIED TAYLOR SERIES TO CALCULATE\r
+;THE SINE OF THE NORMALIZED ARGUMENT.\r
+\r
+\r
+COSB:                          ;ENTRY TO COSINE RADIANS ROUTINE\r
+       FADR    N, PIOT         ;ADD PI/2\r
+                               ;FALL INTO SINE ROUTINE\r
+\r
+SINB:                          ;ENTRY TO SINE RADIANS ROUTINE\r
+       MOVE    T, N            ;PICK UP THE ARGUMENT IN T\r
+       MOVEM   T, SX           ;SAVE IT\r
+       MOVMS   T               ;GET ABSF OF ARGUMENT\r
+       CAMG    T, SP2          ;SINX = X IF X<2^-10\r
+       POPJ    P,              ;EXIT WITH ANS=ARG\r
+       FDV     T, PIOT         ;DIVIDE X BY PI/2\r
+       CAMG    T, ONE          ;IS X/(PI/2) < 1.0?\r
+       JRST    S2              ;YES, ARG IN 1ST QUADRANT ALREADY\r
+       MULI    T, 400          ;NO, SEPARATE FRACTION AND EXP.\r
+       ASH     T1, -202(T)     ;GET X MODULO 2PI\r
+       MOVEI   T, 200          ;PREPARE FLOATING FRACTION\r
+       ROT     T1, 3           ;SAVE 3 BITS TO DETERMINE QUADRANT\r
+       LSHC    T, 33           ;ARGUMENT NOW IN RANHGE (-1,1)\r
+       FAD     T, SP3          ;NORMALIZE THE ARGUMENT\r
+       JUMPE   T1, S2          ;REDUCED TO FIRST QUAD IF BITS 00\r
+       TLCE    T1, 1000                ;SUBTRACT 1.0 FROM ARG IF BITS ARE\r
+       FSB     T, ONE          ;01 OR 11\r
+       TLCE    T1, 3000                ;CHECK FOR FIRST QUADRANT, 01\r
+       TLNN    T1, 3000                ;CHECK FOR THIRD QUADRANT, 10\r
+       MOVNS   N, T            ;01,12\r
+\f\r
+S2:    SKIPGE  SX              ;CHECK SIGN OF ORIGINAL ARG\r
+       MOVNS   T               ;SIN(-X) = -SIN(X)\r
+       MOVEM   T, SX           ;STORE REDUCED ARGUMENT\r
+       FMPR    T, T            ;CALCULATE X^2\r
+       MOVE    N, SC9          ;GET FIRST CONSTANT\r
+       FMP     N, T            ;MULTIPLY BY X^2\r
+       FAD     N, SC7          ;ADD IN NEXT CONSTANT\r
+       FMP     N, T            ;MULTIPLY BY X^2\r
+       FAD     N, SC5          ;ADD IN NEXT CONSTANT\r
+       FMP     N, T            ;MULTIPLY BY X^2\r
+       FAD     N, SC3          ;ADD IN NEXT CONSTANT\r
+       FMP     N, T            ;MULTIPLY BY X^2\r
+       FAD     N, PIOT         ;ADD IN LAST CONSTANT\r
+       FMPR    N, SX           ;MULTIPLY BY X\r
+       POPJ    P,              ;EXIT\r
+\r
+\r
+SC3:   577265210372            ;-0.64596371106\r
+SC5:   175506321276            ;0.07968967928\r
+SC7:   606315546346            ;0.00467376557\r
+SC9:   164475536722            ;0.00015148419\r
+\r
+SP2:   170000000000            ;2**-10\r
+SP3:   0                       ;0\r
+CD1:   90.0\r
+SCD1:  206712273406\r
+\f;FLOATING POINT SINGLE PRECISION SQUARE ROOT FUNCTION\r
+;THE SQUARE ROOT OF THE ABSOLUTE VALUE OF THE ARGUMENT IS\r
+;CALCULATED. THE ARGUMENT IS WRITTEN IN THE FORM\r
+;      X=      F*(2**2B)       WHERE 0<F<1\r
+;SQRT(X) IS THEN CALCULATED AS (SQRT(X))*(2**B)\r
+;SQRT(F) IS CALCULATED BY N LINEAR APPROXIMATION, THE NATURE\r
+;OF WHICH DEPENDS ON WHETHER 1/4 < F < 1/2 OR 1/2 < F < 1,\r
+;FOLLOWED BY TWO ITERATIONS OF NEWTON'S METHOD.\r
+\r
+SQRTB: MOVE    T, N            ;PICK UP THE ARGUMENT IN T\r
+SQRTB0:        JUMPL   T, SQRMIN       ;SQRT OF NEGATIVE NUMBER?\r
+       JUMPE   T, ZERANS       ;CHECK FOR AGUMENT OF ZERO\r
+       ASHC    T, -33          ;PUT EXPONENT IN T, FRACTION IN T1\r
+       SUBI    T, 201          ;SUBTRACT 201 FROM EXPONENT\r
+       ROT     T, -1           ;CUT EXP IN HALF, SAVE ODD BIT\r
+       HRRM    T, EX1          ;SAVE FOR FUTURE SCALING OF ANS\r
+                               ;IN FSC N,. INSTRUCTION\r
+       LSH     T, -43          ;GET BIT SAVED BY PREVIOUS INST.\r
+       ASH     T1, -10         ;PUT FRACTION IN PROPER POSITION\r
+       FSC     T1, 177(T)      ;PUT EXPONENT OF FRACT TO -1 OR 0\r
+       MOVEM   T1, N           ;SAVE IT. 1/4 < F < 1\r
+       FMP     T1, SQCON1(T)   ;LINEAR FIRST APPROX,DEPENDS ON\r
+       FAD     T1, SQCON2(T)   ;WHETHER 1/4<F<1/2 OR 1/2<F<1.\r
+       MOVE    T, N            ;START NEWTONS METHOD WITH FRAC\r
+       FDV     T, T1           ;CACULATE X(0)/X(1)\r
+       FAD     T1, T           ;X(1) + X(0)/X(1)\r
+       FSC     T1, -1          ;1/2(X(1) + X(0)/X(1))\r
+       FDV     N, T1           ;X(0)/X(2)\r
+       FADR    N, T1           ;X(2) + X(0)/X(2)\r
+       XCT     EX1\r
+       POPJ    P,              ;EXIT\r
+\r
+SQCON1:        0.8125                  ;CONSTANT, USED IF 1/4<FRAC<1/2\r
+       0.578125                ;CONSTANT, USED IF 1/2<FRAC<1\r
+SQCON2:        0.302734                ;CONSTANT, USED IF 1/4<FRAC<1/2\r
+       0.421875                ;CONSTANT, USED IF 1/2<FRAC<1\r
+\r
+SQRMIN:        PUSH    P,T     ;SAVE ARG\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /SQRT OF NEGATIVE NUMBER IN /\r
+       PUSHJ   P,GOSR3         ;PRINT LINE NUMBER\r
+       POP     P,T             ;GET ARG\r
+       MOVMS   T\r
+       JRST    SQRTB0          ;USE ABSOLUTE VALUE\r
+\r
+\f;TAN - SINGLE PRECISION TANGENT ROUTINE.\r
+;\r
+;BASED ON ACM ALGORITHM 229, (COMM. ACM, 7, MAY 1964, J. MORELOCK).\r
+\r
+;METHOD:\r
+;\r
+;TAN(N*(PI/2)+A) = -(1/TAN(A)) IF N IS ODD,\r
+;TAN(N*(PI/2)+A) = TAN(A) IF N IS EVEN.\r
+;\r
+;/A/ IS <= 0.5*(PI/2).\r
+\r
+;ON ENTRY, THE ARG IS IN AC N.\r
+;ON EXIT, THE ANSWER IS IN AC N.\r
+\r
+;COTAN (X)=TAN(PI/2-X)\r
+\r
+COTB:  MOVNS   N               ;CALCULATE -X...\r
+       FADR    N,PIOT          ;PLUS PI/2\r
+TANB:  MOVEM   N,PIVOT\r
+       PUSHJ   P,COSB\r
+       JUMPE   N,TANB1\r
+       EXCH    N,PIVOT\r
+       PUSHJ   P,SINB\r
+       FDVR    N,PIVOT\r
+       POPJ    P,\r
+TANB1: PUSHJ   P,INLMES\r
+       ASCIZ 'TAN OF PI/2 OR COTAN OF ZERO IN '\r
+       JRST    410317\r
+\f;FLOATING POINT SINGLE PRECISION EXPONENTIAL FUNCTION\r
+;THE ARGUMENT IS RESTRICTED TO THE FOLLOWING RANGE\r
+;      -88.028<X<88.028\r
+;IF X<-88.028, THE PROGRAM RETURNS ZERO AS THE ANSWER\r
+;IF X>88.028, THE PROGRAM RETURNS +INFINITY AS THE ANSWER\r
+;THE RANGE OF THE ARGUMENT IS REDUCED AS FOLLOWS:\r
+;EXP(X) = 2**(X*LOG(B)BASE2) = 2**(M+F)\r
+;WHERE M IS AN INTEGER AND F IS N FRACTION\r
+;2**M IS CALCULATED BY ALGEBRAICALLY ADDING M TO THE EXPONENT\r
+;OF THE RESULT OF 2**F. 2**F IS CALCULATED AS\r
+\r
+;2**F = 2(0.5+F(A+B*F^2 - F-C(F^2 + D)**-1)**-1\r
+\r
+;THE ROUTINE HAS THE FOLLOWING CALLING SEQUENCE:\r
+;      PUSHJ   P, EXP\r
+;\r
+;THE ARGUMENT IS IN N\r
+;THE ANSWER IS RETURNED IN ACCUMULATOR N\r
+\r
+EXPB:                          ;ENTRY TO EXPONENTIAL ROUTINE\r
+       MOVE    T, N            ;PICK UP THE ARGUMENT IN T\r
+       MOVM    N, T            ;GET ABSF(X)\r
+       CAMLE   N, E7           ;IS ARGUMENT IN PROPER RANGE?\r
+       JRST    N, EXTOLG       ;EXP TO LARGE.;##MSG +CON OR STOP?\r
+\r
+       SETZM   N, ES2          ;INITIALIZE ES2\r
+       MULI    T, 400          ;SEPARATE FRACTION AND EXPONENT\r
+       TSC     T, T            ;GET N POSITIVE EXPONENT\r
+       MUL     T1, E5          ;FIXED POINT MULTIPLY BY LOG2(B)\r
+       ASHC    T1, -242(T)     ;SEPARATE FRACTION AND INTEGER\r
+       AOSG    T1              ;ALGORITHM CALLS FOR MULT. BY 2\r
+       AOS     T1              ;ADJUST IF FRACTION WAS NEGATIVE\r
+       HRRM    T1, EX          ;SAVE FOR FUTURE SCALING\r
+       ASH     A, -10          ;MAKE ROOM FOR EXPONENT\r
+       TLC     A, 200000       ;PUT 200 IN EXPONENT BITS\r
+       FADB    A, ES2          ;NORMALIZE, RESULTS TO A AND ES2\r
+       FMP     A, A            ;FORM X^2\r
+       MOVE    N, E2           ;GET FIRST CONSTANT\r
+       FMP     N, A            ;E2*X^2 IN N\r
+       FAD     A,E4            ;ADD E4 TO RESULTS IN A\r
+       MOVE    T, E3           ;PICK UP E3\r
+       FDV     T, A            ;CALCULATE E3/(F^2 + E4)\r
+       FSB     N, T            ;E2*F^2-E3(F^2 + E4)**-1\r
+       MOVE    T1, ES2         ;GET F AGAIN\r
+       FSB     N, T1           ;SUBTRACT FROM PARTIAL SUM\r
+       FAD     N, E1           ;ADD IN E1\r
+       FDVM    T1, N           ;DIVIDE BY F\r
+       FAD     N,E6            ;ADD 0.5\r
+       XCT     EX              ;SCALE THE RESULTS\r
+       POPJ    P,              ;EXIT\r
+\r
+E1:    204476430062            ;9.95459578\r
+E2:    174433723400            ;0.03465735903\r
+E3:    212464770715            ;617.97226953\r
+E4:    207535527022            ;87.417497202\r
+E5:    270524354513            ;LOG(B),  BASE  2\r
+E6:    0.5\r
+E7:    207540071260            ;88.028\r
+EXTOLG:        PUSHJ P,INLMES\r
+       ASCIZ /EXP TOO LARGE IN /\r
+       PUSHJ P,GOSR3\r
+       JRST    LRGNS1\r
+\f;SINGLE PRECISION EXP.2 FUNCTION\r
+;THIS ROUTINE CALCULATES A FLOATING POINT NUMBER TO A FIXED\r
+;POINT POWER. THE CALCULATION IS A**B, WHERE T IS OF THE FORM\r
+\r
+;      T=Q(0) + Q(1)*2 + Q(2)*4 + ...WHERE Q(I)=0 OR 1\r
+\r
+;THE BASE IS IN ACCUMULATOR N\r
+;AND THE EXPONENT IS IN ACCUMULATOR (N+1) WHEN THE ROUTINE IS\r
+;CALLED. THE ANSWER IS RETURNED IN ACCUMULATOR N.\r
+;EXP.2 IS CALLED ONLY BY EXP.3.         IT IS GUARANTEED THAT THE\r
+;BASE AND THE EXPONENT ARE NON-ZERO.\r
+\r
+\r
+EXP2.0:        JUMPE   N,FEXP3\r
+       MOVSI   T1,(1.0)\r
+       JUMPGE  T,FEXP2\r
+       MOVMS   N,T             ;ABSOLUTE VALUE\r
+       PUSHJ   P,FEXP2\r
+       MOVSI   T,(1.0)\r
+       FDVM    T,N\r
+       POPJ    P,\r
+FEXP1: FMP     N,N             ;FORM A**N, FLOATING POINT\r
+       LSH     T,-1            ;SHIFT EXPONENT FOR NEXT BIT\r
+FEXP2: TRZE    T,1             ;IS THE BIT ON?\r
+       FMP     T1,N            ;YES, MULTIPLY ANSWER BY A**N\r
+       JUMPN   T,FEXP1         ;UPDATE A**N UNLESS ALL THOUGH\r
+       MOVE    N,T1            ;PICK UP RESULT FROM T1\r
+       POPJ    P,              ;EXIT\r
+FEXP3: SKIPN   N,T\r
+       MOVSI   N,(1.0)\r
+       POPJ    P,\r
+\r
+;SINGLE PRECISION FORTRAN IV EXP.3 FUNCTION\r
+;THIS ROUTINE CALCULATES A FLOATING POINT NUMBER RAISED TO A\r
+;FLOATING POINT POWER. THE CALCULATION IS\r
+;      A**B= EXP(B*LOG(N))\r
+\r
+;IF THE EXPONENT IS AN INTEGER THE\r
+;RESULT WILL BE COMPUTED USING "EXP2.0" .\r
+\r
+;THE CALLING SEQUENCE FOR THE ROUTINE IS AS FOLLOWS:\r
+;      PUSHJ   P, EXP3.0\r
+;THE BASE IS IN ACCUMULATOR N\r
+;AND THE EXPONENT IS IN ACCUMULATOR (N+1) WHEN THE ROUTINE\r
+;IS CALLED. THE RESULT IS RETURNED IN ACCUMULATOR N.\r
+\r
+\r
+\r
+\r
+EXP3.0:        JUMPE   T,EXP3A         ;IS EXPONENT ZERO?\r
+       JUMPE   N,EXP3B         ;IS BASE ZERO?\r
+EXP3A0:        MOVM    A,T             ;SET UP ABS VAL OF EXPON FOR SHIFTING\r
+       JUMPL   N,EXP3C         ;IS BASE NEGATIVE?\r
+EXP3A1:        MOVEI   T1,0            ;CLEAR AC T1 TO ZERO\r
+       LSHC    T1,11           ;SHIFT 9 PLACES LEFT\r
+       SUBI    T1,200          ;TO OBTAIN SHIFTING FACTOR\r
+       JUMPLE  T1,EXP3GO\r
+       HRR     B,T1\r
+       MOVEI   T1,0\r
+       LSHC    T1,0(B)\r
+       JUMPN   A,EXP3GO\r
+       SKIPGE  T               ;YES, WAS  IT NEG. ?\r
+       MOVNS   T1              ;YES, NEGATE IT\r
+       MOVE    T,T1            ;MOVE INTEGER INTO T\r
+       JRST    EXP2.0          ;OBTAIN RESULT USING EXP2.0\r
+EXP3GO:        PUSH    P,T             ;SAVE EXPONENT\r
+       PUSHJ   P,LOGB          ;CALCULATE LOG OF N\r
+       FMPR    N,(P)           ;CALCULATE B*LOG(N)\r
+       PUSHJ   P,EXPB          ;CALCULATE EXP(B*LOG(N))\r
+       POP     P,T\r
+       POPJ    P,              ;RETURN\r
+\r
+EXP3A: MOVSI   N,(1.0)         ;ANSWER IS 1.0\r
+       POPJ    P,\r
+\r
+EXP3B: JUMPGE  T,ZERANS\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /ZERO TO A NEGATIVE POWER IN /\r
+       PUSHJ   P,GOSR3\r
+LRGNS1:        HRLOI   N,377777        ;LARGEST ANSWER\r
+       POPJ    P,\r
+\r
+EXP3C: MOVE    X1,A\r
+       FAD     X1,FIXCON\r
+       FSB     X1,FIXCON\r
+       CAMN    A,X1\r
+       JRST    EXP3A1          ;NEGATIVE BASE, INTEGRAL POWER\r
+       PUSH    P,N             ;SAVE ARGUMENTS\r
+       PUSH    P,T\r
+       PUSHJ   P,INLMES\r
+       ASCIZ /ABSOLUTE VALUE RAISED TO POWER IN /\r
+       PUSHJ   P,GOSR3\r
+       POP     P,T\r
+       POP     P,N\r
+       MOVMS   N\r
+       JRST    EXP3A0\r
+\r
+\f      SUBTTL  RUN-TIME RANDOM NUMBER ROUTINES\r
+\r
+IFN FTRND, <\r
+;;WRANB -- PSEUDO-RANDOM RESET/WARMUP\r
+; PUSHJ P,WRANB\r
+;\r
+;THE ARG IS IN ACCUMULATOR A\r
+;\r
+; 1.   USES STANDARD BASIC "PUSHJ" CALLING SEQUENCE.\r
+; 2.   W IS A BIT VECTOR (BITS 05-35 SIGNIFICANT).\r
+; 3.   RETURNS NO USEFUL VALUE IN AC Z.\r
+; 4.   CREATES A BASIS OF "NNN" VECTORS AT VRANT IN VRAN,\r
+;      BASED ON THE WARMUP ARGUMENT W. (STANDARD VALUE\r
+;      IS W=0.) RESETS VRAN'S OWN INDEX. USES VRAN LOCATIONS\r
+       ;               VRANR   ; VRAN OWN INDEX RESET VALUE.\r
+       ;               VRANW   ; VRAN'S WARMUP CONSTANT.\r
+       ;               VRANT   ; VRAN'S VECTOR-TABLE.\r
+       ;               VRANN   ; NEGATIVE TABLE LENGTH.\r
+; 5.   FORTRAN AC ASSIGNMENTS ARE\r
+;      N=00    ; FUNCTION-VALUE RETURN AC.\r
+;      T=1     ; SCRATCH AC.\r
+;      P=17    ; PUSHDOWN LIST\r
+;      T1=2    ; INDEX AC.\r
+;      A=3     ; INDEX AC.\r
+; 6.   WRAN MAY BE USED FREELY TO REPEAT A PREVIOUSLY GENERATED\r
+;      SEQUENCE (BY CALLING WRAN WITH THE PREVIOUSLY USED VALUE\r
+;      FOR W), OR TO CAUSE THE GENERATION OF A COMPLETELY NEW\r
+;      SEQUENCE (BY CALLING WRAN WITH A NEW VALUE FOR W).\r
+\r
+\r
+       ...=0   ; ELLIPSIS (FOR CONVENIENCE).\r
+>\r
+\r
+WRANB: XOR     N,VRANW         ;   ADJUST,\r
+       TLZ     N,(37B4)        ;   IGNORE BITS 00-04\r
+       JUMPE   N,WRANB         ;   REJECT 0.\r
+       MOVSI   T1,777771               ; ESTABLISH OUTER LOOP.\r
+WRAN2: MOVNI   A,6     ;ESTABLISH INNER LOOP.\r
+WRAN3: MOVE    T,N             ; COPY ARGUMENT,\r
+       ROT     T,13            ;  POSITION BITS 05-10 FOR\r
+       XOR     T,N             ;  MOD 2 SUM WITH BITS 30-35.\r
+       ROT     T,-6            ; USE RESULT AS NEW\r
+       LSHC    N,6             ;  ARGUMENT BITS 30-35\r
+       AOJN    A,WRAN3         ; SIX BYTES DONE? NO, BACK.\r
+       MOVEM   N,VRANT(T1)     ; YES, ARGUMENT IS BASIS VECTOR.\r
+       AOBJN   T1,WRAN2                ; "NNN" VECTORS DONE? NO, BACK.\r
+       MOVE    N,VRANR         ; RESET VRAN OWN INDEX.\r
+       MOVEM   N,VRANX         ; (AFTER RESTORING AC'S!)\r
+       POPJ    P,                      ; RETURN (OVER "ARG").\r
+\r
+;FRANB -- FLOATING-POINT PSEUDO-RANDOM GENERATOR.\r
+\r
+; PUSHJ P,FRANB\r
+;\r
+; 1.   USES STANDARD BASIC "PUSHJ" CALLING SEQUENCE.\r
+; 3.   RETURNS IN AC N A FLOATING-POINT NUMBER AS AN\r
+;      INSTANCE OF A REAL RANDOM VARIABLE UNIFORMLY\r
+;      DISTRIBUTED ON THE OPEN INTERVAL (0,1).\r
+; 4.   REQUIRES THE VECTOR GENERATOR FUNCTION VRAN.\r
+;VRAN\r
+; 5.   FORTRAN AC ASSIGNMENTS ARE\r
+RANB:\r
+FRAN1: PUSHJ   P,VRANB         ; GET RANDOM VECTOR,\r
+       LSH     N,-9            ;  SCALE TO MANTISSA,\r
+       JUMPE   N,FRAN1         ;  REJECT ZERO.\r
+       TLO     N,(1B1)         ; FORCE EXPONENT OF 2^0.\r
+       FAD     N,[1B1]         ;  NORMALIZE.\r
+       POPJ    P,              ; RETURN (IGNORE "ARG").\r
+\fIFN FTRND, <\r
+;VRAN7B -- 36-BIT PSEUDO-RANDOM GENERATOR.\r
+\r
+;; NAME SHOULD ALWAYS BE\r
+;; "VRANXX", WHERE "XX" IS THE ASSEMBLED VALUE OF\r
+;; THE PARAMETER "NNN". (SEE 6. BELOW.) USE ONLY THE\r
+;; STATISTICALLY BEST "EEE" VALUE FOR EACH "NNN" VALUE.\r
+\r
+; PUSHJ S,VRANB\r
+;\r
+; 1.   USES STANDARD BASIC "PUSHJ" CALLING SEQUENCE.\r
+; 3.   RETURNS IN AC N A 36-BIT PSEUDO-RANDOM VECTOR.\r
+;              VRANX   ; AC STORAGE, OWN INDEX.\r
+;              VRANR   ; OWN INDEX RESET VALUE.\r
+;              VRANW   ; WARMUP CONSTANT.\r
+;              VRANT   ; VECTOR-TABLE.\r
+;              VRANN   ; NEGATIVE TABLE LENGTH.\r
+; 6.   VRAN HAS THREE ASSEMBLY PARAMETERS:\r
+       RADIX 10\r
+       NNN=7   ; VECTOR-TABLE SIZE.\r
+       EEE=3   ; VECTOR-TABLE OFFSET.\r
+       RADIX 8\r
+       W=013702175435  ; VECTOR-TABLE GENERATOR.\r
+;      WHICH ARE USED TO ESTABLISH AN INITIAL TABLE OF\r
+;      "NNN" BASIS VECTORS <V[J] : 0 .LE. J .LT. NNN>, AND TO\r
+;      GENERATE SUCCESSIVE VECTORS ACCORDING TO THE RULE:\r
+;      V[NNN+J] = (V[0+J] + V[EEE+J]) MODULO (2^36) : 0 .LE. J.\r
+;      (SEE RANPAK.TXT FOR ADMISSABLE VALUES FOR <NNN,EEE,W>,\r
+;      AND A DISCUSSION OF THE ALGORITHM.)\r
+\r
+       VRANN=-NNN      ; NEGATIVE TABLE LENGTH (FOR WRAN).\r
+>\r
+\r
+VRANB: MOVE    T1,VRANX                ; SET UP OWN INDEX.\r
+       MOVE    N,VRANT+NNN(T1) ; ADDEND V[E+J] IF J .LT. N-E\r
+       TRNN    T1,(1B0)                ; [J.LT.N-E]=[RH(T1).LT.0]?\r
+       MOVE    N,VRANT+0(T1)   ; ADDEND V[E+J] IF J .GE. N-E.\r
+       ADDB    N,VRANT+NNN-EEE(T1)     ; AUGEND V[0+J] AND RESULT V[N+J].\r
+       AOBJN   T1,VRAN1                ; SETP J; J.GT.N? NO,OVER.\r
+       MOVE    T1,VRANR                ; YES, RESET J.\r
+VRAN1: MOVEM   T1,VRANX                ; SAVE OWN INDEX\r
+       POPJ    P,              ;EXIT\r
+\r
+VRANR: XWD     -<NNN+1>,-<NNN-EEE>     ; OWN INDEX RESET VALUE\r
+\r
+VRANW: EXP     W               ;WARMUP CONSTANT (FOR WRAN).\r
+\r
+       LIT\r
+\r
+IFN PURESW,<\r
+       LOC     140\r
+>\r
+EX1:   FSC     N,0\r
+FRSTLN:        BLOCK   1       ;141\r
+LASTLN:        BLOCK   1       ;142\r
+LOWEST:        BLOCK   1       ;143\r
+PREAD: BLOCK   2       ;144\r
+PINPUT:        BLOCK   2       ;146\r
+DATLIN:        BLOCK   2       ;150\r
+DATAFF:        BLOCK   1       ;152\r
+HPOS:  BLOCK   1       ;153\r
+REGPNT:        BLOCK   1       ;154\r
+TMPLOW:        BLOCK   1       ;155\r
+TMPPNT:        BLOCK   1       ;156\r
+PSHPNT:        BLOCK   1       ;157\r
+SEQPNT:        BLOCK   1       ;160\r
+TOPSTG:        BLOCK   1       ;161\r
+SVRBOT:        BLOCK   1       ;162\r
+SVRTOP:        BLOCK   1       ;163\r
+FMTPNT:        BLOCK   1       ;164\r
+IFFLAG:        BLOCK   1       ;165\r
+\r
+VARFRE:        BLOCK   1       ;166\r
+FCNLNK:        BLOCK   1       ;167\r
+ELETOP:        BLOCK   1       ;170\r
+FUNAME:        BLOCK   1       ;171\r
+LETSW: BLOCK   1       ;172\r
+MTIME: BLOCK   1       ;173\r
+       BLOCK   1       ;174\r
+FUNSTA:        BLOCK   1       ;175\r
+FUNLOW:        BLOCK   1       ;176\r
+LOWSTA:        BLOCK   1       ;177\r
+SB1M1: BLOCK   1       ;200\r
+SB2M1: BLOCK   1       ;201\r
+TEMP1: BLOCK   1       ;202\r
+TEMP2: BLOCK   1       ;203\r
+TEMP3: BLOCK   1       ;204\r
+TYI:   BLOCK   3       ;205\r
+TYO:   BLOCK   3       ;210\r
+TTYBUF: BLOCK  3       ;213\r
+\r
+LINB0: BLOCK   20      ;216\r
+\r
+DRMBUF:        BLOCK   2       ;236\r
+VECT1: BLOCK   100     ;240\r
+VECT2: BLOCK   100     ;340\r
+       BLOCK   1       ;440\r
+STRFCN:        BLOCK   1       ;441\r
+TABVAL:        BLOCK   1       ;442\r
+RUNFLA:        BLOCK   1       ;443\r
+OLDFLA:        BLOCK   1       ;444\r
+RENFLA:        EXP -1          ;445\r
+CURDEV: BLOCK  1       ;446\r
+CURNAM: BLOCK  1       ;447\r
+CUREXT: BLOCK  1       ;450\r
+DETER: BLOCK   1       ;451\r
+NUMRES:        BLOCK   1       ;452\r
+VRANX: BLOCK   1       ;453\r
+FILDIR:        BLOCK   1       ;454\r
+       SIXBIT /BAS/    ;455\r
+       EXP     0,0     ;456\r
+                       ;457\r
+EX:    FSC N,0         ;SCALE THE RESULTS\r
+BADMSG:        ASCII /MISSING LINE NUMBER FOLLOWING LINE /\r
+BADGNN:        EXP  60,0\r
+CRLFMS:        ASCIZ /\r
+/\r
+UUOH:  0               ;473\r
+       JRST UUOHAN\r
+\r
+       NNN=7\r
+       W=13702175435\r
+       INTERNAL VRANT\r
+\r
+DEFINE .WRAN(NN,WW) <  ; ASSEMBLES "WRAN(0)" BASIS.\r
+       DEFINE  .WRAN1 <\r
+       REPEAT 6, <\r
+       %Q=<%A>B<35+25>\r
+       %Q=<%A ! %Q> & <-1-<%A & %Q>>\r
+       %A=<%A>B<35-6> ! <%Q & 77> >\r
+       EXP     %A >\r
+       %A=WW\r
+       REPEAT NN, <\r
+       .WRAN1 >>\r
+\r
+VRANT: .WRAN(NNN,W)\r
+SPEC:  EXP 1\r
+NEWOL1:        SIXBIT /DSK/\r
+       EXP TYI\r
+WEAVI: OCT 1\r
+WEAV:  SIXBIT /DSK/\r
+       EXP  TYI\r
+SAVI:  OCT 1\r
+SAVEX: SIXBIT /DSK/\r
+       XWD TYO,\r
+\fDEFINE ROLLS <\r
+X TXT\r
+X LIN\r
+\r
+X COD\r
+X CON\r
+X LIT\r
+X ARA\r
+X SVR\r
+X GSB\r
+X SCA\r
+X VSP\r
+X PTM\r
+X TMP\r
+\r
+X STM\r
+X VAR\r
+X SEX\r
+X ARG\r
+X REF\r
+X FCN\r
+X FCL\r
+X FAD\r
+X CAD\r
+X LAD\r
+X SAD\r
+X FOR\r
+X NXT\r
+>\r
+       PSHROL=200000   ;ADDRESS ASSOCIATED WITH THIS\r
+                       ;PHANTOM ROLL ARE ABSOLUTE, INDEXED BY (P)\r
+\r
+\fDEFINE TBLS <\r
+X CMD\r
+X STA\r
+X DEC\r
+X REL\r
+X IFN\r
+>\r
+ZZ.=0\r
+DEFINE X(A)\r
+<A'ROL=ZZ.\r
+ZZ.=ZZ.+1\r
+>\r
+       TBLS\r
+ROLLS\r
+ROLTOP=ZZ.-1\r
+\r
+\fFLOOR:\r
+DEFINE X(A)\r
+<EXP A'FLO>\r
+TBLS\r
+\r
+DEFINE X(A)\r
+<Z>\r
+\r
+       ROLLS\r
+CEIL:\r
+DEFINE X(A)\r
+<EXP A'CEI>\r
+TBLS\r
+\r
+DEFINE X(A)\r
+<Z>\r
+\r
+       ROLLS\r
+\r
+COMBOT=VARROL          ;BOTTOM COMPILE ROLL AFTER CODROL\r
+COMTOP=NXTROL          ;TOP COMPILE ROLL.\r
+ONCESW:        EXP     -1      ;ONCE-ONLY SWITCH FOR START\r
+                       ;AFTERWARDS, THE CONSTANT ZERO.\r
+\r
+PAKFLA:        BLOCK   1       ;612    ;-1 IF TEXT IS NOT PACKED\r
+VPAKFL:        BLOCK   1       ;613    ;-1 IF VARIABLE SPACE PACKED.\r
+INPFLA:        BLOCK   1       ;614    ;NON-ZERO DURING INPUT,ZERO DURING READ\r
+IFIFG: BLOCK   1       ;615\r
+PIVOT: ES2: C3:        BLOCK   1       ;616\r
+SX:    BLOCK   1       ;617\r
+PLIST: XWD -100,.\r
+       BLOCK 100\r
+\r
+EXTERN JOBSA,JOBREL,JOBFF,JOBREN,JOBOPC,JOBAPR,JOBTPC\r
+\r
+MINFLG=400000   ;MINUS FLAG IN LEFT HALF OF EXPR PNTR\r
+ROLMSK=377777   ;ROLL NUMBER MASK IN SAME\r
+\r
+SUBTTL LITERALS\r
+       DEFINE  IMP(A)\r
+<      CE'A=CEIL+A'ROL\r
+       FL'A=FLOOR+A'ROL\r
+       INTERN  CE'A,FL'A       >\r
+       IMP     SVR\r
+       IMP     LIT\r
+       IMP     SCA\r
+       IMP     ARA\r
+       IMP     STM\r
+       IMP     PTM\r
+       IMP     LAD\r
+       IMP     GSB\r
+       IMP     FOR\r
+       IMP     FCL\r
+       IMP     CAD\r
+       IMP     ARG\r
+       IMP     REF\r
+       IMP     COD\r
+       IMP     SEX\r
+       IMP     SAD\r
+       IMP     NXT\r
+       IMP     LIN\r
+       IMP     CON\r
+       IMP     VSP\r
+       IMP     TXT\r
+       IMP     TMP\r
+\r
+       END     BASIC\r