ASMB,R,L,C  RTE 'XREF' CROSS-REFERENCE TABLE GENERATOR
      HED * RTE 'XREF' CROSS-REFERENCE TABLE GENERATOR 92067-16012
* 
*     NAME:   XREF
*     SOURCE: 92067-18012 
*     RELOC:  92067-16012 
*     PGMR:   C.C.H.,S.P.K. 
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  ALL RIGHTS     *
*  * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM XREF,3,99 92067-16012 REV.2001 791031 
      SUP 
      EXT IFBRK 
      EXT C.SOR,C.LST,C.TTY,OPN.C,WRT.C,RED.C,END.C 
      EXT SPC.C,PRM.C,SUP.C,GMM.C,RWN.C,EOF.C 
* 
* THIS PROGRAM PRODUCES A CROSS REFERENCE TABLE FOR AN PROGRAM
* WRITTEN IN HP-21XX ASSEMBLY LANGUAGE (HPAP). THE TABLE CON- 
* SISTS OF A LIST OF SYMBOLS, IN ALPHABETIC ORDER, EACH FOLLOWED
* BY ITS LOCATION IN THE PROGRAM, AND A LIST OF REFERENCES TO 
* THAT SYMBOL. EACH LOCATION IS A 5-DIGIT SEQUENCE NUMBER, FOL- 
* LOWED BY THE NUMBER OF THE TAPE ON WHICH IT APPEARS.  THESE TWO 
* ARE SEPARATED BY A SLASH.  THE TAPE NUMBER IS NOT  PRINTED WHEN 
* ONE TAPE ONLY EXISTS. 
* 
* THE METHOD USED IS TO READ IN THE HPAP SOURCE PROGRAM AND 
* BUILD A TABLE OF REFERENCES. THERE ARE TWO INTERNAL TABLES, THE 
* LABEL TABLE (LTAB) AND THE CROSS REFERENCE TABLE (XTAB). THESE
* TABLES ARE ORGANIZED AS FOLLOWS:
* 
*     LTAB: EACH ENTRY CONTAINS THE LABEL NAME AS FOLLOWS:
*              WORD COUNT     CHAR.1
*              CHAR.2         CHAR.3    (OPTIONAL)
*              CHAR.4         CHAR.5    (OPTIONAL)
*              CHAR.6         CHAR.7    (OPTIONAL)
* 
*           THE WORD COUNT MAY BE 1,2,3, OR 4 
* 
*     XTAB: EACH ENTRY CONTAINS THE FOLLOWING:
*              -NUMBER OF WORDS IN ENTRY  (-N-2)
*              LABEL SEQUENCE NUMBER
*              REF.1     "      "    LABELS ARE ADDED AS ENCOUNTERED; 
*                ...
*              REF.N     "      "     REST OF TABLE IS PUSHED DOWN. 
* 
* NO LINKAGE BETWEEN THE 2 TABLES IS REQUIRED BECAUSE THE ENTRIES 
* ARE IN THE SAME ORDER AND CORRESPOND 1 FOR 1. 
* NOTE THAT LTAB BEGINS IN LOW CORE AND XTAB IN HIGH CORE, SO THAT
* BOTH ARE OPEN-ENDED.
* 
* A LABEL WHICH HAS BEEN DEFINED BUT NEVER REFERENCED IS SIGNIFIED BY 
* A "@" IN COLUMN #1 PRECEEDING THE LABEL.
* 
* A LABEL WHICH HAS BEEN DEFINED MORE THAN ONCE WILL HAVE A DEFINITION
* FIELD OF HASH MARKS: "#####". 
* 
* A LABEL WHICH HAS BEEN REFERENCED BUT NEVER DEFINED WILL HAVE A 
* DEFINITION FIELD OF QUESTION MARKS "?????". 
* 
* ANY INSTRUCTION THAT WILL HAVE AN EFFECT UPON THE PROGRAM LISTING 
* AS ORG, ORB, ORR, IFN, IFZ, XIF, ECT. WILL BE DEFINED AS FOLLOWS: 
* " **XXX *****    NNNNN    NNNNN " WHERE XXX IS THE TYPE OF INSTR. 
* AND NNNNN IS THE SEQUENCE NUMBER OF THE INSTRUCTION.
* 
* A LITERAL INSTRUCTION WILL BE DEFINED AS A LABEL WITH ITS DEFINITION
* FILLED WITH DOTS, OTHER SEQUENCE NUMBERS DEFINE WHERE THEY WERE USED. 
* 
* PARAMETERS: 
*              *ON,XREF,SOURCE,LIST[,A[,B[,C]]] 
*                        NAMR  NAMR 
*   WHERE:
*                 SOURCE AND LIST NAMR'S ARE FMGR NAMR OR LU#'S 
*                  A = 0 WILL ASK FOR NO ALPHA LIMITS.
*                  A # 0 WILL ASK "ENTER LIMITS OR /E"
*                       THE OPERATOR SHOULD ENTER TWO ALPHA CHARACTERS
*                       REPRESENTING THE BEGINNING AND LAST SYMBOLS 
*                       OF THIS PASS. THE MESSAGE WILL CONTINUE AFTER 
*                       EACH PASS UNTIL A /E IS ENTERED.
* 
*                  B = 0 WILL GIVE TAPE NUMBERS WITH SEQUENCE NUMBERS 
*                  B = N WILL GIVE NO TAPE NUMBERS THUS ALLOWING
*                        LARGER SEQUENCE NUMBERS
*                  B = -N XREF WILL NUMBER PAGES CONSECUTIVELY
*                         FROM THE LAST RTE-ASMB PAGE NUMBER. 
*                         (TAPE NUMBERS WILL BE PRINTED.) 
*                  [ MORE THAN 16 TAPES: PROCESSING TERMINATES ! ]
* 
* 
*                  C = 0 WILL GIVE 55 LINES PER PAGE. 
*                  C = N WILL GIVE N LINES PER PAGE. [0<N<=55]
* 
* 
* 
* 
      SKP 
XREF  JSB SUP.C     SUPERVISOR CALL FOR SET UP OF COMPILER LIB
      DEF TIME      16 WORD TIME STRING 
      NOP           NO ERRORS SHOULD OCCUR
      LDA PRMST     PROMPT STRING 
      JSB OPN.C     OPEN SOURCE FILE
      DEF C.SOR     SOURCE FILE FCB 
      JMP SRCER     ERROR RETURN
      JSB OPN.C     OPEN LIST FILE
      DEF C.LST 
      CLB,RSS       ERROR RETURN
      JMP GTPRM     GET PARAMETERS
      JMP ?FMPE     DISPLAY ERROR 
* 
SRCER CCB 
      CPA .M202     NO, SOURCE FILE?
      RSS 
      JMP ?FMPE     NO, FMP ERROR 
      JSB WRT.C     YES 
      DEF C.TTY 
      DEF NOSRC      XREF:  NO SOURCE 
      DEF DEC10 
      NOP 
      JMP STOP1     TERMINATE XREF
* 
GTPRM JSB PRM.C    GET LIMIT PARAMETER
      DEF .3
      STA LETOP    SAVE LIMIT PARAMETER 
      JSB PRM.C    GET THE TAPE NUMBER OPTION PARAMETER 
      DEF .4
      STA .TAPE    SAVE THE TAPE NUMBER OPTION PARAMETER
      SSA,RSS       IF PARAM. IS POSITIVE, PROCEED
      JMP PRAM5       NORMALLY; ELSE, IF NEGATIVE,
      CMA,INA         MAKE POS. FOR CONTINUING PAGE 
      STA PAGNO       FROM THE ASSEMBLER. 
      CLA           SET THE FLAG TO INDICATE
      STA .TAPE       THAT TAPE NUMBERS ARE DESIRED.
PRAM5 JSB PRM.C    GET THE LINES PARAMETER
      DEF .5
      CMA,INA,SZA,RSS     NEGATE COUNT, AND CHECK FOR ZERO. 
      JMP XR11      ZERO, THEREFORE USE DEFAULT COUNT =55.
      STA CHEKR     SAVE FOR LATER USE. 
      ADA .55       ADD MAXIMUM ALLOWABLE VALUE.
      SSA           IS PARAMETER <= MAXIMUM VALUE?
      JMP XR11       NO, USE DEFAULT COUNT =55. 
      LDA CHEKR      YES, GET SUPPLIED VALUE. 
      STA NLINZ    SAVE IN LINE COUNTER 
      STA LNSKP    SAVE IN LINE SKIP COUNTER
XR11  LDA .TAPE     LOAD A WITH TAPE # PARAMETER
      SZA,RSS        TAPE #'S REQUESTED?
      JMP FGLLL     YES 
      LDA RM1      NO, LOAD A WITH MASK OF 077777B
      STA MSK12     SET SEQ # MASK
      LDA RM2 
      STA TAPE1    SET TAPE # ADD VALUE 
      LDA RM3 
      STA ROTAT    SET ROTATE INSTRUCTION -RAL- 
      STA .TAPE    SET TAPE# PARAMETER: NON-ZERO
      JMP FGSET 
FGLLL LDA RM4      SET FOR TAPE NUMBERS
      STA MSK12    SET SEQ # MADK 
      LDA RM5 
      STA TAPE1     SET TAPE # ADD VALUES 
      LDA RM6 
      STA ROTAT     SET ROTATE INSTR -ALF,RAL-
FGSET CLA          LOAD A WITH ZERO 
      STA RUN      SET RUN TO ZERO
RSTAR LDA DEFCB    INITIALIZE CONSTANTS 
      ADA DEFCB 
      STA CHAR1 
      STA OUTBF 
      LDA DEFLB 
      ADA DEFLB 
      STA LABCH 
      LDA FXEND    GET "CODED" END OF OP-CODE TABLE,
      STA ETAB      AND SET CURRENT END-OF-TABLE ADDRESS. 
      JSB GMM.C     GET THE FWA AND LWA FOR XREF PROG 
      DEF .0
      NOP           NO SEGMENTS THEREFORE NO ENTRY NAME 
      STA LTAB. 
      STA FWA 
      STB .XTAB 
      STB LWA 
      LDA RUN       GET RUN FLAG
      SZA           NEW PASS: OPERATOR SPEC'D LIMITS ?
      JMP CLSEQ      YES, SKIP LINE CNT,. & NAME INIT.
      LDA BLBL      SET BLANKS IN 
      STA NAME        NAME LOCATION 
      STA NAME+1
      STA NAME+2
      CCA          SET A TO -1
      STA LINES    SET LINES TO -1
CLSEQ CLA           INITIALIZE
      STA SEQNO      SEQUENCE NUMBER &
      STA LABCT      NUMBER OF LABELS TO ZERO 
      STA DDFLG     CLEAR DOUBLE DEFINES FLAG 
      STA LOBND     SET LOWER BOUND OF LLOWED SYMBS 0 
      STA TAPNO    INITIALIZE TAPE NUMBER 
      LDA MASK8    SET UPPER BOUND OF ALLOWED 
      STA HIBND       SYMBOLS.
      LDA LETOP    CHECK IF XREF LIMITS SPECIFIED 
      SZA,RSS 
      JMP RAC      THEYRE NOT--USE 0 AND 377,I.E.,ALL.
      JSB WRT.C 
      DEF C.TTY     CONSOLE FCB 
      DEF EMESG 
      DEF .18 
      NOP 
      JSB RED.C     READ ONE WORD FROM THE CONSOLE
      DEF C.TTY     CONSOLE FCB 
      DEF CBUF      BUFFER ADDRESS
      DEF .1        WORD COUNT
      NOP 
      LDA CBUF
      CPA SLSHE     KEYBOARD TERMINATE REQUEST? 
      RSS            YES, GO SEE IF PAGE EJECT REQUIRED.
      JMP BOUND      NO. GO TO SET NEW BOUNDS.
      JMP STOP      TERMINATE XREF
BOUND LDA CBUF      PLACE THE TWO CHARS IN LOBND
      AND MASK8       AND HIBND.
      STA HIBND 
      XOR CBUF
      ALF,ALF 
      STA LOBND 
      JSB RWN.C     REWIND SOURCE FILE
      DEF C.SOR 
      SPC 1 
* RECORD INPUT SECTION *
      SPC 1 
RAC   CLA           INITIALIZE NEXT TO ZERO TO PRE- 
      STA NEXT      VENT ERROR FROM OCCURING IN ID. 
      JSB IFBRK     BREAK FLAG SET? 
      DEF *+1 
      SSA 
      JMP STOP      YES, TEMINATE XREF
      JSB RED.C     GO TO READ THE RECORD.
      DEF C.SOR     SOURCE FILE FCB 
      DEF CBUF      BUFFER ADDRESS
      DEF DEC40     WORD COUNT
      JMP REDER     READ ERROR
      SSB           EOF RETURN? 
      JMP EOFER 
      BLS           CONVERT TO CHAR COUNT 
      SZB           END OF TAPE?
      JMP DOCRD      NO. GO TO PROCESS RECORD 
      SPC 1 
* END OF TAPE SECTION * 
      SPC 1 
      LDA .TAPE      YES, LOAD A WITH TAPE # PARAMETER
      SZA          SKIP IF PARAMETER IS ZERO
      JMP RAC      IF NOT ZERO SKIP EOT ROUTINE 
      STA SEQNO     RESET SEQUENCE NO. TO ZERO. 
      LDA TAPNO     OTHERWISE BUMP TAPE NUMBER
      ADA TAPE1       BY ONE
      STA TAPNO          AND UPDATE TAPE COUNTER. 
      SSA,RSS       MORE THAN 16 TAPES PROCESSED? 
      JMP RAC        NO, CONTINUE.
      JSB WRT.C     GO TO PRINT & ABORT.
      DEF C.TTY 
      DEF TPMSG 
      DEF DEC10 
      NOP 
      JMP STOP      TERMINATE XREF
* 
REDER CCB 
      JMP ?FMPE     DISPLAY FMP ERROR 
* 
EOFER JSB WRT.C 
      DEF C.TTY 
      DEF ENDFA     /XREF: END OF FILE
      DEF DEC10 
      NOP 
      JMP STOP      TERMINATE XREF
* 
PRMST ASC 1,]_
ENDFA ASC 10, /XREF: END OF FILE
* 
* 
LWA   NOP 
NOSRC ASC 10, /XREF: NO SOURCE
.0    DEC 0 
.4    DEC 4 
.5    DEC 5 
.M202  DEC 202
* 
      SPC 1 
* RECORD PROCESSING SECTION * 
      SPC 1 
DOCRD ISZ SEQNO     ADD 1 TO SEQUENCE NUMBER. 
      CMB           INITIALIZE CCNT TO
      STB CCNT        -1-# OF CHARACTERS IN RECORD
      LDA RM1      LOAD A WITH RM1 MASK 
      CPA MSK12    IS IT THE SAME AS MASK 12
      JMP RETRX    YES, CONTINUE NORMAL SEQUENCE. 
      LDA SEQNO    NO, LOAD A WITH SEQUENCE NUMBER
      CPA =D2048   IS SEQUENCE NUMBER 2048
      JMP .CHNG    YES, CHANGE TO NO TAPE NUMBERS 
RETRX LDB CHAR1     GET THE FIRST 
      STB CPNTR 
      JSB BUF2A       CHARACTER.
      CPA STAR      IF A STAR, GO TO READ THE 
      JMP RAC         NEXT RECORD.
      CPA BLANK     IF A BLANK, SKIP OVER LABEL 
      JMP DOOP        SECTION.
      JSB ID        GO GET THE LABEL
      JMP RAC       ILLEGAL LABEL.
      CPA COMMA     IS NEXT CHARACTER A COMMA ? 
      JMP RAC       IF SO, IGNORE--ASMB CARD. 
      JSB CHEKR 
      JMP DOOP
      JSB LLKUP     FIND THE LABEL IN LTAB. 
      CCB           SET B TO POINT AT LABEL SEQUENCE
      JSB PUTSQ       NUMBER AND PUT IN XTAB. 
      SPC 1 
* OPERATOR PROCESSING SECTION * 
      SPC 1 
DOOP  JSB ID        GO GET THE OPERATOR.
      JMP RAC       ILLEGAL OPERATOR. 
      JSB LOOK      FIND IN OPERATOR TABLE
      DEF OPBEG     DEFINE BEGINNING OF OPERATOR TABLE
ETAB  DEF FXEND     DEF END OP-TABLE (MODIFIED BY 'DOMIC')
      LDB A         GET INDEX VALUE 
      CMB             IF IT IS EQUAL
      ADB MICOP         OR GREATER
      ELB                 THAN
      SEZ                   CONSTANT, USE 
      LDA MICOP               CONSTANT AS INDEX BASE. 
      LDB OPCNT     GET # OF OPERANDS FOR CURRENT OP-CODE.
      SZB           IF NOT ZERO,
      JMP DOOP1       GO MAKE NUMBER NEGATIVE.
      SEZ,RSS       IF NOT A MIC-OP,
      INB,RSS        INCR BY ONE, AND SKIP. 
      RSS 
DOOP1 CMB,INB       MAKE NEGATIVE AND 
      STB TEMP2       SAVE FOR FUTURE REFERENCE.
      ADA SWICH     JUMP TO CORRECT PROCESSING
      JMP 0,I         ROUTINE.
* 
.CHNG LDA RM1      CHANGE 
      STA MSK12      FOR
      LDA RM2          NO 
      STA TAPE1          TAPE 
      LDA RM3              NUMBERS
      STA ROTAT 
      STA .TAPE     SET TAPE PARAMETER NON-ZERO 
      JMP RETRX     RETURN. 
      SPC 1 
*  CHEKR TESTS FOR WHETHER THE CURRENT LABEL IS BETWEEN THE 
* BOUNDS OF ACCEPTABILITY.  THAT IS, WHETER ITS FIRST CHAR
* IS BETWEEN LOBND AND HIBND.  IF IT IS, WE RETURN TO 
* NORMAL +1, OTHERWISE TO NORMAL
      SPC 1 
CHEKR NOP 
      LDA LABEL    GET THE FIRST CHARACTER
      AND MASK8 
      CMA,INA      -CHAR
      ADA HIBND    HIBND-CHAR 
      SSA          TEST HIGH END
      JMP CHEKR,I    TOO HIGH.
      CMA,INA      CHAR-HIBND 
      ADA HIBND    CHAR 
      CMA          -CHAR-1
      ADA LOBND    LOBND-CHAR-1 
      SSA          TEST LOW END 
      ISZ CHEKR    FORCE THE SKIP IF OKAY.
      JMP CHEKR,I 
      SPC 1 
PSUDO NOP 
      LDA LABEL+1  LOAD CHARACTERS 2 AND 3
      STA LABEL+2  STORE AS CHARACTERS 4 AND 5
      LDA LABEL    LOAD THE FIRST CHARACTER 
      IOR SSTAR    SET THE WORD COUNT TO "*". 
      STA LABEL+1  STORE AS CHARACTERS 2 AND 3
      LDA SPCLB    LOAD WORD COUNT/ASTERISK 
      STA LABEL    STORE FIRST CHARACTER WORD 
      JSB CHEKR    GO CHECK FOR CURRENT BOUNDS
      JMP PSUDO,I  GO IGNORE CURRENT OPERATOR 
      ISZ PSUDO     RETURN TO P+2: WITHIN BOUNDS. 
      JSB LLKUP    GO GET THE SYMBOL ORDINAL
      JMP PSUDO,I   RETURN
      SPC 1 
DOSP1 CLA,RSS       SPECIAL OPCODE; OPERAND EXPECTED. 
DOSPC CCA           SPECIAL OPCODE; NO OPERAND. 
      STA SOP       STORE THE OPERAND OPTION FLAG.
      JSB PSUDO     GO PROCESS PSUEDO OPCODE
      JMP IGNOP     IGNORE: OPCODE OUT OF BOUNDS! 
      CLB           ENTER: B=0
      JSB PUTSQ     GO INSERT SEQ. # IN XTAB. 
IGNOP ISZ SOP       IS AN OPERAND TO BE PROCESSED?
      SPC 1 
* PROCESS SINGLE AND MULTIPLE OPERANDS *
      SPC 1 
DOSOP JSB SOP       PROCESS THE OPERAND.
      JMP RAC       GO TO NEXT RECORD.
      SPC 1 
* ROUTINE TO HANDLE SINGLE AND MULTIPLE OPERANDS *
      SPC 1 
SOP   NOP 
      LDA TEMP2     IF NO OPERANDS
      SZA,RSS         WERE SPECIFIED
      JMP SOP,I         RETURN. 
CLIND CLA 
      STA INDIR     CLEAR INDIRECT INDICATOR
DONXT JSB ID        GET A SYMBOL
      JMP NXOPR     NOT SYMBOLIC
      LDA INDIR     IF INDIRECT INDICATOR 
      SZA             IS SET, GO CLEAR AND
      JMP CLIND         GO GET NEXT SYMBOL. 
      JSB CHEKR 
      JMP NXOPR 
      JSB LLKUP     GET SYMBOL'S ORDINAL IN A 
      CLB             AND CREATE A SEQ. NO. IN
      JSB PUTSQ         XTAB. 
NXOPR LDA NEXT      IS NEXT CHARACTER 
      CPA PLUS        A PLUS
      JMP DONXT         YES-GO GET NEXT SYMBOL
      CPA MINUS           NO-IS IT A MINUS? 
      JMP DONXT             YES-GO GET NEXT SYMBOL
      CPA COMMA               NO-IS IT A COMMA? 
      JMP STIND                 YES-GO SET INDIR. 
      CPA BLANK                   NO-IS IT A SPACE? 
      JMP BPCNT                     YES-GO DECR CNTR
      JMP SOP,I                       NO-GO GET NEXT
STIND STA INDIR     SET INDIRECT INDICATOR
BPCNT ISZ TEMP2     DECR COUNTER BY 1 
      JMP DONXT     GO GET NEXT OPERAND 
      JMP SOP,I     GO GET NEXT STATEMENT TEMP2 = 0 
      SPC 1 
* MIC PROCESSOR 
      SPC 1 
DOMIC JSB PSUDO     GO PROCESS PSUEDO OP-CODE 
      JMP IGMIC     IGNORE 'MIC': OUT OF BOUNDS.
      CLB           ENTER B=0 
      JSB PUTSQ      GO INSERT SEQ # IN XTAB. 
IGMIC JSB ID        GET OP-CODE 
      JMP RAC       GO TO PROCESS NEXT RECORD 
      LDA LABEL     GET 1ST CHAR OF OP-CODE 
      LDB ETAB      GET CURRENT END OF OP-CODE TABLE
      STA B,I       STORE 1ST CHAR OF OP-CODE 
      INB           INCR CURRENT END OF OP-CODE TABLE 
      LDA LABEL+1 
      STA B,I       STORE LAST 2 CHARS OF OP-CODE 
      JSB PSUDO     GO PROCESS AS PSUEDO OP-CODE
      JMP MICPR     IGNORE PSUEDO OPCODE; CHECK PARAMETERS. 
      CCB           SET B TO POINT AT LABEL SEQUENCE
      JSB PUTSQ       NUMBER AND PUT IN ETAB. 
MICPR LDA NEXT      IS NEXT CHAR
      CPA COMMA       EQUAL TO A COMMA? 
      RSS           YES - GO GET NEXT PARAM 
      JMP RAC           NO - GO GET NEXT STATEMENT. 
GSEC  JSB ID        GO GET NEXT SYMBOL
      JMP *+1       SKIP SECOND PARAMETER 
      LDA NEXT      IS NEXT CHAR
      CPA BLANK       EQUAL TO SPACE
      JMP RAC           YES - GO GET NEXT STATEMENT 
      CPA FEED            IS IT A LINE FEED 
      JMP RAC               YES - GO GET NEXT STATEMENT 
      CPA COMMA               IS IT A COMMA 
      RSS                       YES - GO GET NEXT CHAR
      JMP GSEC                    NO - GO GET NEXT SYMBOL 
GTLEN JSB CHAR      GET # OF OPERANDS PARAMETER 
      CPA BLANK     SKIP
      JMP GTLEN       BLANKS. 
      CPA FEED      END OF CARD?
      JMP FLEN        YES - CONTINUE. 
      JSB DIGIT     GO CHECK SEE IF IT IS A DIGIT 
      RSS           YES - IT IS A DIGIT CONTINUE
FLEN  CLA,INA,RSS   SYMBOLIC - SET # OF OPERANDS TO 1.
      AND .7        CONVERT ASCII DIGIT TO OCTAL. 
      ALF 
      ALF,ALF 
      STA NEXT
      LDB ETAB
      LDA B,I       GET FIRST CHAR OF CURRENT OP-CODE 
      IOR NEXT      "OR" IN NUMBER OF OPERANDS
      STA B,I       RESTORE ENTRY IN TABLE
      ALF,ALF       UPDATE POINTER
      AND .15         TO NEXT 
      ADB A             ENTRY IN OP-CODE
      STB ETAB            TABLE.
      JMP RAC       GO GET NEXT STATEMENT 
      SPC 1 
* EXT PROCESSOR 
      SPC 1 
DOEXT JSB ID        GET SYMBOL
      JMP RAC       END OF STATEMENT. 
      JSB CHEKR 
      JMP DOEXX 
      JSB LLKUP     PUT IN LABEL TABLE. 
      JSB ORDLK     GET ADDRESS OF LABEL SEQUENCE 
      ADA MIN1
      LDB 0,I         NUMBER AND SEE IF IT'S ZERO.
      SZB,RSS       IF IT IS, PLACE THE CURRENT 
      JSB MKSEQ       SEQNO THERE.
DOEXX LDA NEXT     IF NEXT CHARACTER IS A 
      CPA COMMA       COMMA,
      JMP DOEXT     GO GET THE NEXT SYMBOL, 
      JMP RAC         ELSE GO TO READ NEXT LINE.
      SPC 1 
* ENT PROCESSOR * 
      SPC 1 
DOENT JSB SOP       PROCESS SYMBOL. 
      CPA COMMA     IF NEXT CHARACTER IS A COMMA, 
      RSS             SKIP FOR REFRESH
      JMP RAC         ELSE GO TO READ NEXT CARD.
      CCA           REFRESH NUMBER-OF-OPERANDS
      STA TEMP2       COUNTER, AND
      JMP DOENT         GO TO GET THE NEXT SYMBOL.
      SPC 1 
* COM PROCESSOR * 
      SPC 1 
DOCOM JSB ID        GET A SYMBOL
      JMP RAC       END OF STATEMENT. 
      JSB CHEKR 
      JMP DOCM1 
      JSB LLKUP     PUT IN LABEL TABLE. 
      CCB 
      JSB PUTSQ     PUT SEQUENCE NUMBER IN XTAB.
DOCM1 LDA NEXT     IF NEXT CHARACTER IS A 
      CPA LPREN       LEFT PARENTHESIS, 
      JMP COMRG     GO TO PROCESS ARGUMENT. 
COM1  CPA COMMA     IF A COMMA, 
      JMP DOCOM       GO GET NEXT COMMON ENTRY. 
      JMP RAC       ELSE GET NEXT RECORD. 
COMRG JSB CHAR      PROCESS ARGUMENT. 
      CPA RPREN     IF NEXT CHAR. IS A RIGHT PAREN, 
      JMP *+4        GO GET NEXT COM ENTRY. 
      CPA FEED         IF A LINE FEED, THEN 
      JMP RAC              END OF CARD. 
      JMP COMRG         ELSE GET NEXT CHARACTER.
      JSB CHAR
      JMP COM1
      SPC 1 
* NAM PROCESSOR * 
      SPC 1 
DONAM LDA CCNT      GET CURRENT CHARACTER COUNT.
      STA NAMLN     SAVE FOR EXTENSION PROCESSING.
      JSB ID        GET THE NAME
      JMP RAC       NOT THERE 
      LDA LABEL     GET FIRST CHARACTER OF NAME 
      AND MASK8 
      IOR UPBLN     AND PRECEDE IT BY A BLANK.
      STA NAME      MOVE TO NAME LOCATION.
      LDA LABEL+1 
      STA NAME+1
      LDA LABEL+2 
      STA NAME+2
      LDA CCNT      GET CURRENT CHARACTER COUNT.
      CMA,INA,SZA,RSS MAKE POSITIVE. ZERO ? 
      JMP RAC         YES, GO GET NEXT RECORD.
      ADA NAMLN     ANY MORE TO PROCESS ? 
      SSA,RSS 
      JMP RAC       NO. GO TO READ NEXT RECORD. 
      LDA .NMEX 
      ADA .NMEX 
      STA NAMLN 
      LDA NEXT      GET LAST CHARACTER READ.
      RSS           GO TO CHECK FOR FIRST BLANK.
FBLNK JSB CHAR      YES, EXAMINE NEXT CHARACTER.
      CPA FEED      IF CHAR. IS A LINE FEED, THIS IS
      JMP RAC         END OF STRING. GO READ NEW REC
      CPA BLANK     IS THIS BEGINNING OF NAM EXTENT?
      RSS             YES, GO TO PROCESS. 
      JMP FBLNK       NO. GO SEARCH FOR 1RST BLANK. 
      LDB DM40      (B) = MAX CHAR. COUNT.
      LDA CCNT      GET CURRENT CHAR. COUNT.
      ADA DEC40     IS NAM EXTENT >40 CHARS.? 
      SSA 
      STB CCNT      YES, SET = 40 MAX CHARS.
      LDA BLANK     (A)= ASCII BLANK. 
MVEXT LDB NAMLN 
      JSB A2BUF 
      ISZ NAMLN 
      JSB CHAR      GET THE NEXT CHARACTER. 
      LDB CCNT      GET NUMBER OF CHARS. ALREADY MOVED. 
      SZB           EXTENSION BUFFER FULL ? 
      CPA FEED      NO. IF THIS CHARACTER IS A LINE FEED, 
      JMP RAC         THAT'S ALL. 
      JMP MVEXT     GO BACK FOR MORE. 
      SPC 1 
* END PROCESSOR * 
      SPC 1 
DOEND JSB SOP      PROCESS ELEMENT FOLLOWING END. 
      LDA TAPNO    SET TAPE NUMBER
      STA TPCNT    TO TAPE COUNT
* 
      SPC 1 
* OUTPUT SECTION *
      SPC 1 
      LDA RUN       GET RUN FLAG
      SZA           NEW PASS: OPERATOR SPEC'D LIMITS? 
      JMP *+3        YES, DON'T FORCE NEW HEADER. 
      CCA           SET LINE COUNT TO -1 TO FORCE PAGE EJECT
      STA LINES       TITLE AT THE BEGINNING. 
      LDA LABCT     COMPLEMENT LABCT TO FACILITATE
      STA LBLCT 
      CMA            ITS USE AS A COUNTER.
      STA LABCT 
      SPC 1 
* SECTION TO PROCESS A SINGLE LABEL * 
      SPC 1 
DUMP  ISZ LABCT     ANY MORE LABELS ? 
      JMP DOLAB     YES.
      LDA LETOP     GET LIMIT PARAMETER.
      SZA,RSS       LIMITS SUPPLIED FROM KEYBOARD ? 
      JMP STOP      NO, TERMINATE XREF
      ISZ RUN      SET RUN NOT EQUAL TO ZERO
      JMP RSTAR    RETURN FOR NEXT LIMITS 
* 
DOLAB LDA MAXCC     SET CCNT SO AS TO FORCE A 
      STA CCNT        BLANK LINE. 
      JSB LINE
* 
* SEARCH LABEL TABLE TO FIND THE FIRST LABEL, ALPHABETICALLY *
* 
      LDA MASK8     INITIALIZE TO A 
      STA LABEL       MAXIMUM.
      LDA FWA       INITIALIZE LPNTR TO POINT AT
      STA PNTR1       FIRST ENTRY.
      LDA LTAB.     SET LTAB. AS END OF TABLE 
      CMA,INA         POINTER.
      STA PNTR2 
      CLA           INTIALIZE ORDNL TO
      STA ORDNL       ZERO. 
DOLB1 ISZ ORDNL     ADVANCE ORDNL.
      LDB PNTR1     TEST FOR END OF LTAB. 
      ADB PNTR2 
      SSB,RSS       SKIP IF NOT END OF LABEL TABLE. 
      JMP GOTLB     GO TO PRINT SECTION.
* 
* MOVE CURRENT LABEL TO TEST ARRAY. * 
* 
      LDA BLBL      FIRST INITIALIZE TO BLANKS. 
      STA TEST+1
      STA TEST+2
      STA TEST+3   STORE BLANKS IN TEST BUFFER
      LDA PNTR1     SET TEMP TO POINT AT CURRENT
      STA TEMP        LABEL.
      LDB .TEST     SET B TO POINT AT TEST ARRAY. 
      LDA TEMP,I    GET FIRST WORD OF LABEL IN A. 
      AND MASK8     GET FIRST CHARACTER IN
      STA TEST           TEST.
      XOR TEMP,I    GET WORD COUNT IN HI-PART OF A. 
      ALF,ALF       ROTATE TO LO-PART.
      CMA,INA       STORE AS NEGATIVE IN COUNT. 
      STA COUNT 
DOLB2 ISZ TEMP      ADVANCE LABEL POINTER.
      ISZ COUNT     TEST FOR ANY MORE WORDS IN LABEL
      INB,RSS      ADVANCE TEST POINTER, SKIP 
      JMP COMPR     GO TO COMPARISON SECTION. 
      LDA TEMP,I    GET NEXT WORD OF LABEL. 
      STA 1,I         AND MOVE IT TO TEST ARRAY.
      JMP DOLB2 
      SPC 1 
* COMPARISON SECTION *
      SPC 1 
COMPR LDA .LAB      SET TEMP1 TO POINT
      STA TEMP1       AT LABEL
      LDB .TEST     AND B TO POINT AT TEST
      LDA MIN4     SET COUNT TO -4
      STA COUNT 
DOLB3 LDA TEMP1,I   GET LABEL WORD IN A AND 
      CMA,INA        SUBTRACT IT FROM 
      ADA 1,I         TEST WORD.
      SSA           IF TEST WORD IS SMALLER, GO TO
      JMP MOVE       MOVE SECTION;
      SZA           IF BIGGER GO TO 
      JMP KEEP       KEEP SECTION.
      ISZ COUNT     TEST FOR ANY MORE WORDS.
      RSS           YES.
      JMP KEEP      NO--SHOULDN'T COME HERE 
      ISZ TEMP1     ADVANCE LABEL POINTER 
      INB             AND TEST POINTER
      JMP DOLB3 
MOVE  LDA 1,I       MOVE TEST WORD TO LABEL 
      STA TEMP1,I 
      ISZ TEMP1     ADVANCE 
      INB             POINTERS. 
      ISZ COUNT     ANY MORE WORDS IN TEST ?
      JMP MOVE      YES.
      LDA PNTR1     SET UP ADDRESS OF BEST LABEL
      STA BESTL       SO FAR. 
      LDA ORDNL     SET ORDINAL OF THAT 
      STA BESTO       LABEL ALSO. 
KEEP  LDA TEMP      SET PNTR1 TO NEXT LABEL, AND
      STA PNTR1       GO TO TEST THE
      JMP DOLB1         NEXT ONE. 
* 
                                                                                                                                  