ASMB,Q,C
      NAM RXREF,4,90 24999-16051 REV.2024 800528
************************
*     MODULE CROSS-REFERENCING PROGRAM - VERSION IV 
* 
*     WRITTEN BY:  KATHY HAHN 
* 
*     HISTORY---
* 
*     MODIFIED BY: TERRY DONAHUE
*     DATE MODIFIED:
* 
*     MODIFIED BY:  LYLE WEIMAN 
*     DATE MODIFIED: 14 SEPT '76
*     REASON: TO PRINT FILE NAME,CR #RECORD SIZE(DATE), FULL NAM RECORD 
* 
*     MODIFIED BY: LYLE WEIMAN
*     DATE MODIFIED: 23 FEB. '77
*     REASON: TO PRINT ACTUAL CARTRIDGE REF. # OF FILE, CHANGE ALL
*             EXEC I/O CALLS TO REIO CALLS, AND ALLOW "BATCH" USE.
* 
*     MODIFIED BY: LYLE WEIMAN
*     DATE MODIFIED: 20 DEC '77 
*     REASON: INCORPORATE EMA RECORDS FOR RTE-IV
* 
*     MODIFIED BY: LYLE WEIMAN
*     DATE MODIFIED: MAR 30 '78 
*     REASON: CHANGE NAME TO 'RXREF' SO AS TO AVOID DUPLICATE MODULE
*             NAME (MICROCODE ASSEMBLER'S CROSS-REF IS 'MXREF'
* 
*     MODIFIED BY: LYLE WEIMAN
*     DATE MODIFIED: 11 APR '78 
*     REASON: ALLOW 'BATCH' USAGE 
* 
*     MODIFIED BY: HARVEY CLAWSON 
*     DATE MODIFIED: 1 AUG '79
*     REASON: CONVERT FOR COMPATIBILITY WITH RTE-L (REMOVE 'LG' CAPABILITY
*             AND ALLOW 'LOD' AND 'GEN' RECORDS BEFORE 'NAM' RECORD)
*       ALSO: ALLOW USE OF LARGE BACKGROUND PARTITION (MAKE TYPE 4; USE 
*             'LIMEM' TO DETERMINE FREE MEMORY SIZE)
*       ALSO: ALLOW COMMAND INPUT FROM A FILE 
*       ALSO: ALLOW LIST OUTPUT TO A FILE 
*       ALSO: DEFAULT THE LIST FILE TO THE USER TERMINAL
*       ALSO: LOCK LIST DEVICE FOR DURATION OF PROGRAM
*       ALSO: IMPROVE ERROR REPORTING ON FILE ERRORS
*       ALSO: ALLOW ASCII FILE SUBPARAMETERS (USE 'NAMR' SUBROUTINE). 
*       ALSO: ALLOW SPECIFICATION OF RELOCATABLE FILE NAMES 
*             IN THE RUN STRING 
*       ALSO: ALLOW SEVERAL NEW TERMINATION COMMANDS (END, /E, EX, /A)
*       ALSO: PRINT THE NUMERIC TYPE OF EACH MODULE 
*       ALSO: PRINT A WARNING MESSAGE IF THE MODULES ARE NOT IN LOGICAL 
*             LOAD ORDER. 
* 
*     MODIFIED BY: HARVEY CLAWSON 
*     DATE MODIFIED: 10 OCT '79   
*     REASON: FIX THE ALGORITHM FOR DETERMINING WHETHER ALL MODULES ARE 
*             IN LOGICAL LOAD ORDER.  PRINT AN ASTERISK BESIDE THE  
*             MODULE NAME OF EACH BACKWARD REFERENCE. 
*       ALSO: DELETE TRAILING SPACES FROM OUTPUT RECORDS TO REDUCE THE
*             AMOUNT OF DISC SPACE REQUIRED FOR LISTING TO A FILE.
*       ALSO: ABORT THE CROSS REFERENCE IF THE BREAK FLAG IS SET BY 
*             THE OPERATOR 'BR' COMMAND.
*       ALSO: PRINT THE MODULE NUMBER WITHIN THE FILE (IMMEDIATELY
*             BELOW THE MODULE NAME). 
*       ALSO: ALLOW MORE THAN 256 MODULES TO BE CROSS REFERENCED
*             (LIMITED ONLY BY THE SIZE OF FREE MEMORY).
* 
*     MODIFIED BY: HARVEY CLAWSON 
*     DATE MODIFIED: 27 MAY '80 
*     REASON: PRINT THE TIME AND DATE WITH EACH LISTING 
*       ALSO: CHANGE THE START-UP SEQUENCE TO PROMPT FOR
*             PARAMETERS NOT SPECIFIED IN THE RUN STRING
*       ALSO: MAKE 'EX' EQUIVALENT TO '/E', NOT '/A'. 
* 
      HED  RXREF OPERATING CHARACTERISTICS
* 
*     CALLING SEQUENCE: 
*       RU,RXREF,COMMAND NAMR,LIST NAMR,RELOC1,...,RELOCN,/E
* 
*     WHERE:
*       'COMMAND NAMR' IS A FILE CONTAINING A LIST OF RELOCATABLE 
*                      FILE NAMES (DEFAULTS TO USER TERMINAL, PROMPTS 
*                      WITH '-')
* 
*       'LIST NAMR' IS A LIST DEVICE OR FILE (DEFAULTS TO USER TERMINAL). 
*                   IF THE FILE CANNOT BE FOUND, IT IS CREATED. 
* 
*       'RELOCX' IS THE FILE NAMR OF A RELOCATABLE BINARY FILE OR 
*                OTHER VALID INPUT AS FOLLOWS:
* 
* 
*            <NAMR>        FILE IS OPENED AND SCANNED. NAM,ENT,EXT
*                          & END RECORDS ARE READ AND SORTED FOR
*                          LATER CROSS-REFERENCE PRINTOUT.
* 
*            <LU #>        SAME AS ABOVE, EXCEPT THE SPECIFIED LOGICAL
*                          UNIT IS READ INSTEAD OF A DISC FILE. 
* 
*            -END, END, /E, EX, OR END OF FILE  
*                          SIGNIFIES LAST FILE HAS BEEN INPUT.
*                          CAUSES PROGRAM TO BEGIN ALPHABETICAL SORTING AND 
*                          PRINTOUT OF: 
*                               MODULES, WHERE-USED 
*                               ENTRY POINTS, DEFINING MODULE & REFERENCING 
*                                 MODULES 
*                               UNDEFINED EXTERNALS, WHERE-USED 
* 
*            /A            ABORT.  DO NOT COMPLETE CROSS REFERENCE. 
* 
*     MULTIPLE FILE NAMES MAY BE INPUT IN ONE RECORD. 
      SKP 
* 
*   ERROR MESSAGES (DISPLAYED ON USER TERMINAL):
* 
*     FMP ERROR -NNN ON FILEX (SUBRX) --
*       WHERE:
*         -NNN IS THE FMP ERROR NUMBER
*         FILEX IS THE NAME OF THE FILE OR DEVICE LU
*         SUBRX IS THE NAME OF THE FMP ROUTINE (I.E. OPENF, CLOSE)
* 
*     WAITING FOR FILEX --  THE NAMED FILE OR DEVICE IS OPEN OR LOCKED
*       TO ANOTHER PROGRAM.  ENTER 'BR,RXREF' TO STOP RETRIES.
* 
*     CHECKSUM --  BAD CHECKSUM, OR FILE IS NOT RELOCATABLE BINARY. 
* 
*     NOT ENOUGH SPACE TO COMPUTE LEVEL NUMBER --  BE SURE YOU
*       LOAD THIS PROGRAM TO USE AS LARGE A PARTITION AS POSSIBLE.
* 
*     SYMBOL TABLE-MODULE TABLE OVERFLOW --  BE SURE YOU
*       LOAD THIS PROGRAM TO USE AS LARGE A PARTITION AS POSSIBLE.
* 
*     NNN WARNINGS --  THE SPECIFIED NUMBER OF WARNING MESSAGES HAVE
*       BEEN PRINTED ON THE LIST FILE.
* 
* 
*   WARNING MESSAGES (DISPLAYED ON LIST FILE):
* 
*     ****DUP MODULE NAME:    -- MODULE OF SAME NAME HAS BEEN SEEN BEFORE.
* 
*     ****DUP ENT:       ,SKIP IT --  ENTRY POINT OF SAME NAME HAS BEEN 
*       SEEN BEFORE.
* 
*     ****DUP EXT:       ,SKIP IT --  EXTERNAL REFERENCE REPEATED WITHIN  
*       MODULE. 
* 
*     ****BACKWARD REFERENCE -- TO ALLOW EFFICIENT SEARCHING OF LIBRARIES,
*       EACH MODULE SHOULD PRECEDE THOSE MODULES IT REFERENCES.  THE MODULES
*       MARKED WITH '*' FOLLOW THE REFERENCED MODULE. 
*       TO GUARANTEE EFFICIENT SEARCHING OF LIBRARIES, ALL  
*       BACKWARD REFERENCES MAY BE RESOLVED BY ORDERING THE MODULES IN
*       ASCENDING NUMERICAL LEVEL NUMBER. 
* 
*     ****CIRCULAR REFERENCE -- SOME MODULE REFERS TO A SECOND MODULE WHICH 
*       IN TURN REFERS BACK TO THE FIRST MODULE.  BOTH MODULES ARE LISTED 
*       AS HAVING A LEVEL NUMBER OF 1000. 
* 
      SKP 
* 
*     NOTE: "LEVEL" IS AN INDICATION OF SUBROUTINE NESTING. 
*     IF RXREF SEES A MODULE WHICH IS NOT CALLED FROM ANY OTHER 
*     MODULE, THEN IT ASSIGNS THAT MODULE LEVEL 1.  THE MODULES 
*     THIS MODULE CALLS ARE ASSIGNED LEVEL 2, AND SO ON.
*     LEVELS ARE ASSIGNED BY THE MAXIMUM DEPTH FROM WHICH THEY ARE
*     CALLED.  FOR EXAMPLE, IF A UTILITY SUBROUTINE IS CALLED FROM
*     VARIOUS LEVELS, ITS LEVEL WOULD THEN BE ONE LARGER THAN THE LARGEST 
*     LEVEL NUMBER OF ANY SUBROUTINE WHICH CALLS IT.
*     OCCASIONALLY, IT IS NECESSARY FOR SOFTWARE TO REFER TO
*     LEVELS "ABOVE" IT.  THAT IS, A MODULE AT LEVEL N REFERS 
*     TO ANOTHER MODULE WITH A LOWER LEVEL NUMBER.  IN THIS 
*     CASE, RXREF SIMPLY GIVES UP AND ASSIGNS LEVEL NUMBER 1000.  
*     IF INSUFFICIENT MEMORY IS AVAILABLE TO COMPUTE THE NUMBERS, 
*     ZEROES ARE PRINTED. 
* 
* 
      SKP 
*     TABLE FORMATS:
*      SYMBOL TABLE -- GROWS DOWNWARD FROM LWAM 
*        WORD 7 - ADDRESS OF DEFINING MODULE ENTRY
*        WORD 6 - ADDRESS OF FIRST ENTRY IN USER-MODULE LIST
*        WORD 5 - ADDRESS OF NEXT ALPHA. SYMBOL TABLE ENTRY 
*        WORD 4 - ADDRESS OF NEXT ALPHA. ENTRY IN MODULE-ENT LIST 
*        WORD 3 - CHARACTER 5 OF NAME;  FLAGS 
*        WORD 2 - CHARACTERS 3 AND 4 OF NAME
*        WORD 1 - CHARACTERS 1 AND 2 OF NAME
* 
*      USER-MODULE LIST -- GROWS DOWNWARD WITH THE SYMBOL TABLE 
*        WORD 2 - ADDRESS OF NEXT ENTRY IN USER-MODULE LIST 
*        WORD 1 - ADDRESS OF MODULE ENTRY REFERENCING THIS SYMBOL 
* 
*      MODULE-TABLE -- GROWS UPWARD FROM FWAM;  LENGTH VARIES AS
*       THE NUMBER OF EXT'S IN A MODULE VARY
*        WORD N - ADDRESS OF S.T. ENTRY FOR EXT #N
*           : 
*           : 
*        WORD 8 - ADDRESS OF S.T. ENTRY FOR EXT #1
*        WORD 7 - NUMBER OF EXT'S FOR THIS MODULE 
*        WORD 6 - LEVEL NUMBER
*        WORD 5 - ADDRESS OF FIRST S.T. ENTRY IN MODULE-ENT LIST
*        WORD 4 - ADDRESS OF NEXT ALPHA. MODULE TABLE ENTRY 
*        WORD 3 - CHARACTER 5 OF NAME;  FLAGS 
*        WORD 2 - CHARACTERS 3 AND 4 OF NAME
*        WORD 1 - CHARACTERS 1 AND 2 OF NAME
* 
********
* 
      HED RELOC. MODULE CROSS-REFERENCE GENERATOR 
      EXT KCVT      DECIMAL TO ASCII CONVERSION 
      EXT IFBRK     RETURNS -1 IF BREAK FLAG SET
      EXT CREAT     CREATE A FILE 
      EXT READF     READ A FILE 
      EXT WRITF     WRITE A FILE
      EXT GETST     GETS OPERATOR PARAMETERS
      EXT LOGLU     RETURNS LU OF OPERATOR CONSOLE
      EXT OPENF     LU OR FILE "OPEN" ROUTINE 
      EXT NAMR      FMGR NAMR PARSE ROUTINE 
      EXT CLOSE     FILE CLOSER 
      EXT CNUMD     INTEGER-TO-DECIMAL ASCII CONVERTER
      EXT FSTAT     CARTRIDGE INFO. GETTER
      EXT FTIME     SYSTEM TIME FORMATTER 
      EXT LOCF      FILE INFO 
      EXT LIMEM     GET FIRST WORD AND SIZE OF FREE MEMORY
      EXT EXEC      OPERATING SYSTEM EXECUTIVE
      EXT REIO      BUFFERED I/O
      EXT .MVW      MOVE WORDS
* 
A     EQU     0 
B     EQU     1 
      SUP 
* 
      SKP 
* 
RXREF EQU * 
* INITIALIZATION ROUTINE
* 
*     NOTE: THIS CODE IS OVERLAID AFTER EXECUTION BY
*     THE CARTRIDGE DIRECTORY INFORMATION BLOCK.
* 
* 
      JSB GETST     GET THE RUN STRING
      DEF *+4 
      DEF CMDBF     BUFFER
      DEF M80       LENGTH
      DEF CMD1      TLOG
* 
      JSB LIMEM     GET FREE MEMORY 
      DEF *+4 
      DEF ZERO      GET MEMORY
      DEF FWAM      FIRST WORD OF FREE MEMORY 
      DEF HADDR     # OF WORDS
      LDA FWAM
      STA LADDR 
      ADA M1
      ADA HADDR     COMPUTE LAST WORD 
      STA HADDR 
* 
      JSB LOGLU     GET LU OF OPERATOR CONSOLE
      DEF *+2         (FOR ERROR MESSAGES)
      DEF LUTTY 
      STA LUTTY     STORE LU OF OPERATOR CONSOLE
      IOR B400      SET THE ECHO BIT FOR TERMINAL INPUT 
      STA LUIN
* 
      CLA 
      STA MCNT      NUMBER OF MODULES 
      STA AMDT      ADD OF MODULE TABLE 
      STA ASYMT     ADD OF SYMBOL TABLE 
      STA MADDR     ADD OF CURRENT MODULE ENTRY 
      STA ADDR      ADD OF CURRENT ST ENTRY 
      STA TBPSZ     TOTAL BASE PAGE SIZE
      STA TMNSZ     TOTAL MAIN SIZE 
      STA TCMSZ     TOTAL COMMON SIZE 
      STA WARN      WARNING COUNT 
* 
      CLA,INA 
      STA X         INDEX FOR PARSE ROUTINE 
* 
      LDB CMD1
      SZB,RSS 
      JMP GETIT     NO STRING SPECIFIED, ASK FOR FILES
* 
* 
COM?  JSB NAMR      PARSE COMMAND FILE NAME 
      DEF *+5 
      DEF CNAME     RESULT
      DEF CMDBF 
      DEF CMD1
      DEF X         INDEX 
* 
      LDA CNAME 
      SZA,RSS 
      JMP TTY       INTERACTIVE COMMAND INPUT 
      CPA LUTTY 
      JMP TTY       INTERACTIVE COMMAND INPUT 
* 
      JSB OPENW     OPEN THE COMMAND FILE 
      DEF DCBC      COMMAND DCB 
      DEF IERR
      DEF CNAME     NAME
      DEF ZERO      OPTION
      DEF CSECR 
      DEF CCART 
      JSB FMPER     PRINT ANY ERRORS
      DEF CNAME 
      DEF OPEN
      CLB           NON-INTERACTIVE 
      SSA 
TTY   CCB           USE TERMINAL
      STB TTYFL 
* 
* 
      JSB NAMR      PARSE LIST FILE NAME
      DEF *+5 
      DEF LNAME     RESULT
      DEF CMDBF 
      DEF CMD1
      DEF X 
* 
      CCB 
      LDA CMD1      ANY FILE NAMES PAST THE LIST DEVICE?
      INA 
      CPA X 
      CLB             NO, NO RELOCS IN RUN STRING 
      STB QUIT? 
      LDA LNAME 
      SZA,RSS 
      LDA LUTTY     DEFAULT TO USER TERMINAL
      STA LNAME 
* 
      JSB OPENW     OPEN THE LIST FILE
      DEF DCBL
      DEF IERR
      DEF LNAME     NAME
      DEF ZERO      OPTION
      DEF LSECR 
      DEF LCART 
      CPA M6
      JMP CRETL     CREATE THE LIST FILE
      JSB FMPER     PRINT ANY ERRORS
      DEF LNAME 
      DEF OPEN
LERR? SSA 
      JMP ABORT     GIVE UP 
* 
* 
      JSB LIST     EJECT PAGE 
      DEF EJECT 
      SSA 
      JMP ABORT     GIVE UP 
* 
      JSB LIST      '24998-XXXXX  XXXX SOFTWARE KIT'
      DEF HEAD0 
* 
      JSB FTIME     FORMAT THE TIME AND DATE MESSAGE
      DEF *+2 
      DEF DATE+2
* 
      JSB LIST      ' 4:11 PM  WED., 10  OCT., 1979'
      DEF DATLN 
* 
      JSB LIST      'MODULE         MODULE  SIZE (OCTAL)
      DEF HEAD1 
      JSB LIST      'NAME   MODULE IDENT.   BPAG  MAIN  COMM' 
      DEF HEAD2 
      JSB LIST      '----------------------------'
      DEF HEAD3 
      JMP NXTCM 
* 
* 
* 
CRETL LDA LSIZE     CREATE THE LIST FILE
      SZA,RSS 
      LDA D24       DEFAULT TO 24 BLOCK FILE
      STA LSIZE 
      LDA LTYPE 
      SZA,RSS 
      LDA D4        DEFAULT TO TYPE 4 
      STA LTYPE 
      JSB CREAT     CREATE THE LIST FILE
      DEF RTN11 
      DEF DCBL
      DEF IERR
      DEF LNAME 
      DEF LSIZE 
      DEF LTYPE 
      DEF LSECR 
      DEF LCART 
RTN11 JSB FMPER     PRINT ANY ERROR 
      DEF LNAME 
      DEF CRET
      JMP LERR? 
* 
* 
* 
GETIT JSB REIO      '*RELOCATABLE MODULE CROSS REFERENCE*'  
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF TITLE 
      DEF TITLN 
* 
      JSB REIO      'PLEASE ENTER FILE NAMES AS FOLLOWS:' 
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF PLEAS 
      DEF PLNG
* 
* 
      JSB REIO      'COMMAND, LIST, RELOC1,...,RELOCN,/E' 
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF RUNST 
      DEF RUNLN 
* 
      JSB REIO      READ THE RUN STRING 
      DEF *+5 
      DEF D1
      DEF LUIN
      DEF CMDBF 
      DEF M80 
      STB CMD1
      JMP COM?      PARSE COMMAND FILE NAME 
* 
* 
*     THE FOLLOWING FOUR MESSAGES ARE OVERLAID BY THE 
*     RELOCATABLE BINARY INPUT.  THE TOTAL LENGTH MUST
*     BE AT LEAST 60 WORDS. 
* 
RBBUF EQU * 
DATLN DEC 17        
DATE  ASC 17, 
* 
TITLN DEC 18  
TITLE ASC 18,*RELOCATABLE MODULE CROSS REFERENCE* 
* 
PLNG  DEC 18  
PLEAS ASC 18,PLEASE ENTER FILE NAMES AS FOLLOWS:  
* 
RUNLN DEC 19
RUNST ASC 19,COMMAND, LIST, RELOC1,..., RELOCN, /E
* 
* 
* 
*     NOTE: SIZE OF CARTRIDGE DIRECTORY INFORMATION 
*     BLOCK MUST BE AT LEAST 175 WORDS OCTAL, GIVEN 
*     BELOW BY SZCM:
* 
SZCM  EQU *-RXREF 
* 
M80   DEC -80 
M6    DEC -6
M11   DEC -11 
ZERO  DEC 0 
D24   DEC 24
X     NOP 
QUIT? NOP 
WARN  NOP 
FWAM  NOP           POINTS TO BASE OF MODULE TABLE
      HED  RXREF COMMAND PROCESSOR
* 
NXTCM JSB NAMR      PARSE THE INPUT 
      DEF *+5 
DFILE DEF FNAME     RESULT OF PARSE 
      DEF CMDBF     INPUT BUFFER
      DEF CMD1      INPUT BUFFER LENGTH 
      DEF X         INDEX 
* 
      LDA FNAME 
      SZA,RSS 
      JMP CMDIN     INPUT COMMAND 
* 
      LDA DFILE 
      LDB DEND
      JSB COMP      CHECK FOR 'END' 
      SZA,RSS 
      JMP FINIS     FINISH XREF 
* 
      LDA DFILE 
      LDB D.END 
      JSB COMP      CHECK FOR '-END'
      SZA,RSS 
      JMP FINIS     FINISH XREF 
* 
      LDA DFILE 
      LDB D/E 
      JSB COMP      CHECK FOR '/E'
      SZA,RSS 
      JMP FINIS     FINISH XREF 
* 
      LDA DFILE 
      LDB DEX 
      JSB COMP      CHECK FOR 'EX'
      SZA,RSS 
      JMP FINIS     EXIT
* 
* 
      LDA DFILE 
      LDB D/A 
      JSB COMP      CHECK FOR '/A'
      SZA,RSS 
      JMP ABORT     EXIT
* 
* 
* 
      JSB CLOSE 
      DEF *+2 
      DEF #DCB
      CPA M11 
      CLA           IF NOT OPEN, IGNORE ERROR 
      JSB FMPER     PRINT ANY OTHER ERRORS
      DEF FNAME 
      DEF CLOS
* 
* 
      JSB OPENW      ATTEMPT TO OPEN FILE OR LU 
      DEF #DCB
      DEF IERR
      DEF FNAME      NAME 
      DEF B311      OPTION
      DEF FSECR 
      DEF FCART 
      JSB FMPER     PRINT ANY ERRORS
      DEF FNAME 
      DEF OPEN
      SSA 
      JMP NXTCM     TRY NEXT FILE 
* 
*     GET FILE INFORMATION
* 
      JSB LOCF
      DEF *+10
      DEF #DCB
      DEF IERR
      DEF IERR      DON'T CARE ABOUT THESE PARAMS 
      DEF IERR
      DEF IERR
      DEF FSIZE      FILE SIZE(IN SECTORS)
      DEF FLU       LU OF FILE
      DEF FTYPE       FILE TYPE 
      DEF FREC      RECORD SIZE(SOMETIMES HAS DATE FILE MADE) 
      JSB FMPER     PRINT ANY ERROR 
      DEF FNAME 
      DEF LOC 
* 
*     EXTRACT THE CARTRIDGE REFERENCE NUMBER FROM THE 
*     CARTRIDGE DIRECTORY.
* 
      JSB FSTAT 
      DEF *+2 
@CRTN DEF RXREF 
* 
      LDA @CRTN 
LLL   EQU *         SEARCH LOOP 
      LDB A,I       GET LU OF CARTRIDGE 
      SZB,RSS       END OF LIST?
      JMP LL2       NOT FND,DON'T KNOW HOW THIS COULD HAPPEN....
      CPB FLU       SAME AS FILE? 
      JMP LLF       YES, FOUND
      ADA D4        MOVE ON TO NEXT ENTRY.
      JMP LLL 
* 
LLF   EQU *         HERE WHEN CARTRIDGE FOUND 
      ADA D2        MOVE POINTER TO CARTRIDGE REF. NO.
      LDA A,I       GET DIRECTORY TRACK NUMBER
      STA FCART 
LL2   EQU * 
      JSB NAME      MOVE FILE NAME
      DEF FNAME 
      DEF FN1 
* 
      JSB CNUMD     CONVERT CARTRIDGE TO DECIMAL
      DEF *+3 
      DEF FCART 
      DEF FN2 
* 
      JSB CNUMD     CONVERT FILE TYPE TO DECIMAL
      DEF *+3 
      DEF FTYPE       FILE TYPE 
      DEF FN3 
* 
      LDA FSIZE      GET FILE SIZE(IN SECTORS)
      ARS           CONVERT TO BLOCKS 
      STA FSIZE      STORE FOR CONVERSION 
      JSB CNUMD     CONVERT TO DECIMAL
      DEF *+3 
      DEF FSIZE 
      DEF FN4 
* 
      JSB CNUMD     CONVERT FILE SIZE TO DECIMAL
      DEF *+3         (RECORD SIZE IS SOMETIMES USED TO INDICATE
      DEF FREC         DATE FILE CREATED) 
      DEF FN5 
* 
      JSB CNUMD     CONVERT FILE'S LU TO
      DEF *+3          DECIMAL
      DEF FLU 
      DEF FN6 
* 
* 
      JSB LIST      'FILE NAME:  FILEXX::CR:TY:SZ'
      DEF FNBUF 
* 
      CLA 
      STA MODS      CLEAR MODULE COUNT
* 
READB JSB RBIN      READ BINARY RECORD
* 
      ADA RTBL      INDEX INTO JUMP TABLE 
      LDA A,I 
      JMP A,I       JUMP TO RECORD PROCESSOR
* 
* 
FNBUF ABS FBUFL-FNBUF-1 
      ASC 6, FILE NAME: 
FN1   BSS 3         FILE NAME BUFFER
      ASC 1,::
FN2   EQU *         CARTRIDGE REFERENCE NUMBER FIELD. 
      BSS 3 
      ASC 1,: 
FN3   EQU * 
      BSS 3         FILE TYPE FIELD.
      ASC 1,: 
FN4   EQU * 
      BSS 3         FILE SIZE FIELD 
      ASC 1,: 
FN5   EQU * 
      BSS 3         RECORD SIZE (DATE) FIELD. 
      ASC 5, IS ON LU 
FN6   EQU *         FILE LU FIELD.
      BSS 3 
FBUFL EQU * 
* 
* 
* 
* 
* 
IERR  NOP 
PRMT  ASC 1,-_      ASK FOR INPUT 
* 
* 
* 
LNAME BSS 4         10-WORD PARSE BUFFER
LSECR NOP             * 
LCART NOP               * 
LTYPE NOP                 * 
LSIZE NOP                   * 
LREC  NOP                     * 
      NOP                       * 
* 
* 
CNAME BSS 4         10-WORD PARSE BUFFER
CSECR NOP             * 
CCART NOP               * 
CTYPE NOP                 * 
CSIZE NOP                   * 
CREC  NOP                     * 
      NOP                       * 
* 
* 
FNAME BSS 4         10-WORD PARSE BUFFER
FSECR NOP             * 
FCART NOP               * 
FTYPE NOP                 * 
FSIZE NOP                   * 
FREC  NOP                     * 
FLU   NOP                       * 
* 
* 
* 
FINIS JSB BLINE     BLANK THE LINE
      LDA TTLHD 
      LDB MPTBF     PRINT TOTAL HEADING 
      JSB MVNAM 
      LDB TBPSZ 
      LDA OBF13 
      JSB CONV      CONVERT TOTAL BPAGE SIZE TO ASCII 
      LDB TMNSZ 
      JSB CONV      CONVERT TOTAL MAIN SIZE 
      LDB TCMSZ 
      JSB CONV      CONVERT TOTAL COMMON SIZE 
      JSB BFOUT 
      JSB LVLNM    COMPUTE MODULES' LEVEL NUMBERS 
      JSB MREF      DO MODULE CROSS REFERENCE 
      JSB XREF      DO ST CROSS REFERENCE 
* 
      LDA WARN
      SZA,RSS 
      JMP RXEND     NO WARNINGS 
* 
      LDB D8
      CPA D1
      LDB D7
      STB WRN       LENGTH OF WARNING MESSAGE 
* 
      JSB CNUMD     CONVERT WARNING COUNT TO DECIMAL
      DEF *+3 
      DEF WARN
      DEF WRN+1 
* 
      JSB ERROR     'NNN WARNINGS'
      DEF WRN 
* 
RXEND JSB LIST      'END OF CROSS REF'
      DEF NDMSG 
      JSB LIST      PAGE EJECT
      DEF EJECT 
* 
HALT  JSB CLOSE     CLOSE THE BINARY INPUT FILE 
      DEF *+2 
      DEF #DCB
      CPA M11 
      CLA 
      JSB FMPER     PRINT ANY OTHER ERRORS
      DEF FNAME 
      DEF CLOS
* 
      JSB CLOSE     CLOSE THE COMMAND INPUT FILE
      DEF *+2 
      DEF DCBC
      CPA M11 
      CLA 
      JSB FMPER     PRINT ANY OTHER ERRORS
      DEF FNAME 
      DEF CLOS
* 
      JSB CLOSE     CLOSE THE LIST FILE 
      DEF *+2 
      DEF DCBL
      CPA M11 
      CLA 
      JSB FMPER     PRINT ANY OTHER ERRORS
      DEF FNAME 
      DEF CLOS
* 
      JSB EXEC      DONE WITH PROGRAM 
      DEF *+2 
      DEF D6
* 
* 
ABORT JSB ERROR     'RXREF ABORTED' 
      DEF ABMSG 
      JMP HALT
* 
ABMSG DEC 7 
      ASC 7,RXREF ABORTED 
* 
* 
WRN   DEC 8 
      ASC 8,XXXXXX WARNINGS 
* 
* 
TTLHD DEF *+1 
      ASC 3,TOTAL 
D.END DEF *+1 
      ASC 3,-END
DEND  DEF *+1 
      ASC 3,END 
D/E   DEF *+1 
      ASC 3,/E
D/A   DEF *+1 
      ASC 3,/A
DEX   DEF *+1 
      ASC 1,EX
BLANK ASC 2,
* 
CLOS  ASC 3,CLOSE 
OPEN  ASC 3,OPENF 
CRET  ASC 3,CREAT 
LOC   ASC 3,LOCF
WRIT  ASC 3,WRITF 
READ  ASC 3,READF 
* 
B311  OCT 311 
D8    DEC 8 
* 
NDMSG DEC 9 
      ASC 9, END OF CROSS REF 
* 
      SKP 
* 
CMDIN EQU * 
      ISZ QUIT? 
      CLA,INA,RSS 
      JMP FINIS     RELOCS WERE SPECIFIED IN RUN STRING, QUIT 
      STA X         RESET INDEX FOR 'NAMR'
      LDA TTYFL     GET TTY FLAG. 
      SSA,RSS          INTERACTIVE DEVICE?
      JMP CMDFL     NOT A TTY, DON'T SEND PROMPT. 
      JSB REIO      ISSUE PROMPT TO TERMINAL. 
      DEF *+5 
      DEF D2
      DEF LUTTY 
      DEF PRMT
      DEF M2
* 
      JSB REIO      READ TERMINAL INPUT 
      DEF *+5 
      DEF D1
      DEF LUIN  
      DEF CMDBF 
      DEF M80 
      SZB,RSS 
      JMP FINIS     END OF INPUT
      JMP RDEX      SAVE TRANSMISSION LOG 
* 
CMDFL JSB READF     READ A RECORD FROM FILE 
      DEF *+6 
      DEF DCBC
      DEF IERR
      DEF CMDBF     BUFFER
      DEF D40 
      DEF CMD1
      JSB FMPER     PRINT ANY ERRORS
      DEF CNAME 
      DEF READ
      SSA 
      JMP FINIS     ERROR, FINISH PROCESSING
      LDB CMD1
      SSB 
      JMP FINIS     END OF FILE 
      BLS           CONVERT LENGTH TO CHARACTERS
RDEX  STB CMD1
      JMP NXTCM     PARSE NEXT COMMAND
* 
      SKP 
* 
FMPER NOP 
      SSA,RSS 
      JMP FMPOK     NO ERROR, RETURN
      STA FMP       ERROR ACCUMULATOR 
      CMA,INA       COMPLEMENT ERROR NUMBER 
      STA FMP3
      JSB CNUMD     CONVERT TO DECIMAL
      DEF *+3 
      DEF FMP3
      DEF FMP1
* 
      LDA MINUS 
      STA FMP1      ADD MINUS SIGN
      LDA FMPER,I 
      STA FMPNM 
      JSB NAME      MOVE THE FILE NAME TO THE MESSAGE 
FMPNM NOP 
      DEF FMP2
* 
      ISZ FMPER 
      LDA FMPER,I 
      LDB DFMP3 
      JSB MVNAM     MOVE THE SUBROUTINE NAME
* 
      JSB ERROR     'FMP ERROR  -NNNN ON FILEX (SUBR)'
      DEF MSGP
      LDA FMP       FETCH ERROR CODE
      RSS 
FMPOK ISZ FMPER 
      ISZ FMPER 
      JMP FMPER,I 
* 
* 
* 
FMP   NOP 
* 
MSGP  DEC 18
      ASC 5,FMP ERROR 
FMP1  ASC 5,XXXXXX ON 
FMP2  ASC 4,XXXXXX (
FMP3  ASC 4,XXXXXX) 
* 
DFMP3 DEF FMP3
MINUS ASC 1, -
* 
      SKP 
* 
*     NAME:OPENW
*     SUBROUTINE TO OPEN A FILE OR LU WITH WAIT.
*     IF THE FILE IS OPEN OR THE LU IS LOCKED TO
*     ANOTHER PROGRAM, RXREF PRINTS 
*     THE MESSAGE 'WAITING FOR XXXXXX', AND THEN
*     RETRIES THE OPEN REQUEST FOREVER AT 6 SECOND
*     INTERVALS.  RETRIES MAY BE STOPPED BY AN OPERATOR BREAK.
* 
* 
*     CALLING SEQUENCE: 
*          JSB OPENW
*          DEF DCB
*          DEF ERROR
*          DEF NAME 
*          DEF OPTION 
*          DEF SECR 
*          DEF CR 
*          >ERROR CODE IN A 
* 
* 
OPENW NOP           OPEN WITH WAIT
      CLA 
      STA ERCOD 
      LDA OPENW 
      LDB DOPEN 
      JSB .MVW      MOVE THE PARAMETERS TO THE CALL 
      DEF D6
      NOP 
      LDA OPENW 
      ADA D6        ADJUST THE RETURN ADDRESS 
      STA OPENW 
* 
* 
OPNLP JSB OPENF     OPEN THE FILE OR LU 
      DEF *+7 
OPEND NOP           DCB 
OPENE NOP           ERROR CODE
OPENN NOP           NAME
      NOP           OPTION
      NOP           SECR
      NOP           CARTRIDGE 
      SSA,RSS 
      JMP OPENW,I   SUCCESS!
* 
* 
      CPA M8
      RSS           FILE OPEN 
      CPA M36 
      RSS           LU LOCKED 
      JMP OPENW,I   FAILURE 
* 
* 
* 
      CPA ERCOD 
      JMP WAITO     MESSAGE ALREADY PRINTED 
* 
      STA ERCOD 
      LDA OPENN 
      STA *+2 
      JSB NAME      MOVE FILE NAME TO MESSAGE 
      NOP 
      DEF WBUF+9
* 
      JSB ERROR     PRINT 'WAITING FOR XXXXXX'
      DEF WTBF
* 
* 
WAITO JSB IFBRK     CHECK THE BREAK FLAG
      DEF *+1 
      SZA 
      JMP QUIT
* 
      JSB EXEC      TIME SUSPEND
      DEF RTN23 
      DEF TIME      CODE 12 
      DEF ZERO      NAME
      DEF D2        CODE 2=SECONDS
      DEF ZERO      MULTIPLE
      DEF M6        6 SECONDS 
* 
RTN23 JMP QUIT      ABORT RETURN FROM EXEC 12 
      JMP OPNLP     TRY AGAIN 
* 
QUIT  LDA OPENE,I   NO MORE RETRIES, BREAK FLAG SET 
      JMP OPENW,I   FAILURE 
* 
* 
WTBF  DEC 12
WBUF  ASC 12,RXREF WAITING FOR XXXXXX 
M8    DEC -8
M36   DEC -36 
TIME  DEF 12,I
ERCOD NOP 
DOPEN DEF OPEND 
* 
      SKP 
* 
ERROR NOP           PRINT ERROR MESSAGE ON TERMINAL 
      LDA ERROR,I 
      STA ERLNG 
      INA 
      STA ERBUF 
      JSB REIO      WRITE THE ERROR MESSAGE 
      DEF *+5 
      DEF D2
      DEF LUTTY     TERMINAL LU 
ERBUF NOP 
ERLNG NOP 
      ISZ ERROR 
      JMP ERROR,I 
* 
      SKP 
* 
*     CALLING SEQUENCE: 
*       JSB LIST
*       DEF STRNG 
*        .
*        .
*        .
*STRNG  DEC N       MUST BE POSITIVE WORD LENGTH
*       ASC N,XXXXXXXXXXXXXXXX
* 
* 
* 
LIST  NOP           OUTPUT LISTING
      JSB IFBRK     TEST THE BREAK FLAG 
      DEF *+1 
      SZA 
      JMP ABORT     BREAK FLAG SET, QUIT
* 
      LDA LIST,I
      LDB A,I       WORD LENGTH 
      INA 
      STA LSBUF     BUFFER ADDRESS
      ADB A 
LSTLP ADB M1        BACK UP ONE WORD
      LDA B,I 
      CPA BLANK     REMOVE ALL TRAILING BLANKS
      JMP LSTLP 
* 
      INB 
      LDA LSBUF 
      CMA,INA 
      ADB A 
      SZB 
      SSB 
      CLB,INB       IF START OF BUFFER WAS PASSED, OUTPUT ONE WORD
      STB LSLNG 
      JSB WRITF     WRITE THE LISTING 
      DEF RTN5
      DEF DCBL
      DEF IERR
LSBUF NOP 
      DEF LSLNG 
RTN5  JSB FMPER     PRINT ANY ERRORS
      DEF LNAME 
      DEF WRIT
      ISZ LIST
      JMP LIST,I
* 
LSLNG NOP 
      SKP 
* 
*     NAME:NAME 
*     SUBROUTINE TO MOVE A FILE NAME TO A BUFFER. 
*     IF THE PARAMETER IS NUMERIC, THE MESSAGE
*     'LU  XX' IS MOVED.
* 
*     CALLING SEQUENCE: 
*          JSB NAME 
*          DEF NAMBF  (MUST BE IN 'NAMR' PARSED FORMAT) 
*          DEF BUFFER (3-WORD DESTINATION BUFFER) 
* 
* 
NAME  NOP           MOVE A FILE NAME
      DLD NAME,I
      STB NTMP1 
      ISZ NAME
      ISZ NAME
      JSB .MVW      MOVE THE FILE NAME
      DEF D3
      NOP 
      LDA A,I 
      RAR,SLA 
      JMP NAME,I    ASCII FILE NAME, DONE 
* 
      LDA NTMP1,I   NUMERIC (LU)
      AND B77 
      STA NTMP2 
      JSB KCVT      CONVERT LU TO DECIMAL 
      DEF *+2 
      DEF NTMP2 
      LDB NTMP1 
      ADB D2
      STA B,I 
      DLD LU        MOVE ASCII PREFIX 
      DST NTMP1,I 
      JMP NAME,I    DONE
* 
NTMP1 NOP 
NTMP2 NOP 
LU    ASC 2,LU
* 
      SKP 
* 
RBIN  NOP 
RDF   JSB READF     READ BINARY INPUT 
      DEF *+6 
      DEF #DCB
      DEF IERR
RBBFA DEF RBBUF     BUFFER
      DEF D60 
      DEF RBCNT     COUNT 
      JSB FMPER     PRINT ANY ERRORS
      DEF FNAME 
      DEF READ
      IOR RBCNT 
      SSA 
      JMP NXTCM     ERROR OR END-OF-FILE, ASK FOR NEXT FILE 
***** 
* 
* COMPUTE AND CHECK CHECKSUM
* 
      LDA RBCNT      GET NEG. #DATA WORDS.
      CMA,INA,SZA,RSS 
      JMP RDF       ZERO LENGTH, TRY AGAIN
      ADA D3        SET UP COUNTER
      SSA,RSS       (PROTECTION AGAINST 
      JMP CKSER     LT 4 WORD RECORD.)
      STA RBTM1      SET COUNTER
      LDA RBBUF+1    START CKSM WITH I. D. WORD 
      LDB DRB3
* 
RBLP  ADA B,I      ADD
      INB           REMAINING 
      ISZ RBTM1       WORDS IN
      JMP RBLP        RECORD - SUM IN A 
      CPA RBBUF+2    COMPARE WITH RECORD CHECKSUM 
      JMP RBOK      EQUAL, RECORD GOOD
* 
CKSER JSB ERROR     'CHECKSUM'
      DEF ERR1
      JMP NXTCM     TRY NEXT FILE 
* 
ERR1  DEC 4 
      ASC 4,CHECKSUM
* 
* 
RBOK  LDA RBBUF+1 
      ALF,RAR       ROTATE RIC FIELD TO 
      AND B7        LOW A AND ISOLATE CODE. 
      STA RIC       SAVE RECORD TYPE
      JMP RBIN,I
* 
RBTM1 NOP 
DRB3  DEF RBBUF+3 
D60   DEC 60
* 
* RECORD TYPE DRIVER
* 
RTBL  DEF *+1 
      DEF READB 
      DEF NAM 
      DEF ENXTR 
      DEF READB 
      DEF ENXTR 
      DEF ENDR
      DEF ENXTR      EMA RECORD 
      DEF READB 
      SKP 
MCNT  NOP 
MODS  NOP           MODULE NUMBER WITHIN FILE 
RBCNT NOP 
RIC   NOP 
TBPSZ NOP 
TCMSZ NOP 
TMNSZ NOP 
* 
* 
TEMP  NOP 
OBF1  DEF OBUF+1
OBF5  DEF OBUF+5
OBF7  DEF OBUF+7
MPTBF DEF OBUF+9
OBF13 DEF OBUF+13 
EMTBF DEF OBUF+22 
ENDLN DEF OBUF+36 
LSTPS DEF OBUF+37 
RBF3  DEF RBBUF+3 
RBF17 DEF RBBUF+17
DER4  DEF ERR4+12 
DER5  DEF ERR5+8
DER6  DEF ERR6+8
* 
* 
* 
* 
* 
LER4  LDA RBF3
      LDB DER4
      JSB MVNAM     MOVE THE NAME TO THE MESSAGE
      JSB LIST      'DUP MODULE NAME:'
      DEF ERR4
      ISZ WARN      INCREMENT WARNING COUNT 
DUMMY JSB RBIN
      CPA D5
      JMP READB 
      JMP DUMMY 
* 
* 
* 
* 
ERR4  DEC 14
      ASC 14, ****DUP MODULE NAME:
* 
* 
      SKP 
* 
* SET UP MODULE TABLE ENTRY FROM A NAM RECORD 
* 
NAM   LDA HADDR     CHECK FOR ST-MT OVERFLOW
      LDB LADDR 
      ADB D7
      JSB OVFCH 
      JSB LIST      PRINT BLANK LINE
      DEF SPACE 
      ISZ MODS      BUMP MODULE COUNT 
* 
      JSB BLINE 
      LDB AMDT
      SZB,RSS       EMPTY MODULE LIST?
      JMP NBEG      YES 
      LDA RBF3      NO
      JSB COMP
      SZA,RSS 
      JMP LER4      ERROR-DUPL. MODULE NAMES
      SSA 
      JMP NSRCH 
NBEG  LDA LADDR     THIS MODULE GOES AT THE ALPHA.
      STA B          BEGINNING OF THE LIST
      STA MADDR     B, MADDR = ADD OF NEW ENTRY 
      ADA D3
      STA LADDR 
      LDA AMDT      SUCCESSOR IS PREVIOUS 1ST ENTRY 
      STA LADDR,I 
      STB AMDT
      JMP MV1 
* 
* SEARCH MODULE TABLE WHERE B IS ADD OF LAST
*  MODULE ENTRY SEARCHED
* 
NSRCH ADB D3
      STB PREVE 
      LDA B,I 
      STA B         ADD OF NEXT ENTRY IN B
      SZB,RSS 
      JMP EOL       END OF LIST 
      LDA RBF3
      JSB COMP
      SZA,RSS 
      JMP LER4      DUPL. MODULE NAMES
      SSA 
      JMP NSRCH 
* 
EOL   LDA LADDR 
      STA MADDR     SET ALPHA. MODULE SUCCESSOR OF
      STA PREVE,I    PREV ENTRY TO PT TO THIS ENTRY 
      ADA D3
      STA LADDR 
      STB LADDR,I   SET ALPHA. MODULE SUCCESSOR 
MV1   EQU * 
      LDB MADDR     STORE MODULE NAME.
      LDA RBF3
      JSB MVNAM      IN TABLE ENTRY 
      ISZ MCNT      INCREMENT # MODULES 
      INB 
      CLA           INITIALIZE
      STA B,I        POINTERS 
      INB            TO 0:
      STA B,I 
      INB 
      STA B,I 
      LDA D4
      ADA LADDR 
      STA LADDR     UPDATE LADDR
      JSB BLINE     BLANK OUT BUFFER
      LDB OBF1      MOVE NAME 
      LDA MADDR         OUTPUT
      JSB MVNAM             BUFFER
* 
      LDA OBUF+3
      IOR B54       INSERT COMMA AFTER NAME 
      STA OBUF+3
* 
      JSB KCVT      CONVERT TYPE TO DECIMAL 
      DEF *+2 
      DEF RBBUF+9 
      STA OBUF+4
* 
      LDB RBCNT     GET RECORD LENGTH 
      CMB,INB       MAKE NEGATIVE 
      ADB D17       TEST FOR EXTENDED-NAM 
      SSB,RSS       EXTENDED NAM FIELD PRESENT? 
      JMP MV2       NO,CONTINUE 
      CMB,INB 
      STB TEMP1 
      LDA RBF17     SOURCE ADDRESS
      LDB OBF7      LOAD DESTINATION ADDRESS
      JSB .MVW      MOVE WORDS
      DEF TEMP1 
      NOP 
MV2   EQU * 
      JSB BFOUT     PRINT OUT THE LINE
* 
      JSB CNUMD     CONVERT MODULE COUNT TO ASCII 
      DEF *+3 
      DEF MODS
      DEF OBUF+1
* 
      LDA EMTBF 
      STA CTR       SET FOR ENT OUTPUT
      CCA           FOR THE NAM RECORD (THIS
      STA EFLG       INFO IS USED IN ENXTR) 
      LDA OBF13 
      LDB RBBUF+7 
      ADB TBPSZ 
      STB TBPSZ 
      LDB RBBUF+7    CONVERT BP LENGTH TO ASCII 
      JSB CONV      CONVERT BP LENGTH TO ASCII
      LDB RBBUF+6 
      RBL,CLE,ERB 
      ADB TMNSZ 
      STB TMNSZ 
      LDB RBBUF+6 
      RBL,CLE,ERB   CLEAR AIC CODE IN BIT # 15
      JSB CONV      CONVERT MAIN PROG LENGTH
      LDB RBBUF+8 
      ADB TCMSZ 
      STB TCMSZ 
      LDB RBBUF+8 
      JSB CONV      CONVERT COMMON LENGTH 
      JMP READB 
* 
OBUFA DEF OBUF
* 
SPACE DEC 1 
      ASC 1,
* 
CTR   NOP 
B54   OCT 54
* 
      SPC 2 
* CHECK FOR SYMBOL TABLE - MODULE TABLE OVERFLOW
* 
OVFCH NOP 
      CMB,INB 
      ADB A           HADDR - LADDR 
      SSB,RSS 
      JMP OVFCH,I     +: NO OVERFLOW
      LDB EMTBF 
      CPB CTR       ANYTHING LEFT IN BUFFER?
      RSS 
      JSB BFOUT     YES, DUMP IT
      JSB ERROR     'SYMBOL TABLE-MODULE TABLE OVERFLOW'
      DEF OVMSG 
      JMP FINIS 
* 
OVMSG DEC 19
      ASC 19, SYMBOL TABLE-MODULE TABLE OVERFLOW
      SPC 2 
* MOVE SYMBOL NAME TO TABLE ENTRY, OR OUTPUT BUFFER 
* 
*     ON ENTRY: (A) = SOURCE ADDRESS
*               (B) = DESTINATION ADDRESS 
* 
*     5 CHARS WILL BE MOVED (6TH IS BLANKED)
* 
MVNAM NOP 
      STA TEMP3 
      LDA A,I       STORE:
      STA B,I          CHARACTERS 1 & 2 
      INB 
      ISZ TEMP3 
      LDA TEMP3,I 
      STA B,I          CHARACTERS 3 & 4 
      INB 
      ISZ TEMP3 
      LDA TEMP3,I 
      AND BYTE
      IOR B40 
      STA B,I              CHARACTER 5
      INB 
      JMP MVNAM,I 
      SPC 1 
* BLANK OUT PRINT BUFFER,OBUF 
* 
BLINE NOP 
      LDA BLANK 
      STA OBUF
      LDA OBUFA 
      LDB A 
      INB 
      JSB .MVW      FILL BUFFER 
      DEF D39 
      NOP 
      JMP BLINE,I 
* 
D39   DEC 39
      SPC 2 
* 
* CONVERSION ROUTINE
*      CONVERT 15-BIT BINARY NUMBER TO 6 CHARACTER
*      (LEADING BLANK) ASCII FORM OF OCTAL
* 
*     ON ENTRY: (B) = BINARY NUMBER TO CONVERT
*               (A) = ADDRESS TO STORE ASCII
* 
CONV  NOP 
      STA TEMP1   SAVE STORAGE ADDRESS
      RBL         POSTION FIRST DIGIT TO BITS 15-13 
      LDA M3
      STA TEMP2   CONVERT COUNTER = -3
      LDA B40     MAKE FIRST CHARACTER A SPACE
CONV1 ALF,ALF     ROTATE CHAR TO UPPER POSITION 
      STA TEMP3   AND SAVE
      BLF,RBR     POSITION NEXT DIGIT TO BITS 2-0 
      LDA B 
      AND D7      ISOLATE DIGIT 
      IOR B60     MAKE AN ASCII CHAR (60-67)
      IOR TEMP3   PACK IN UPPER CHARACTER 
      STA TEMP1,I   AND STORE IN STORAGE AREA 
      ISZ TEMP1   INCREMENT STORAGE AREA ADDRESS
      BLF,RBR     ROTATE NEXT DIGIT TO LOW BYTE 
      LDA B       ISOLATE CHAR
      AND D7       IN LOW A 
      IOR B60     MAKE AN ASCII CHAR
      ISZ TEMP2   INCREMENT CONVERT COUNTER 
      JMP CONV1   NOT FINISHED
      LDA TEMP1   FINISHED.SET (A) =NEST STORAGE
      JMP CONV,I   AREA WORD ADDRESS, AND EXIT
* 
TEMP3 NOP 
* 
      SPC 2 
* 
* 
*     COMP - DETERMINES ALPHABETIC ORDER OF 2 SYMBOLS 
*      A= ADD OF CURRENT RECORD 
*      B = ADD OF A TABLE ENTRY 
*      RESULTS IN A, WHERE: 
*         (A) LT 0 WHEN (A,I) GT (B,I)
*         (A) EQ 0 WHEN (A,I) EQ (B,I)
*         (A) GT 0 WHEN (A,I) LT (B,I)
* 
COMP  NOP 
      STA TEMP1 
      STB TEMP2 
      LDA M2
      STA CNT 
CMP1  LDA TEMP1,I 
      CMA,INA 
      ADA TEMP2,I 
      SZA 
      JMP COMP,I    CHARS 1 & 2 DON'T MATCH 
      ISZ TEMP1     CHARACTERS
      ISZ TEMP2      MATCH SO FAR 
      ISZ CNT 
      JMP CMP1
      LDA TEMP1,I 
      AND BYTE        TEST CHAR 5 : 
      CMA,INA 
      STA CNT       TEMPORARY SAVE
      LDA TEMP2,I 
      AND BYTE
      ADA CNT 
      JMP COMP,I
* 
TEMP1 NOP 
TEMP2 NOP 
CNT   NOP 
BYTE  OCT 177400
      SKP 
* 
* FIND OR ADD A SYMBOL TABLE ENTRY FOR AN EXT OR
*  ENT RECORD 
* 
ENXTR EQU * 
      LDA RIC 
      ADA M4
      SSA 
      CLA,INA         1 FOR ENT, 2 FOR EMA
      STA RIC         0 FOR EXT 
      LDB EMTBF 
      CPB CTR         EMPTY BUFFER? 
      JMP ENXX        YES 
      LDA RIC 
      CPA EFLG        NEW RECORD TYPE(FROM LAST RECORD) 
      JMP ENXT1       NO
      JSB BFOUT       YES, DUMP CONTENTS
      LDB EMTBF     RESET BUFFER POINTER
      STB CTR 
ENXX  EQU * 
      LDA RIC 
      STA EFLG
      CPA D2        EMA RECORD? 
      JMP EMAX      YES, PROCESS SLIGHTLY DIFFERENTLY.
      SZA 
      JMP ENXT0 
      LDA EXTH
      RSS 
ENXT0 LDA ENTH
      LDB CTR 
      JSB MVNAM 
      STB CTR 
ENXT1 LDA RBBUF+1      GET AND ISOLATE RECORD 
      AND B77           ITEM COUNT
      CMA,INA          SET NEGATIVE COUNTER 
      STA RBBUF+1       FOR PROCESSING
      LDA RBF3  
      STA EBUFA 
ENXT2 LDB CTR          MOVE NAME TO 
      CPB EMTBF         OUTPUT BUFFER 
      RSS 
      JMP ENXT3 
      LDA RIC 
      SZA 
      JMP ENXT4 
      LDA EXTH
      RSS 
ENXT4 LDA ENTH
      JSB MVNAM 
      LDA EBUFA 
ENXT3 JSB MVNAM 
      CPB LSTPS 
      RSS 
      JMP ENXT5 
ENTX1 EQU * 
      JSB BFOUT 
      LDB EMTBF 
ENXT5 STB CTR 
      LDB ASYMT 
      SZB,RSS 
      JMP EBEG      EMPTY ST
      LDA EBUFA     COMPARE ENT-NAME AND
      JSB COMP       ST NAME (FIRST ENTRY)
      SZA,RSS 
      JMP ESTM      HAVE FOUND THE MATCHING ST ENTRY
      SSA,RSS 
      JMP EBEG      NEW ENTRY GOES AT BEGINNING OF ST 
ESRCH ADB D4        SEARCH SYMBOL TABLE 
      STB PREVE     SAVE ADD OF PREV ENTRY'S WORD #5
      LDA B,I 
      STA B         GET NEXT ST ENTRY ADD 
      SZB,RSS 
      JMP ESRC1     END OF ST 
      LDA EBUFA     COMPARE SYMBOLS 
      JSB COMP
      SZA,RSS 
      JMP ESTM      HAVE A ST MATCH 
      SSA 
      JMP ESRCH     CONTINUE SEARCH 
ESRC1 JSB GETNT     ADD AN ENTRY TO THIS POSITION IN
      STA PREVE,I    THE ST.  SET PTR TO IT 
      JMP ESRC2 
EBEG  JSB GETNT     GET SPACE ALLOCATED FOR NEW ENTRY 
      STA ASYMT     AT BEGINNING OF ST
ESRC2 LDB EFLG      ENT OR EXT? 
      SZB,RSS 
      JMP SETMU     SET UP MOD-USE LIST ENTRY 
      ADA D6        ENT 
      STA B 
      JMP ELST      ENT-JUMP TO MOD-ENT LIST SEARCH 
* 
* HAVE A MATCHING SYMBOL TABLE ENTRY
* 
ESTM  STB ADDR      HAVE A ST MATCH 
      LDA EFLG      EXT OR ENT? 
      SZA,RSS 
      JMP EXTPR     GOTO EXT RECORD PROCESSOR 
      ADB D6        ENT - DEFINED YET?
      LDA B,I 
      SZA 
      JMP LER5      YES-DUPL. ENT RECORDS 
      JMP ELST      NO-SEARCH THRU MOD-ENT LIST 
* 
      SKP 
* 
*  EMA RECORD PROCESSOR 
* 
EMAX  EQU * 
      LDA EMAH      MOVE "EMA=" TO OUTPUT BUFFER
      LDB CTR 
      JSB MVNAM 
      STB CTR 
      LDA RBBFA     GET POINTER TO SYMBOL 
      ADA D3
      STA EBUFA 
      LDB CTR 
      JSB MVNAM     MOVE EMA SYMBOL NAME TO OUTPUT BUFFER 
      STB CTR 
      LDA RBBUF+1   GET EMA SIZE
      AND B1777     MASK EMA SIZE 
      STA B 
      LDA CTR 
      JSB CONV      CONVERT TO OCTAL
      STA B         MOVE DESTINATION ADDRESS TO (B) 
      LDA BLANK 
      STA B,I       STORE TWO BLANKS
      INB 
      LDA MSGH      GET DESTINATION ADDRESS 
      JSB MVNAM     MOVE "MSEG="
      LDA B 
      LDB RBBUF+6   GET MSEG SIZE 
      JSB CONV      CONVERT 
      STA CTR       SAVE
      CCA           SET UP SO ENT/EXT PROCESSORS WORK ON
      STA RBBUF+1     ON ONE SYMBOL ONLY. 
      JMP ENTX1 
B1777 OCT 1777
EMAH  DEF *+1 
      ASC 3, EMA= 
MSGH  DEF *+1 
      ASC 3,MSEG= 
* 
* EXT PROCESSING
* 
EXTPR EQU * 
      ADB D5        GET ADDRESS 
      LDB B,I        OF MODULE-USE LIST 
      SZB,RSS 
      JMP SETMU     EMPTY MODULE-USE LIST 
      LDA B,I       M-U NOT EMPTY 
      CPA MADDR     SEARCH THRU MOD-USE LIST
      JMP LER6      MOD ALREADY THERE-DUPL EXT'S IN I 
SETM0 INB 
      STB PREVE 
      LDB B,I       GET ADD. OF NEXT MOD-USE ENTRY
      SZB,RSS 
      JMP SETM1     NO MORE 
      LDA B,I 
      CPA MADDR     MATCH MOD 
      JMP LER6      DUPL, EXT'S 
      JMP SETM0 
* 
SETM1 LDA HADDR 
      ADA M2
      LDB LADDR 
      INB 
      JSB OVFCH     CHECK FOR ST-MT OVERFLOW
      LDB HADDR     ADD ENTRY AT THIS POSITION IN LIS 
      ADB M1
      STB PREVE,I 
      JMP ADDEX 
SETMU LDA HADDR 
      ADA M2
      LDB LADDR 
      INB 
      JSB OVFCH    CHECK FOR ST-MT OVERFLOW 
      LDA ADDR     EMPTY M-U LIST 
      ADA D5
      LDB HADDR 
      ADB M1
      STB A,I      SET MOD-USE POINTER
ADDEX LDA MADDR 
      STA B,I       STORE ADD. OF USER MODULE 
      ADA D6
      ISZ A,I       INCREMENT # OF EXT'S IN MODULE
      CLA           SET NEXT M-U ENTRY PTR. TO 0
      STA HADDR,I    (SINCE WE ALWAYS ADD THEM AT THE END)
      ADB M1          END)
      STB HADDR 
      LDA ADDR      GET SPACE FOR EXT ADD 
      STA LADDR,I    IN MODULE ENTRY
      ISZ LADDR     UPDATE
      JMP NXTEN     GET NEXT ENTRY IN RECORD
* 
* SEARCH MODULE'S ENT-LIST
* 
ELST  LDA MADDR     ENT PROCESSING
      STA B,I       SET MODULE-DEFN ADDRESS 
      ADA D4
      LDB A,I       GET ENT-LIST PTR. 
      SZB,RSS 
      JMP LBEG      EMPTY ENT-LIST
      LDA EBUFA     SEARCH THRU 
      JSB COMP       ENT-LIST 
      SZA,RSS 
      JMP LER5      DUPLICATE ENT RECORDS -ERROR
      SSA 
      JMP LSRCH     CONTINUE SEARCH 
LBEG  LDA ADDR      PLACE ENTRY AT BEG. OF LIST 
      ADA D3
      STB A,I       PTR. TO SUCCESSOR IN ENT-LIST 
      LDA ADDR
      LDB MADDR 
      ADB D4        PTR. TO FIRST ENTRY IN
      STA B,I        MODULE'S ENT-LIST
      JMP NXTEN     GET NEXT RECORD ENTRY 
LSRCH ADB D3        SAVE ADD. CONTAINING ADD. OF
      STB PREVE      NEXT ENT-LIST ENTRY
      LDA B,I       GET NEXT MOD-ENT ENTRY
      STA B 
      SZB,RSS 
      JMP NXTEA     END OF MOD-ENT LIST 
      LDA EBUFA 
      JSB COMP      COMPARE SYMBOL NAMES
      SZA,RSS 
      JMP LER5      ERROR-DUPL ENT'S
      SSA 
      JMP LSRCH     SEARCH NEXT ENTRY 
* 
NXTEA LDA ADDR      PREV. MOD-ENT LIST ENTRY
      STA PREVE,I    POINTS TO THIS ENTRY 
      ADA D3
      STB A,I       SET NEXT MOD-ENT ENTRY PTR. 
NXTEN LDA EBUFA     GET OLD RECORD ENTRY ADDRESS
      ADA D3        ADD 3 FOR NEXT EXT ENTRY
      ADA EFLG      ADD 1 MORE FOR ENT
      STA EBUFA     SET ADD OF NEXT ENTRY 
      ISZ RBBUF+1    INCREMENT ENTRY COUNT
      JMP ENXT2     MORE TO PROCESS 
      JMP READB     FINISHED-GET NEXT RECORD
* 
* 
PREVE NOP 
EFLG  NOP 
EBUFA NOP 
* 
ENTH  DEF *+1 
      ASC 3, ENT= 
EXTH  DEF *+1 
      ASC 3, EXT= 
* 
* 
* 
*     DUPLICATE SYMBOL
* 
LER5  EQU * 
      LDA EFLG      IS THIS AN
      CPA D2        EMA RECORD? 
      JMP EXTPR     YES, ALLOW DUPLICATES.
      LDA EBUFA 
      LDB DER5
      JSB MVNAM     MOVE NAME TO MESSAGE
* 
      JSB LIST      'DUP ENT:    SKIP IT' 
      DEF ERR5
      ISZ WARN      INCREMENT WARNING COUNT 
      JMP NXTEN 
* 
LER6  LDA EBUFA 
      LDB DER6
      JSB MVNAM     MOVE NAME TO MESSAGE
* 
      JSB LIST      'DUP EXT:    SKIP IT' 
      DEF ERR6
      ISZ WARN      INCREMENT WARNING COUNT 
      JMP NXTEN 
* 
ERR5  DEC 14
      ASC 14, ****DUP ENT:       ,SKIP IT 
* 
ERR6  DEC 14
      ASC 14, ****DUP EXT:       ,SKIP IT 
      SPC 2 
* 
* GET A SYMBOL TABLE ENTRY
* 
GETNT NOP           GET SPACE ALLOCATED FOR A NEW SYM 
      STB TEMP
      LDA HADDR      BOL TABLE ENTRY
      ADA M7
      LDB LADDR 
      JSB OVFCH     CHECK FOR ST-MT OVERFLOW
      STA HADDR     POINTS TO NEXT FREE SPACE 
      INA 
      STA ADDR      PTS. TO BEGINNING OF NEW ENTRY
      ADA D4
      LDB TEMP
      STB A,I       PT. TO NEXT S.T. ENTRY
      LDB ADDR      MOVE NAME TO
      LDA EBUFA 
      JSB MVNAM      ENTRY
      CLA           INITIALIZE: 
      STA B,I          MOD-ENT LIST PTR., 
      ADB D2
      STA B,I          MOD-USE LIST PTR., 
      INB 
      STA B,I          AND MOD-DEFN. PTR. TO 0
      LDA ADDR
      JMP GETNT,I 
* 
      SPC 2 
* 
* END RECORD PROCESSOR
* 
ENDR  EQU * 
      LDB EMTBF 
      CPB CTR       ANY ENT'S OR EXT'S LEFT IN BUFFER?
      JMP ENDR0     NO
      JSB BFOUT     YES, PRINT THEM 
      LDB EMTBF 
      STB CTR 
ENDR0 LDA RBBUF+1    IS A TRANSFER ADDRESS GIVEN? 
      SLA 
      JMP ENDR1      YES
      LDA EFLG       NO-IS THERE A MODULE NAME
      SSA,RSS         LEFT IN OBUF? 
      JMP READB      NO 
      JMP ENDR2      YES, PRINT IT
* 
ENDR1 LDA ENDH      YES - 
      JSB MVNAM      PRINT IT 
      STB A 
      LDB RBBUF+3 
      RBL,CLE,ERB 
      JSB CONV
ENDR2 JSB BFOUT 
      JMP READB 
* 
ENDH  DEF *+1 
      ASC 3, END= 
      SPC 2 
* 
BFOUT NOP 
      JSB LIST      LIST THE OUTPUT BUFFER
      DEF OUT 
      JSB BLINE 
      JMP BFOUT,I 
      SKP 
* 
* COMPUTE MODULE LEVEL NUMBER 
* 
LVLNM NOP 
      LDA HADDR 
      LDB LADDR 
      REP 3 
      ADB MCNT
      CMB,INB     CHECK TO SEE WHETHER
      ADB A        THERE IS ENOUGH
      SSB,RSS      SPACE AVAILABLE
      JMP INT0    YES, GO PROCESS LEVELS
NOROM JSB ERROR     'NOT ENOUGH SPACE...LEVEL NUMBER' 
      DEF NOTRM 
      JMP LVLNM,I 
* 
INT0  LDA LADDR 
      STA VECTR   SAVE ADD OF LEVEL VECTOR
      ISZ LADDR 
      LDB MCNT
      CMB,INB,SZB,RSS 
      JMP RXEND     SKIP REMAINDER OF CROSS REFERENCE LISTING 
      STB TEMP
      LDB D1000    DEFAULT VALUE FOR HIGHEST LEVEL #  
INT1  STB LADDR,I  AND INITIALIZE ENTIRE VECTOR TO IT 
      ISZ LADDR 
      ISZ TEMP
      JMP INT1
* 
      LDA AMDT    PLACE MODULE ID # (ALPHA ORDER) 
      CLB,INB 
INT2  STA MADDR    INTO MODULE ENTRY WORD 6 
      ADA D5
      STB A,I 
      ADA M2      GET NEXT MODULE ENTRY 
      LDA A,I 
      SZA,RSS 
      JMP INT3    END OF MODULE TABLE 
      INB 
      JMP INT2
* 
INT3  CLA,INA 
      STA CNT 
      LDA AMDT
INT4  CLB 
      STB UFLG    W-U FLAG (=0 UNTIL ONE FOUND) 
      STA MADDR 
      ADA D4
      LDA A,I    GET FIRST ENT ENTRY
      SZA,RSS 
      JMP INT6   NO ENT'S 
INT5  STA ADDR
      ADA D5
      LDB A,I      GET FIRST W-U ENTRY
      SZB          NONE 
      ISZ UFLG     INCREMENT WHEN ONE FOUND 
      ADA M2       GET MODULE'S NEXT ENT
      LDA A,I 
      SZA 
      JMP INT5
      LDA UFLG   NO MORE ENTS ANY W-U'S FOUND?
      SZA 
      JMP INT7   YES
INT6  CLA,INA    SET MODULE LEVEL = 1 
      LDB VECTR   SINCE NO W-U'S
      ADB CNT 
      STA B,I 
INT7  LDA MADDR 
      ADA D3
      LDA A,I    GET NEXT MODULE ENTRY
      SZA,RSS 
      JMP INT8     NO MORE
      ISZ CNT      INCREMENT MODULE # (AND OFFSET 
      JMP INT4       IN VECTOR) 
* 
INT8  CLA,INA 
      STA LEVEL  INITIALIZE LEVEL # 
      STA CNT 
      LDA LADDR 
      STA PRLST 
      LDA AMDT
INT9  STA MADDR 
      ADA D6
      LDB A,I 
      SZB,RSS 
      JMP INT14    NO EXT'S - GO TO NEXT MODULE 
      CMB 
      STB TEMP1  SAVE NEG # EXTS
      STA TEMP2  SAVE ADD OF EXT LIST 
INT10 ISZ TEMP1 
      RSS 
      JMP INT11   NO MORE EXT'S 
      ISZ TEMP2 
      LDA TEMP2,I GET ADD OF EXT-ST ENTRY 
      ADA D6
      LDA A,I     GET ITS DEFN MODULE ADD 
      SZA,RSS 
      JMP INT10   AN UNDEFF GO TO NEXT EXT
      ADA D2      HAS AN ENTRY ALREADY BEEN 
      LDB A,I      MADE IN THE PARLIST FOR
      SLB          THESE 2 MODULES (BIT #1 ON)? 
      JMP INT10   YES, GO TO NEXT EXT 
      ISZ A,I     NO SET FLAG IN WORD #3 OF MODULE'S
      ADA D3       ENTRY
      LDA A,I       PUT MODULE'S #  
      STA LADDR,I   IN PARLIST ENTRY  
      LDB LADDR 
      INB 
      CPB HADDR 
      JMP NOROM    OVERFLOW 
      LDA CNT 
      STA B,I       SECOND WORD 
      INB 
      CPB HADDR 
      JMP NOROM    OVERFLOW 
      STB LADDR 
      JMP INT10 
* 
INT11 LDA MADDR    CLEAR FLAGS OF THOSE 
      ADA D6        MODULES REFERENCED
      LDB A,I       BY THIS MODULE
      CMB,INB 
      STB TEMP1    SAVE NEG # EXT'S 
      STA TEMP2 
INT12 ISZ TEMP2 
      LDA TEMP2,I 
      ADA D6
      LDB A,I      GET DEFN MODULE ADD
      SZB,RSS 
      JMP INT13    UNDEFINED
      ADB D2
      LDA B,I 
      AND BYTE         CLEAR FLAG IN LOW HALF 
      STA B,I       OF MODULE ENTRY WORD #3 
INT13 ISZ TEMP1 
      JMP INT12 
* 
INT14 ISZ CNT 
      LDA MADDR 
      ADA D3
      LDA A,I 
      SZA 
      JMP INT9
* 
      LDA PRLST 
      CPA LADDR 
      JMP EXIT   HAD ONLY ONE MODULE
SLCT1 LDA PRLST 
      CLB 
      STB UFLG
SLCT2 STA PARNT   SAVE ADD OF PARLIST ENTRY 
      INA 
      LDA A,I     GET HIGH MODULE # 
      ADA VECTR   AND GET IT ITS ENTRY IN  VECTR
      LDB A,I     GET HIGH'S LEVEL #
      CPB LEVEL 
      RSS 
      JMP SLCT3 
      LDA PARNT,I GET LOW MODULE #
      ADA VECTR 
      LDB LEVEL 
      INB 
      STB A,I      SEj LEVEL # OF LOW TO LEVEL+1
      ISZ UFLG
SLCT3 LDA PARNT    GET NEXT PARLIST ENTRY 
      ADA D2
      CPA LADDR 
      RSS 
      JMP SLCT2 
      LDA UFLG
      SZA,RSS 
      JMP EXIT
      LDA LEVEL 
      CPA D1000 
      JMP EXIT
* 
      INA 
      STA LVL1    SET TO LEVEL+1
      CLA,INA 
      STA CNT 
CHK2  LDA VECTR 
      ADA CNT 
      CPA PRLST 
      JMP CHK6
      LDB A,I 
      CPB LVL1
      JMP CHK3
      ISZ CNT 
      JMP CHK2
* 
CHK3  STA TEMP1 
      LDA PRLST 
CHK4  STA PARNT 
      LDA A,I 
      CPA CNT      = CURRENT MODULE INDEX?
      RSS 
      JMP CHK5     NO, GO TO NEXT PAR LIST ENTR,
      LDA PARNT 
      INA 
      LDA A,I       GET HIGH'S LEVEL #
      ADA VECTR 
      LDA A,I 
      LDB LVL1
      CMB,INB 
      ADB A 
      SSB 
      JMP CHK5     NO  GET NEXT PARLIST ENTRY 
      LDA D1000 
      STA TEMP1,I 
* 
CHK5  LDA PARNT 
      ADA D2
      CPA LADDR 
      RSS 
      JMP CHK4
      ISZ CNT 
      JMP CHK2
* 
CHK6  ISZ LEVEL 
      JMP SLCT1 
* 
EXIT  LDA AMDT
      ISZ VECTR 
EX1   ADA D5
      LDB VECTR,I 
      STB A,I 
      ISZ VECTR 
      LDB VECTR 
      CPB PRLST 
      JMP LVLNM,I 
      ADA M2
      LDA A,I 
      JMP EX1 
* 
VECTR NOP 
PARNT NOP 
PRLST NOP 
LEVEL NOP 
LVL1  NOP 
NOTRM DEC 21
      ASC 21, NOT ENOUGH SPACE TO COMPUTE LEVEL NUMBER
* 
      SKP 
* 
* MODULE CROSS REFERENCE
* 
MREF  NOP 
      CLA 
      STA CFLAG 
      STA BFLAG 
      JSB LIST      EJECT PAGE
      DEF EJECT 
      JSB LIST      'MODULE  LEVEL  MODULES WHERE USED' 
      DEF HEAD5 
      JSB LIST      '------------------------------------'
      DEF HEAD3 
      JSB BLINE     BLANK OUT PRINT BUFFER
      LDA AMDT
      SZA,RSS 
      JMP MREF,I    NO MODULES IN LIST
MXRF1 STA MADDR      GET MODULE ENTRY & SAVE ADD
      LDB OBF1       MOVE MODULE
      JSB MVNAM       OUTPUT BUFER
      STB @ADR
      LDA MADDR     CONVERT LEVEL # TO ASCII
      ADA D5
      LDA A,I 
      STA CTR 
      CPA D1000 
      STA CFLAG     SET THE CIRCULAR REFERENCE FLAG 
* 
      JSB CNUMD     CONVERT LEVEL NUMBER TO DECIMAL 
      DEF *+3 
      DEF CTR 
@ADR  NOP           ADDRESS OF 3-WORD ASCII STORAGE 
* 
      LDB OBF8  
      STB CTR 
      CLA 
      STA UFLG
      LDA MADDR      GET ADD OF FIRST ST ENTRY IN 
      ADA D4          MODULES ENT LIST
      LDB A,I 
      SZB 
      JMP MXRF2 
      JSB BFOUT      EMPTY ENT-LIST, PRINT MODULE NAME, & 
      JMP NXTMD       GET NEXT ONE
MXRF2 STB ADDR
      ADB D5         GET ADD OF FIRST ENTRY IN
      LDA B,I         SYMBOL'S W-U LIST 
      SZA,RSS 
      JMP NXTST      EMPTY LIST,GO TO NEXT ST ENTRY 
SRCHW STA WUENT 
      ISZ UFLG
      LDB A,I        GET MODULE ENTRY ADD 
      ADB D2
      LDA B,I        HAS MODULE NAME BEEN PRINTED?
      SLA             YET?
      JMP NXTWU      YES
      ISZ B,I        SET SO WON'T BE PRINTED AGAIN
* 
      LDA WUENT,I 
      CMA,INA 
      ADA MADDR     CHECK FOR BACKWARD REFERENCE
      SSA,RSS 
      JMP OK        NO
      STA BFLAG     SET THE BACKWARD REFERENCE FLAG 
      LDA MARK
      STA CTR,I     MARK THE OFFENDING MODULE 
* 
OK    LDA WUENT,I    FOR CURRENT MODULE 
      LDB CTR 
      INB 
      JSB MVNAM 
      STB CTR 
      CPB ENDLN      FULL BUFFER? 
      RSS 
      JMP NXTWU 
      JSB BFOUT      YES, DUMP IT 
      LDB OBF8  
      STB CTR 
NXTWU LDA WUENT 
      INA 
      LDA A,I        GET NEXT W-U ENTRY 
      SZA 
      JMP SRCHW      CONTINUE 
NXTST LDA ADDR       GET NEXT ST MOD-ENT LIST ENTRY 
      ADA D3
      LDB A,I 
      SZB 
      JMP MXRF2      CONTINUE 
      LDA UFLG
      SZA,RSS 
      JMP NXT0
      LDA CTR        NO MORE MOD-ENT LIST ENTRIES 
      CPA OBF8       EMPTY OUTPUT BUFFER? 
      RSS 
NXT0  JSB BFOUT      NO, DUMP CONTENTS
      LDB AMDT
NXT   ADB D2
      LDA B,I        CLEAR OUT
      AND BYTE            PRINT FLAGS 
      STA B,I         IN MODULE 
      INB             ENTRIES 
      LDB B,I 
      SZB 
      JMP NXT 
NXTMD LDA MADDR      GET NEXT MODULE TABLE ENTRY
      ADA D3
      LDA A,I 
      SZA 
      JMP MXRF1 
* 
* 
*     CHECK FOR BACKWARD REFERENCES OR CIRCULAR REFERENCES. 
*     PRINT A WARNING IF ANY WERE FOUND.
* 
      LDA CFLAG 
      SZA,RSS 
      JMP BREF?     NO CIRCULAR REFERENCES  
* 
      JSB LIST      'CIRCULAR REFERENCE'
      DEF CREF
      ISZ WARN
* 
BREF? LDA BFLAG 
      SZA,RSS 
      JMP MREF,I    NO BACKWARD REFERENCES
* 
      JSB LIST      'BACKWARD REFERENCE'
      DEF BREF
      ISZ WARN
      JMP MREF,I    
* 
* 
BREF  DEC 12
      ASC 12, ****BACKWARD REFERENCE
* 
CREF  DEC 12
      ASC 12, ****CIRCULAR REFERENCE
* 
WUENT NOP 
UFLG  NOP 
CFLAG NOP 
BFLAG NOP 
MARK  ASC 1, *
OBF8  DEF OBUF+8
* 
      SKP 
* 
* BINARY TO ASCII (DECIMAL) CONVERSION
* 
* 
* 
D1000 DEC 1000  
D1    DEC 1 
* 
      SKP 
* 
* ENTRY CROSS REFERENCE 
* 
XREF  NOP 
      JSB LIST      EJECT PAGE
      DEF EJECT 
      CLA 
      STA EFLG        DO ENTRY XREF FIRST 
      JSB LIST      'ENTRY DEFN-MOD  MODULES WHERE USED'
      DEF HEAD6 
      JMP XRF1
* 
UNRSD STA UFLG
      INA 
      STA EFLG
      JSB LIST      EJECT PAGE
      DEF EJECT 
      JSB LIST      'UNRESOLVED EXT  MODULES WHERE USED'
      DEF HEAD7 
XRF1  JSB LIST      '-------------------------------------' 
      DEF HEAD3 
      JSB BLINE 
      LDB ASYMT 
      SZB,RSS 
      JMP XREF,I    NO ENTRIES IN LIST
XRF2  STB ADDR       GOT ST ENTRY AND SAVE ADD
      ADB D6
      LDA B,I        IS SYMBOL DEFINED? 
      LDB EFLG
      SZA,RSS 
      JMP UNDCH      NO 
      SZB 
      JMP NXTE
      LDB OBF5       YES-MOVE NAME TO OUTPUT BUFFER 
      JSB MVNAM 
      INB 
      STB CTR 
XRF3  LDB OBF1       AND MOVE SYMBOL NAME TO OBUF 
      LDA ADDR
      JSB MVNAM 
      LDA ADDR       GET FIRST ENTRY
      ADA D5          IN SYMBOL'S W-U  LIST 
      LDB A,I 
      SZB,RSS 
      JMP NXTE1      EMPTY W-U LIST 
SCHWU STB MADDR      SAVE ENTRY ADDRESS 
      LDA B,I        GET ADD OF W-U MODULE
      LDB CTR        MOVE NAME TO 
      JSB MVNAM       OBUF
      CPB ENDLN      FULL BUFFER? 
      RSS 
      JMP NXTE0 
      JSB BFOUT 
      LDB MPTBF 
NXTE0 STB CTR 
      LDA MADDR 
      INA 
      LDB A,I        GET NEXT W-U ENTRY 
      SZB 
      JMP SCHWU       AND CONTINUE
      LDA CTR        NO MORE
      CPA MPTBF      EMPTY BUFFER?
      RSS 
NXTE1 JSB BFOUT      NO 
NXTE  LDA ADDR       GET NEXT ST ENTRY
      ADA D4
      LDB A,I 
      SZB 
      JMP XRF2        AND CONTINUE
      LDA EFLG        NO MORE?
      SZA,RSS         ALL DONE? 
      JMP UNRSD       NO,DO UNDEFS XREF 
      ISZ UFLG        WERE THERE ANY UNRES'D EXTS?
      RSS 
      JMP XREF,I      YES 
      JSB BLINE 
      LDB OBF1
      LDA NOENT 
      JSB MVNAM 
      JSB BFOUT       PRINT A 0 
      JMP XREF,I      RETURN
* 
UNDCH SZB,RSS         ARE WE PROCESSING UNDEFS? 
      JMP NXTE        NO
      LDB MPTBF       YES,SET CTR TO APPROPRIATE
      STB CTR          POSITION IN OBUF 
      CCA 
      STA UFLG
      JMP XRF3
* 
* 
NOENT DEF *+1 
      ASC 3, 0
      SPC 2 
* 
EJECT DEC 1 
      ASC 1,1       PAGE EJECT IF LINE PRINTER
      SPC 2 
      SKP 
* 
* HEADINGS
* 
OUT   DEC 40        MUST PRECEDE OBUF -- OBUF MUST BE 50 WORDS
OBUF  EQU *         LAST 10 WORDS MAY CONTAIN NAM RECORD  
*                                 COMMENTS  WHICH ARE NOT PRINTED.
HEAD0 DEC 26
      ASC 26,   24999-16051  2024 SOFTWARE SERVICE KIT SYSTEM 
HEAD1 DEC 26
      ASC 26,  MODULE                     MODULE  SIZE (OCTAL)
* 
HEAD2 DEC 23
      ASC 23,  NAME    MODULE IDENT.    BPAG  MAIN  COMM
* 
HEAD3 DEC 28
      ASC 28, --------------------------------------------------------
* 
HEAD5 DEC 18
      ASC 18,  MODULE  LEVEL   MODULES WHERE USED 
* 
HEAD6 DEC 18
      ASC 18,  ENTRY DEFN-MOD  MODULES WHERE USED 
* 
HEAD7 DEC 18
      ASC 18,  UNRESOLVED EXT  MODULES WHERE USED 
* 
*  CONSTANTS
* 
B40   OCT 40
B377  OCT 377 
B60   OCT 60
B77   OCT 77
B400  OCT 400 
D2    DEC 2 
D3    DEC 3 
D4    DEC 4 
D5    DEC 5 
D6    DEC 6 
B7    EQU * 
D7    DEC 7 
D17   DEC 17
D40   DEC 40
M1    DEC -1
M2    DEC -2
M3    DEC -3
M4    DEC -4
M7    DEC -7
AMDT  NOP            ADDRESS OF MODULE TABLE
ASYMT NOP            ADDRESS OF SYMBOL TABLE
CMD1  NOP           LENGTH OF CURRENT COMMAND 
MADDR NOP            ADD OF CURRENT MOD TABLE ENTRY 
ADDR  NOP            ADD OF CURRENT SYM TABLE ENTRY 
HADDR NOP            LWAM 
LADDR NOP            MODULE TABLE STARTS HERE - FWAM
TTYFL DEC -1        TTY FLAG:-1 IF INTERACTIVE INPUT, 0 OTHERWISE.
LUTTY NOP           LU OF OPERATOR CONSOLE
LUIN  NOP           LU OF OPERATOR CONSOLE + ECHO BIT 
* 
      SKP 
* 
DCBC  BSS 144       COMMAND DCB 
DCBL  BSS 144       LIST DCB
#DCB  BSS 144       BINARY INPUT DCB
CMDBF BSS 40        COMMAND INPUT BUFFER
      END RXREF 
                                                                                                                                                                                                                                              