ASMB,R,L,C,N
      HED RT4GN ---- MAIN FOR ON-LINE GENERATOR 
      NAM RT4GN,3,90 92067-16009 REV.1926 790427
      SPC 1 
******************************************************************
*  * (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.       *
******************************************************************
      SPC 2 
      SPC 1 
************************************************************
* 
*   NAME:             RT4GN 
*   SOURCE PART #:    92067-18009 
*   REL PART #:       92067-16009 
*   WRITTEN BY:       KFH, JH, RB, GAA
* 
************************************************************* 
      SPC 2 
* 
* 
* DEFINE ENTRY POINTS.
* 
*     OPERATOR INPUT SUBROUTINES: 
* 
      ENT \PRMT     PRINT COMMAND AND ACCEPT INPUT. 
      ENT \READ      \READ INPUT. 
      ENT \RNME     SPECIAL ENTRY TO READ SUBR. 
      ENT \YENO     ANALYZE YES/NO RESPONSE.
      ENT \DCON     ANALYZE INPUT FOR OCTAL VALUE.
      ENT \GETC     SUPPLY CHAR FOR GETNA & GETOC.
      ENT \GETN     MOVE LBUF TO TBUF.
      ENT \GET#     LBUF CHAR FROM ASCII TO OCTAL.
      ENT \GINT     INITIALIZE LBUF SCAN. 
* 
*     DIAGNOSTIC SUBROUTINES: 
* 
      ENT \GNER     PRINT DIAGNOSTIC. 
      ENT \INER     CALL ERROR AND CONTINUE.
      ENT \IRER      CALL ERROR AND ABORT.
      ENT \ABOR     \ABOR THE GENERATION. 
* 
*     DISC FILE I/O SUBROUTINES:
* 
      ENT \CRET     CREATE A FILE.
      ENT \CLOS     CLOSE A FILE. 
      ENT \TRUN     CLOSE RTGEN OUTPUT FILE.
      ENT \CFIL     CHECK FOR FILE ERRORS.
      ENT \MESS     WRITE ON INTERACTIVE DEVICE.
      ENT \SPAC     OUTPUT BLANK LINE.
      ENT \RNAM     FIND A NAM RECORD IN A FILE.
      ENT \RBIN     READ RELOCATABLE FILE.
      ENT \TERM     PURGE ALL FILES ON ABORT. 
      ENT \EXIT     FINAL FILE CLEANUP
* 
*     CORE-IMAGE OUTPUT FILE SUBROUTINES. 
* 
      ENT \DSKA     INCR. DISC ADDRESS. 
      ENT \DSKI     INPUT CONTROL.
      ENT \DSKO     OUTPUT CONTROL. 
      ENT \DSKD     I/O SUBROUTINE. 
* 
*     DCB'S:
* 
      ENT \RDCB     RELOCATABLE FILE DCB. 
      ENT \NDCB     NEW-NAM FILE DCB. 
      ENT \BDCB     BOOT DCB
* 
*     LST, IDENT, FIX-UP SUBS AND POINTERS. 
* 
      ENT \ILST,\LSTS,\LSTX,\LSTE 
      ENT \TLST,\PLST 
      ENT \LST1,\LST2,\LST3,\LST4,\LST5 
* 
      ENT \INID,\IDXS,\IDX
      ENT \TIDN,\PIDN 
      ENT \ID1,\ID2,\ID3,\ID4,\ID5,\ID6,\ID7,\ID8,\ID9,\ID10,\ID11
      ENT \ID12,\ID13,\ID14,\ID15,\ID16 
* 
      ENT \IFIX,\FIX,\PFIX,\TFIX
      ENT \FIX1,\FIX2,\FIX3,\FIX4 
* 
      ENT \LNKX,\LNK,\LNKS
      ENT \LNK1,\LNK2,\LNK3 
* 
*     LINKAGES FOR SEGMENT SUBR CALLS TO ANOTHER SEGMENT. 
* 
      ENT \LODN     LOADS A PROGRAM 
      ENT \DPLD     LOADS A DRIVER
      EXT \NLOD       (RT4G4) 
* 
      ENT \GNIO     BUILDS I-O TABLES 
      EXT \IOTB       (RT4G5) 
* 
      EXT \GENS     BUILDS THE SYSTEM (RT4G3) 
* 
      EXT \TB31     BUILDS $TB31  (RT4G1) 
      EXT \TB32     BUILDS $TB32  (RT4G7) 
* 
      ENT \FSEC     CLEAN-UP BOOT EXTENSION AND HEADER RECORDS
      EXT \FSC0       (RT4G1) 
      EXT \FSC5       (RT4G7) 
* 
      ENT \SYTB     BUILDS SYSTEM TABLES
      EXT \TBLS       (RT4G5) 
* 
      ENT \CLDP     LOADS DRIVER PARTITIONS 
      ENT \DDON 
      EXT \\LDP       (RT4G8) 
* 
      ENT \PART     PARTITION DEFINITION
      EXT \PDEF       (RT4G6) 
* 
*     POINTERS FOR CURRENT PAGE LINKAGE IMAGE AREA. 
* 
      ENT \TBLK,\CPLM 
      ENT \LRBP,\URBP,\IRBP 
      ENT \CUBP,\UCBP,\ICBP,\CBPA 
* 
*     MISCELLANEOUS SUBROUTINES:
* 
      ENT \CONV 
      ENT \ABDO,\USER,\USRS,\SEGS,\SYS,\DSYS
* 
*     MISCELLANEOUS VARIABLES:
* 
      ENT \NAMN,\NAMB,\NAMO 
      ENT \TRCM,\IACM,\TRCH 
      ENT \SRET 
      ENT \FMRR 
      ENT \DPR2 
      ENT \BPAR 
      ENT \OCTN 
      ENT \BUFL 
      ENT \TCHR 
      ENT \ADSK,\PREL,\NUMP 
      ENT \ADBF 
      ENT \MRT2 
      ENT \PTYP 
      ENT \TMSK 
      ENT \RNT,\PRV 
      ENT \TBCH,\PIOC,\SWPF 
      ENT \LBUF,\TBUF 
      ENT \CURL,\CPL2 
      ENT \CMFL 
      ENT \ABCO,\MXAB 
      ENT \OLDA 
      ENT \ADBP,\NABP 
      ENT \OBUF 
      ENT \TIME,\TIM1,\MULR 
      ENT \CPLB,\ASKY,\SSID,\SKYA 
* 
      SKP 
* 
*     DEFINE EXTERNALS
* 
      EXT \PIP,LURQ,RMPAR,IFBRK 
      EXT WRITF,EXEC,CLOSE
      EXT LOCF,APOSN
      EXT CREAT,OPEN,READF,CNUMD
      EXT .ENTR 
      EXT COR.A,\DST0,\BOT0 
      EXT GETST 
      EXT \DST5,\BOT5 
* 
      SPC 2 
* 
*     DEFINE A AND B REG
* 
A     EQU 0 
B     EQU 1 
      SUP 
      SPC 3 
LST#T DEC 2        # LST TRACKS.
IDT#T DEC 3        # IDENT TRACKS.
FIX#T DEC 1        # FIX-UP TRACKS. 
SECWD DEC 128      # WORDS PER SECTOR.
      SKP 
*  IDENT FORMAT 
* 
*  WORD 1:  \ID1  - NAME 1,2
*  WORD 2:  \ID2  - NAME 3,4
*  WORD 3:  \ID3  - (15-8) NAME 5 
*                   (7-3)  NOT USED 
*                   (2-0)  USAGE FLAG 
*                          (2) MODULE WAS LOADED
*                          (1) MUST LOAD MODULE (EXT DEFINED BY IT) 
*                          (0) MODULE WAS LOADED AS PART OF A SEGMENT 
*  WORD 4:  \ID4  - (15) MAIN PROGRAM 
*                   (14-0) COMMON LENGTH
*  WORD 5:  \ID5  - (15) BASE/CURRENT PAGE LINKING FLAG 
*                   (14) NEW NAM RECORD FLAG
*                   (13-4) EMA SIZE 
*                   (3-0) MAP OPTIONS 
*                         (2) LINKS 
*                         (1) MODULES 
*                         (0) GLOBALS 
*  WORD 6:  \ID6  - (15) EMA DECLARED 
*                   (14-10) MSEG SIZE 
*                   (9-7)   NOT USED
*                   (6-0)   PROGRAM TYPE
*                           (4) SSGA DECLARED 
*                           (3) REVERSE COMMON DECLARED 
*  WORD 7:  \ID7  - LOWEST DBL ADDRESS
*  WORD 8:  \ID8  - DISK LENGTH FOR UTILITY RELOCATABLES
*                OR MAIN IDENT INDEX FOR SEGMENTS 
*                OR (15-8) PROGRAM PAGE REQMTS
*                   (7-0)  KEYWORD INDEX
*                OR (15)   EQT DEFINED
*                   (14)   SDA DECLARED 
*                   (13)   SDA/OWN MAPPING DECLARED 
*                   (13-0) DRIVER LENGTH
*  WORD 9:  \ID9  - FILE NAME 1,2 
*  WORD 10: \ID10 - FILE NAME 3,4 
*  WORD 11: \ID11 - FILE NAME 5,6 
*  WORD 12: \ID12 - SECURITY CODE 
*  WORD 13: \ID13 - CARTRIDGE LABEL 
*  WORD 14: \ID14 - RECORD NUMBER 
*  WORD 15: \ID15 - RELATIVE BLOCK
*  WORD 16: \ID16 - BLOCK OFFSET
* 
      SKP 
* 
*  LST FORMAT 
* 
*  WORD 1: \LST1 - NAME 1,2 
*  WORD 2: \LST2 - NAME 3,4 
*  WORD 3: \LST3 - NAME 5, ORDINAL
*  WORD 4: \LST4 - IDENT  INDEX  OR 2 IF COMMON 
*                                   3 IF ABSOLUTE 
*                                   4 IF REPLACE
*                                   5 IF UNDEFINED
*                                   6 IF EMA
*  WORD 5: \LST5 - SYMBOL VALUE, OR IDENT INDEX IF EMA
* 
* 
* 
*  FIXUP TABLE FORMAT 
* 
*  \FIX1: CORE ADDRESS
*  \FIX2: (15-11) INSTRUCTION CODE
*         (10)    BYTE INSTR
*         (9)     UPPER BP LINK 
*         (2-0)   DBL RECORD TYPE 
*  \FIX3: OFFSET
*  \FIX4: INDEX OF LST ENTRY REFERENCED,
*         OR 0 IF A LOCAL SYMBOL
*         OR -1 IF .ZRNT
* 
* 
* 
* 
*  PROGRAM TYPES
* 
*  0: SYSTEM
*  1: MEMORY RESIDENT 
*  2: RT DISK RESIDENT
*  3: BG DISK RESIDENT
*  4: ENLARGED BG DISK RESIDENT 
*  5: BG SEGMENT
*  6: LIBRARY/UTILITY 
*  7: UTILITY 
*  8: UTILITY 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: ENLARGED BG DISC RESIDENT USING REALTIME COMMON 
* 13: TABLE AREA II 
* 14: TYPE 6 LIBRARY/UTILITY THAT IS TO BE FOURCE LOADED TO THE LIBRARY.
* 15: TABLE AREA I
* 30: SUBSYSTEM GLOBAL MODULE 
* 17,18,19,20,25,26,27,28: TYPES 1,2,3,4,9,10,11,12 (RESP) W/SSGA ACCESS
* 21-24,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.) 
      SKP 
* 
*  ERROR CODES
* 
*  0/ HARDWARE/GENERATOR ERROR (SEND IN BUG REPORT) 
*  1: INVALID REPLY TO INITIALIZATION PARAMETERS
*  2: INSUFFICIENT AMOUNT OF AVAILABLE MEMORY FOR TABLES
*  3: RECORD OUT OF SEQUENCE
*  4: INVALID RECORD TYPE 
*  5: DUPLICATE ENTRY POINTS
*  6: COMMAND ERROR - PROGRAM INPUT PHASE 
*  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: CHECKSUM ERROR 
*  15: ILLEGAL CALL BY A TYPE 6 OR 14 PROGRAM TO A TYPE 7 
*  16: BP LINKAGE AREA OVERFLOW 
*  17: TYPE 1 OUTPUT FILE OVERFLOW (ESTIMATE WAS NOT LARGE ENOUGH)
*  18: MEMORY OVERFLOW
*  19: TR STACK UNDERFLOW/OVERFLOW
* 
*  20: INVALID COMMAND INPUT LU 
*  21: '$CIC' NOT FOUND IN LOADER SYMBOL TABLE
*  22: LIST FILE ERROR
*  23: INVALID S OR M OPERANDS
*  24: INVALID SELECT CODE IN EQT ENTRY 
*  25: INVALID DRIVER NAME IN EQT ENTRY 
*  26: INVALID D,B,U,T,X,S,M OPERANDS IN EQT ENTRY
*  27: INVALID DEVICE REFERENCE NO. 
*  28: INVALID INTERRUPT SELECT CODE
*  29: INVALID INTERRUPT SELECT CODE ORDER
* 
*  30: INVALID INT ENTRY MNEMONIC 
*  31: INVALID EQT NO. IN INT ENTRY 
*  32: INVALID PROGRAM NAME IN INT ENTRY
*  33: INVALID ENTRY POINT IN INT ENTRY 
*  34: INVALID ABSOLUTE VALUE IN INT ENTRY
*  35: MORE THAN 63 EQT OR 255 DRT ENTRIES DEFINED
*  36: INVALID TERMINATING OPERAND IN INT ENTRY 
*  37: INVALID COMMON LENGTH IN SYS, LIB, OR SSGA MODULE..... 
*  38: ID-SEGMENT OF SEGMENT 3 NOT FOUND
*  39: NOT USED 
* 
*  40: INVALID EMA PROGRAM TYPE 
*  41: MULTIPLE EMA DECLARATIONS
*  42: INVALID REFERENCE TO EMA SYMBOL
*  43: INVALID MSEG SIZE
*  44: SAM EXCEEDS 32K LOGICAL ADDRESS SPACE
*  45: INVALID PARTITION SIZE 
*  46: INVALID PARTITION TYPE 
*  47: INVALID PARTITION RESERVATION
*  48: INVALID OR UNKNOWN ASSIGNED PROGRAM NAME 
*  49: INVALID PARTITION NUMBER 
* 
*  50: PROGRAM TOO LARGE FOR PARTITION SPECIFIED
*  51: INVALID PAGE OVERRIDE SIZE 
*  52: ILLEGAL REFERENCE TO SSGA ENTRY POINT
*  53: SUM OF PARTITION SIZES DOESN'T EQUAL # PAGES LEFT
*  54: SUBROUTINE OR SEGMENT DECLARED MORE COMMON THAN MAIN 
*  55: PAGE REQ'MTS OF EMA PROGRAM CAN'T BE OVERRIDDEN
*  56: SUBPARTITION SIZE OR SUM OF SIZES > THAN MOTHER PART'N SIZE
*  57: MISSING SYSTEM ENTRY POINT 
*  58: ILLEGAL REF TO TYPE 0 SYSTEM ENTRY POINT BY NON-TYPE 3 MODULE
*  59: DRIVER PARTITION OVERFLOW
* 
*  60: LONG ID SEGMENT LIMIT OF 254 EXCEEDED
*  61: PHYSICAL MEMORY OVERFLOW 
*  62: INVALID INSTRUCTION REFERENCE TO AN EMA SYMBOL 
      SKP 
DBP   EQU *        FWA DUMMY BASE PAGE. 
* 
************************************************
*                                              *
* THE NEXT 1K IS OVERLAID FOR DUMMY BASE PAGE  *
* WHEN RT4G3 BEGINS EXECUTION.                 *
*                                              *
************************************************
       SPC 5
START NOP 
      STB PARS5 
      JSB RMPAR 
      DEF *+2 
      DEF PARS5 
* 
* 
*     SET UP COMMAND LU OR FILE, AND THE ERRLU
* 
      LDA PARS5     GET PARAMETER 1 
      SZA,RSS       IF NOT SPECIFIED, THEN
      ISZ PARS5     DEFAULT TO LU 1 FOR INPUT 
      AND B1774     MASK FOR TYPE 
      SZA,RSS       NUMERIC?
      JMP NOPRM     YES, GO SET UP CMDLU
* 
      JSB GETST     RETRIEVE PARAMETERS 
      DEF *+4 
DLBUF DEF \LBUF 
      DEF P48 
      DEF \FMRR 
* 
      RBL           CONVERT TO CHARACTERS 
      LDA DLBUF     GET INPTU BUFFER ADDRESS
      JSB \PARS     GO PARSE THE PARAMETER STRING 
      DEF PARS2     INTO THE PARSE BUFFER AT WORD 2 
      JMP STRT2 
* 
NOPRM LDB PARS5     SET UP THE COMMAND LU 
      STB PRS21 
      CLA,INA 
      STA PARS2     PARAMETER TYPE 1
* 
STRT2 LDA RWSUB     GET POTENTIAL R/W SUBFUCTION
      STA PARS5     SAVE FOR OPEN CALL
* 
      JSB STATE     SET THE STATE FLAGS \IACM & CMDLU 
      JMP INVLU     INVALID INPUT LU SPECIFIED - GO RECOVER 
      LDA CMDLU     IF AN INTERACTIVE LU, SET THE 
      LDB \IACM      1 MEANS INTERACTIVE
      SZB,RSS 
      CLA,INA       DEFAULT TO LU 1 
      STA ERRLU     ERROR LU
* 
      JSB FOPEN     GO OPEN FILE
      DEF *+3 
      DEF \IDCB 
      DEF PARS5 
      LDA \FMRR 
      SSA,RSS       ANY ERRORS? 
      JMP STRT3     NO
      CMA,INA       SET POS. FOR CONVERT
      STA \FMRR 
      JSB CNUMD     GET DEC ERROR CODE
      DEF *+3 
      DEF \FMRR 
      DEF FERMA     ERROR MESSAGE ADDR
      LDA FERMA+2   GET LAST TWO CHARACTERS 
      STA FILEA+6 
      LDA DNAM      MOVE THE FILE NAME
      LDB DFILE 
      MVW P3
* 
      JSB EXEC      SEND ERROR TO OPERATOR LU 
      DEF *+5 
      DEF P2
      DEF ERRLU 
      DEF FILEA+1 
      DEF P10 
STRT4 CLB           SET BACK TO LU 1
      STB CMDLU 
      STB \IACM 
      INB 
      STB ERRLU 
      JMP NOPRM+1   START OVER
* 
INVLU JSB EXEC      INVALID INPUT LU SPECIFIED
      DEF *+5       ISSUE ERROR MESSAGE TO LU 1 (NOW
      DEF P2         DEFAULT ERRLU) 
      DEF P1
      DEF GNR20 
      DEF P5
      JMP STRT4     SET UP THE INPUT LU 
* 
STRT3 CLA 
      JSB PUSH      GO PLACE ON STACK 
      JSB \TERM     ERROR RETURN - CAN'T HAPPEN!
* 
      LDA ERRLU      WE'RE GOING TO OVERLAY 3 WORDS 
      CMA,INA 
      LDB DSTRT      AT STRT3 - IN ORDER TO SETUP 
      JSB \CONV      THE ERROR COMMAND: 
      LDA STRT3+2     "TR,ERRLU"
      STA TRCOM+2    STORE THE ASCII LU 
* 
      LDA \CPLM     NEGATE HIGH END OF CURRENT
      CMA,INA       PAGE LINK LIMIT IMAGE 
      STA \CPLM     AREA
      SKP 
* ALLOCATE SPACE FOR FIX-UP,IDENT, AND LST TABLES:
* 
*  DETERMINE HOW MUCH CORE REMAINS BEYOND LONGEST 
*  SEGMENT, DIVIDE INTO 3 BLOCKS FOR IN-CORE CHUNKS 
*  OF TABLES, AND ALLOCATE DISC SPACE FOR TABLE STORAGE.
*  AVAILABLE CORE MUST BE AT LEAST 512 WORDS. 
*  THE LST IS ALLOCATED LAST TO USE WASTED CORE FROM
*  FIXUP & IDENT BLOCKS.
* 
      LDA 1657B     ADDR OF KEYWORD TABLE.
      STA TEMP1 
TRY   LDB TEMP1,I   GET NEXT ID SEG ADDRESS 
      SZB           END OF TABLE IF ZERO
      JMP TRYY
      LDA ERR38     SEGMENT 3'S ID SEGMENT IS MISSING 
      JMP NROOM+1   SEND ERROR & TERMINATE
* 
TRYY  ADB P12       GET TO NAME.
      LDA B,I       GET FIRST TWO CHAR. 
* 
*               DYNAMICALLY DETERMINE LONGEST SEGMENT 
* 
      CPA AS.RT     "RT4G3" = LONGEST SEGMENT.
      RSS           MATCH.
      JMP NEXT
      INB 
      LDA B,I       GET SECOND TWO CHAR.
      CPA AS.GN 
      RSS           MATCH.
      JMP NEXT
      INB 
      LDA B,I 
      AND M7400 
      CPA AS.3      "3".
      JMP MATCH 
NEXT  ISZ TEMP1 
      JMP TRY 
* 
MATCH LDA TEMP1,I   GET ADDR OF IDSEG.
      JSB COR.A     GET TO LWAM OF SEGMENT. 
      INA           GET FWAM. 
      STA FWAM      SAVE AS FIRST WORD AVAIL. MEM.
      CMA,INA       GET SIZE OF UNDECLARED CORE.
      ADA LWAM      LWAM SET BY RTE.
      STA NEXT
      LDA N512      MAKE SURE ENOUGH CORE.
      ADA NEXT      AT LEAST 512 WORDS WORTH
      SSA 
      JMP NROOM     NO ROOM. BAIL OUT.
      LDA NEXT
      CLB 
      DIV P4      ALLOCATE AVAILABLE MEMORY:
      STA TEMP1   1/4 TH FOR FIXUP TABLE, AND 
      CMA,INA     3/8 TH'S EACH FOR IDENT AND LST 
      ADA NEXT
      ARS           DIVIDE BY 2 
      STA TEMP2 
* 
* SET UP FIX-UP TABLE.
* 
      LDA TEMP1 
      CLB           TRUNCATE BLOCK SIZE 
      DIV P6144     IF GREATER THAN 6144 (#WORDS/TRACK) 
      SZA 
      LDB P6144     TO ONE TRACK
      STB A 
SETF0 CLB 
      DIV SECWD     SEE HOW MANY SECTORS FIT. 
      STA FX.#S     SAVE # SECT PER FIX-UP BLOCK. 
      MPY SECWD     CONVERT TO WORDS FOR LENGTH.
      STA LFIX      OF DISC READS AND WRITES. 
      CLB           BLOCK MULTIPLE MUST END ON A TRACK
      LDA P6144     BOUNDARY AS WELL
      DIV LFIX
      SZB,RSS 
      JMP SETF1     OK
      LDA LFIX
      ADA N128      DECREMENT SIZE BY ONE SECTOR
      JMP SETF0 
SETF1 LDA LFIX
      CLB           GET # 4 WORD ENTRIES IN 
      DIV P4        THE BLOCK.
      STA EFIX      SAVE # ENTRIES IN BLOCK.
* 
      LDA FWAM      INITIALIZE FIX-UP POINTERS: 
      STA BFIX        FIRST ENTRY,
      CLA 
      STA \PFIX        # ENTRIES USED,
      STA \TFIX        CURRENT ENTRY INDEX. 
      STA B.F         1ST ENTRY NOW IN CORE.
* 
* SET UP IDENT TABLE. THIS ONE HAS AN OFFSET OF +10.
* 
      LDA BFIX      SET FWA IDENT AREA AT 
      ADA LFIX
      STA BIDNT     END OF FIX-UP AREA. 
      LDA TEMP2     GET BLOCK 
      CLB           TRUNCATE BLOCK SIZE 
      DIV P6144     IF GREATER THAN 6144 (#WORDS/TRACK) 
      SZA 
      LDB P6144     TO ONE TRACK
      STB A 
SETI0 CLB 
      DIV SECWD     SEE HOW MANY SECTORS FIT
      STA ID.#S 
      MPY SECWD     CONVERT TO WORDS FOR LENGTH 
      STA LIDNT 
      CLB           BLOCK MULTIPLE MUST END ON
      LDA P6144     TRACK BOUNDARY AS WELL
      DIV LIDNT 
      SZB,RSS 
      JMP SETI1     OK
      LDA LIDNT     DECREMENT BLOCK 
      ADA N128      SIZE BY ONE SECTOR
      JMP SETI0 
SETI1 LDA LIDNT 
      CLB           GET # 16 WORD ENTRIES IN
      DIV P16        THE BLOCK. 
      STA EIDNT     SAVE # ENTRIES IN BLOCK.
* 
      LDA P10       INITIALIZE IDENT POINTERS:
      STA \PIDN       # ENTRIES USED +10, 
      STA \TIDN       CURRENT ENTRY INDEX,
      STA B.I         1ST ENTRY INDEX NOW IN CORE.
* 
* SET UP LOADER SYMBOL TABLE (LST). 
* 
      LDA BIDNT     SET FWA LST AREA AT END 
      ADA LIDNT 
      STA BLST      OF IDENT AREA.
      CMA,INA       USE ALL OF REMAINING
      ADA LWAM       AVAILABLE MEMORY.
      CLB           TRUNCATE BLOCK SIZE 
      DIV P6144     IF GREATER THAN 6144 (#WORDS/TRACK) 
      SZA 
      LDB P6144     TO ONE TRACK
      STB A 
SETL0 CLB 
      DIV SECWD     SEE HOW MANY SECTORS FIT. 
      STA LS.#S     SAVE # SECT PER LST BLOCK.
      MPY SECWD     CONVERT TO WORDS FOR LENGTH 
      STA LLST      OF DISC READS AND WRITES. 
      CLB 
      LDA P6144     BLOCK MULTIPLE
      DIV LLST      MUST END ON TRACK 
      SZB,RSS       BOUNDARY AS WELL
      JMP SETL1 
      LDA LLST
      ADA N128      DECREMENT BY ONE SECTOR 
      JMP SETL0 
SETL1 LDA LLST
      CLB           GET # 5 WORD ENTRIES IN 
      DIV P5        THE BLOCK.
      STA ELST      SAVE # ENTRIES. 
* 
      CLA           INITIALIZE LST POINTERS:
      STA \PLST       # ENTRIES USED, 
      STA \TLST       CURRENT ENTRY INDEX,
      STA B.L        1ST ENTRY NOW IN CORE. 
      SKP 
* 
* ALLOCATE DISC SPACE FOR FIX-UP, IDENT, LST. 
* 
      LDA FIX#T     GET # FIX-UP TRACKS,
      ADA IDT#T     ADD # IDENT TRACKS, 
      ADA LST#T     ADD # LST TRACKS. 
      IOR MSIGN     SET NO SUSPEND BIT
      STA NEXT      TOTAL # TRACKS TO ALLOCATE. 
* 
GETTR JSB EXEC
      DEF *+6 
      DEF P4
      DEF NEXT      # TRACKS REQUESTED. 
      DEF FTRKA     RETURNED: FIRST TRACK.
      DEF DSKLU     RETURNED: WHICH DISC. 
      DEF SECTK     RETURNED: SECTORS/TRACK.
* 
      LDA FTRKA     GET FIRST TRACK # 
      SSA,RSS       REQUEST GRANTED?
      JMP ALLOC     YES 
      JSB \SPAC 
      JSB EXEC      NO, TELL USER OF PROBLEM
      DEF *+5 
      DEF P2
      DEF ERRLU 
      DEF TRMSG 
      DEF P14       "GENERATOR WAITING FOR TRACKS"
* 
      LDA  NEXT      TAKE OUT NO-SUSPEND BIT
      XOR MSIGN 
      STA NEXT      SUSPEND UNTIL TRACKS ARE AVAILABLE
      JMP GETTR 
* 
ALLOC LDA FX.#S     GET # 128 WORD SECTORS. 
      CLE,ELA       MPY BY 2 (64 WORD SECTORS). 
      CLB 
      DIV SECTK     FIND MULT. FACTOR PER WRITE.
      SZB,RSS       IF A TRACK MULTIPLE 
      LDB P96       THEN SET IT SO
      STB FX.#S     # 64 WORD SECTORS PER BLOCK.
* 
      LDA ID.#S 
      CLE,ELA 
      CLB 
      DIV SECTK 
      SZB,RSS 
      LDB P96 
      STB ID.#S 
* 
      LDA LS.#S 
      CLE,ELA 
      CLB 
      DIV SECTK 
      SZB,RSS 
      LDB P96 
      STB LS.#S 
* 
      LDA FTRKA 
      STA FX.BT     FIX-UP START TRACK. 
      STA FX.LT     FIX-UP TRACK LAST READ. 
      ADA FIX#T 
      STA FX.ET     FIX-UP LAST TRACK +1. 
      STA ID.BT     IDENT START TRACK.
      STA ID.LT     IDENT TRACK LAST READ.
      ADA IDT#T 
      STA ID.ET     IDENT LAST TRACK +1.
      STA LS.BT     LST START TRACK.
      STA LS.LT     LST TRACK LAST READ.
      ADA LST#T 
      STA LS.ET     LST LAST TRACK +1.
      CLA 
      STA FX.LS 
      STA ID.LS 
      STA LS.LS 
      SKP 
* 
*     GET NAME, SECUR, LABEL OF LIST FILE.
* 
FNAME LDA P10       "LIST FILE?"
      LDB LSTFI 
      JSB \RNME     GET LIST FILE 
      JSB \CRET     GO CREATE THE FILE
      DEF *+5 
      DEF \LDCB 
      DEF P64 
      DEF P3
      DEF ZERO
      CLA 
      JSB \CFIL     CHECK FILE STATUS 
      JMP FNAME     ERROR 
      ISZ LFERR      1=> ACKNOWLEDGE LIST FILE ERRORS 
* 
      DLD PARS2     WAS NAME A FILE OR LU?
      CPA P1
      RSS 
      JMP FLNM0     FILE NAME, SO DEFAULT TO LSTLU=0
      STB LSTLU     SAVE THE LU - MAY NOT BE INTERACTIVE
      JSB EXEC      DETERMINE THE DEVICE TYPE 
      DEF *+6 
      DEF P13 
      DEF LSTLU 
      DEF EQT5
      DEF FNAME 
      DEF ALLOC 
* 
      CLB 
      LDA FNAME     IF BIT BUCKET WAS SPECIFIED,
      AND M77       DON'T MISTAKE IT FOR A TYPE 
      SZA,RSS       00 DEVICE 
      JMP SETIA 
* 
      LDB LSTLU 
      LDA EQT5      INTERACTIVE DEVICES ARE TYPE 0, OR
      ALF,ALF        TYPE 5, SUBCHANNEL 0 
      AND M77 
      STA EQT5
      CPA P7        IF A TYPE 7 DEVICE, THEN IT IS
      CLA           AUTOMATICALLY INTERACTIVE 
      CPA P5
      LDA ALLOC      GET TYPE 5 SUBCHANNEL
      AND M77 
      CLB 
      SZA,RSS 
      INB            SET INTERACTIVE
SETIA STB IALST      0=NOT INTERACTIVE, 1=IT IS 
* 
      SZB           IF ITS INTERACTIVE
      JMP EC?       THEN DON'T LOCK 
LULOC JSB LURQ
      DEF *+4 
      DEF IOPTN 
      DEF LSTLU 
      DEF P1
* 
      SZA,RSS       WAS IT SUCCESSFUL?
      JMP EC?       YES 
      JSB \SPAC 
      JSB EXEC
      DEF *+5 
      DEF P2
      DEF ERRLU 
      DEF LUMSG 
      DEF P17       "GENERATOR WAITING ON LIST LU LOCK" 
* 
      LDA IOPTN     SET THE WAIT BIT FOR NEXT CALL
      XOR MSIGN 
      STA IOPTN 
      JMP LULOC 
* 
* RE-OPEN THE LIST FILE WITH A NON-EXCLUSIVE OPEN SO IT CAN 
* BE EXAMINED CONCURRENT WITH GENERATION
* 
FLNM0 JSB OPEN      A CALL TO OPEN AN ALREADY 
      DEF *+7       OPEN FILE WILL RESULT 
DLDCB DEF \LDCB     IN IT BEING CLOSED AND
      DEF \FMRR      RE-OPENED WITH THE OPTIONS 
      DEF PARS2+1 
      DEF P1
      DEF PARS3+1 
      DEF PARS4+1 
      LDA DLDCB     GET DCB ADDRESS 
      JSB \CFIL     CHECK ERROR STATUS
      JMP FLNM0 
* 
* ASK WHETHER ECHO IS DESIRED 
* AND OPEN IT IF SO 
* 
EC?   LDA P5
      LDB ECHOI 
      JSB YE?NO 
      JMP EC?       INVALID REPLY 
      STA ECHON     1 FOR YES, 0 FOR NO 
* 
      CLA,INA       SET UP FOR CREATION 
      STA PARS2     OF DUMMY DCB IN TYP0
      LDA ERRLU 
      STA PARS2+1   LU ALREADY DETERMINED 
      JSB FOPEN 
      DEF *+3 
      DEF \EDCB 
      DEF RWSUB 
* 
      JSB \CFIL 
      JSB \TERM 
      RSS           SKIP
* 
* GET SIZE, NAME, SECUR, LABEL OF CORE-IMAGE RTE OUTPUT FILE. 
* 
      JSB \INER     INPUT ERROR 
EST#  JSB \SPAC 
      LDA P30 
      LDB FISIZ     "EST. # TRACKS IN OUTPUT FILE?" 
      JSB \READ 
      LDA N3
      JSB \DCON     GET BINARY. 
      JMP EST#      ERROR. TRY AGAIN. 
      STA NEXT
      ADA MIN15     CHECK FOR 15 TRACKS MIN.
      SSA 
      JMP EST#-1
      LDA NEXT
      MPY P48       GET # BLOCKS. 
      SSA           IF NEGATIVE THEN RETRY
      JMP EST#-1
      STA NEXT
* 
FLNAM JSB \SPAC 
      LDA P17 
      LDB OUTFI 
      JSB \RNME     "OUTPUT FILE NAME?" 
* 
      LDA PARS2     CHECK FOR NUMERIC OR NULL ANSWER
      CMA,INA,SZA   IF NULL(TYPE 0) 
      INA,SZA,RSS   OR NUMERIC(TYPE 1)
      RSS 
      JMP FLNMC     THEN ITS A LU 
      JSB \INER 
      JMP FLNAM 
* 
FLNMC JSB \CRET     GO CREATE THE OUTPUT FILE 
      DEF *+5 
      DEF ABDCB 
      DEF NEXT      # BLOCKS. 
      DEF P1        TYPE 1 FILE.
      DEF ZERO
      CLA 
      JSB \CFIL     CHECK FILE ERROR
      JMP FLNAM     RETRY...ERROR 
* 
* GET SYSTEM DISK TYPE
* 
      JSB \SPAC 
      RSS 
      JSB \INER     INPUT ERROR TO "SYSTEM DISK?" 
STRT0 LDA P12       TO GET THE INITIAL SEGMENT
      LDB MES00     DEPENDS ON THE DISK TYPE
      JSB \READ      MES00: "SYSTEM DISK?"
      LDA N4
      JSB \DCON     CONVERT 4 DEC DIGITS
      JMP STRT0     ERROR - TRY AGAIN 
      CLB,INB 
      CPA P7900     CHECK FOR A 
      CLB           7900
      CPA P7905     OR A 7905 
      CCB 
      CPA P7906     OR A 7906 
      CCB 
      CPA P7920     OR A 7920 
      CCB 
      STB DTYPE     0=7900, -1=7905,7906,7920 
      SSB 
      JMP STRT5 
      SZB           IF NOT 7900 
      JMP STRT0-1   THEN ERROR
                                                                                        