Added CREF.MAC
authorRichard Cornwell <rcornwell@github.com>
Thu, 22 Nov 2018 23:40:03 +0000 (18:40 -0500)
committerRichard Cornwell <rcornwell@github.com>
Thu, 22 Nov 2018 23:40:03 +0000 (18:40 -0500)
src/cref.mac [new file with mode: 0644]

diff --git a/src/cref.mac b/src/cref.mac
new file mode 100644 (file)
index 0000000..c88c8c8
--- /dev/null
@@ -0,0 +1,1255 @@
+TITLE  CREF V40A - CROSS REFERENCE PROGRAM\r
+SUBTTL CCL SYSTEM - BOWERING/RPG/PMH/NGP/TNH/TWE/JBS - 01-MAY-71\r
+;*****(C)COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD MASS.,USA *****\r
+\r
+INTERNAL JOBVER,PURE\r
+LOC <JOBVER==137>\r
+       XWD 0,000040    ;CREF VERSION NUMBER\r
+\r
+IFNDEF PURE,<PURE=1>\r
+   IFN PURE,<HISEG>\r
+\r
+EXTERNAL       JOBFF,  JOBREL, JOBDDT, JOBSYM\r
+INTERNAL       CREF\r
+\r
+IFNDEF TEMPC,<TEMPC==1>        ;TMPCOR UUO ALLOWED IF SET TO 1\r
+IFNDEF FAILC,<FAILC==1>        ;NO FAIL BLOCK STRUCTURE UNLESS REQUESTED\r
+;ACCUMULATOR DEFINITIONS\r
+AC0=0\r
+TEMP=1\r
+TEMP1=2\r
+WPL=3  ;CONTAINS COUNT OF HOW MANY REFERENCES/LINE IN LISTING\r
+RC=WPL\r
+SX=4\r
+BYTEX=5\r
+BYTEM=6\r
+TX=BYTEM\r
+TIO=6  ;AC USED FOR MTAPE FLAGS IN COMMAND SCANNER LOGICTX=BYTEM\r
+C=7\r
+CS=10\r
+LINE=11        ;HOLDS LINE #\r
+FLAG=12\r
+FREE=13        ;POINTS TO HIGH END OF INCREMENT BYTE TABLE\r
+SYMBOL=14      ;POINTS TO ENTRY COUNT AT LOW END OF SYMBOL TABLE\r
+TOP=15 ;CONTAINS HIGHEST AVAILABLE ADR IN MEMORY\r
+IO=16  ;HOLDS FLAGS\r
+PP=17  ;PUSH DOWN POINTER\r
+\f;DEFINITIONS FOR LENGTHS OF LINES AND PAGES\r
+WPLLPT==^D14   ;IN OUTPUT LPT LISTING, 14 REFERENCES/LINE\r
+WPLTTY==8      ;IN OUTPUT TTY LISTING, 8 REFERENCES/LINE\r
+.LPP==^D53     ;LINES PER PAGE IN LISTING\r
+PDL==30                ;PUSH DOWN STACK LENGTH\r
+\r
+IOLST==        000001  ;IF 1, SUPPRESS PROGRAM LISTING\r
+IONCRF==000002 ;1 IF COMMAND STRING SEARCH LIMITS BEING USED\r
+IOPAGE==000004 ;IF 1, DO A FORM FEED\r
+IOFAIL==000010 ;1 IF "NEW STYLE" CREF DATA HAS BBEN SEEN\r
+IODEF==        000020  ;1 IF SYMBOL IS A DEFINING OCCURRANCE\r
+IOENDL==000040\r
+IORPG==        000100  ;1 IF RPG SYSTEM IN USE (SET BY STATTING AT (JOBSA)+1)\r
+IOTABS==000200 ;"RUBOUT A" SEEN AT AND OF CREF DATA (INSERT TAB IN LISTING)\r
+IOEOF==        000400  ;END OF FILE SEEN\r
+IONLZ==        001000  ;LEADING ZERO TEST\r
+IOTB2==        002000  ;FOR F4\r
+IOTTY==        004000  ;1 IF LISTING DEVICE IS TTY\r
+IOERR==        010000  ;IMPROPER INPUT DATA SEEN\r
+IODF2==        020000  ;DEFINING OCCURRANCE OF A SYMBOL\r
+IOSYM==        040000  ;SYMBOL DEFINED WITH = OR :\r
+IOMAC==        100000  ;MACRO NAME\r
+IOOP== 200000  ;OPDEF, OP CODE, OR PSEUDO INSTRUCTION OCCURRANCE\r
+IOPROT==400000 ;1 IF INPUT 'CRF' OR 'LST' FILE IS PROTECTED\r
+               ;BY /P SWITCH\r
+\r
+\f;DEFINITIONS FOR "OLD STYLE" CODES FROM VARIOUS PROCESSORS\r
+%OP==33\r
+%MAC==34\r
+%LINE==35\r
+%SYM==36\r
+%EOF==37       ;MULTIPLE-PROGRAM BREAK CHARACTER\r
+\r
+A==0           ;ASCII MODE\r
+AL==1          ;ASCII LINE MODE\r
+\r
+CTLI==1                ;CONTROL DEVICE NUMBER (INPUT)\r
+CHAR==2                        ;INPUT DEVICE NUMBER\r
+LST==3                 ;LISTING DEVICE NUMBER\r
+\r
+;      COMMAND STRING ACCUMULATORS\r
+\r
+ACDEV=TEMP                     ;DEVICE\r
+ACFILE=TEMP1                   ;FILE\r
+ACEXT=LINE                     ;EXTENSION\r
+ACDEL=4                        ;DELIMITER\r
+ACPNTR=5                       ;BYTE POINTER\r
+\r
+;FLAGS USED IN AC TIO\r
+\r
+TIORW==1000    ;MTAPE REWIND FLAG\r
+TIOLE==2000    ;SET(BUT NOT USED ANYWHERE) BY BACKSPACE REQUEST\r
+TIOCLD==20000  ;CLEAR DIRECTORY FLAG\r
+\r
+OPDEF  RESET   [CALLI   0]\r
+OPDEF  DEVCHR  [CALLI   4]\r
+OPDEF  WAIT    [MTAPE   0]\r
+OPDEF  CORE    [CALLI  11]\r
+OPDEF  UTPCLR  [CALLI  13]\r
+\r
+OPDEF  DDTOUT  [CALLI 3]\r
+OPDEF  EXIT    [CALLI 12]\r
+TMPCOR==44     ;TMPCOR UUO CALLI #\r
+\f\r
+MLON\r
+\r
+CREF:  TDZA IO,IO              ;START HERE FROM (JOBSA)\r
+       MOVSI IO,IORPG          ;START HERE FROM (JOBSA)+1\r
+       RESET\r
+       MOVEI ENDCLR\r
+       MOVEM JOBFF             ;INIT JOBFF TO 1ST FREE LOCATION\r
+       MOVE PP,[IOWD PDL,PPSET]        ;INIT PUSH DOWN LIST\r
+\r
+IFN TEMPC,<\r
+       SETZM TMPFLG            ;ZERO TMPCOR FLAG\r
+       TLNN IO,IORPG           ;IS A CCL TYPE CALL?\r
+       JRST TMPEND             ;NO\r
+       HRRZ AC0,JOBFF          ;GET START OF BUFFER AREA\r
+       HRLI AC0,-200           ;-LENGTH IN LH FOR TMPCOR IOWD\r
+       MOVEM AC0,TMPFIL+1      ;STORE IT IN TMPCOR IOWD\r
+       SOS TMPFIL+1            ;MAKE IT CONFORM TO IOWD FORMAT\r
+       HRRM AC0,CTIBUF+1       ;SET UP DUMMY BYTE POINTER\r
+       MOVSI TEMP,(SIXBIT /CRE/)       ;SETUP 2 WORD BLOCK FOR TMPCOR UUO\r
+       MOVEM TEMP,TMPFIL\r
+       MOVE TEMP,[XWD 1,TMPFIL]        ;SET UP FOR READ FROM CORE\r
+       CALLI TEMP,TMPCOR       ;READ AND DELETE FILE "CRE"\r
+       JRST TMPEND             ;FILE NOT THERE, TRY THE DISK\r
+       ADD AC0,TEMP            ;GET END OF BUFFER\r
+       MOVEM AC0,JOBFF         ;DUMMY UP JOBFF\r
+       MOVEM AC0,SVJFF         ;SAVE NEW JOBFF\r
+       IMULI TEMP,5            ;CALCULATE THE CHARACTER COUNT\r
+       ADDI TEMP,1             ;MAKE SURE YOU GET THE LAST CHARACTER IN THE BUFFER\r
+       MOVEM TEMP,CTIBUF+2     ;DUMMY UP CHARACTER COUNT IN HEADER\r
+       MOVEI TEMP,440700       ;SET UP REST OF BYTE POINTER\r
+       HRLM TEMP,CTIBUF+1      ;HEADER NOW COMPLETE\r
+       SETOM TMPFLG\r
+       MOVSI IO,IOPAGE!IOSYM!IOMAC!IORPG\r
+       JRST RETRPG             ;RETURN TO MAIN FLOW\r
+TMPEND:>\r
+       MOVEI TEMP,AL           ;OPEN FILE IN ASCII LINE MODE\r
+       MOVSI TEMP+1,(SIXBIT /TTY/)\r
+       TLNE IO,IORPG           ;USING CCL MODE?\r
+       MOVSI TEMP+1,(SIXBIT /DSK/)     ;YES\r
+       MOVEM TEMP+1,CTIDEV     ;SAVE DEVICE NAME\r
+       MOVEI TEMP+2,CTIBUF     ;SET UP INPUT BUFFER HEADER ADDRESS\r
+       OPEN CTLI,TEMP          ;OPEN INPUT COMMAND FILE\r
+        JRST CREF              ;OPEN FAILURE, START OVER\r
+       INBUF CTLI,1            ;SET UP 1 INPUT BUFFER\r
+       HRRZ JOBFF\r
+       MOVEM SVJFF             ;SAVE JOBFF\r
+       TLNN IO,IORPG\r
+       JRST RETRPG             ;NOT IN CCL MODE\r
+\f;THE FOLLOWING CODE LOOKS UP A FILE -DSK:NNNCRE.TMP\r
+;AND TRIES TO INITIALIZE IT. IF EVERYTHING WORKS, THAT FILE IS\r
+;USED FOR THE COMMAND DATA TO CREF. IF SOMETHING GOES WRONG,\r
+;CREF IS STARTED AT ITS USUAL PLACE AND AN ASTERISC IS TYPED.\r
+;THIS CODE IS USED ONLY FOR THE NEW COMMAND LANGUAGE AND IS STARTED\r
+;BY STARTING AT: (JOBSA)+1\r
+\r
+       MOVEI AC0,3             ;JOB # IS 3 CHARS LONG\r
+       CALLI TEMP,30           ;GET JOB #\r
+CREF1: IDIVI TEMP,12\r
+       ADDI TEMP+1,"0"-40      ;CHANGE REMAINDER TO SIXBIT DIGIT\r
+       LSHC TEMP+1,-6          ;SHOVE DIGITS INTO TEMP+2\r
+       SOJG AC0,CREF1                  ;3 DIGITS YET?\r
+       HRRI TEMP+2,(SIXBIT /CRE/)\r
+       MOVEM TEMP+2,CTIDIR             ;SET UP ###CRE\r
+       MOVSI TEMP,(SIXBIT /TMP/)\r
+       MOVEM TEMP,CTIDIR+1             ;SET UP EXTENSION\r
+       SETZM CTIDIR+3                  ;CLEAR PROJ,PROG\r
+       LOOKUP CTLI,CTIDIR              ;DO LOOKUP ON COMMAND FILE\r
+        JRST CREF              ;FILE ###CRE.TMP NOT FOUND\r
+\r
+\fRETRPG:       TLO IO,IOPAGE!IOSYM!IOMAC\r
+       HRRZ 0,SVJFF            ;GET THE SAVED JOBFF\r
+       MOVEM 0,JOBFF           ;RESTORE JOBFF\r
+       SKIPE JOBDDT\r
+       JRST .+3        ;NO CORE UUO WHEN USING DDT\r
+       CORE 0,                 ;SHRINK CORE\r
+        JRST CREF              ;CORE FAILURE\r
+       SETZM STCLR\r
+       MOVE 0,[XWD STCLR,STCLR+1]\r
+       BLT 0,ENDCLR            ;CLEAR OUT VARIABLE AREA\r
+\r
+       MOVE PP,[IOWD PDL,PPSET]        ;INIT PUSH DOWN LIST POINTER\r
+       HLLOS UPPLIM            ;?\r
+\r
+       TLNE IO,IORPG           ;IN CCL MODE?\r
+       JRST    LSTSET          ;YES, NO *\r
+       PUSHJ PP,CRLF   ;NO\r
+       MOVEI C,"*"\r
+       PUSHJ PP,TYO    ;OUTPUT *\r
+\f;THIS CODE IS USED TO SET UP  SOURCE AND\r
+;DESTINATION DEVICES, DO MAGTAPE SPACING COMMANDS, ETC.\r
+\r
+LSTSET:        MOVSI   ACDEV,(SIXBIT /LPT/)\r
+       MOVEM   ACDEV,LSTDEV            ;DEFAULT LIST DEVICE IS LPT:\r
+       PUSHJ   PP,NAME1        ;GET NEXT DEVICE\r
+       CAIE    C,"_"           ;LISTING DEVICE SPECIFIED?\r
+       JRST    LSTS2           ;NO\r
+       SKIPE   ACDEV\r
+       MOVEM   ACDEV,LSTDEV    ;SAVE DEVICE NAME\r
+       MOVEM   ACFILE,LSTDIR   ;STORE FILE NAME\r
+       MOVEM   ACEXT,LSTDIR+1\r
+\r
+LSTS2: MOVEI FLAG,AL           ;INIT DEVICE IN ASCII LINE MODE\r
+       MOVE FLAG+1,LSTDEV      ;GET DEVICE NAME\r
+       MOVSI FLAG+2,LSTBUF     ;BUFFER HEADER ADDRESS\r
+       OPEN LST,FLAG           ;TRY TO INIT DEVICE\r
+        JRST ERRAVL            ;OPEN FAILED\r
+       OUTBUF LST,2\r
+\r
+       CAIE    C,"_"           ;LISTING DEVICE SPECIFIED?\r
+       JRST    INSET1          ;NO\r
+       DEVCHR ACDEV,           ;GET OUTPUT DEVICE CHARACTERISTICS\r
+       TLNE    ACDEV,10        ;IS IT A TTY?\r
+       TLO     IO,IOTTY        ;YES, SET TTY FLAG\r
+       TLZE    TIO,TIORW       ;REWIND REQUESTED?\r
+       MTAPE   LST,1           ;YES\r
+       JUMPGE  CS,LSTSE3\r
+       MTAPE   LST,17          ;BACKSPACE MTA\r
+       AOJL    CS,.-1          ;IF COUNT IS NEG., BACKSPACE AGAIN\r
+       WAIT    LST,            ;WAIT FOR TAPE TO STOP SO LOAD POINT CAN BE SENSED\r
+       STATO   LST,1B24        ;SKIP IF AT LOAD POINT-\r
+                               ; THIS PUTS TAPE ON CORRECT SIDE OF EOF\r
+       MTAPE   LST,16          ;SPACE FORWARD 1 FILE\r
+LSTSE3:        SOJG    CS,.-1          ;LOOP UNTIL POS. COUNT RUNS OUT\r
+\r
+       TLNE    TIO,TIOCLD      ;DIRECTORY CLEAR REQUESTED?\r
+       UTPCLR  LST,            ;YES, CLEAR IT\r
+       ENTER   LST,LSTDIR\r
+       JRST    ERRENT\r
+\fINSET:        PUSHJ   PP,NAME1        ;GET NEXT COMMAND NAME\r
+INSET1:        SKIPN   ACDEV\r
+       MOVSI   ACDEV,(SIXBIT /DSK/)\r
+       MOVEM   ACDEV,INDEV     ;SAVE DEVICE FOR ERR MESSAGES\r
+       SKIPN   ACFILE\r
+       MOVE    ACFILE,[SIXBIT /CREF/]\r
+       MOVEM   ACFILE,INDIR    ;STORE FILE IN DIRECTORY\r
+\r
+       MOVEI ACDEV-1,A         ;INIT DEVICE IN "A" MODE\r
+       MOVEI ACDEV+1,INBUF     ;SET UP ARG FOR BUFFER HEADER\r
+       OPEN CHAR,ACDEV-1       ;OPEN CHANNEL\r
+        JRST ERRAVI            ;FAILED\r
+\r
+       TLZE    TIO,TIORW       ;REWIND?\r
+       MTAPE   CHAR,1          ;YES\r
+       JUMPGE  CS,INSET2\r
+       MTAPE   CHAR,17\r
+       MTAPE   CHAR,17\r
+       AOJL    CS,.-1\r
+       WAIT    CHAR,\r
+       STATO   CHAR,1B24\r
+       MTAPE   CHAR,16\r
+INSET2:        SOJGE   CS,.-1\r
+\fINSET3:       INBUF   CHAR,2\r
+       JUMPN   ACEXT,INSET4    ;TAKE USER'S EXTENSION IF NON-BLANK\r
+       MOVE ACEXT,[SIXBIT /LSTCRF/]    ;TRY CRF 1ST, THEN LST\r
+       JSP ACDEV,INSETI                ;LOOKUP FILE (DON'T RETURN IF FOUND)\r
+       JUMPN ACEXT,.-1                 ;KEEP LOOKING UNTIL EXT'S GONE\r
+       MOVSI ACEXT,(SIXBIT /TMP/)      ;FINALLY TRY TMP THEN NULL\r
+       JSP ACDEV,INSETI\r
+INSET4:        MOVEI ACDEV,ERRFND              ;RETURN IS CONTINUE OR JRST ERRFND\r
+\r
+INSETI:        HLLM    ACEXT,INDIR+1   ;STORE EXTENSION\r
+       LSH     ACEXT,^D18      ;SLIDE NEXT EXT INTO PLACE\r
+       LOOKUP  CHAR,INDIR\r
+         JRST  (ACDEV)         ;NOT FOUND\r
+\r
+       SKIPN FIRSTL            ;HAS INITIAL PRINTING LINE BEEN REQUESTED?\r
+       JRST LSTS7              ;NO\r
+       TLNE IO,IORPG\r
+       JRST LSTS4              ;NO MESSAGE OUTPUT FOR RPG SYSTEM\r
+       MOVEI TEMP,[ASCIZ /RESTART LISTING AT LINE:     /]\r
+       DDTOUT CTLI,\r
+       INPUT CTLI,             ;INPUT THE ANSWER\r
+LSTS4: MOVEI AC0,0             ;INIT DECIMAL NUMBER ASSEMBLER\r
+LSTS5: PUSHJ PP,TTYIN  ;GET CHARACTER\r
+       CAIL C,"0"      ;IS IT A DIGIT?\r
+       CAILE C,"9"\r
+       JRST LSTS6      ;NO\r
+       IMULI AC0,12    ;YES\r
+       ADDI AC0,-"0"(C)\r
+       JRST LSTS5\r
+\r
+LSTS6: MOVEM AC0,FIRSTL        ;SAVE DECIMAL NUMBER\r
+LSTS7:                 ;TO HERE IF NO INITIAL LINE SPECIFIED\r
+\fIFN FAILC,<\r
+       MOVEI FREE,BLKST-1      ;SET UP THINGS FOR COMBG\r
+       MOVEM FREE,BLKND\r
+>\r
+\r
+RECYCL: HRRZ   FREE,JOBFF      ;RETURN FOR MULTIPLE F4 PROGS\r
+       ADDI    FREE,1\r
+       TRZ     FREE,1          ;SET UP BYTE TABLE ADR ON EVEN LOCATION\r
+\r
+       HRRZ    C,JOBREL        ;SET UP HIGH ADR OF SYMBOL TABLE\r
+       SKIPE   JOBDDT\r
+       HRRZ    C,JOBSYM        ;SAVE DDT'S SYMBOL TABLE WHEN IN USE\r
+       SOS     TOP,C           ;ALLOW 1 WORD SLOP\r
+       SUBI    C,LENGTH        ;MOVE AN INITIAL VESTIGIAL SYMBOL TABLE TO HIGH MEMORY\r
+       MOVE    SYMBOL,C\r
+       HRLI    C,SYMNUM\r
+       BLT     C,0(TOP)        ;MOVE THE 5 WORDS STARTING AT SYMNUM BELOW\r
+       PUSHJ   PP,SRCHI\r
+       MOVEI   LINE,1  ;INITIALIZE LINE COUNTER\r
+       PUSHJ PP,READ   ;TEST FIRST CHARACTER\r
+       CAIE C,%EOF     ;PROGRAM BREAK?\r
+       JRST M2A        ;NO, PROCESS\r
+       JRST M2         ;YES, BYPASS\r
+\r
+;THIS IS AN INITIAL VESTIGIAL SYMBOL TABLE - IT MAKES INITIALIZATION\r
+;OF THE SYMBOL TABLE SEARCH EASY\r
+\r
+SYMNUM:        EXP     LENGTH/2        ;COUNT OF INITIAL ENTRIES IN SYMBOL TABLE\r
+       1B0                             ;MOST NEGATIVE POSSIBLE SYMBOL\r
+       -1                      ;GARBAGE VALUE FOR MOST NEG. SYMBOL\r
+       -1B36           ;MOST POSITIVE POSSIBLE SYMBOL\r
+       -1                      ;GARBAGE VALUE FOR MOST POS. SYMBOL\r
+LENGTH=        .-SYMNUM\r
+\fMLON\r
+M1:    TLNN    IO,IOLST        ;IS PROGRAM LISTING SUPPRESSED?\r
+       PUSHJ   PP,WRITE        ;NO, OUTPUT CHARACTER\r
+M2:    PUSHJ   PP,READ         ;GET NEXT CHARACTER\r
+M2A:   CAIN C,177              ;RUBOUT?\r
+       JRST FAILM              ;ALL "NEW STYLE" CREF DATA BEGINS WITH RUBOUT\r
+       CAIN C,12\r
+       JRST M1\r
+       CAIN C,15\r
+       JRST FCKLF\r
+       CAIG C,%EOF             ;IS CHAR IN RANGE OF "OLD STYLE" CREF CONTROL CHARS.?\r
+       CAIGE C,%OP\r
+       SKIPA                   ;NO\r
+       JRST M2C                ;YES\r
+       TLZE IO,IOENDL\r
+       TLNE IO,IOLST\r
+       JRST M1\r
+       PUSH PP,C\r
+       MOVEI C,11\r
+       PUSHJ PP,WRITE\r
+       POP PP,C\r
+       JRST M1\r
+\r
+M2C:   TLNE IO,IOFAIL          ;IF "NEW STYLE" DATA SEEN (IOFAIL=1),IGNORE OLD\r
+       JRST M1                 ;IGNORE "OLD STYLE" CREF DATA\r
+       TLZ IO,IOENDL\r
+       TLO IO,IOTB2\r
+       XCT     MTAB-%OP(C)     ;DO SOMETHING (USUALLY SET BITS) WITH CONTROL CHAR\r
+       JRST    M3              ;BITS WERE SET (EITHER IOOP,IOMAC, OR IOSYM)\r
+\r
+M2B:   TLNN    IO,IOLST\r
+       PUSHJ   PP,CNVRT        ;IF MAKING LISTING, CONVERT (LINE) TO TEXT\r
+       TLNE IO,IOTABS\r
+       JRST    [MOVEI  C,11\r
+                TLNN   IO,IOLST\r
+                PUSHJ  PP,WRITE\r
+                JRST   M2B1\r
+               ]\r
+M2B1:  AOJA    LINE,M2         ;INDEX LINE NUMBER AND START ON NEXT LINE\r
+\r
+\fM3:   MOVEI   AC0,0   ;INIT RADIX 50 SYMBOL\r
+M4:    PUSHJ   PP,READ ;GET NEXT CHAR FOR SYMBOL\r
+       CAIL    C,"$"\r
+       CAILE   C,"Z"\r
+       JRST    M5A             ;CHAR NOT IN RADIX 50 SET\r
+       HLRZ    C,CSTAT-" "(C)  ;GET RADIX 50 CODE FOR CHAR\r
+       JUMPE   C,M5A           ;CHAR NOT IN RADIX 50 SET\r
+       IMULI   AC0,50          ;BUILD SYMBOL AND LOOP\r
+       ADD     AC0,C\r
+       JRST    M4\r
+\r
+M5A:   PUSHJ PP,M5             ;LEFT JUSTIFY SYMBOL AND STORE IN DATA TABLES\r
+       JRST M2\r
+\r
+       IMULI   AC0,50\r
+M5:    CAMG    AC0,[RADIX5 0,%%%%% ]\r
+       JUMPN   AC0,.-2         ;MULTIPLY BY 50 UNTIL LEFT JUSTIFIED\r
+       JUMPN   AC0,M6          ;SYMBOL GOOD IF NOT ZERO, SAVE IN TABLES\r
+ERROR:         JSP     RC,ERRMSG ;     MOVE    PP,[IOWD PDL,PPSET]     ;RESTORE PP\r
+       SIXBIT  /?IMPROPER INPUT DATA@/\r
+\r
+M6:    TDNE    IO,SX           ;IS THIS TYPE OF SYMBOL BEING CROSS REFERENCED?\r
+       TLNE    IO,IONCRF\r
+       POPJ    PP,             ;NO\r
+       IOR     AC0,SX  ;PUT SYMBOL TYPE BITS INTO SYMBOL\r
+\r
+       CAML    LINE,LOWLIM     ;IS THIS LINE INSIDE THE COMMAND STRING RANGE REQUEST?\r
+       CAMLE   LINE,UPPLIM\r
+       TDZA    FLAG,FLAG       ;NO\r
+       MOVSI   FLAG,(1B0)      ;YES, SET FLAG TO STORE IN DATA TABLES\r
+       JRST    SRCH            ;STORE SYMBOL, SYM TYPE, AND RANGE FLAG IN TABLES\r
+       POPJ    PP,\r
+\r
+;THIS TABLE'S ENTRIES ARE EXECUTED FROM M2C+4\r
+\r
+MTAB:  MOVSI   SX,IOOP         ;CODE TYPE IS OP CODE, OPDEF,PSEUDO INSTRUCTION \r
+       MOVSI   SX,IOMAC        ;MACRO NAME\r
+       SKIPA   C,LINE\r
+       MOVSI   SX,IOSYM        ;NORMAL SYMBOL (DEFINED WITH = OR :)\r
+       JRST R0                 ;BREAK BETWEEN PROGRAMS\r
+\r
+FCKLF: TLNE IO,IOTABS!IOTB2\r
+       TLO IO,IOENDL\r
+       JRST M1\r
+\fR0:   TLO IO,IOPAGE\r
+       SETZM FIRSTL            ;FOR TABLES, EVERYTHING GETS LISTED\r
+       PUSH PP,SYMBOL\r
+IFN FAILC,<\r
+       SKIPE BYTEX,BLKST       ;CHECK FOR FAIL BLOCK STRUCTURE\r
+       PUSHJ PP,BLKPRN\r
+>\r
+       SOS     SX,0(SYMBOL)\r
+       MOVSI   FLAG,IOSYM\r
+R1:    PUSHJ   PP,LINOUT\r
+R1B:   SOJE    SX,FINIS\r
+       ADDI    SYMBOL,2\r
+       SKIPL   2(SYMBOL)\r
+       JRST    R1B\r
+       MOVE    C,1(SYMBOL)\r
+       HRRZ    BYTEX,2(SYMBOL)\r
+       ADDI BYTEX,1\r
+       HRLI    BYTEX,(POINT 6,0,5)\r
+       MOVE    BYTEM,-1(BYTEX)\r
+\r
+R1A:   TDZE    C,FLAG\r
+       JRST    R2\r
+       TLO     IO,IOPAGE\r
+       LSH     FLAG,1\r
+       JUMPN   FLAG,R1A\r
+\r
+R2:    TLZ IO,IONLZ    ;NO NON-ZEROS YET (FOR F4 ONLY)\r
+       PUSHJ   PP,R50ASC\r
+       MOVEI   LINE,0\r
+\r
+R3:    PUSHJ   PP,GETVAL\r
+       JRST    R1\r
+       PUSHJ   PP,CNVRT\r
+       JRST    R3\r
+\f;SUBROUTINE TO CONVERT LINE NUMBERS TO ASCII TEXT\r
+CNVRT: MOVEI   TEMP,6  ;OUTPUT SPACES FOR LEADING ZEROS\r
+CNVR1: MOVEI C+1," "-"0"\r
+       SKIPE C\r
+       IDIVI C,12\r
+       HRLM C+1,(PP)\r
+       SOSG TEMP\r
+       SKIPE C\r
+       PUSHJ PP,CNVR1\r
+       HLRZ C,(PP)\r
+       MOVEI C,"0"(C)\r
+       JRST WRITE\r
+\r
+R50ASC:        IDIVI   C,50\r
+       PUSH    PP,CS\r
+       SKIPE   C\r
+       PUSHJ   PP,R50ASC\r
+       POP     PP,C\r
+       HRRZ    C,CSTAT(C)\r
+       CAIN C,"0"      ;TEST FOR LEADING 0'S\r
+       TLNE IO,IONLZ\r
+       TLOA IO,IONLZ\r
+       MOVEI C," "\r
+       JRST    WRITE0\r
+\fFREAD:        PUSHJ PP,READ   ;GET CHARACTER COUNT\r
+       MOVE TEMP1,C    ;1ST CHAR IS COUNT OF CHARS IN FOLLOWING SYMBOL\r
+       MOVEI AC0,0\r
+FM4:   PUSHJ PP,READ\r
+       CAIL C,"$"\r
+       CAILE C,"Z"     ;CHECK RANGE\r
+       JRST ERROR\r
+       HLRZ C,CSTAT-" "(C)\r
+       JUMPE C,ERROR   ;ILLEGAL RADIX50\r
+       IMULI AC0,50\r
+       ADD AC0,C\r
+       SOJG TEMP1,FM4  ;MORE CHARS TO GO?\r
+       POPJ PP,\r
+\r
+FAILM: PUSHJ PP,READ   ;IS THIS REALLY THE START?\r
+       CAIE C,102      ;RUBOUT B BEGINS ALL "NEW STYLE" CREF DATA\r
+       JRST NOTINF\r
+       TLZ IO,IOENDL   ;INFORMATION WAS SEEN\r
+       TLO IO,IOFAIL   ;THIS IS FAIL\r
+FM2:   PUSHJ PP,READ\r
+       CAIN C,177      ;POSSIBLE END?\r
+       JRST TEND       ;CHECK\r
+       CAILE C,16      ;IN RANGE?\r
+       JRST ERROR\r
+       XCT DTAB-1(C)\r
+       TLZE SX,IODF2   ;DO WE WANT TO DEFINE IT?\r
+       TLO IO,IODEF    ;YES, SET FLAG\r
+       PUSHJ PP,FREAD  ;GET THE SYMBOL\r
+FM6:   PUSHJ PP,M5     ;GO ENTER SYYMBOL\r
+       JRST FM2\r
+\r
+NOTINF:        PUSH PP,C       ;PUT IT OUT AS IT WAS READ\r
+       MOVEI C,177\r
+       TLNN IO,IOLST\r
+       PUSHJ PP,WRITE\r
+       POP PP,C\r
+       JRST M1 ;BACK INTO MAIN STREAM\r
+\r
+TEND:  MOVE AC0,SVLAB  ;IS THERE A LABEL TO PUT IN\r
+       SETZM SVLAB\r
+       MOVSI SX,IOSYM\r
+       SKIPE AC0\r
+       PUSHJ PP,M5\r
+       PUSHJ PP,READ   ;CHECK FOR END CHARACTER\r
+       CAIN C,101\r
+       TLO IO,IOTABS   ;CREF DATA TERMINATED WITH "RUBOUT A" MEANS\r
+                       ;INSERT TAB IN LISTING\r
+       CAIE C,103      ;ALL NEW STYLE CREF DATA ENDS WITH "RUBOUT A" OR "RUBOUT C"\r
+       CAIN C,101\r
+       SKIPA\r
+       JRST ERROR      ;BAD CREF DATA\r
+       MOVE C,LINE     ;SET UP TO ENTER\r
+       JRST M2B\r
+\f;TABLE FOR NEW STYLE CREF CONTROL CHARACTERS\r
+;THE TABLE ENTRIES ARE EXECUTED FROM FM2+5\r
+\r
+DTAB:  JRST SETLAB             ;FOLLOWING SYM DEFINED WITH = OR :\r
+       JRST DLAB               ;THE DEFINING OCCURANCE OF THE ABOVE  SYMBOL\r
+       MOVSI SX,IOOP           ;FOLLOWING SYM IS OP CODE, OPDEF, OR PSEUDO INSTRUCTION\r
+       MOVSI SX,IOOP!IODF2     ;DEFINING OCCURANCE OF THE ABOVE (I. E. OPDEF)\r
+       MOVSI SX,IOMAC          ;MACRO NAME\r
+       MOVSI SX,IOMAC!IODF2    ;MACRO DEFINITION\r
+       REPEAT 6,<JRST ERROR>\r
+IFN FAILC,<\r
+       JRST BBEG       ;BEGINNING OF A BLOCK FOR THE STANFORD "FAIL" ASSEMBLER\r
+       JRST BBEND      ;END OF THE ABOVE BLOCK\r
+>\r
+\r
+IFE FAILC,<\r
+       JRST    ERROR           ;BLOCK STRUCTURE NOT ASSEMBLED IN\r
+       JRST    ERROR\r
+>\r
+\fSETLAB:       PUSHJ PP,FREAD          ;GET LABEL\r
+       EXCH AC0,SVLAB          ;CHANGE FOR OLD\r
+       JUMPE AC0,FM2           ;NO OLD, GO GET MORE\r
+       MOVSI SX,IOSYM          ;SET TO DEFINE\r
+       JRST FM6\r
+\r
+DLAB:  MOVE AC0,SVLAB          ;USE LAST LABEL\r
+       SETZM SVLAB\r
+       JUMPE AC0,ERROR         ;ERROR IF NONE THERE\r
+       MOVSI SX,IOSYM\r
+       TLO IO,IODEF\r
+       JRST FM6\r
+\r
+IFN FAILC,<\r
+BBEG:  AOS TEMP,LEVEL          ;GET CURRENT LEVEL\r
+       MOVSI SX,0\r
+       PUSHJ PP,COMBG          ;GO INSER\r
+       JRST FM2\r
+\r
+BBEND: MOVE TEMP,LEVEL         ;CURRENT LEVEL\r
+       MOVEI SX,1\r
+       PUSHJ PP,COMBG\r
+       SOS LEVEL               ;RESET\r
+       JRST FM2\r
+\r
+COMBG: PUSHJ PP,FREAD          ;GET NAME\r
+       SKIPA\r
+       IMULI AC0,50\r
+       CAMG AC0,[RADIX50 0,%%%%% ]\r
+       JRST .-2\r
+       MOVE TEMP1,FREE\r
+       ADDI FREE,4             ;RESERVE 4 WORDS\r
+       CAML FREE,SYMBOL\r
+       PUSHJ PP,XCEED          ;OVERLAP\r
+       MOVEM AC0,(TEMP1)       ;SAVE NAME\r
+       HRLZM TEMP,1(TEMP1)     ;AND LEVEL\r
+       MOVEM LINE,2(TEMP1)     ;AND CURRENT LINE\r
+       HRLM SX,2(TEMP1)\r
+       MOVE TEMP,BLKND         ;SAVE CURRENT POINTER\r
+       HRRM TEMP1,1(TEMP)      ;SET UP LINK\r
+       MOVEM TEMP1,BLKND\r
+       POPJ PP,\r
+>\r
+\fIFN FAILC,<\r
+BLKPRN:        PUSHJ PP,LINOUT\r
+       MOVE C,@BLKND\r
+       PUSHJ PP,R50ASC\r
+       MOVEI C,11\r
+       PUSHJ PP,WRITE\r
+       MOVE C,[RADIX50 0,PROGRA]\r
+       PUSHJ PP,R50ASC\r
+       MOVEI C,"M"\r
+       PUSHJ PP,WRITE\r
+BLKP3: PUSHJ PP,LINOUT\r
+       HLRZ BYTEM,1(BYTEX)\r
+       LSH BYTEM,-1\r
+       JUMPE BYTEM,BLKP1\r
+       PUSHJ PP,TABOUT\r
+       SOJG BYTEM,.-1\r
+BLKP1: HLRZ BYTEM,1(BYTEX)\r
+       HLRZ SX,2(BYTEX)\r
+       TRNE BYTEM,1\r
+       ADDI SX,4\r
+       JUMPE SX,BLKP2\r
+       MOVEI C," "\r
+       PUSHJ PP,WRITE\r
+       SOJG SX,.-1\r
+BLKP2: MOVE C,(BYTEX)\r
+       PUSHJ PP,R50ASC\r
+       HLRZ SX,2(BYTEX)\r
+       MOVNS SX\r
+       ADDI SX,5\r
+       MOVEI C," "\r
+       PUSHJ PP,WRITE\r
+       SOJG SX,.-1\r
+       HRRZ C,2(BYTEX)\r
+       PUSHJ PP,CNVRT\r
+       HRRZ BYTEX,1(BYTEX)\r
+       JUMPN BYTEX,BLKP3\r
+       TLO IO,IOPAGE\r
+       POPJ PP,\r
+>\r
+\f;THE LEFT HALF OF THIS TABLE IS USED TO CONVERT FROM ASCII TEXT\r
+       ;TO RADIX 50 CODE- THE FIRST LOCATION STARTS AT 40 (SPACE)\r
+       ;ZERO ENTRIES IN LEFT HALF INDICATE INVALID RADIX 50 CHAR\r
+;THE RIGHT HALF IS USED TO CONVERT FROM RADIX 50 TO ASCII\r
+\r
+CSTAT:\r
+       XWD     00," "\r
+       XWD     00,"0"\r
+       XWD     00,"1"\r
+       XWD     00,"2"\r
+       XWD     46,"3"\r
+       XWD     47,"4"\r
+       XWD     00,"5"\r
+       XWD     00,"6"\r
+\r
+       XWD     00,"7"\r
+       XWD     00,"8"\r
+       XWD     00,"9"\r
+       XWD     00,"A"\r
+       XWD     00,"B"\r
+       XWD     00,"C"\r
+       XWD     45,"D"\r
+       XWD     00,"E"\r
+\r
+       XWD     01,"F"\r
+       XWD     02,"G"\r
+       XWD     03,"H"\r
+       XWD     04,"I"\r
+       XWD     05,"J"\r
+       XWD     06,"K"\r
+       XWD     07,"L"\r
+       XWD     10,"M"\r
+\r
+       XWD     11,"N"\r
+       XWD     12,"O"\r
+       XWD     00,"P"\r
+       XWD     00,"Q"\r
+       XWD     00,"R"\r
+       XWD     00,"S"\r
+       XWD     00,"T"\r
+       XWD     00,"U"\r
+\f      XWD     00,"V"\r
+       XWD     13,"W"\r
+       XWD     14,"X"\r
+       XWD     15,"Y"\r
+       XWD     16,"Z"\r
+       XWD     17,"."\r
+       XWD     20,"$"\r
+       XWD     21,"%"\r
+\r
+       XWD     22,0\r
+       XWD     23,0\r
+       XWD     24,0\r
+       XWD     25,0\r
+       XWD     26,0\r
+       XWD     27,0\r
+       XWD     30,0\r
+       XWD     31,0\r
+\r
+       XWD     32,0\r
+       XWD     33,0\r
+       XWD     34,0\r
+       XWD     35,0\r
+       XWD     36,0\r
+       XWD     37,0\r
+       XWD     40,0\r
+       XWD     41,0\r
+\r
+       XWD     42,0\r
+       XWD     43,0\r
+       XWD     44,0\r
+;----\r
+\f;SEARCH THE SYMBOL TABLE AND STORE STUFF IN IT\r
+SRCH:  HRRZ    SX,SRCMID       ;GET POINTER TO SYM IN MIDDLE OF TABLE\r
+SRCH01:        HRRZ    TX,SRCMSB       ;GET "MOST SIGNIFICANT BIT"\r
+                               ; OF TABLE ENTRY COUNT\r
+\r
+;START LOGORITHMIC SEARCH\r
+SRCH10:        CAML    AC0,-1(SX)      ;IS SYMBOL HIGHER THAN THIS?\r
+       JRST    SRCH30          ;YES\r
+SRCH12:        SUB     SX,TX           ;NO,MOVE DOWN BY DELTA INCREMENT\r
+SRCH13:        LSH     TX,-1           ;DIVIDE DELTA INCREMENT BY 2\r
+       CAMG    SX,TOP          ;OVER THE TOP OF THE TABLE?\r
+       JUMPN   TX,SRCH10       ;NO,GO LOOK SOME MORE (SEARCH IS OVER WHEN DELTA=0)\r
+       JUMPN   TX,SRCH12       ;YES,MOVE DOWN INTO TABLE (SEARCH IS OVER WHEN DELTA=0)\r
+       CAMLE   LINE,UPPLIM     ;SYMBOL NOT FOUND, SAVE SYMBOL IF IT MIGHT BE \r
+                       ;IN RANGE (SPECIFIED IN COMMAND STRING) OR IF NO RANGE GIVEN\r
+       POPJ    PP,\r
+       SUBI    SX,1            ;MAKE SX POINT TO 1ST SYM TO BE MOVED\r
+       MOVEI   TX,-2(SYMBOL)\r
+       CAILE   TX,2(FREE)      ;IS THERE ROOM LEFT BETWEEN THE TWO TABLES?\r
+       JRST    SRCH20          ;YES\r
+       PUSHJ   PP,XCEED        ;NO, GET MORE CORE AND MOVE SYM TABLE UP\r
+       ADDI    SX,2000         ;UPDATE SY TABLE POINTERS BY AMOUNT OF NEW CORE\r
+       ADDI    TX,2000\r
+\r
+SRCH20:        MOVE    SYMBOL,TX\r
+       HRLI    TX,2(TX)\r
+       BLT     TX,-2(SX)       ;MOVE SYM TABLE TO MAKE HOLE\r
+       AOS     0(SYMBOL)       ;INDEX SYM TAB ENTRY COUNT TO ACCOUNT FOR NEW ENTRY\r
+       MOVE    TX,FREE         ;GET 1ST ADR OF A WORD PAIR FOR STORING INCREMENTS\r
+       MOVEI BYTEX,1(FREE)     ;GET ADR OF 2ND BYTE FOR 1ST WORD PAIR\r
+       HRLI    BYTEX,(POINT 6,,5)      ;SET UP POINTER FOR 2ND BYTE OF 1ST WORD PAIR\r
+       ADDI    FREE,2          ;UPDATE FREE WORD POINTER\r
+       MOVEM   AC0,-1(SX)      ;SAVE SYMBOL IN SYMBOL TABLE\r
+       SETZM 1(TX)             ;ZERO BYTES AND POINTER TO 2ND WORD PAIR\r
+       MOVEI C,1               ;ASSUME NON-DEF OCCURANCE OF SYMBOL\r
+       TLNE IO,IODEF           ;CORRECT ASSUMPTION?\r
+       TRC C,3                 ;NO, 2 INDICATES A DEF OCCURANCE (1 IS NON-DEF)\r
+       DPB C,[POINT 6,1(TX),5] ;SAVE REASON (DEF OR NOT) OF \r
+                               ;LAST OCCURANCE OF SYM IN 1ST BYTE\r
+       MOVE C,LINE\r
+       LSH C,1         ;LINE # IS STORED SHIFTED LEFT 1 TO LEAVE ROOM FOR A 1 BIT\r
+                               ;FOR A DEF OCCR OF THE SYMBOL\r
+       TLZN IO,IODEF\r
+       IORI C,1                ;IT WAS DEF OCCURANCE, TURN ON BIT\r
+       HRLM    LINE,0(SX)      ;SAVE LINE # AND DEFINE BIT IN LEFT HALF OF SYM VALUE\r
+       HRRM    TX,0(SX)        ;SAVE POINTER TO BYTE WORD PAIRS\r
+                               ; IN RIGHT HALF OF SYM VALUE\r
+       PUSHJ   PP,SRCHI        ;CALCULATE NEW MIDDLE ADR OF SYM TABLE AND \r
+                               ;A NEW STARTING DELTA\r
+       JRST    STV12\r
+\fSRCH30:       CAMN    AC0,-1(SX)      ;HAS THE SYMBOL BEEN FOUND?\r
+       JRST    STV10           ;YES\r
+       ADD     SX,TX           ;NO, LOOK HIGHER IN TABLE\r
+       JRST    SRCH13\r
+\r
+\f;SYMBOL FOUND IN TABLE\r
+STV10: LDB     C,[POINT 17,0(SX),17]   ;GET LAST LINE # WHERE SYMBOL WAS SEEN\r
+       HRRZ TX,0(SX)           ;GET ADR OF 1ST WORD OF 1ST WORD PAIR\r
+                               ;WHERE INCREMENTS ARE STORED\r
+       CAME C,LINE             ;IS THIS OCCR ON SAME LINE AS LAST OCCR?\r
+       JRST STV10A             ;NO\r
+       LDB TEMP,[POINT 6,1(TX),5];YES, GET REASON (DEF OR NOT) FOR STORING LAST TIME\r
+       TLNN IO,IODEF   ;IS THIS OCCR A DEF ONE?\r
+       JRST STV10B     ;NO\r
+       TROE TEMP,2     ;YES, WAS THE PREVIOUS ONE DEF? (A LINE MAY HAVE BOTH\r
+                       ;DEF AND NON-DEF OCCRS)\r
+       POPJ PP,        ;YES, DO NOTHING (2 DEFG OCCURANCES ON SAME LINE)\r
+       JRST STV10C     ;NO,DEF+NON-DEF OCCRS ON SAME LINE\r
+STV10B:        TROE TEMP,1     ;WAS PREVIOUS OCCR NON-DEF?\r
+       POPJ PP,        ;YES, DO NOTHING (2 NON-DEF OCCRS ON SAME LINE)\r
+STV10C:        DPB TEMP,[POINT 6,1(TX),5];SAVE TYPE (DEF OR NOT) OF OCCR IN 1ST BYTE\r
+       JRST STV10D     ;STORE INDICATING DEF+NON-DEF ON SAME LINE\r
+\r
+;THIS SYMBOL IS A NEW SYMBOL NEVER BEFORE SEEN\r
+STV10A:        MOVEI TEMP,1            ;ASSUME THIS IS A NON-DEF OCCR\r
+       TLNE IO,IODEF           ;CORRECT ASSUMPTION?\r
+       TRC TEMP,3              ;NO, CHANGE 1 TO A 2 TO SHOW DEFING OCCR\r
+       DPB TEMP,[POINT 6,1(TX),5]      ;SAVE NEW LINE # IN BITS 0-17 OF SYM VALUE\r
+STV10D:\r
+       DPB LINE,[POINT 17,0(SX),17]\r
+       LSH LINE,1\r
+       TLZN IO,IODEF\r
+       IORI LINE,1             ;MAKE DEFINE BIT BE LOW ORDER BIT OF 2*LINE#\r
+       LSH C,1\r
+       SUBM    LINE,C          ;CALCULATE DELTA LINE#\r
+       LSH LINE,-1             ;NOW ELIMINATE DEFINE BIT\r
+       MOVE    BYTEX,0(TX)     ;GET BYTE POINTER TO LAST BYTE FOR LAST SYM OCCURRANCE\r
+\f\r
+STV12: ORM     FLAG,0(SX)      ;SAVE SYMBOL TYPE (MACRO, SYMBOL,OP CODE)\r
+       CAIGE   C,^D32          ;IS DELTA LINE# (OR LINE# THE 1ST TIME)\r
+                               ; BIGGER THAN 1 BYTE?\r
+       JRST    STV20           ;NO, IT FITS\r
+       MOVEM   PP,PPTEMP       ;2 (OR MORE) BYTES NEEDED\r
+\r
+;DIVIDE 2*LINE#+DEFINE BIT  INTO 5 BIT BYTES, TURN ON\r
+;BIT 30 WHENEVER THERE ARE MORE BYTES LEFT. CALL\r
+;STV20 TO STORE THE BYTES AWAY. FOR THE LAST BYTE DO NOT TURN ON BIT 30,\r
+;THUS INDICATING NO MORE BYTES\r
+STV14: IDIVI   C,^D32\r
+       PUSH    PP,CS\r
+       CAIL    C,^D32\r
+       JRST    STV14\r
+STV16: TRO     C,40\r
+       PUSHJ   PP,STV20\r
+       POP     PP,C\r
+       CAME    PP,PPTEMP\r
+       JRST    STV16\r
+\r
+STV20: TRNE    BYTEX,1         ;IS BYTE POINTER IN 1ST WORD OF WORD PAIR? OR\r
+       CAML    BYTEX,[POINT 6,,16]     ;IN LEFT HALF OR 2ND WORD OF PAIR?\r
+       JRST    STV22           ;YES, CONTINUE USING THIS WORD PAIR\r
+       HRRM    FREE,0(BYTEX)   ;NO,MAKE RH OF 2ND WORD OF PAIR POINT TO NEW WORD PAIR\r
+       MOVE    BYTEX,FREE      ;INIT ADREESS OF BYTE POINTER IN NEW WORD PAIR\r
+       HRLI    BYTEX,(POINT 6,,);INIT BYTE POINTER PARTS TO LEFT BYTE OF\r
+                               ; 1ST WORD OF NEW PAIR\r
+       ADDI    FREE,2          ;UPDATE FREE END OF TABLE\r
+       CAML    FREE,SYMBOL     ;ROOM AVAILABLE?\r
+       PUSHJ   PP,XCEED        ;NO, GET MORE CORE AND MOVE SYMBOL TABLE UP\r
+\r
+STV22: IDPB    C,BYTEX         ;STORE INCREMENT BYTE AWAY\r
+       MOVEM   BYTEX,0(TX)     ;SAVE BYTE POINTER IN 1ST WORD OF 1ST WORD PAIR\r
+POPOUT:        POPJ    PP,\r
+\fGETVAL:       TLZN IO,IODEF\r
+       JRST GETV20\r
+       MOVEI C,"#"\r
+       PUSHJ PP,WRITE\r
+GETV20:        CAMN    BYTEX,BYTEM\r
+       POPJ    PP,\r
+       AOS     0(PP)\r
+       PUSHJ   PP,TABOUT\r
+       MOVEI   C,0\r
+GETV10:        TRNE    BYTEX,1\r
+       CAML    BYTEX,[POINT 6,,16]\r
+       JRST    GETV12\r
+       MOVE    BYTEX,0(BYTEX)\r
+       HRLI    BYTEX,(POINT 6,,)\r
+\r
+GETV12:        ILDB    CS,BYTEX\r
+       ROT     CS,-5\r
+       LSHC    C,5\r
+       JUMPN   CS,GETV10\r
+       TRNN C,1        ;SET DEFINED FLAG\r
+       TLO IO,IODEF\r
+       LSH C,-1\r
+       ADDB    LINE,C\r
+       POPJ    PP,\r
+\fTABOUT:       MOVEI   C,11\r
+       SOJGE   WPL,WRITE0\r
+       PUSHJ   PP,LINOUT\r
+       JRST    TABOUT\r
+\r
+LINOUT:        SOSG    LPP\r
+       TLO     IO,IOPAGE\r
+       MOVEI   C,15\r
+       PUSHJ   PP,WRITE\r
+       MOVEI   C,12\r
+       PUSHJ   PP,WRITE\r
+       MOVEI   WPL,WPLLPT              ;ASSUME LINES FOR LPT\r
+       TLNE IO,IOTTY                   ;CORRECT ASSUMPTION?\r
+       MOVEI WPL,WPLTTY                ;NO, SET UP LINES TO TTY\r
+\r
+       POPJ    PP,\r
+\r
+WRITE0:        TLZN    IO,IOPAGE\r
+       JRST    WRITE\r
+       PUSH    PP,C\r
+       MOVEI   C,14\r
+       PUSHJ   PP,WRITE\r
+       MOVEI   C,.LPP\r
+       MOVEM   C,LPP\r
+       POP     PP,C\r
+\r
+WRITE: CAMGE LINE,FIRSTL       ;HAVE WE REACHED REQUESTED LINE?\r
+       POPJ PP,\r
+       SOSG    LSTBUF+2\r
+       PUSHJ   PP,DMPLST\r
+       IDPB    C,LSTBUF+1\r
+       CAIN    C,12            ;IF NOT LINE-FEED, OR\r
+       TLNN IO,IOTTY           ;IF NOT TTY, DON'T OUTPUT EVERY LINE\r
+       POPJ    PP,\r
+       JRST DMPLST             ;OUPUT LINE\r
+\f;GET 1K MORE CORE AND MOVE THE SYMBOL TABLE (BOTH DDT'S AND CREF'S)\r
+;UP INTO THE NEW SPACE\r
+\r
+XCEED: PUSH    PP,0\r
+       PUSH    PP,1\r
+       PUSH    PP,2\r
+       HRRZ    1,JOBREL        ;GET CURRENT TOP\r
+       MOVEI   0,2000(1)\r
+XCEED2:        CORE    0,              ;REQUEST MORE CORE\r
+       JRST    ERRCOR          ;ERROR, BOMB OUT\r
+       HRRZ    2,JOBREL        ;GET NEW TOP\r
+\r
+XCEED1:        MOVE    0,0(1)          ;GET ORIGIONAL\r
+       MOVEM   0,0(2)          ;STORE IN NEW LOCATION\r
+       SUBI    2,1             ;DECREMENT UPPER\r
+       CAMLE   1,SYMBOL        ;HAVE WE ARRIVED?\r
+       SOJA    1,XCEED1        ;NO, GET ANOTHER\r
+       MOVEI   1,2000\r
+       ADDM    1,SYMBOL\r
+       ADDM    1,JOBSYM\r
+       ADDM    1,TOP\r
+       POP     PP,2\r
+       POP     PP,1\r
+       POP     PP,0\r
+\r
+;FIND LEFT MOST BIT OF NUMBER OF ENTRIES IN SYMBOL TABLE AND\r
+;STORE IT IN SRCMSB. FIND MIDDLE ADR OF SYMBOL TABLE AND STORE\r
+;THE ADR IN SRCMID\r
+\r
+SRCHI: PUSH    PP,0\r
+       PUSH    PP,1\r
+       MOVEI   1,0\r
+       FAD     1,0(SYMBOL)\r
+       LSH     1,-^D27\r
+       MOVEI   0,1000\r
+       LSH     0,-357(1)\r
+       HRRZM   0,SRCMSB\r
+       LSH     0,1\r
+       ADD     0,SYMBOL\r
+       HRRZM   0,SRCMID\r
+       POP     PP,1\r
+       POP     PP,0\r
+       POPJ    PP,\r
+\fFINIS:        POP PP,SYMBOL\r
+FINIS3:        TLZN IO,IOEOF   ;END OF FILE SEEN?\r
+       JRST RECYCL     ;NO, RECYCLE\r
+       TLNE    IO,IORPG        ;SEEN AN END-OF-FILE\r
+       JRST    RPGFN           ;NO.\r
+       PUSHJ   PP,CRLF\r
+       PUSHJ   PP,CRLF\r
+       MOVE    C,JOBREL\r
+       ADD     C,FREE\r
+       SUB     C,SYMBOL\r
+       LSH     C,-^D10\r
+       ADDI    C,1\r
+       IDIVI   C,^D10\r
+       JUMPE   C,FINIS1\r
+       ADDI    C,"0"\r
+       PUSHJ   PP,TYO\r
+FINIS1:        MOVEI   C,"0"(CS)\r
+       PUSHJ   PP,TYO\r
+       MOVE RC,[POINT 6,[SIXBIT /K CORE@/]]\r
+       PUSHJ PP,PNTM1          ;PRINT MESSAGE\r
+\fRPGFN:        CLOSE   LST,\r
+       PUSHJ   PP,TSTLST       ;YES, TEST FOR ERRORS\r
+       RELEAS  LST,\r
+       CLOSE   CHAR,\r
+RPGFN1:        RELEAS  CHAR,\r
+       TLNN IO,IORPG\r
+       JRST    CREF            ;RETURN FOR NEXT ASSEMBLY\r
+       MOVSI IO,IORPG\r
+RPGFN2:        PUSHJ PP,TTYIN\r
+       CAIG C,15\r
+       CAIGE C,12\r
+       SKIPA\r
+       JRST RPGFN2\r
+       MOVSI C,70000\r
+       ADDM C,CTIBUF+1\r
+       AOS CTIBUF+2\r
+       JRST RETRPG\r
+\fNAME1:        SETZB   ACDEV,ACFILE\r
+       SETZB   ACEXT,ACDEL\r
+       SETZB   TIO,CS\r
+\r
+NAME3: MOVSI   ACPNTR,(POINT 6,AC0)    ;SET POINTER\r
+       TDZA    AC0,AC0         ;CLEAR SYMBOL\r
+\r
+SLASH: PUSHJ   PP,SW0\r
+GETIOC:        PUSHJ   PP,TTYIN        ;GET INPUT CHARACTER\r
+       CAIN    C,"/"\r
+       JRST    SLASH\r
+       CAIN    C,"("\r
+       JRST    SWITCH\r
+       CAIN    C,":"\r
+       JRST    DEVICE\r
+       CAIN    C,"."\r
+       JRST    NAME\r
+       CAIE    C,"_"\r
+       CAIG    C,15\r
+       JRST    TERM\r
+       CAIN    C,33    ;NEW ALT MODE?\r
+       JRST    TERM    ;YES\r
+       CAIN    C,"["\r
+       JRST    PROGNP          ;GET PROGRAMER NUMBER PAIR\r
+       SUBI    C,40            ;CONVERT TO 6-BIT\r
+       TLNE    ACPNTR,770000   ;HAVE WE STORED SIX BYTES?\r
+       IDPB    C,ACPNTR        ;NO, STORE IT\r
+       JRST    GETIOC          ;GET NEXT CHARACTER\r
+\r
+DEVICE:        SKIPA   ACDEV,AC0       ;DEVICE NAME\r
+NAME:  MOVE    ACFILE,AC0      ;FILE NAME\r
+       MOVE    ACDEL,C         ;SET DELIMITER\r
+       JRST    NAME3           ;GET NEXT SYMBOL\r
+\r
+TERM:  CAIE    ACDEL,":"       ;IF PREVIOUS DELIMITER\r
+       CAIN ACDEL,0            ;ASSUME FILE NAME IF NOTHING ELSE\r
+       MOVE    ACFILE,AC0      ;SET FILE\r
+       CAIN    ACDEL,"."       ;IF PERIOD,\r
+       HLLZ    ACEXT,AC0       ;SET EXTENSION\r
+       POPJ    PP,             ;EXIT\r
+\fPROGNP:       JUMPL   PP,PROGN2       ;ERROR IF OUTPUT\r
+ERRCM: JSP RC,ERRMSG\r
+       SIXBIT /?COMMAND ERROR@/\r
+\r
+PROGN1:        HRLZM   RC,INDIR+3      ;COMMA, STORE LEFT HALF\r
+PROGN2:        MOVEI   RC,0            ;CLEAR AC\r
+PROGN3:        PUSHJ   PP,TTYIN\r
+       CAIN    C,","\r
+       JRST    PROGN1          ;STORE LEFT HALF\r
+       HRRM    RC,INDIR+3      ;ASSUME TERMINAL\r
+       CAIN    C,"]"\r
+       JRST    GETIOC          ;YES, RETURN TO MAIN SCAN\r
+       LSH     RC,3            ;SHIFT PREVIOUS RESULT\r
+       ADDI    RC,-"0"(C)      ;ADD IN NEW NUMBER\r
+       JRST    PROGN3          ;GET NEXT CHARACTER\r
+\fSWITCH:       PUSHJ   PP,TTYIN\r
+       CAIL    C,"0"\r
+       CAILE   C,"9"\r
+       JRST    SWIT1\r
+       PUSHJ   PP,GETLIM\r
+       CAIE    C,","\r
+       JRST    ERRCM\r
+       MOVEM   RC,LOWLIM\r
+       PUSHJ   PP,TTYIN\r
+       PUSHJ   PP,GETLIM\r
+       CAIE    C,")"\r
+       JRST    ERRCM\r
+       MOVEM   RC,UPPLIM\r
+       CAMGE   RC,LOWLIM\r
+       TLO     IO,IONCRF\r
+       JRST    GETIOC\r
+\r
+SWIT1: CAIN    C,")"\r
+       JRST    GETIOC\r
+       PUSHJ   PP,SW1\r
+       PUSHJ   PP,TTYIN\r
+       JRST    SWIT1\r
+\r
+GETLIM:        TDZA    RC,RC\r
+GETLI1:        PUSHJ   PP,TTYIN\r
+       CAIL    C,"0"\r
+       CAILE   C,"9"\r
+       POPJ    PP,\r
+       IMULI   RC,^D10\r
+       ADDI    RC,-"0"(C)\r
+       JRST    GETLI1\r
+\r
+SW0:   PUSHJ   PP,TTYIN\r
+SW1:   MOVEI   C,-"A"(C)       ;CONVERT FROM ASCII TO NUMERIC\r
+       CAILE   C,"Z"-"A"       ;WITHIN BOUNDS?\r
+       JRST    ERRCM           ;NO, ERROR\r
+       MOVE    RC,[POINT 4,BYTAB]\r
+       IBP     RC\r
+       SOJGE   C,.-1           ;MOVE TO PROPER BYTE\r
+       LDB     C,RC            ;PICK UP BYTE\r
+       JUMPE   C,ERRCM         ;TEST FOR VALID SWITCH\r
+       CAIG    C,TEMP\r
+       JUMPL   PP,ERRCM\r
+       XCT     SWTAB-1(C)      ;EXECUTE INSTRUCTION\r
+       POPJ    PP,             ;EXIT\r
+\f      DEFINE  SETSW           (LETTER,INSTRUCTION) <\r
+       INSTRUCTION\r
+J=     <"LETTER"-"A">-^D9*<I=<"LETTER"-"A">/^D9>\r
+       SETCOD  \I,J>\r
+\r
+       DEFINE  SETCOD          (I,J)\r
+       <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>\r
+\r
+BYTAB0=        0                       ;INITIALIZE TABLE\r
+BYTAB1=        0\r
+BYTAB2=        0\r
+\r
+SWTAB:\r
+       SETSW   Z,<TLO  TIO,TIOCLD      >\r
+       SETSW   A,<ADDI CS,1            >\r
+       SETSW   B,<SUBI CS,1            >\r
+       SETSW   K,<TLZ  IO,IOSYM        >\r
+       SETSW   M,<TLZ  IO,IOMAC        >\r
+       SETSW   O,<TLO  IO,IOOP         >\r
+       SETSW   S,<TLO  IO,IOLST        >\r
+       SETSW   T,<TLO  TIO,TIOLE       >\r
+       SETSW   W,<TLO  TIO,TIORW       >\r
+       SETSW R,<SETOM FIRSTL>\r
+\r
+BYTAB:\r
+       +BYTAB0\r
+       +BYTAB1\r
+       +BYTAB2\r
+\f\r
+CRLF:  MOVEI   C,15            ;OUTPUT CARRIAGE RETURN\r
+       PUSHJ   PP,TYO\r
+       MOVEI   C,12            ;AND LINE FEED\r
+TYO:   LSH     C,35\r
+       HRRI    C,C\r
+       DDTOUT  C,              ;TELETYPE CHARACTER OUTPUT\r
+       POPJ    PP,\r
+\fTTYIN:                        ;COMMAND CHARACTER INPUT SUBROUTINE\r
+RPGIN: SOSG CTIBUF+2\r
+       JRST CKRPGI\r
+RPGIN1:        IBP CTIBUF+1\r
+       MOVE C,@CTIBUF+1\r
+       TRNN C,1\r
+       JRST RPGIN2\r
+\r
+       AOS     CTIBUF+1\r
+       MOVNI   C,5\r
+       ADDM    C,CTIBUF+2\r
+       JRST    RPGIN\r
+RPGIN2:        LDB C,CTIBUF+1\r
+       JUMPE C,RPGIN\r
+       CAIE    C," "           ;SKIP BLANKS\r
+       CAIN    C,"     "\r
+       JRST    TTYIN\r
+       CAIE    C,175\r
+       CAIN    C,176\r
+       MOVEI   C,33            ;CHANGE ALL ALT MODES TO 033\r
+       CAIN    C,32\r
+       JRST    TTYIN           ;IGNORE ^Z (EOF)\r
+       CAIL    C,140\r
+       TRZ     C,40            ;CHANGE LOWER CASE TO UPPER CASE\r
+       POPJ    PP,             ;NO, EXIT\r
+\fCKRPGI:\r
+IFN TEMPC,<    SKIPE TMPFLG    ;IS TMPCOR UUO IN ACTION\r
+       JRST TMPDON             ;YES, EXIT>\r
+       IN CTLI,0\r
+       JRST RPGIN1\r
+       STATO CTLI,740000\r
+       JRST RPGCK2\r
+       JSP RC,ERRMSG\r
+       SIXBIT /?DATA ERROR READING COMMAND FILE@/\r
+IFN TEMPC,<\r
+TMPDON:        MOVE AC0,[XWD 2,TEMP]\r
+       MOVSI TEMP,(SIXBIT /CRE/)\r
+       MOVEI TEMP1,0\r
+       CALLI AC0,TMPCOR        ;DELETE TMPCOR FILE "CRE"\r
+       JFCL                    ;FAILED, SO WHO CARES>\r
+LEAVE: CALLI 1,12              ;EXIT\r
+       JRST CREF\r
+\r
+RPGCK2:        TLNN IO,IORPG           ;IN CCL MODE?\r
+       JRST CREF               ;NO, START OVER\r
+       SETZB TEMP,TEMP+1       ;YES, DELETE COMMAND FILE\r
+       SETZB TEMP+2,TEMP+3\r
+       RENAME CTLI,TEMP\r
+       JFCL\r
+       JRST LEAVE\r
+\fREAD: SOSG    INBUF+2         ;BUFFER EMPTY?\r
+       JRST    READ3           ;YES\r
+READ1: ILDB    C,INBUF+1       ;PLACE CHARACTER IN C\r
+       JUMPE C,READ\r
+       POPJ    PP,\r
+\r
+READ3: INPUT   CHAR,0          ;GET NEXT BUFFER\r
+       STATO   CHAR,762000     ;ERROR?\r
+       JRST    READ1           ;NO, GET CHARACTER\r
+       TLO     IO,IOEOF        ;EOF SEEN.  FIRST TIME?\r
+       STATO   CHAR,742000\r
+       JRST    R0\r
+\r
+       MOVEI CS,INDEV\r
+       JSP RC,DVFNEX\r
+       SIXBIT /?INPUT DATA ERROR, @/\r
+\r
+DMPLST:        OUTPUT  LST,0           ;OUTPUT BUFFER\r
+TSTLST:        STATO   LST,740000      ;ANY ERRORS?\r
+       POPJ    PP,             ;NO, EXIT\r
+\r
+       MOVEI CS,LSTDEV\r
+       JSP RC,DVFNEX\r
+       SIXBIT /?OUTPUT DATA ERROR, @/\r
+\fERRAVI:       SKIPA CS,[INDEV]        ;INPUT DEVICE INIT FAILURE\r
+ERRAVL:        MOVEI CS,LSTDEV         ;LISTING DEVICE INIT FAILURE\r
+       JSP RC,DVFNEX\r
+       SIXBIT /?DEVICE NOT AVAILABLE, @/\r
+\r
+\r
+ERRENT:        MOVEI CS,LSTDEV\r
+       JSP RC,DVFNEX\r
+       SIXBIT /?CANNOT ENTER FILE @/\r
+\r
+ERRFND:        MOVEI CS,INDEV\r
+       JSP RC,DVFNEX\r
+       SIXBIT /?CANNOT FIND FILE @/\r
+\r
+ERRCOR:        JSP RC,ERRMSG\r
+       SIXBIT /?INSUFFICIENT MEMORY AVAILABLE@/\r
+\r
+\fERRMSG:       PUSHJ PP,PNTMSG         ;FOR SIMPLE ERROR MESSAGES\r
+       JRST ERRFIN\r
+\r
+DVFNEX:        PUSHJ PP,PNTMSG         ;PRINT MESSAGE DEV:FILENAME.EXT\r
+       PUSHJ PP,PNTSIX         ;PRINT DEVICE\r
+       MOVEI C,":"\r
+       PUSHJ PP,TYO            ;PRINT COLON\r
+       ADDI CS,1               ;ADVANCE POINTER TO FILENAME\r
+       SKIPN (CS)              ;IS FILENAME 0?\r
+       JRST ERRFIN             ;YES, NO FILENAME\r
+       PUSHJ PP,PNTSIX         ;NO, PRINT FILENAME\r
+       ADDI CS,1               ;ADVANCE POINTER TO EXTENSION\r
+       HLLZS C,(CS)            ;ZERO OUT OTHER HALF. EXTENSION=0?\r
+       JUMPE C,ERRFIN          ;EXTENSION 0?\r
+       MOVEI C,"."             ;NO\r
+       PUSHJ PP,TYO            ;PRINT DOT\r
+       PUSHJ PP,PNTSIX         ;PRINT EXTENSION\r
+\r
+ERRFIN:        PUSHJ PP,CRLF\r
+       JRST CREF               ;START CREF OVER\r
+\r
+PNTSIX:        HRLI CS,(POINT 6,0)     ;PRINT 1 WORD OF SIXBIT\r
+PNTSX1:        TLNN CS,770000          ;NEXT ILDB GO OVER WORD BOUNDARY?\r
+       POPJ PP,                ;YES, FINISHED\r
+       ILDB C,CS\r
+       JUMPE C,.-2             ;STOP AT A 0\r
+       ADDI C,40               ;CONVERT TO ASCII\r
+       PUSHJ PP,TYO\r
+       JRST PNTSX1\r
+\r
+PNTMSG:        PUSHJ PP,CRLF           ;PRINT SIXBIT MESSAGE\r
+       HRLI RC,(POINT 6,0)\r
+PNTM1: ILDB C,RC\r
+       CAIN C,40               ;STOP AT @\r
+       POPJ PP,\r
+       ADDI C,40               ;CONVERT TO ASCII\r
+       PUSHJ PP,TYO\r
+       JRST PNTM1\r
+\fLIT\r
+\f\r
+       IFN PURE, <LOC  140>\r
+\r
+SVJFF: BLOCK   1\r
+\r
+CTIBUF:        BLOCK   3       ;COMMAND FILE INPUT BUFFER HEADER\r
+CTIDEV:        BLOCK 1         ;INPUT COMMAND DEVICE\r
+CTIDIR:        BLOCK   4\r
+TMPFIL:        BLOCK 2                 ;SIXBIT /CRE/\r
+                               ;XWD -200,C(JOBFF)\r
+                               ;FOR TMPCOR UUO\r
+TMPFLG:        BLOCK 1         ;FLAG FOR TMPCOR UUO IN PROGRESS\r
+\r
+\r
+STCLR:         ;START BLT CLEAR HERE\r
+\r
+INBUF: BLOCK   3\r
+INDEV: BLOCK   1       ;INPUT DEVICE (FOR ERR MESSAGES ONLY)\r
+INDIR: BLOCK   4\r
+\r
+LSTBUF:        BLOCK   3\r
+LSTDEV:        BLOCK   1       ;LIST DEVICE (FOR ERR MESSAGES ONLY)\r
+LSTDIR:        BLOCK   4\r
+\r
+PPSET: BLOCK   PDL\r
+LPP:   BLOCK   1\r
+\r
+PPTEMP:        BLOCK   1\r
+FIRSTL:        BLOCK 1 ;LINE # AFTER WHICH TO PRINT LISTING\r
+\r
+SRCMSB:        BLOCK   1       ;MOST SIGNIFICANT BIT (USED BY SRCH)\r
+SRCMID:        BLOCK   1       ;ADR IN MIDDLE OF SYM TABLE (USED BY SRCH)\r
+\r
+LOWLIM:        BLOCK   1\r
+UPPLIM:        BLOCK   1\r
+LEVEL: BLOCK   1\r
+SVLAB: BLOCK 1\r
+IFN FAILC,<\r
+BLKST: BLOCK 1\r
+BLKND: BLOCK 1\r
+>\r
+\r
+ENDCLR: END CREF\r
+\f\r