*ASMB,R,L,Z   USE 'Z' FOR RTE-III GENERATOR 
*ASMB,R,L,N   USE 'N' FOR RTE-II GENERATOR
      HED  REAL TIME SYSTEM GENERATOR 
*     NAME:   RTGEN 
*     SOURCE: 92001-18015 (RTE-II AND RTE-III)
*     RELOC:  92001-16015 (RTE-II) 92060-16030 (RTE-III)
*     PGMR:   GAA/RHB 
* 
*  ***************************************************************
*  * THIS PROGRAM CONTAINS INFORMATION WHICH IS PROPRIETARY TO   *
*  * THE HEWLETT-PACKARD COMPANY.  IT IS NOT TO BE DISCLOSED TO  *
*  * ANY THIRD PARTIES OR REPRODUCED EXCEPT FOR ARCHIVE PURPOSES *
*  ***************************************************************
* 
      IFN 
*** BEGIN NON-MEU CODE ***
      NAM RTEGN 92001-16015 REV.1631 760630 
**** END NON-MEU CODE ****
      XIF 
      IFZ 
***** BEGIN MEU CODE *****
      NAM RTEGN 92060-16030 REV.1631 760630 
****** END MEU CODE ******
      XIF 
      SPC 1 
      ENT N1,N2,N3,N4,N5,N6,N8,N9,N10,N16,N27 
      ENT N64,P2,P3,P4,P5,P6,P7,P8,P9,P11,P12,P13,P14 
      ENT P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25 
      ENT P28,P29,P31,P33,P60,P64,P99,P202,P6K,L60,L2000
      ENT M60,M77,M120,M177,M377,M777,M400,D128,M200,M0760
      ENT M1740,M1600,M1777,M2000,M1377,M7400,M7000,M7600 
      ENT M7700,M7777,M0300,M1177 
      ENT DPWRS,P0100,P1000,P100,P10,P1 
      ENT OPWRS,M0100,M1000,M100,M10
      ENT PPREL,LWASM,BLANK,UBLNK,MSIGN,RPARB 
      ENT ADBP,DSKA,MOVW
* 
*     ENTRY POINTS FOR THIS MODULE
* 
*     VARIABLES ... 
* 
      EXT DSKAB 
* 
*     UTILITY SUBROUTINES 
* 
      ENT DOCON,SPACE,READ,GETNA,GINIT,GETOC,GETAL
      ENT INERR,YE/NO,LSTS,ERROR,LSTE,LABDO,IRERR 
      ENT OUTID,CONVD 
* 
      ORB 
A     EQU 0 
B     EQU 1 
      SPC 2 
*     THE FOLLOWING LABELS ARE TO BE SATISFIED BY THE DRIVER MODULE 
*     OF THE GENERATOR.  THAT MODULE TAKES CARE OF ALL THINGS WHICH 
*     DEPEND ON THE DETAILS OF THE DISC AND ITS CONTROLER.
* 
      EXT SYSCH     SYSTEM SUBCHANNEL 
      EXT AUXCH     AUX DISC SUBCHANNEL 
      EXT DSIZE     SYSTEM DISC SIZE (TRACKS) 
      EXT DAUXN     AUX DISC SIZE (TRACKS)
      EXT DSETU     INITILIZE SUBROUTINE
      EXT DSKSC     SCRATCH DISC ADDRESS
      EXT LSSYS,LSAUX  LAST SEEK FLAGS
      EXT DISKA     INCREMENT DISC ADDRESS SUBROUTINE 
      EXT DISKO     DISC OUTPUT ROUTINE 
      EXT DISKI     DISC INPUT ROUTINE
      EXT DSTBL     GENERATE DISC TABLE SUBROUTINE
      EXT TRTST     TEST CURRENT TRACK SUBROUTINE 
      EXT DTSET     SET UP TAT SUBROUTNE
      EXT SDS#      SYSTEM DISC SECTORS/TRACK 
      EXT ADS#      AUX DISC SECTORS/TRACK
      EXT FSECT     FLUSH FINAL SECTOR FROM CORE
      EXT DERCN     DISC ERROR COUNT
      EXT DBPO      ORG OF DUMMY BASE PAGE
      EXT DSKAB     INITIAL ABS DISC ADDRESS
      EXT PTBOT     CONFIGURE DISC/ PUNCH BOOT
      SKP 
*          GENERATOR ORGANIZATION                *   ORDER
*                                                    OF EXECUTION 
      SPC 3 
***************** - HIGH CORE - ******************
*                                                *
*             SIO DRIVERS (TTY,LP,PT,HSP,MT)     *
*                                                *
**************************************************
*                    - IDENTS -                  *
*                    ----------                  *
*                                                *
*                     - FIX UP TABLE -           *
*                     -------                    *
*                     - LST -                    *
**************************************************
*                                                *
*       DISC MODULE  USUALLY HERE                *
*                                                *
**************************************************
*                                                *
*           LOAD, LINKAGE SUBROUTINES            *
*                                                *
**************************************************
*                                                *
*            FINAL CLEAN UP, LIBRARY MOVE        *  8 
*            DIRECTORY CREATION ECT.             *
*                                                *
*     IFZ - (DMS SYSTEM) PARTITION DEFINITION,   *
*           PROG SIZE OVERRIDE, ETC.             *
*                                                *
*           PROGRAM LOADING CONTROL              *  4,6 
*                                                *
**************************************************
*                                                *
*               I/O TABLE GENERATION             *  5 
*                                                *
*                  PARAMETER INPUT               *  3 
*                                                *
**************************************************
*                                                *
*                                                *
*          RELOCATABLE PROGRAM INPUT             *  2 
*                                                *
*                INITIALIZATION                  *  1 
*                                                *
*                                                *
****************** - 2000 - **********************
*                                                *
*                                                *
*        DATA AREAS, SOME GENERAL SUBS.          *
*                                                *
*                                                *
**************************************************
      SKP 
*  IDENT FORMAT 
* 
*  WORD 1: ID1 - NAME 1,2 
*  WORD 2: ID2 - NAME 3,4 
*  WORD 3: ID3 - NAME 5, USAGE FLAG (SEE BELOW) 
*  WORD 4: ID4 - COMMON LENGTH
*  WORD 5: ID5 - CURRENT DISK ADDRESS 
*  WORD 6 (15): ID6 - M/S 
*  WORD 6 (08-14): ID6 - NOT USED 
*  WORD 6 (00-06): ID6 - TYPE 
*  WORD 7: ID7 - LOWEST DBL ADDRESS 
*  WORD 8: ID8  - DISK LENGTH FOR UTILITY RELOCATABLES
*                 OR.. MAIN IDENT ADDR FOR SEGMENTS 
*                 OR.. (DMS SYSTEMS) PG REQMTS (8 BITS) 
*                      THEN KEYWD INDEX (LOW 8 BITS). 
* 
*   USAGE FLAG BITS ARE AS FOLLOWS: 
* 
*   BIT 0  IF SET MODULE WAS LOADED 
*   BIT 1  IF SET MUST LOAD THIS MODULE (EXT DEFINED BY IT) 
*   BIT 2  IF SET THIS MODULE WAS LOADED AS PART OF A SEGMENT 
* 
* 
*  LST FORMAT 
* 
*  WORD 1: LST1 - NAME 1,2
*  WORD 2: LST2 - NAME 3,4
*  WORD 3: LST3 - NAME 5, ORDINAL 
*  WORD 4: LST4 - IDENT ADDRESS OR 2 IF COMMON, 3 IF ABS, 4 IF REPLACE
*  WORD 5: LST5 - SYMBOL VALUE
* 
* 
*  PROGRAM TYPES (NON-DMS)
* 
*  0: SYSTEM
*  1: RT RESIDENT 
*  2: RT DISK RESIDENT
*  3: BG DISK RESIDENT
*  4: BG RESIDENT 
*  5: BG SEGMENT
*  6: LIBRARY 
*  7: UTILITY 
*  8: LOAD ONLY TO SATISFY EXTERNAL REFERENCES. 
*  9: RT RESIDENT USING BACKGROUND COMMON.
* 10: RT DISC RESIDENT USING BACKGROUND COMMON. 
* 12: BG RESIDENT USING FORGROUND COMMON. 
* 11: BG DISC RESIDENT USING FORGROUND COMMON.
* 13: BG SEGMENT USING FORGROUND COMMON 
* 14: TYPE 6 THAT IS TO BE FOURCE LOADED TO THE LIBRARY.
* 30: (DMS SYSTEM SSGA MODULE) CONVERTED TO TYPE 7. 
* 16-29,31 (DMS MODULES USING SSGA) TYPE SET TO TYPE-16.
* 15,32-99:UNUSED (TYPE + 80 IS USED TO DESIGNATE AUTO
      SPC 1 
*  PROGRAM TYPES (DMS SYSTEMS)
* 
*  0: SYSTEM
*  1: MEMORY RESIDENT 
*  2: RT DISK RESIDENT
*  3: BG DISK RESIDENT
*  4: (CONVERTED TO 9)
*  5: BG SEGMENT
*  6: LIBRARY 
*  7: UTILITY 
*  8: LOAD ONLY TO SATISFY EXTERNAL REFERENCES. 
*  9: MEMORY RESIDENT USING BACKGROUND COMMON.
* 10: RT DISC RESIDENT USING BACKGROUND COMMON. 
* 11: BG DISC RESIDENT USING FORGROUND COMMON.
* 12: (CONVERTED TO TYPE 1) 
* 13: (CONVERTED TO 5, USES SAME COMMON AS MAIN)
* 14: TYPE 6 THAT IS TO BE FOURCE LOADED TO THE LIBRARY.
* 30: SUBSYSTEM GLOBAL MODULE 
* 17,18,19,25,26,27: TYPES 1,2,3,9,10,11 (RESP.)
*                    W/ACCESS TO SSGA.
* 15,16,20-24,28,29,31-99:UNUSED (TYPE + 80 IS USED TO
*              DESIGNATE AUTO SCHEDULE AT STARTUP, BUT MAY
*               ONLY BE ENTERED IN PARM PHASE. +80 IS JUST
*               A FLAG TO PARM PHASE, NOT STORED IN ID-SEG.)
* 
* 
*  FIX UP TABLE FORMAT
* 
*  FIX1: CORE ADDRESS 
*  FIX2: INSTRUCTION CODE 
*  FIX3: OFFSET 
*  FIX4: ADDRESS OF LST ENTRY REFERENCED OR ZERO IF NONE. 
      SKP 
* 
*  ERROR CODES
* 
*  1: INVALID TTY REPLY TO INITIALIZATION PARAMETERS
*  2: CHECKSUM ERROR
*  3: RECORD OUT OF SEQUENCE
*  4: INVALID RECORD TYPE 
*  5: DUPLICATE ENTRY POINTS
*  6: NOT USED
*  7: LST,IDENT,FIXUP TABLE OVERFLOW
*  8: DUPLICATE PROGRAM NAMES 
*  9: PARAMETER NAME ERROR
*  10: PARAMETER TYPE ERROR 
*  11: PARAMETER PRIORITY ERROR 
*  12: PARAMETER EXECUTION INTERVAL ERROR 
*  13: BG SEGMENT PRECEDES BG DISC RESIDENT 
*  14: SYS AV MEM OR BG BOUNDARY ERRORS 
*  15: ILLEGAL CALL BY A TYPE 6 PROGRAM (MAY CALL TYPE 0 AND 6 ONLY)
*  16: BP LINKAGE AREA OVERFLOW 
*  17: DISK OVERFLOW (NEXT DISK ADDR EXCEEDS LAST AVAIL DISK ADDR)
*  18: MEMORY OVERFLOW
*  19: ATTEMPT TO RESTART AFTER CLEAN-UP BEGUN
*  20: NOT USED 
*  21: '$CIC' NOT FOUND IN LOADER SYMBOL TABLE
*  22: DISK READ PARITY/DECODE ERROR
*  23: INVALID FWA BP LINKAGE REPLY 
*  24: INVALID CHANNEL NO. IN EQT RECORD
*  25: INVALID DRIVER NAME IN EQT RECORD
*  26: INVALID D, B, U, OPERANDS IN EQT RECORD
*  27: INVALID DEVICE REFERENCE NO. 
*  28: INVALID INTERRUPT REC CHANNEL NO.
*  29: INVALID INTERRUPT REC CHANNEL NO. ORDER
*  30: INVALID INT RECORD MNEMONIC
*  31: INVALID EQT NO. IN INT RECORD
*  32: INVALID PROGRAM NAME IN INT RECORD 
*  33: INVALID ENTRY POINT IN INT RECORD
*  34: INVALID ABSOLUTE VALUE IN INT RECORD 
*  35: BP INTERRUPT LOCATION OVERFLOW 
*  36: INVALID TERMINATING OPERAND IN INT RECORD
*  37: INVALID COMMON LENGTH IN SYS, LIB, OR SSGA MODULE..... 
*  38: ABSOLUTE SYSTEM HAS OVERLAYED A RELOCATABLE PROGRAM
*  39: ILLEGAL SYSTEM CALL OF TYPE 6 PROGRAM
*  40: MH RTEGN ATTEMPTED TO USE A DEFECTIVE CYLINDER 
*  41: MORE THAN 10 BAD TRACKS IN A MOVING HEAD SYSTEM
*  42: ABSOLUTE SYSTEM INCLUDES A BAD TRACK 
*  43: DISC SPECIFICATIONS DO NOT CONFORM TO SYSTEM DISC
      SKP 
********************************************************************
*                                                                  *
*     M E U     E R R O R     C O D E S                            *
*                                                                  *
********************************************************************
      SPC 1 
*   DURING DEFINITION OF PARTITIONS:
*  44: INVALID PARTITION NUMBER 
*  45: INVALID PARTITION SIZE 
*  46: INVALID PARTITION TYPE 
*  47: INVALID PARTITION RESERVE
*     USER RESPONSE TO 44 THRU 47: REENTER DESCRIPTION
*     OF PARTITION IN QUESTION AND CONTINUE.
* 
*  53: PARTITION SIZES DON'T TOTAL TO AVAILABLE AREA
*     USER RESPONSE TO 53: REDEFINE ALL PARTITIONS
* 
*   DURING ASSIGNMENT OF PROGRAMS TO PARTITIONS:
*  48: INVALID OR UNKNOWN PROGRAM NAME
*  49: INVALID PARTITION NUMBER 
*  50: PROGRAM TOO LARGE FOR PARTITION SPECIFIED
*     USER RESPONSE TO 48 THRU 50: REENTER ASSIGNMENT 
*     OR GIVE UP AND CONTINUE 
* 
*   DURING OVERRIDE OF PROGRAM SIZE REQMTS: 
*  48: (SAME AS ABOVE)
*  51: INVALID SIZE (LARGER THAN ALLOWABLE OR 
*      SMALLER THAN PROGRAM REQUIREMENT 
*     USER RESPONSE TO 48 OR 51: REENTER SIZE OVERRIDE
*     OR GIVE UP AND CONTINUE 
* 
*   DURING PROGRAM LOADING AND RELOCATION:
*  52: MODULE WITHOUT SSGA BIT IN TYPE HAS
*      EXTERNAL REF TO AN SSGA ENTRY POINT
*     USER RESPONSE: CHANGE TYPE OR DELETE SSGA REFERENCE 
*  54: SUBROUTINE OR SEGMENT DECLARED MORE COMMON THAN MAIN 
*     USER RESPONSE: RECOMPILE MAIN SPECIFYING MAX COMMON NEEDED
      HED RTE GENERATOR  - CONSTANTS AND ADDRESSES
* 
DRPTR EQU 101B      PT READER DRIVER ADDRESS
DRKEY EQU 102B      KEYBOARD OUPUT DRIVER ADDRESS 
DRHSP EQU 103B      HS PUNCH DRIVER ADDRESS 
DRTTY EQU 104B      TELETYPE INPUT DRIVER ADDRESS 
FWAM  EQU 105B
LWAM  EQU 106B      END AVAIL. MEM - SET BY DRIVERS 
DRMAG EQU 107B      (TEMP MAG TAPE DRIVER ADDR) 
.     EQU 1650B     ORIGIN OF SYS COMM AREA 
      SPC 1 
TRANS DEF RTEGN     TRANSFER ADDR TO RTEGN
AINPT DEF INPUT     ADDRESS OF PROGRAM INPUT CODE 
APARS DEF PARAM     ADDRESS OF PARAMETER INPUT CODE 
      IFZ 
***** BEGIN DMS CODE *****
APART DEF PARTS     ADDRESS OF PARTITION DEF PHASE
****** END DMS CODE ******
      XIF 
NRST  DEF E19       ADDRESS OF RESTART ERROR CODE 
ADBP  DEF DBPO      STARTING ADDRESS OF DUMMY BASE PAGE 
NADBP BSS 1         THE NEG OF RTEGN START
      SKP 
* 
*                                   PROGRAM CONSTANT FACTORS
ZERO  OCT 0 
N1    DEC -1
N2    DEC -2
N3    DEC -3
N4    DEC -4
N5    DEC -5
N6    DEC -6
N7    DEC -7
N8    DEC -8
N9    DEC -9
N10   DEC -10 
N11   DEC -11 
N16   DEC -16 
N27   DEC -27 
N32   DEC -32 
N64   DEC -64 
N65   DEC -65 
N80   DEC -80 
N2048 DEC -2048 
NDAY  OCT 177574,025000 
P2    DEC 2 
P3    DEC 3 
P4    DEC 4 
P5    DEC 5 
P6    DEC 6 
P7    DEC 7 
P8    DEC 8 
P9    DEC 9 
P11   DEC 11
P12   DEC 12
P13   DEC 13
P14   DEC 14
P15   DEC 15
P16   DEC 16
P17   DEC 17
P18   DEC 18
P19   DEC 19
P20   DEC 20
P21   DEC 21
P22   DEC 22
P23   DEC 23
P24   DEC 24
P25   DEC 25
P26   DEC 26
P28   DEC 28
P29   DEC 29
P30   DEC 30
P31   DEC 31
P32   DEC 32
P33   DEC 33
P60   DEC 60
P64   DEC 64
P99   DEC 99
P202  DEC 202 
P6K   DEC 6000
L6    EQU N6
L10   EQU N8
L12   EQU N10 
L60   OCT -60 
L2000 OCT -2000 
M4    EQU P4
M7    EQU P7
M13   EQU P11 
M17   EQU P15 
M20   EQU P16 
M37   EQU P31 
M60   OCT 60
M77   OCT 77
M120  OCT 120 
M177  OCT 177 
M377  OCT 377 
M777  OCT 777 
M400  OCT 400 
D128  DEC 128 
M200  EQU D128
M0760 OCT 076000
M1740 OCT 174000
M1760 OCT 176000
M1600 OCT 160000
M1777 OCT 1777
M2000 OCT 2000
M2002 OCT 2002
M1377 OCT 100377
M4000 OCT 4000
M7400 OCT 177400
M7000 OCT 177000
M7600 OCT 177600
M7700 OCT 177700
M7777 OCT 77777 
M0300 OCT 030000
M0400 OCT 040000
M1177 OCT 101777
      SKP 
DPWRS DEF *+1 
P0100 DEC 10000 
P1000 DEC 1000
P100  DEC 100 
P10   DEC 10
P1    DEC 1 
OPWRS DEF *+1 
M0100 OCT 10000 
M1000 OCT 1000
M100  OCT 100 
M10   OCT 10
      OCT 1 
* 
      SUP 
BLANK OCT 040       BLANK 
UBLNK OCT 20000     UPPER CHAR BLANK
MSIGN OCT 100000    NEGATIVE SIGN 
RPARB OCT 24440     RIGHT PAREN, BLANK
      SPC 3 
* 
DBLNK DEF UBLNK     DEF OF BLANK FOR SPACE ROUTINE
TTYIN NOP           ADDRESS OF THE TTY INPUT DRIVER (ACTUAL)
LSTD  NOP           ADDRESS OF THE ACTUAL LIST DEVICE DRIVER
DAOUT DEF ASOUT     ADDRESS OF DUMMY LIST OUTPUT DRIVER 
DASIN DEF ASIN      ADDRESS OF DUMMY INPUT DRIVER.
      SPC 2 
      IFN 
*** BEGIN NON-DMS CODE ***
FWSCA EQU .-1       FIRST WORD OF SYS COMM AREA 
LWSBP ABS FWSCA     LAST WORD OF BP LINK AREA +1
EOBP  ABS -FWSCA
#IREG EQU P2        NUMBER OF INDEX REGS (AMOUNT OF 
*                                   SPACE ALLOWED FOR SAVING THEM)
**** END NON-DMS CODE ****
      XIF 
      IFZ 
***** BEGIN DMS CODE *****
FWSCA EQU .-1       EXTEND COMM AREA FOR I-REG PTR
LWSBP ABS FWSCA     LWA BP LINK AREA +1 
#IREG EQU P2        SAVE 2 I-REGS 
****** END DMS CODE ******
      XIF 
      SPC 2 
*     ALL STARTS AND RESTARTS COME TO HERE. 
* 
BEGIN LDA DAOUT     GET THE DUMMY DRIVER ADDRESS
      CPA DRKEY     ALREADY SET UP? 
      JMP TRANS,I   YES GO RESTART THE CODE 
* 
      LDB DRKEY     GET THE ACTUAL ADDRESS
      STB LSTD      AND SET FOR DUMMY ROUTINES
      LDB DRTTY     GET THE ACTUAL INPUT DRIVER ADDRESS 
      STB TTYIN     AND SET FOR DUMMY ROUTINES
      STA DRKEY     SET THE DUMMY ADDRESSES 
      LDA DASIN     GET THE DUMMY INPUT ROUTINE ADDRESS 
      STA DRTTY     AND SET IT. 
      JMP TRANS,I   GO DO THE RT GENERATION!! 
      HED RTE GENERATOR   BASE PAGE ROUTINES
*  THE INIDX,IDXS AND IDX SUBROUTINES ARE USED TO SET THE CURRENT 
*  ADDRESSES FOR THE ENTRY IN THE PROGRAM IDENTIFICATION
*  BLOCK TABLE (IDENT).  THE ADDRESS OF THE NEXT ENTRY
*  IN THE IDENT TABLE IS CONTAINED IN TIDNT.  ON RETURN FROM
*  IDX, TIDNT CONTAINS THE ADDRESS OF THE NEXT AVAILABLE
*  ENTRY IN IDENT.  THE ADDRESS OF THE FIRST ENTRY IS CONTAINED 
*  IN BIDNT AND THE ADDRESS OF THE END OF IDENT IS CONTAINED
*  IN PIDNT.
* 
*  IDXS FINDS AN ENTRY IN THE TABLE.
* 
*  IF THE NEXT IDENT ENTRY OVERFLOWS INTO THE LAST LST ENTRY, 
*  IDX PRINTS A DIAGNOSTIC AND EXITS TO THE IRRECOVERABLE ERROR 
*  SUBROUTINE.
* 
*                                   SET INITIAL IDENT ADDRESS 
* 
*  INIDX SETS THE ADDRESS OF THE FIRST ENTRY IN THE IDENT 
*  TABLE AS THE CURRENT ADDRESS.
* 
*  CALLING SEQUENCE:
*    A = IGNORED
*    B = IGNORED
*    JSB INIDX
* 
*  RETURN: CONTENTS OF A DESTROYED, B PRESERVED 
* 
INIDX NOP 
      LDA BIDNT     BIDNT = INITIAL IDENT ADDRESS 
      STA TIDNT     SET CURRENT IDENT ADDRESS 
      JMP INIDX,I   RETURN
      SKP 
*  IDXS FINDS AN ID ENTRY IN THE IDENT TABLE. 
* 
*  CALLING SEQUENCE:
*    A = IGNORED
*    B = ADDRESS OF THE NAME TO FIND. 
*    JSB IDXS 
* 
*  RETURN: CONTENTS OF A AND B ARE DESTROYED. 
*  (N+1): CURRENT IDENT ADDRESSES ARE FOR THE NEXT FREE ENTRY IN
*         THE IDENT LIST. SYMBOL NOT FOUND. 
*  (N+2): CURRENT IDENT ADDRESSES ARE FOR THE SPECIFIED PROGRAM.
* 
IDXS  NOP 
      JSB INIDX     INIT TIDNT TO 1ST IDENT ADDR
      STB INIDX     SAVE PTR TO ASCII NAME
*                   ** OTHER SUBS MAY WANT NAME PTR IN INIDX ** 
      LDB TIDNT     B WILL KEEP ADDR IN IDENT 
      JMP IDXS7     JUMP TO END TO ENTER LOOP 
      SPC 1 
IDXS2 ADB N8        POINT TO NEXT IDENT 
IDXS3 CPB PIDNT     IF AT END OF IDENTS 
      JMP IDXS4      THEN LEAVE...
      CPA B,I       ELSE IF 1ST 2 CHARS 
      RSS            DON'T MATCH
      JMP IDXS2       TRY NEXT IDENT
      SPC 1 
      ISZ IDXST     1ST 2 MATCH, GET
      LDA IDXST,I    NEXT 2 FROM INPUT
      INB             AND FROM IDENT. 
      CPA B,I       IF NOT A MATCH
      RSS            THEN JUMP TO UPDATE
      JMP IDXS5       IDENT PTR AND CONTINUE. 
      SPC 1 
      ISZ IDXST     1ST 4 CHARS MATCH,
      LDA IDXST,I    GET NEXT FROM INPUT
      INB             AND IDENT 
      XOR B,I 
      AND M7400     COMPARE UPPER BYTE ONLY 
      SZA            AND IF NO MATCH
      JMP IDXS6       GO GET NEXT IDENT 
      SPC 1 
*     MATCH OCCURRED - BACKUP POINTER TO BEGINNING OF IDENT 
      SPC 1 
      ADB N2        POINT TO START OF IDENT 
      SPC 1 
*     MATCH OR NOT..... SET UP IDENT POINTERS USING 'IDX' 
      SPC 1 
IDXS4 STB TIDNT     POINT TIDNT AT CURRENT IDENT
      JSB IDX       GO SET IDENT POINTERS 
      JMP IDXS,I    NO MATCH - RETURN AT N+1
      ISZ IDXS
      JMP IDXS,I    MATCH - RETURN AT N+2 
      SPC 1 
IDXS5 ADB P1        JUGGLE A LITTLE 
IDXS6 ADB N10        TO GET NEXT IDENT ADDR 
IDXS7 LDA INIDX     RESET POINTER TO
      STA IDXST      START OF NAME. 
      LDA A,I       PUT 1ST CHARS IN A. 
      JMP IDXS3     GO CHECK NEXT IDENT 
IDXST BSS 1         TEMPORARY 
      SPC 3 
* 
*                                   SET IDENT ADDRESSES FROM TIDNT
* 
*  IDX SETS THE ADDRESSES OF THE CURRENT 10-WORD ENTRY IN THE 
*  IDENT TABLE FROM THE ADDRESS OF THE CURRENT ENTRY (TIDNT). 
* 
*  CALLING SEQUENCE:
*    A = IGNORED
*    B = IGNORED
*    JSB IDX
* 
*  RETURN: CONTENTS OF A AND B ARE DESTROYED. 
*  (N+1): CURRENT IDENT ADDRESSES ARE THE ADDRESSES 
*         OF THE NEXT AVAILABLE IDENT ENTRY, OR THE 
*         END OF THE IDENT TABLE HAS BEEN REACHED.
*  (N+2): CURRENT IDENT ENTRY ADDRESSES (NOT END OF IDENT)
* 
IDX   NOP 
      LDA TIDNT     TIDNT = CURRENT IDENT ADDRESS 
      CPA PIDNT     END OF IDENT LIST?
      RSS           YES - RETURN TO NEXT INSTRUCTION
      ISZ IDX       SET RETURN ADDRESS FOR N+2
      STA ID1       SET ADDRESS OF NAME 1,2 
      INA 
      STA ID2       SET ADDRESS OF NAME 3,4 
      INA 
      STA ID3       SET ADDRESS OF NAME 5, USE FLAG 
      INA 
      STA ID4       SET ADDRESS OF COM/PROG LENGTH
      INA 
      STA ID5       SET ADDRESS OF CURRENT DISK ADDR
      INA 
      STA ID6       SET ADDRESS OF M/S,PRIOR/DISK,TY
      INA 
      STA ID7       SET ADDRESS OF EXEC INTERV(1) 
      INA 
      STA ID8       SET MAIN IDENT ADDR FOR BS
      LDA TIDNT     TIDNT = CURRENT IDENT ADDR
      CMA,INA 
      ADA PLST      PLST = CURRENT END LST ADDR 
      SSA,RSS       SKIP IF NO OVERLAP
      JMP LSERR     PRINT OVERFLOW MESSAGE
* 
      LDA TIDNT     GET CURRENT ADDRESS AND 
      ADA N8        SET FOR NEXT IDENT ADDRESS
      STA TIDNT     SET NEXT IDENT ADDRESS
      JMP IDX,I     RETURN
      SKP 
*  THE INLST, LSTS, LSTE AND LSTX SUBROUTINES ARE USED TO SET THE 
*  CURRENT LOADER SYMBOL TABLE (LST) ADDRESSES.  THE ADDR OF THE
*  NEXT ENTRY IN LST IS CONTAINED IN TLST.  ON RETURN FROM IDX, 
*  TLST CONTAINS THE ADDRESS OF THE NEXT AVAILABLE ENTRY IN LST, OR 
*  THE ADDRESS OF THE END OF LST.  THE ADDRESS OF THE FIRST ENTRY 
*  IN LST IS AT BLST AND THE ADDRESS OF THE NEXT AVAILABLE ENTRY
*  IS AT PLST.
* 
*  IF THE NEXT ENTRY IN LST OVERFLOWS INTO THE CURRENT
*  IDENT ENTRY, LSTX PRINTS A DIAGNOSTIC AND EXITS
*  TO THE IRRECOVERABLE ERROR SUBROUTINE. 
* 
*                                   SET INITIAL LST ADDRESS 
* 
*  INLST SETS THE ADDRESS OF THE FIRST ENTRY IN LST.
* 
INLST NOP 
      LDA BLST      BLST = FIRST LST ADDRESS
      STA TLST      SET CURRENT LST ADDRESS 
      JMP INLST,I   RETURN
      SKP 
*  LSTS SEARCHED THE LST FOR A SPECIFIED ENTRY. 
* 
*  CALLING SEQUENCE:
*    A = IGNORED
*    B = ADDRESS OF THE ASCII NAME TO BE FOUND. 
*    JSB LSTS 
* 
*  RETURN: CONTENTS OF A AND B DESTROYED. 
*    (N+1): THE END OF THE LST WAS FOUND WITH OUT FINDING THE 
*           SYMBOL.  THE LST ENTRIES ARE SET TO THE NEXT AVAILABLE
*           ENTRY.
*    (N+2): THE CURRENT LST ADDRESS POINT TO THE FOUND ENTRY. 
* 
LSTS  NOP 
      JSB INLST     INIT TLST TO 1ST LST ADDRDDR
      STB INLST     SAVE PTR TO ASCII NAME
*                   ** SOME SUBS EXPECT LSTS TO STORE THIS ** 
*                   ** POINTER IN INLST'S ENTRY POINT      ** 
      LDB TLST      B WILL KEEP ADDR IN LST 
      JMP LSTS7     ENTER LOOP AT END.
      SPC 1 
LSTS2 ADB P5        POINT TO NEXT LST 
LSTS3 CPB PLST      IF AT END OF LSTS 
      JMP LSTS4      THEN LEAVE...
      CPA B,I       ELSE IF 1ST 2 CHARS 
      RSS            DON'T MATCH
      JMP LSTS2       TRY NEXT LST
      SPC 1 
      ISZ LSTST     1ST 2 MATCH, GET
      LDA LSTST,I    NEXT 2 FROM INPUT
      INB             AND FROM LST. 
      CPA B,I       IF NOT A MATCH
      RSS            THEN JUMP TO UPDATE
      JMP LSTS6       LST PTR AND CONTINUE. 
      SPC 1 
      ISZ LSTST     1ST 4 CHARS MATCH,
      LDA LSTST,I    GET NEXT FROM INPUT
      INB             AND LST 
      XOR B,I 
      AND M7400     COMPARE UPPER BYTE ONLY 
      SZA            AND IF NO MATCH
      JMP LSTS5       GO GET NEXT LST 
      SPC 1 
*     MATCH OCCURRED - BACKUP POINTER TO BEGINNING OF LST 
      SPC 1 
      ADB N2        POINT TO START OF LST 
      SPC 1 
*     MATCH OR NOT..... SET UP LST POINTERS USING 'LSTX'
      SPC 1 
LSTS4 STB TLST      POINT TLST  AT CURRENT LST
      JSB LSTX      GO SET LST POINTERS 
      JMP LSTS,I    NO MATCH - RETURN AT N+1
      ISZ LSTS
      JMP LSTS,I    MATCH - RETURN AT N+2 
      SPC 1 
LSTS5 ADB N1        JUGGLE A LITTLE 
LSTS6 ADB P4         TO GET NEXT LST ADDR 
LSTS7 LDA INLST     RESET PTR TO
      STA LSTST      ASCII NAME.
      LDA A,I       PUT 1ST 2 CHARS IN A. 
      JMP LSTS3     GO CHECK NEXT IDENT.... 
LSTST BSS 1         TEMPORARY 
      SKP 
* 
*                                   SET LST ADDRESSES FROM TLST 
* 
*  LSTX SETS THE CURRENT LST ADDRESSES FROM TLST. 
* 
*  CALLING SEQUENCE:
*    A = IGNORED
*    B = IGNORED
*    JSB LSTX 
* 
*  RETURN: CONTENTS OF A AND B ARE DESTROYED. 
*    (N+1): THE END OF LST IS REACHED AND THE CURRENT 
*           LST ADDRESSES ARE THE ADDRESSES OF THE NEXT AVAILABLE 
*           ENTRY IN LST. 
*    (N+2): CURRENT LST ADDRESSES ARE SET (NOT END OF LST). 
* 
LSTX  NOP 
      LDA TLST      GET CURRENT LST ADDRESS 
      CPA PLST      END OF LST TABLE? 
      RSS 
      ISZ LSTX      INCR RETURN ADDRESS 
      STA LST1      SET WORD 1  ADDR
      INA 
      STA LST2      SET WORD 2 ADDR 
      INA 
      STA LST3      SET WORD 3 ADDR 
      INA 
      STA LST4      SET WORD 4 ADDR 
      INA 
      STA LST5      SET WORD 5 ADDR 
      INA 
      STA TLST      SET NEXT LST ADDRESS
      CMA,INA 
      ADA PIDNT     PIDNT = ADDR CURRENT IDENT
      SSA,RSS       SKIP - INVALID LST ENTRY
      JMP LSTX,I    RETURN
* 
* 
LSERR LDA ERR07 
      JSB IRERR     IRRECOVERABLE ERROR EXIT
* 
ERR07 ASC 1,07      IDENT/LST OVERFLOW
      SKP 
*                                      ENTRY A NEW SYMBOL 
* 
*  LSTE SEARCHS THE LST FOR A SYMBOL AND IF NOT FOUND ENTERS IT 
*  IN THE LST.
* 
*  CALLING SEQUENCE:
*    A = IGNORED
*    B = SYMBOL ADDRESS 
*    JSB LSTE 
* 
*  RETURN: CONTENTS OF A AND B ARE DESTROYED. 
*    (N+1): SYMBOL IS NEW AND WAS ENTRED, LST ADDRESS ARE SET UP
*    (N+2): SYMBOL WAS IN LST.  LST ADDRESS ARE SET UP. 
* 
LSTE  NOP 
      JSB LSTS      SEARCH FOR THE SYMBOL 
      JMP LSTE2     IF NOT FOUND GO ENTER 
* 
      ISZ LSTE      STEP TO ALREADY IN LST EXIT 
      JMP LSTE,I    AND EXIT
* 
LSTE2 LDB INLST,I   GET THE FIRST CHARACTERS OF NEW 
      STB LST1,I    SYMBOL AND SET IN THE LIST
      ISZ INLST     STEP TO NEXT CHARACTERS 
      LDA INLST,I   GET THE CHARACTERS
      STA LST2,I    AND SET 
      ISZ INLST     STEP TO THE LAST CHARACTER
      LDA INLST,I   FETCH IT
      AND M7400     KEEP ONLY THE HIGH CHARACTER
      STA LST3,I    SET IT IN THE LST 
      CLA           CLEAR 
      STA LST4,I    THE IDENT FLAG
      STA LST5,I    AND VALUE FIELDS
      LDA LST5      ADVANCE THE END OF THE LST
      INA           BY
      STA PLST      ONE ENTRY 
      JMP LSTE,I    EXIT BACK TO THE USER 
      HED RTE GENERATOR  BASE PAGE WORKING LOCATIONS AND BUFFERS
*                                  RELOCATION BASE TABLE
MRTAD DEF TPREL     DEF FOR MR FIELD
RBTAD DEF *+1 
      OCT 0         ABSOLUTE PROGRAM BASE 
TPREL OCT 0         CURRENT PROG BASE ADDRESS 
TPBRE OCT 0         BP RELOCATION ADDRESS 
COMAD OCT 0         CURRENT COMMON RELOCATION BASE
      NOP           ABS PROGRAM BASE FOR MR CODE
* 
ALBUF DEF LBUF
ADBUF DEF DBUF
ATBUF DEF TBUF
AMLST DEF MLIST 
AMEM5 DEF MLIST+5 
AMEM8 DEF MLIST+8 
AILST DEF ILIST 
* 
WDCNT OCT 0         TEMPORARY WORD COUNTER
* 
BLST  NOP           ADDR OF FIRST LST ENTRY 
TLST  BSS 1         CURRENT LST ADDR
PLST  NOP           ADDR OF NEXT AVAILABLE ENTRY
* 
BIDNT BSS 1         ADDR OF FIRST IDENT 
TIDNT BSS 1         CURRENT IDENT 
PIDNT OCT 36000     NEXT AVAILABLE IDENT
* 
BFIX  NOP 
TFIX  NOP 
PFIX  NOP 
* 
*     THE LST POINTERS BELOW CANNOT BE MOVED WITHOUT CHANGING 
*     THE DRIVER (RTGEN PART 2)....THEY ARE EQUATED THERE ALSO. 
* 
LST1  EQU 07B       WORD 1 ADDR (LST) 
LST2  EQU 10B       WORD 2 ADDR (LST) 
LST3  EQU 11B       WORD 3 ADDR (LST) 
LST4  EQU 12B       WORD 4 ADDR (LST) 
LST5  EQU 13B       WORD 5 ADDR (LST) 
* 
MAXC  EQU 14B       MAX CHAR COUNT
TCHAR EQU 15B       TEMPORARY CHAR SAVE AREA
OCTNO EQU 16B       OCTAL DIGIT 
* 
DSKSY EQU 17B       INITIAL ID SEGMENT DISK ADDRESS 
PIOC  EQU 20B       ADDR. OF PRIVILEGED I/O CARD
IDSP  EQU 21B       POSITION OF 1ST ID SEG. IN SECT 
TBCHN EQU 22B       TIME BASE GENERATOR CHNL
SWAPF EQU 23B       SWAPPING FLAG = 0/1 = NO/YES
LWASM EQU 24B       LAST WORD SYS AVAIL MEM 
PARAD EQU 25B       PARAMETER INPUT DRIVER ADDRESS
TTYCH EQU 26B       SYSTEM TTY CHANNEL NO.
* 
DSKAD EQU 27B       CURRENT DISK ADDRESS
PLFLG EQU 30B       PROGRAM LOAD. FLAG = -1/0 = L/NL
DSCNT EQU 31B       DISK SEGMENT SECTOR COUNT 
* 
ID1   EQU 32B       IDENT 1 ADDR: NAME 1,2
ID2   EQU 33B       IDENT 2 ADDR: NAME 3,4
ID3   EQU 34B       IDENT 3 ADDR: NAME 5, USAGE FLAG
ID4   EQU 35B       IDENT 4 ADDR: COMMON LENGTH 
                                                                                                                                                                                      