ASMB,R,L,C
      HED RTE MICRO CROSS-REFERENCE GENERATOR 
      NAM MXREF,3 92061-16002 REV.2013 800131 
      SUP 
* 
* 
*   ********************************************************* 
*   * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.           * 
*   *                                                       * 
*   * THIS  PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT * 
*   * A  TIME  AND  SHALL  NOT   OTHERWISE   BE   RECORDED, * 
*   * TRANSMITTED OR STORED IN A RETRIEVAL SYSTEM.  COPYING * 
*   * OR  OTHER  REPRODUCTION  OF  THIS  PROGRAM EXCEPT FOR * 
*   * ARCHIVAL PURPOSES IS  PROHIBITED  WITHOUT  THE  PRIOR * 
*   * WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.           * 
*   ********************************************************* 
* 
* 
HEADR ASC 11,PAGE .... MICRO XREF 
      ASC 10,REV.2013 801031
TIME  BSS 16
* 
      EXT EXEC                          RTE \ RLIB
      EXT SUP.C,GMM.C,OPN.C,SPC.C       CMPLR LIB 
      EXT END.C,WRT.C,RED.C,PRM.C       CMPLR LIB 
      EXT C.SAU,C.LST,C.SON,C.TTY       CMPLR LIB 
* 
* 
********************
* 
* INITIALIZATION PHASE
* 
MXREF NOP 
      JSB SYSIO    SET UP SUBSYS I/O
      JSB EJECT    PRINT HEADER 
      JSB EXEC     SWAP ALL OF MEMORY PARTITION 
      DEF *+3       BECAUSE WE'RE USING IT FOR
      DEF .22        SYMBOL TABLE 
      DEF .3
      JSB GMM.C    GET FWA,LWA
      DEF .0       (NO OF SEGMENTS) 
      STA SBASE    BASE OF SYM TAB (GROWS UP) 
      STA SNEXT 
      ADB .M1      BASE OF REF TAB (GROWS DOWN) 
      STB RNEXT 
      CMB,INB      SUFFICIENT MEMORY? 
      ADB SNEXT    RNEXT-6>SNEXT? 
      ADB .6
      SSB,RSS 
      ISZ SYMOV    NO: ANTICIPATE OVERFLOW
* 
* INITIATE I/O ON INPUT DEVICE
* 
      JSB OPN.C 
      DEF C.SAU 
      JMP IER     ERROR RTN 
      JMP INIT
IER   LDA .M20     ABORT - NO SOURCE
      JSB PRINT 
      DEF NOLS
      JMP ABORT 
* 
* 
* 
INIT  EQU * 
      JSB INPUT    GET MIC CMD. LIMITED CHECKING
      LDA MIC1     "MICMX "?
      LDB CARD
      JSB CMP 
      DEC 3 
      SZA,RSS 
      JMP MX       YES
      LDA MIC2     "MICMX,"?
      JSB CMP 
      DEC 3 
      SZA,RSS 
      JMP MX       YES
      LDA MIC3     "MICMXE"? WE TAKE XE CLASSES 
      JSB CMP      REGARDLESS...BUT WE XREF 1ST 
      DEC 3        RECORD IF NOT MIC COMMAND
      SZA,RSS 
      JMP READ     YES
      JMP READ2    NO: SCAN FOR SYMBOLS 
MX    ISZ MX?      SET MX STATE 
* 
* 
********************
* 
* INPUT PHASE 
* 
READ  JSB INPUT    GET A SOURCE RECORD
      ISZ #REC
READ2 LDB @FLD1    EXAMINE FIRST CHARACTER
      JSB LOADB 
      CPA ASTER    COMMENT? 
      JMP READ     YES: IGNORE RECORD 
      CPA "$"      CONTROL CARD?
      JMP READ     YES: IGNORE RECORD 
      JSB CLASS    CLASSIFY OP-FIELD
      ADA *+2 
      JMP A,I 
      DEF *+1,I    ZERO-ORIGINED TABLE
      DEF SORT     "END" PSEUDO-OP
      DEF CL1      OF CLASSES 
      DEF CL2 
      DEF CL3 
* 
CL1   EQU *        LABEL ONLY 
      JSB DFINE    XFER LABEL 
      SOC 
      JMP NOMEM    OUT OF MEMORY
      JMP READ
* 
CL2   EQU *        LABEL & FIXED-FIELD EXPR 
      JSB DFINE    XFER LABEL 
      LDB @FLD6    XREF LABEL IN FIELD 6
      SOS 
      JSB REFER 
      SOC 
      JMP NOMEM    OUT OF MEMORY
      JMP READ
* 
CL3   EQU *        LABEL & VARIABLE-FIELD EXPR
      JSB DFINE    XREF LABEL 
      LDB @FLD3    XREF LABEL BETWEEN FIELDS 3 & 6
      SOS 
      JSB REFER 
      SOS 
      JMP READ
* 
* SYMBOL TABLE OVERFLOW.  REPORT ERROR, THEN LIST 
* AS MUCH AS WE'VE GOT
* 
NOMEM EQU * 
      ISZ ANYER     BUMP ERROR COUNT
      LDA #REC     MOVE LINE# INTO ERROR MSG
      LDB @OV1
      JSB DECML 
      DEC 4 
      LDA .M45
      JSB PRINT 
      DEF OVMSG 
      LDA .2
      JSB SPACE 
* 
* 
********************
* 
* SORT PHASE
* 
* SIMPLE IN-PLACE EXCHANGE SORT.  DEFINE CONTINUALLY
* DIMINISHING PARTITIONS OF SYMBOL TABLE AND MOVE 
* "SMALLEST" SYMBOL TO TOP OF PARTITION 
* 
SORT  EQU * 
      LDB SBASE 
* 
SPART EQU *        NEXT PARTITION 
      CPB SNEXT 
      JMP LIST     DONE 
      STB TOP 
      STB LEAST 
* 
SFIND EQU *        FIND LEAST IN PARTITION
      ADB .6       PTR TO NEXT SYMBOL 
      CPB SNEXT 
      JMP SXCH     END OF PARTITION 
      LDA LEAST    LEAST<=NEXT SYMBOL?
      JSB CMP 
      DEC 4 
      CMA,SSA,INA,SZA 
      STB LEAST    NO: NEXT SYMBOL BECOMES LEAST
      JMP SFIND 
* 
SXCH  EQU *        MOVE LEAST TO TOP IF NECESSARY 
      LDB LEAST 
      CPB TOP 
      JMP SNXT     TOP IS LEAST ALREADY 
      LDA B        TEMP<==LEAST 
      LDB TEMP
      JSB MOVE
      DEC 6 
      LDA TOP      LEAST<==TOP
      LDB LEAST 
      JSB MOVE
      DEC 6 
      LDA TEMP     TOP<==TEMP 
      LDB TOP 
      JSB MOVE
      DEC 6 
SNXT  EQU * 
      ADB .6       TOP+6: NEXT PARTITION
      JMP SPART 
* 
* 
********************
* 
* LIST PHASE
* 
LIST  EQU * 
      JSB SUMRY 
      LDA .1
      JSB SPACE 
      LDB SBASE 
* 
LNXTS EQU *        GET NEXT SYMBOL
      CPB SNEXT 
      JMP LDONE 
      STB SYM 
      CLA,INA      SPACE ONE LINE...
      JSB SPAC?    ...IF NOT AT TOP OF FORM 
      LDA SYM      MOVE SYMBOL TO OUTPUT
      LDB OUTBF 
      JSB MOVE
      DEC 4 
      LDB SYM      GET DEFINITION 
      ADB .4
      LDA B,I      SYMBOL DEFINED?
      SSA 
      JMP LUND     NO 
      LDB @XR3     YES: MOVE DEFINITION INTO OUTPUT 
      JSB DECML 
      DEC 4 
      LDA @XR5
      STA @XR 
      LDA .M14
      STA XRLEN 
      JMP LREF
LUND  LDA @UND     UNDEFINED SYMBOL 
      LDB @XR2
      JSB MVB 
      DEC 15
      LDA @XR6
      STA @XR 
      LDA .M26
      STA XRLEN 
LREF  EQU *        LIST REFERENCES
      LDB SYM      ANY REFERENCES?
      ADB .5
      LDA B,I      (PTR TO LAST REF IF ANY) 
      SSA,RSS 
      JMP L1ST     YES
      LDA @UNR     NO REFERENCES
      LDB @XR4
      JSB MVB 
      DEC 18
      LDA XRLEN 
      ADA .M20
      STA XRLEN 
      JMP LLAST 
L1ST  LDA A,I      PTR TO FIRST REF 
      STA TOP 
* 
LNXTR EQU *        LIST NEXT REFERENCE
      STA REF 
      LDB @XR      FULL LINE? 
      CPB @XR7
      JSB DUMP     YES: WRITE LINE
      LDA REF      GET LINE # 
      INA 
      LDA A,I 
      JSB DECML 
      DEC 4 
      ADB .10      NEXT REFERENCE POSTION 
      STB @XR      IN OUTPUT
      LDB XRLEN 
      ADB .M6 
      STB XRLEN 
      LDA REF,I    PTR TO NEXT REFERENCE
      CPA TOP 
      JMP *+2      END OF REFERENCES
      JMP LNXTR 
* 
LLAST JSB DUMP     WRITE LAST LINE
      LDB SYM      NEXT SYM TAB ENTRY 
      ADB .6
      JMP LNXTS 
* 
* 
********************
* 
* END OF CROSS-REFERENCE
* 
LDONE EQU * 
      LDA .M12
      JSB DSPLY 
      DEF ENDMS 
      JMP STOP
* 
ABORT EQU * 
      ISZ ANYER     BUMP ERROR COUNT
      LDA .M14
      JSB DSPLY 
      DEF ABMSG 
* 
STOP  JSB SPC.C 
      DEF C.LST 
      DEF .M2 
      NOP       ERROR RTN UNIMPORTANT IN ABORT
* 
      JSB END.C 
      DEF ANYER    RETURN ERROR COUNT 
      JMP 12    ERROR RTN HERE ? - ABORT (MP) 
      HED RTE MICRO CROSS-REFERENCE GENERATOR  --  SUBROUTINES
* 
* 
********************
* 
* C L A S S 
* 
* ENTRY:
*   JSB CLASS 
* 
* EXIT: 
*   A= CLASSIFICATION 
* 
* CLASSIFY OP-MNEMONIC TO DETERMINE WHICH FIELDS TO 
* CROSS-REFERENCE.
* 
* WE EXAMINE ONLY FIRST 4 CHARACTERS OF OP-FIELD.  WE ALSO
* ALLOW LABELS WHERE THEY ARE NORMALLY NOT PERMITTED AND TREAT
* ILLEGAL OP-MNEMONICS AS CLASS-2.  THIS IS TO MAXIMIZE 
* THE UTILITY OF THE XREF, BEING AS FORGIVING OF SYNTAX 
* ERRORS AS POSSIBLE. 
* 
* CLASSIFICATIONS ARE DEFINED AS FOLLOWS: 
*   0 -- NO XREF.  TERMINATE SOURCE INPUT (END).
*   1 -- NO EXPR.  XREF LABEL (TYPE-1, ZERO AND ONES
*        OP-MNEMONICS -- ALSO ALGN).
*   2 -- XREF LABEL AND FIXED-FMT EXPR (TYPES-2, -3 AND 
*        -4 OP-MNEMONICS -- ALSO ILLEGAL OP-MNEMONICS). 
*   3 -- XREF LABEL AND VARIABLE-FMT EXPR (ORG, DEF AND EQU). 
* 
* ADDITIONAL INTERNAL CLASSIFICATIONS:
*   377B -- "RTN" OP-CODE, MX-E ONLY.  TREATED AS CLASS-2 
*           IS SPECIAL FIELD IS "CNDX".  OTHERWISE, TREATED 
*           AS CLASS-1. 
* 
* CLASSIFICATION TABLE HAS THE FOLLOWING FORMAT:
* 
*      1
*      5        8 7        0
*     *********************** 
*     * MNEMONIC (2 WORDS)  *    END OF TABLE IS DENOTED
*     *                     *    BY 4 BYTES OF ZEROES 
*     *********************** 
*     * MX CLASS : XE CLASS * 
*     *********************** 
* 
CLASS NOP 
      LDA @FLD2    GET OP-CODE FIELD
      LDB CODE
      JSB MVB 
      DEC 4 
      LDA CLTAB    INITIALIZE TABLE SEARCH
      STA CLPTR 
* 
CLNXT EQU * 
      LDA CLPTR,I  GET TABLE ENTRY
      ISZ CLPTR 
      LDB CLPTR,I 
      ISZ CLPTR    POINTS TO CLASSIFICATION 
      CPB CODE+2   NB: IF B=0, WE ALWAYS SKIP 
      XOR CODE+1
      SZA,RSS      A=0 OR A=CODE
      JMP GOTCL    FOUND MATCH OR END OF TABLE
      ISZ CLPTR 
      JMP CLNXT 
* 
GOTCL EQU * 
      LDA CLPTR,I  GET CLASSIFICATION 
      LDB MX? 
      SZB 
      ALF,ALF      GET MX CLASSIFICATION
      AND =B377 
      CPA =B377    SPECIAL INTERNAL CLASS?
      JMP *+2 
      JMP CLASS,I 
      LDA @FLD3    YES: "RTN" OP-CODE 
      LDB CNDX     SPECIAL FIELD IS "CNDX"? 
      JSB CMPB
      DEC 4 
      SZA 
      CLA,INA,RSS  NO: TREAT AS CLASS-1 
      LDA .2       YES: TREAT AS CLASS-2
      JMP CLASS,I 
CLPTR BSS 1 
CODE  DBL *+1      HOLDS OP-CODE FOR COMPARISON 
      BSS 2 
CNDX  DBL *+1 
      ASC 2,CNDX
CLTAB DEF *+1      OP-CODE TABLE
      ASC 2,
      BYT 1,1 
      ASC 2,IMM 
      BYT 2,2 
      ASC 2,JMP 
      BYT 2,2 
      ASC 2,JSB 
      BYT 2,2 
      ASC 2,RTN    (NOT ON MX)
      BYT 2,377 
      ASC 2,EQU 
      BYT 3,3 
      ASC 2,DEF 
      BYT 3,3 
      ASC 2,ORG 
      BYT 3,3 
      ASC 2,DIV 
      BYT 1,1 
      ASC 2,MPY 
      BYT 1,1 
      ASC 2,WRTE
      BYT 1,1 
      ASC 2,READ
      BYT 1,1 
      ASC 2,ENV 
      BYT 1,1 
      ASC 2,ENVE
      BYT 1,1 
      ASC 2,ALGN
      BYT 1,1 
      ASC 2,ARS 
      BYT 1,1 
      ASC 2,CRS 
      BYT 1,1 
      ASC 2,LGS 
      BYT 1,1 
      ASC 2,NRM    (NOT ON MX)
      BYT 2,1 
      ASC 2,LWF 
      BYT 1,1 
      ASC 2,ASG 
      BYT 1,1 
      ASC 2,NOP 
      BYT 1,1 
      ASC 2,ONES
      BYT 1,1 
      ASC 2,ZERO
      BYT 1,1 
      ASC 2,END 
      BYT 0,0 
      DEC 0,0      ILLEGAL OP-MNEMONIC
      BYT 2,2 
      JMP CLASS,I 
* 
* 
********************
* 
* C M P 
* 
* ENTRY:
*   LDA <LEFT PTR>
*   LDB <RIGHT PTR> 
*   JSB CMP 
*   DEC <# WORDS> 
* 
* EXIT: 
*   A= -1 IF LEFT<RIGHT 
*       0 IF LEFT=RIGHT 
*       1 IF LEFT>RIGHT 
*   B= RIGHT PTR (AS ON ENTRY)
* 
* COMPARE TWO WORD ARRAYS.  "LEFT" AND "RIGHT" REFER
* OPERANDS OF A RELATIONAL EXPR (EG., "LEFT < RIGHT").
* 
CMP   NOP 
      STA CLFT
      STB CRT 
      LDA CMP,I 
      CMA,INA 
      STA CCNT
      ISZ CMP 
* 
CWORD EQU *        COMPARE NEXT WORD
      LDA CRT,I 
      CMA,INA 
      ADA CLFT,I   A>0 IF LEFT>RIGHT
      SZA 
      JMP CDONE 
      ISZ CLFT
      ISZ CRT 
      ISZ CCNT
      JMP CWORD 
* 
CDONE EQU *        COMPARISON COMPLETE
      SZA,RSS 
      JMP CMP,I    EQUAL
      SSA 
      CCA,RSS      INDICATE LEFT<RIGHT & SKIP 
      CLA,INA      INDICATE LEFT>RIGHT
      JMP CMP,I 
CCNT  BSS 1 
CLFT  BSS 1 
CRT   BSS 1 
* 
* 
********************
* 
* C M P B 
* 
* ENTRY:
*   LDA <LEFT BPTR> 
*   LDB <RIGHT BPTR>
*   JSB CMPB
*   DEC <# BYTES> 
* 
* EXIT: 
*   A=-1 IF LEFT<RIGHT
*      0 IF LEFT=RIGHT
*      1 IF LEFT>RIGHT
* 
* SIMILAR TO "CMP", BUT FOR CHARACTER STRINGS.
* 
CMPB  NOP 
      STA CBLFT 
      STB CBRT
      LDA CMPB,I
      CMA,INA 
      STA CBCNT 
      ISZ CMP 
* 
CBYTE EQU *        COMPARE NEXT BYTE
      LDB CBLFT 
      JSB LOADB 
      STB CBLFT 
      STA CBCHR    SAVE LEFT BYTE 
      LDB CBRT
      JSB LOADB 
      STB CBRT
      CMA,INA 
      ADA CBLFT    A>0 IF LEFT>RIGHT
      SZA 
      JMP CBFIN 
      ISZ CBCNT 
      JMP CBYTE 
* 
CBFIN EQU *        COMPARISON COMPLETE
      SZA,RSS 
      JMP CMPB,I   EQUAL
      SSA 
      CCA,RSS      INDICATE LEFT<RIGHT & SKIP 
      CLA,INA      INDICATE LEFT>RIGHT
      JMP CMPB,I
CBCHR BSS 1        LEFT CHARACTER 
CBCNT BSS 1        CHARACTER COUNTER
CBLFT BSS 1        BPTR TO LEFT STRING
CBRT  BSS 1        BPTR TO RIGHT STRING 
* 
* 
********************
* 
* D E C M L 
* 
* ENTRY:
*   LDA <VALUE> 
*   LDB <BPTR TO LEAST-SIGNIFICANT DIGIT> 
*   JSB DECML 
*   DEC <# DIGITS>
* 
* EXIT: 
*   B= BPTR TO MOST-SIGNIFICANT DIGIT PLUS ONE
* 
* CONVERT INTERNAL BINARY VALUE TO ASCII FORM OF
* DECIMAL NUMBER.  NOTE THAT RESULT MAY HAVE LEADING
* ZEROES. 
* 
DECML NOP 
      STA DVAL
      LDA DECML,I 
      CMA,INA 
      STA DCNT
      ISZ DECML 
* 
DNXT  EQU *        NEXT DIGIT 
      STB DDEST 
      CLB 
      LDA DVAL     SHIFT VALUE
      DIV .10 
      STA DVAL     ENTIER(VALUE/10) 
      LDA B        VALUE MOD 10 
      ADA "0"      CONVERT DIGIT TO ASCII 
      LDB DDEST    STORE INTO STRING
      JSB STORB 
      ADB .M2      BPTR TO NEXT MOST-SIG DIGIT
      ISZ DCNT
      JMP DNXT
      JMP DECML,I 
DCNT  BSS 1        # DIGITS 
DDEST BSS 1        BPTR TO NEXT POSITION
DVAL  BSS 1        VALUE
* 
* 
********************
* 
* D F I N E 
* 
* ENTRY:
*   JSB DFINE 
* 
* EXIT: 
*   O= 1 IF SYMBOL TABLE OVERFLOW 
* 
* CROSS-REFERENCE SYMBOL IN LABEL FIELD.  BUILDS
* "DEFINED" SYMBOL ENTRY IN CASE SYMBOL DOES NOT
* EXIST.
* 
DFINE NOP 
      LDA #REC
      STA DEFN
      LDA @FLD1    LABEL PRESENT? 
      LDB LABL
      JSB MVLBL 
      SZA 
      JSB XREF     YES: UPDATE REF LIST 
      JMP DFINE,I 
* 
* 
********************
* 
* D S P L Y 
* 
* ENTRY:
*   LDA <LENGTH>
*   JSB DSPLY 
*   DEF <BUFFER>
* 
* WRITE MESSAGE TO CONSOLE DEVICE.
* 
DSPLY NOP 
      SSA,RSS 
      JMP DS
      CMA,INA 
      SLA,ARS 
      INA 
DS    STA DLEN
      LDA DSPLY,I 
      STA DBUF
      ISZ DSPLY 
      JSB WRT.C 
      DEF C.TTY 
DBUF  DEF 0 
      DEF DLEN
      JMP ABORT    ERROR RTN
      JMP DSPLY,I 
DLEN  BSS 1 
* 
* 
********************
* 
* D U M P 
* 
* ENTRY:
*   JSB DUMP
* 
* EXIT: 
*   B= NEW @XR
* 
* WRITES LINE OF REFERENCES (OUTBUF) TO LIST DEVICE.
* RESETS FIELD INDICATORS FOR NEXT LINE.
* 
DUMP  NOP 
      LDA XRLEN    WRITE BUFFER 
      JSB PRINT 
      DEF OUTBF+1 
      LDA .35 
      LDB OUTBF 
      JSB PAD 
      LDB .M10     RESET TO 1ST COLUMN
      STB XRLEN 
      LDB @XR3
      STB @XR 
      JMP DUMP,I
* 
* 
********************
* 
* E J E C T 
* 
* ENTRY:
*   JSB EJECT 
* 
* EJECTS PAGE AND WRITES HEADER...ONLY IF WE'RE NOT 
* ALREADY AT THE TOP OF FORM (AND HEADER WRITTEN).
* 
EJECT NOP 
      LDA #LNS     TOP OF FORM ALREADY? 
      CPA LINE3 
      JMP EJECT,I  YES: IGNORE REQUEST
      JSB SPC.C 
      DEF C.LST 
      DEF .M2 
      JMP ABORT   ERROR RTN 
      JSB TITLE    WRITE HEADER 
      JMP EJECT,I 
* 
* 
********************
* 
* F I N D X 
* 
* ENTRY:
*   LDB <BPTR TO EXPR FIELD>
*   JSB FINDX 
* 
* EXIT: 
*   B= BPTR TO EXPR (OR FIELD 6)
* 
* SKIP BLANKS TO FIND FIRST CHARACTER OF EXPRESSION.
* WON'T GO BEYOND FIELD 6.
* 
FINDX NOP 
      LDA BLNK
      JSB SKIP
      LDA @FLD6    PAST FIELD 6?
      CMA,INA      B>=@FLD6?
      ADA B 
      SSA,RSS 
      LDB @FLD6    YES: RESET TO FIELD 6
      JMP FINDX,I 
* 
* 
********************
* 
* I N P U T 
* 
* ENTRY:
*   JSB INPUT 
* 
* READ SOURCE LINE FROM INPUT DEVICE. 
* 
INPUT NOP 
      LDA .36 
      LDB CARD
      JSB PAD 
RETRY JSB RED.C    READ SOURCE FROM DISC OR DEVICE
      DEF C.SAU 
      DEF CARD+1
      DEF .36 
      JMP ABORT    EROR RTN 
      SSB          EOF ?
      JMP INEOF    YES: ADD "END" CARD
      SZB,RSS      BLANK RECORD (EOT)?
      JMP RETRY    YES: IGNORE
      JMP INPUT,I 
* 
INEOF EQU *        FAKE "END" 
      LDA =A E
      STA CARD+5
      LDA =AND
      STA CARD+6
      JMP INPUT,I 
* 
* 
* 
********************
* 
* L O A D B 
* 
* ENTRY:
*   LDB <BPTR TO CHARACTER> 
*   JSB LOADB 
* 
* EXIT: 
*   A= CHARACTER
*   B= BPTR TO NEXT CHARACTER 
* 
* LOAD CHARACTER FROM <BPTR> INTO A-REGISTER. 
* 
LOADB NOP 
      CLE,ERB 
      LDA B,I 
      SEZ,RSS 
      ALF,ALF 
      AND =B377 
      ELB 
      INB 
      JMP LOADB,I 
* 
* 
********************
* 
* M O V E 
* 
* ENTRY:
*   LDA <PTR TO SOURCE> 
*   LDB <PTR TO TARGET> 
*   JSB MOVE
*   DEC <# WORDS> 
* 
* EXIT: 
*   B= PTR TO TARGET (AS ON ENTRY)
* 
* MOVE WORDS FROM ONE ARRAY TO ANOTHER. 
* 
MOVE  NOP 
      STA MINP
      STB MDEST 
      LDA MOVE,I
      CMA,INA 
      STA MCNT
      ISZ MOVE
* 
MWORD EQU *        NEXT WORD
      LDA MINP,I
      STA MDEST,I 
      ISZ MINP
      ISZ MDEST 
      ISZ MCNT
      JMP MWORD 
      JMP MOVE,I
MCNT  BSS 1 
MDEST BSS 1 
MINP  BSS 1 
* 
* 
********************
* 
* M V B 
* 
* ENTRY:
*   LDA <BPTR TO SOURCE>
*   LDB <BPTR TO TARGET>
*   JSB MVB 
*   DEC <# BYTES> 
* 
* MOVE CHARACTERS FROM ONE STRING TO ANOTHER. 
* 
MVB   NOP 
      STA MVINP 
      STB MVDST 
      LDA MVB,I 
      CMA,INA 
      STA MVCNT 
      ISZ MVB 
* 
MVNXT EQU * 
      LDB MVINP 
      JSB LOADB 
      STB MVINP 
      LDB MVDST 
      JSB STORB 
      STB MVDST 
      ISZ MVCNT 
      JMP MVNXT 
      JMP MVB,I 
MVCNT BSS 1 
MVDST BSS 1 
MVINP BSS 1 
* 
* 
********************
* 
* M V L B L 
* 
* ENTRY:
*   LDA <BPTR TO SOURCE>
*   LDB <WORD PTR TO TARGET>
*   JSB MVLBL 
* 
* EXIT: 
*   A= # CHARACTERS MOVED 
*   MLINP= BPTR TO LAST+1 CHAR
* 
* MOVE A LABEL (IF FOUND) INTO THE "LABL" BUFFER. 
* ENSURES THAT FIRST CHARACTER IS NOT "%", "*"
* OR DIGIT (IE., VALID CONSTANT).  THEN MOVES 
* STRING UNTIL WE FIND A BLANK, "+", OR "-" UP TO 
* 8 CHARACTERS.  NOTE THAT WE ACCEPT LABEL WITH 
* INITIAL "$" HERE (CONSISTENT WITH WEAK DIAGNOSTIC 
* PHILOSOPHY).
* 
MVLBL NOP 
      STA MLINP 
      STB MLDST 
      LDA .4
      JSB PAD 
      LDA MLDST    GET BPTR TO TARGET 
      RAL 
      STA MLDST 
      LDA .M8 
      STA MLCNT 
      LDB MLINP 
      JSB LOADB 
      CPA ASTER    STARTS WITH "*" OR "%"?
      JMP MLFIN    YES: NO LABEL
      CPA "%" 
      JMP MLFIN    YES: NO LABEL
      ADA .M"0" 
      SSA 
      JMP MLNXT    NO: POSSIBLY A LABEL 
      ADA .M10
      SSA 
      JMP MLFIN    YES: NOT A LABEL 
* 
MLNXT EQU * 
      LDB MLINP 
      JSB LOADB 
      CPA PLUS     "+", "-" OR BLANK? 
      JMP MLFIN    YES: END OF LABEL
      CPA MINUS 
      JMP MLFIN 
      CPA BLNK
      JMP MLFIN 
      STB MLINP 
      LDB MLDST 
      JSB STORB 
      STB MLDST 
      ISZ MLCNT 
      JMP MLNXT 
* 
MLFIN EQU * 
      LDA MLCNT 
      ADA .8       # CHARACTERS MOVED 
      JMP MVLBL,I 
MLCNT BSS 1 
MLDST BSS 1 
* 
* 
********************
* 
* P A D 
* 
* ENTRY:
*   LDA <# WORDS> 
*   LDB <PTR TO BUFFER> 
*   JSB PAD 
* 
* PROPAGATE BLANKS INTO THE BUFFER. 
* 
PAD   NOP 
      CMA,INA 
      STA PCNT
      LDA BLNK2 
* 
PANXT EQU * 
      STA B,I 
      INB 
      ISZ PCNT
      JMP PANXT 
      JMP PAD,I 
PCNT  BSS 1 
* 
* 
******************************
* 
* P R I N T 
* 
* ENTRY:
*   LDA <LENGTH>
*   JSB PRINT 
*   DEF <BUFFER>
* 
PRINT NOP 
      SSA,RSS 
      JMP PR1 
      CMA,INA 
      SLA,ARS 
      INA 
PR1   STA PLEN
      ISZ #LNS     TOP OF FORM? 
      JMP PR0 
      JSB EJECT    YES: PRINT HEADER
      ISZ #LNS     (CANNOT BE ZERO) 
PR0   LDA PRINT,I 
      STA PBUF
      ISZ PRINT 
      JSB WRT.C 
      DEF C.LST 
PBUF  DEF 0 
      DEF PLEN
      JMP ABORT   ERROR RTN 
      JMP PRINT,I 
PLEN  BSS 1 
* 
* 
********************
* 
* R A D D 
* 
* ENTRY:
*   LDB <PTR TO REF LINK IN SYM TAB ENTRY>
*   JSB RADD
* 
* EXIT: 
*   O= 1 IF SYM TAB OVERFLOW
* 
* ALLOCATE AND SET-UP REFERENCE ENTRY.  ADD ENTRY 
* TO REFERENCE LIST.
* 
* REFERENCE ENTRY HAS THE FOLLOWING FORMAT: 
* 
*     ********************
*     * REFERENCE LINK   *
*     ********************
*     * REFERENCE LINE # *
*     ********************
* 
* REFERENCE LIST IS CIRCULAR WITH HEAD POINTER IN SYMBOL
* TABLE.  THUS, INSERTIONS ARE EASY AND THE REFERENCE HAS 
* A FIFO ORDER, OBVIATING A LIST SORT.  NOTE THAT THE 
* LINE # IN WHICH SYMBOL IS DEFINED APPEARS IN SYMBOL 
* TABLE, NOT REFERENCE LIST (ALTHO ANY DUPLICATE
* DEFINITION WILL APPEAR AS REFERENCES TO THE FIRST). 
* REFERENCE LIST HAS THE FOLLOWING FORM:
* 
*     ****************
*     * SYMBOL TABLE *
*     * ENTRY        *
*     *           ---*-----------------+
*     ****************                 :
*                                      :
*                                      :
*          ***********    ***********  +--> *********** 
*     +--> *      ---*--> *      ---*-----> *      ---*--+
*     :    *         *    *         *       *         *  :
*     :    ***********    ***********       ***********  :
*     :     FIRST REF                        LAST REF    :
*     +--------------------------------------------------+
* 
RADD  NOP 
      STB SYM 
      LDA SYMOV    REF TAB OVERFLOW?
      STO 
      SZA 
      JMP RADD,I   YES
      LDB RNEXT    "ALLOCATE" REF TAB ENTRY 
      STB REF 
      ADB .M2 
      STB RNEXT    NEXT AVAIL ENTRY 
      CMB,INB      RNEXT-6<=SNEXT?
      ADB SNEXT 
      ADB .4       NET: ADD 6 
      SSB,RSS 
      ISZ SYMOV    YES: ANTICIPATE OVERFLOW 
* 
      LDA SYM,I    PTR TO LAST ENTRY
      LDB REF      LINK ENTRY INTO CIRC LIST
      STB SYM,I    LINK NEW ENTRY TO SYM TAB
      SSA          FIRST REF? 
      JMP RA1ST    YES
      LDB A,I      PTR TO FIRST ENTRY 
      STB REF,I    LINK FIRST TO NEW ENTRY
      LDB REF 
      STB A,I      LINK LAST TO NEW ENTRY 
      JMP *+2 
RA1ST STB REF,I    FIRST ENTRY PTS TO SELF
      ISZ REF      PUT LINE# INTO NEW ENTRY 
      LDA #REC
      STA REF,I 
      CLO          NO OVERFLOW
      ISZ #REF
      JMP RADD,I
* 
* 
********************
* 
* R E F E R 
* 
* ENTRY:
*   LDB <BPTR TO LEFT-MOST COLUMN OF EXPR FIELD>
*   JSB REFER 
* 
* EXIT: 
*   O= 1 IF SYM TAB OVERFLOW
* 
* CROSS-REFERENCE SYMBOL (IF ANY) ENCOUNTERED IN EXPR.
* BUILDS "FWD REFERENCE" ENTRY IN CASE SYMBOL IS NOT
* ALREADY DEFINED.
* 
REFER NOP 
      LDA =B100000 SET UP ENTRY 
      STA DEFN
      JSB FINDX    LOCATE EXPR
      LDA B        LABEL PRESENT? 
      LDB LABL
      JSB MVLBL 
      SZA 
      JSB XREF     YES: UPDATE REF LIST 
      JMP REFER,I 
* 
* 
******************************
* 
* S A D D 
* 
* ENTRY:
*   JSB SADD
* 
* EXIT: 
*   B= PTR TO SYM TAB ENTRY 
*   O= 1 IF OVERFLOW (IN WHICH CASE B IS INVALID) 
* 
* ALLOCATE AND SET-UP SYMBOL TABLE ENTRY.  ENTRY
* TEMPLATE IS IN "LABL".
* 
* SYMBOL TABLE ENTRY HAS THE FOLLOWING FORMAT:
* 
*     ********************* 
*     * SYMBOL (4 WORDS)  * 
*     *                   * 
*     ********************* 
*     * DEFINITION LINE # *    100000B IF UNDEFINED 
*     ********************* 
*     * REF LIST HEAD     *    -1 IF NO REFERENCES
*     ********************* 
* 
* SYMBOL AND REFERENCE ENTRIES ARE ALLOCATED IN A FREE
* SPACE.  THE TWO TABLES GROW TOGETHER.  THE FORM IS: 
* 
*     *********** 
*     * SYM TAB * <-- SBASE (FWA) 
*     * ENTRY   * 
*     *---------* 
*     *         * <-- SNEXT 
*     *         * 
*     *         * <-- RNEXT (NB: PTS LOWER OF TWO WORDS)
*     *         * 
*     *---------* 
*     * REF TAB * 
*     * ENTRY   * <-- LWM 
*     *********** 
* 
* SEE "RADD" FOR RELATIONSHIP BETWEEN SYMBOL TABLE ENTRY AND
* REFERENCE LIST. 
* 
SADD  NOP 
      LDA SYMOV    SYM TAB OVERFLOW?
      STO 
      SZA 
      JMP SADD,I   YES
      LDB SNEXT    "ALLOCATE" SYM TAB ENTRY 
      LDA RNEXT    ANTICIPATE OVERFLOW
      CMA,INA      RNEXT-6<=SNEXT?
      ADA B 
      ADA .6
      SSA,RSS 
      ISZ SYMOV    YES: SET OVERFLOW FLAG 
      ADA RNEXT    NEXT SYMTAB ENTRY (SNEXT+6)
      STA SNEXT 
* 
      LDA LABL     SET UP SYMTAB ENTRY
      JSB MOVE
      DEC 6 
      CLO 
      ISZ #SYM
      JMP SADD,I
* 
* 
********************
* 
* S E R C H 
* 
* ENTRY:
*   JSB SERCH 
*   DEF <SYM TAB MOCK-UP> 
* 
* EXIT: 
*   B= -1 IF NOT FOUND
*      SYM TAB ENTRY ADDR IF FOUND
* 
* SEARCH SYMBOL TABLE FOR LABEL POINTED TO AT P+1 IN
* CALLING SEQUENCE. 
* 
SERCH NOP 
      LDB SBASE 
* 
SRNXT EQU * 
      CPB SNEXT 
      JMP SRNO
      LDA SERCH,I 
      JSB CMP 
      DEC 4 
      SZA,RSS 
      JMP SRYES    FOUND IT 
      ADB .6
      JMP SRNXT 
* 
SRNO  CCB          NOT FOUND
SRYES ISZ SERCH 
      JMP SERCH,I 
* 
* 
********************
* 
* S K I P 
* 
* ENTRY:
*   LDA <CHARACTER> 
*   LDB <BPTR TO FIRST CHAR>
*   JSB SKIP
* 
* EXIT: 
*   A= LAST CHARACTER 
*   B= BPTR TO LAST CHARACTER 
* 
* SKIP CONTIGUOUS SEQUENCE OF SPECIFIED CHARACTER.
* 
SKIP  NOP 
      STA SKCHR 
* 
SK1   JSB LOADB 
      CPA SKCHR 
      JMP SK1 
      ADB .M1 
      JMP SKIP,I
SKCHR BSS 1 
* 
* 
********************
* 
* S P A C ? 
* S P A C E 
* 
* ENTRY:
*   LDA <# BLANK LINES> 
*   JSB SPACE 
* 
* PRINT A BLANK LINE ON LIST DEVICE.
* 
SPAC? NOP 
      LDB #LNS     TOP OF FORM? 
      CPB LINE3 
      JMP SPAC?,I  YES: IGNORE REQUEST
      LDB SPAC? 
      STB SPACE 
      JMP SPACE+1 
* 
SPACE NOP 
      STA SLEN
      ADA #LNS     ENOUGH LINES ON PAGE?
      SSA,RSS 
      JMP SP1      NO: PAGE EJECT INSTEAD 
      STA #LNS
      JSB SPC.C 
      DEF C.LST 
      DEF SLEN
      JMP ABORT   ERROR RTN 
      JMP SPACE,I 
* 
SP1   EQU * 
      JSB EJECT 
      JMP SPACE,I 
SLEN  BSS 1 
* 
* 
********************
* 
* S T O R B 
* 
* ENTRY:
*   LDA <CHARACTER> 
*   LDB <BPTR TO DESTINATION> 
*   JSB STORB 
* 
* EXIT: 
                                                                                                                                              