ASMB,Q,R,C
      HED RT4GN ---- MAIN FOR ON-LINE GENERATOR 
      NAM RT4GN,3,90 92067-16315 REV.2026 800423
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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-18315 
*   REL PART #:       92067-16315 
*   WRITTEN BY:       JJC, 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
      ENT \MTCH 
* 
*     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 
      ENT \SCTK 
      ENT \MDTB,\IBI
* 
      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 
      EXT $BMON 
      EXT $OPSY     VARIABLE TO GET OP SYSTEM TYPE
      EXT FTIME     SYSTEM ROUTINE TO GET TIME OF DAY 
      EXT SEGLD     SEGMENT SWAPPER 
* 
      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 AS PART OF A SEGMENT 
*                          (1) MUST LOAD MODULE (EXT DEFINED BY IT) 
*                          (0) MODULE WAS LOADED
*  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-8)   NOT USED
*                   (7)     DON'T DUPLICATE FLAG
*                   (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
* 
*    * ADD 128 TO PROGRAM TYPE TO INDICATE "DON'T COPY".
* 
*  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
* 
* SET UP SYSTEM TYPE WORD 
* 
      LDA $OPSY 
      ERA 
      STA STYPE 
      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 
      JSB \LDAX     LOAD A THRU B,I WITH XLA IF NEEDED
      LDB A 
      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.
      JSB \LDAX     LDA B,I WITH XMAP LOAD IF NEEDED
* 
*               DYNAMICALLY DETERMINE LONGEST SEGMENT 
* 
      CPA AS.RT     "RT4G3" = LONGEST SEGMENT.
      RSS           MATCH.
      JMP NEXT
      INB 
      JSB \LDAX     LDA B,I WITH XMAP LOAD IF NEEDED
      CPA AS.GN 
      RSS           MATCH.
      JMP NEXT
      INB 
      JSB \LDAX     LDA B,I WITH XMAP LOAD IF NEEDED
      AND M7400 
      CPA AS.3      "3".
      JMP MATCH 
NEXT  ISZ TEMP1 
      JMP TRY 
* 
MATCH LDB TEMP1     GET ADDR
      JSB \LDAX       OF ID SEGMENT 
      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 
* 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 SETUP     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 
* 
* 
* SET UP FIX-UP TABLE.
* 
SETUP LDA SECTK      GET SECTORS PER TRACK, SYS DISC
      MPY P64        CALC WORDS/TRACK 
      STA WDTK
      LDA TEMP1 
      CLB           TRUNCATE BLOCK SIZE 
      DIV WDTK      IF GREATER THAN 6144 (#WORDS/TRACK) 
      SZA 
      LDB WDTK      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 WDTK      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 WDTK      IF GREATER THAN 6144 (#WORDS/TRACK) 
      SZA 
      LDB WDTK      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 WDTK      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 WDTK      IF GREATER THAN 6144 (#WORDS/TRACK) 
      SZA 
      LDB WDTK      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 WDTK      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 
* 
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 SECTK     THEN SET IT SO
      STB FX.#S     # 64 WORD SECTORS PER BLOCK.
* 
      LDA ID.#S 
      CLE,ELA 
      CLB 
      DIV SECTK 
      SZB,RSS 
      LDB SECTK 
      STB ID.#S 
* 
      LDA LS.#S 
      CLE,ELA 
      CLB 
      DIV SECTK 
      SZB,RSS 
      LDB SECTK 
      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 
                                                                                                                                                                              