ASMB,Q,R,C
      HED          RT4G8 - DRIVER PARTITION LOADING CONTROL SEGMENT 
      NAM RT4G8,5,90 92067-16323 REV.2001 790817
      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 3 
******************************************************************
* 
*   NAME:           RT4G8 
*   SOURCE PART #:  92067-18323 
*   REL PART #:     92067-16323 
*   WRITTEN BY:     KFH 
* 
******************************************************************
      SPC 1 
* 
*   ENTRY POINT NAMES 
* 
      ENT \\LDP 
* 
*   EXTERNAL REFERENCE NAMES
* 
      EXT \DPLD,\PREL,\TBUF 
      EXT \CBPA,\CPL2 
      EXT \CONV,\ABDO,\DSKA 
      EXT \ADSK,\PTYP,\TMSK 
      EXT \SPAC,\GNER,\MESS,\IRER,\ABOR 
      EXT \ADBP,\NUMP 
      EXT \IDX,\TIDN,\ID1,\ID3,\ID4,\ID5,\ID6,\ID8
      EXT \IFIX,\FIX,\FIX1
      EXT \CUBP,\UCBP,\ICBP,\CBPA 
      EXT \SYS,\USRS,\USER
      EXT \LRBP,\URBP,\SRET 
      EXT \DDON 
* 
* 
A     EQU 0 
B     EQU 1 
      SUP 
************************************************************************
* 
      SKP 
*************************************************************************** 
* 
*                                                              770913 
* 
*    THE FOLLOWING BLOCK OF STORAGE FOR VARIABLES PRECEEDS, 
*    AND IS REFERENCED BY, EACH SEGMENT.  IT IS NOT OVERLAID
*    AS EACH NEW SEGMENT IS LOADED INTO MEMORY. 
* 
*    THE LOCATION OF EACH VARIABLE MUST BE THE SAME IN ALL
*    SEGMENTS.  IF A CHANGE IS MADE, MAKE THE SAME CHANGES
*    IN THE REST OF THE SEGMENTS. 
* 
*************************************************************************** 
* 
* 
TB30  BSS 160       TRACK MAP TABLE/HEADER RECORD BUFFER
* 
ILIST BSS 64        USER SYSTEM PROG IDENT ADDR LIST
CURIL BSS 1         CURRENT ILIST ADDRESS 
* 
SYSCH BSS 1         SUBCHANNEL OF SYSTEM UNIT.
DCHNL BSS 1         CHANNEL OF SYSTEM DISK UNIT 
AUXCH BSS 1         SUBCHANNEL OF AUX UNIT. 
DSIZE BSS 1         DISK SIZE -NO. OF TRACKS. 
#SUBC BSS 1         # DISC SUBCHANNELS DEF'D (7905/7920)
DAUXN BSS 1         AUXILIARY DISK SIZE.
ADS#  BSS 1         AUX DISC SECTORS/TRACK. 
* 
*             RELOCATION BASE TABLE.
RBTA  BSS 1         ABSOLUTE PROGRAM BASE.
TPREL BSS 1         CURRENT PROGRAM BASE ADDRESS. 
TPBRE BSS 1         BASE PAGE RELOCATION ADDRESS. 
COMAD BSS 1         CURRENT COMMON RELOCATION BASE. 
      BSS 1         ABS PROGRAM BASE FOR MR CODE. 
* 
WDCNT BSS 1         TEMPORARY WORD COUNTER. 
DSKSY BSS 1         INITIAL ID SEGMENT DISK ADDRESS 
IDSP  BSS 1         POSITION OF 1ST ID SEG. IN SECT 
TTYCH BSS 1         SYSTEM TTY CHANNEL NO.
* 
PLFLG BSS 1         PROGRAM LOAD. FLAG = -1/0 = L/NL
DSCNT BSS 1         DISK SEGMENT SECTOR COUNT 
* 
NXFLG BSS 1         ENT/EXT FLAG = -1/0 
EXCNT BSS 1         SYMBOL COUNTER
* 
LCNT  BSS 1         CURRENT \LBUF COUNT 
DCNT  BSS 1         CURRENT DBUF COUNT
CURAI BSS 1         CURRENT IBUF COUNT
* 
CPLS  BSS 1         ADDRESS OF TOP OF FIXED CP LINK IMAGE 
CPL1  BSS 1         ADDRESS OF LOW CURRENT PAGE LINK SPECS. 
CPL1H BSS 1         NUMBER OF CURRENT PAGE LINKS ASSIGNED 
CPL2H BSS 1         IN LOW AND HIGH AREA RESPECTIVELY 
URBP1 BSS 1         LWA R/T DISC RES BP LINK AREA 
CURAK BSS 1         CURRENT KBUF ADDRESS
* 
CURAT BSS 1         CURRENT \TBUF ADDRESS 
TCNT  BSS 1         CURRENT \TBUF COUNT 
* 
CURAP BSS 1         CURRENT PLIST ADDRESS 
* 
AMAD  BSS 1         CURRENT MLIST ADDRESS 
* 
IXCNT BSS 1         ID EXTENSION COUNT
IDEXC BSS 1         CURRENT ID EXT'S USED 
IDEX  BSS 1         ADDRESS OF ID EXTENSION TABLE 
* 
LICNT BSS 1         LONG ID SEGMENT COUNT 
SSCNT BSS 1         BG. SEG ID COUNT
* 
DSKID BSS 1         DISK ID SEGMENT ADDRESS 
KEYCN BSS 1         TOTAL KEYWORD COUNT 
KEYCT BSS 1         CURRENT KEYWORD COUNT 
* 
MLIST BSS 11        MEMORY MAP BUFFER 
* 
TEMP1 BSS 1 
TEMP2 BSS 1 
LWH1  BSS 1 
LWH2  BSS 1 
LWH3  BSS 1 
LWH4  BSS 1 
L01   BSS 1 
* 
FSYBP BSS 1         FIRST WORD SYS BP LINKAGE 
SYSAD BSS 1         CURRENT ID SEGMENT ADDRESS
* 
TBREL BSS 1         CURRENT BP RELOC ADDR 
PBREL BSS 1         INITIAL BP RELOC ADDR 
* 
RELAD BSS 1         CURRENT CORE RELOCATION ADDRESS 
* 
BSBAD BSS 1         BG SEGMENT BP RELOC ADDR
BSPAD BSS 1         BG SEGMENT PROG RELOC ADDR
* 
LFLAG BSS 1         PROGRAMS-LOADED FLAG
IMAIN BSS 1         CURRENT MAIN IDENT INDEX. 
HDFLG BSS 1         HEADING FORMAT FLAG 
CIDNT BSS 1         CURRENT MAIN IDENT INDEX. 
* 
AEQT  BSS 1         ADDRESS OF EQUIPMENT TABLE
CEQT  BSS 1         NO. ENTRIES IN EQUIPMENT TABLE
SPLCO BSS 1         SPOOL EQT COUNT 
DVMAP BSS 1         ADDRESS OF DRIVER MAP TABLE 
* 
DPFLG BSS 1         DP RELOCATION FLAG, 0=YES, -1=NO
DPLN BSS 1          PAGE LENGTH OF DRIVER PARTITION 
DPADD BSS 1         START ADDR OF DRIVER PARTITION
DSKDP BSS 1         DISK ADDRESS OF DP #2 
PAGE# BSS 1         NEXT PHYSICAL PAGE TO ALLOCATE
DPNUM BSS 1         CURRENT DP# -1, OR TOT DP PAGES 
SDID  BSS 1         IDENT IDEX OF SYS DISK DRIVER 
LWDP1 BSS 1         LAST WORD OF DP, +1 
FWSDA BSS 1         FIRST WORD OF SDA 
* 
ASQT  BSS 1         ADDR OF DEVICE REFERENCE TABLE
CSQT  BSS 1         NO. ENTRIES IN DEV. REF. TABLE
* 
AINT  BSS 1         ADDRESS OF INTERRUPT TABLE
* 
DSKIN BSS 1         DISK ADDR OF INT CODE RECORD
INTCN BSS 1         RECORD COUNT OF INT CODE
* 
IDSAV BSS 1         INDEX OF CURRENT IDENT. 
DSKMN BSS 1         INITIAL MAIN DISK ADDRESS 
BSSDP BSS 1         INITIAL DISK RES MAIN BSS DISP
PRENT BSS 1         PRIMARY ENTRY POINT 
DBLAD BSS 1         CURRENT DBL ADDRESS 
REKEY BSS 1         INSTRUCTION TYPE BYTE 
INSCN BSS 1         INSTRUCTION TYPE COUNTER
INSTR BSS 1         CURRENT INSTRUCTION 
PAGNO BSS 1         CURRENT PAGE NO.
OPRND BSS 1         CURRENT OPERAND 
PLGTH BSS 1         PROGRAM LENGTH
* 
DRT2  BSS 1         DISK DRT ENTRY ( SYSTEM)
DRT3  BSS 1         AUX DISK DRT ENTRY
* 
LIBFG BSS 1 
LDTYP BSS 1 
* 
SCH1  BSS 1         INDEX OF IDENT OF PGM TO BE SCHEDULED 
SCH3  BSS 1         ADDRESS OF CURRENT ID SEGMENT 
SCH4  BSS 1         ADDRESS OF THE SCHEDULED PGM ID SEG 
FGBGC BSS 1         BACKGROUND USING FG COMMON FLAG 
$LIBR BSS 1         INDEX OF $LIBR ENT
$LIBX BSS 1         INDEX OF $LIBX ENT
CUPRI BSS 1 
* 
BLLO  BSS 1         -(LOWER BUFFER LIMIT) 
BLHI  BSS 1         -(UPPER BUFFER LIMIT) 
* 
MEM6  BSS 1 
MEM12 BSS 1 
* 
COMRT BSS 1         MAXIMUM RT COM LENGTH 
COMBG BSS 1         MAXIMUM BG COM LENGTH 
COMSZ BSS 1         #WORDS COMMON DECLARED IN CURRENT MAIN
RTCAD BSS 1         RT COMMON ADDRESS 
BGCAD BSS 1         BG COMMON ADDRESS 
FPCOM BSS 1         FIRST PAGE OCCUPIED BY COMMON 
LPCOM BSS 1         LAST PAGE CONTAINING ANY COMMON 
* 
FPSAM BSS 1         1ST PAGE CONTAINING S.A.M.
FWSAM BSS 1         1ST WORD CONTAINING S.A.M.
SYMAD BSS 1         VALUE FOR AVMEM IN SCOM 
SAM#1 BSS 1         SIZE OF FIRST CHUNK OF SAM
SAM#2 BSS 1         SIZE OF SECOND CHUNK OF SAM 
SAM2P BSS 1         START PAGE OF SAM #2
LWTAI BSS 1         LAST WORD OF TABLE AREA I 
FWPRV BSS 1         FIRST WORD FOR PRIVILEGED PROGRAMS
* 
FWSYS BSS 1         FIRST WORD OF SYSTEM CODE 
LPSYS BSS 1         LAST PAGE CONTAINING SYS
LWSYS BSS 1         LAST WORD OF SYSTEM 
LPSLB BSS 1         LAST PAGE OF SLOW BOOT
LWSLB BSS 1         LAST WORD OF SLOW BOOT
MTYPE BSS 1         MAIN PROGRAMS'S TYPE
* 
HIBP  BSS 1         BP LINK MODE FOR FIXUP ENTRIES
LOLNK BSS 1         LOW LINK FOR SSGA,LIB, OR SYS 
HILNK BSS 1         HI LINK USED BY MEM RES PRG 
BPINC BSS 1         BP LINK ALLOCATION MODE, -1=DOWN,1=UP 
BPLMT BSS 1         LAST AVAIL BP LINK IN CURRENT MODE, +1
* 
TPMAX BSS 1         HWM FOR RELOCATION OF BG MAINS & SEGS 
MAXPT BSS 1         NUM PARTS. ALLOWED
MAT.  BSS 1         ADDRESS OF MEMORY ALLOCATION TABLE
* 
SSGA. BSS 1         FWA SSGA
MAP.  BSS 1         PTR TO MEU RES MAP
MPFT. BSS 1         PTR TO MPFT 
* 
EMLNK BSS 1         EMA SYMBOL'S LINK 
EMLST BSS 1         LST INDEX OF EMA SYMBOL 
EMDSK BSS 1         DISK ADDR OF EMA PROGRAM
* 
*     MEMORY RESIDENT AREA POINTERS 
* 
MRACM BSS 1         MR ACCESS COMMON FLAG (>0 IF YES) 
LBCAD BSS 1         FIRST WORD OF MEMORY RES LIBRARY
LEND  BSS 1         LAST  WORD OF MEMORY RES LIBRARY
FWMRP BSS 1         FIRST WORD OF MEMORY RES PROGRAM AREA 
EMRP  BSS 1         LAST  WORD OF MEMORY RES PROGRAM AREA 
FPMRP BSS 1         FIRST PAGE OF MEMORY RES PROGRAM AREA 
FPMBP BSS 1         PAGE # FOR MEMORY RES BASE PAGE 
MRP#  BSS 1         # PAGES OCCUPIED BY MRL & MRP'S 
DSKMB BSS 1         DISK ADDRESS OF MEMORY RES BASE PAGE
DSKMR BSS 1         DISK ADDRESS OF MEMORY RESIDENT LIB/PROG AREA 
DSKBP BSS 1         SYSTEM DISK ADDRESS 
* 
DSKAV BSS 1         NEXT AVAILABLE DISK ADDRESS 
DSKLC BSS 1         DISK ADDRESS OF LIBRARY CODE
DSKLB BSS 1         DISK ADDR OF LIBRARY ENTRY PTS
DSKUT BSS 1         UTILITY PROG DISK ADDRESS 
DSKBS BSS 1         DISK ADDR OF MAIN BG DISK RES BP
DSKBR BSS 1         CURRENT MAIN BG DISK RES DISK AD
ADICT BSS 1         ADDR OF DISK DICTIONARY 
LBCNT BSS 1         RESIDENT LIBR ENTRY PT COUNT
SYCNT BSS 1         SYSTEM ENTRY POINT COUNT
KEYAD BSS 1         CURRENT KEYWORD ADDRESS 
* 
SYBAD BSS 1         ADDR OF FIRST BP LINK FOR BG
IDSAD BSS 1         ADDR OF FIRST ID SEGMENT
ABSID BSS 1         IDENT ADDR FOR NEXT BG SEG SCAN 
IDMBS BSS 1         BG MAIN ADDRESS FOR BS REF
* 
SYTRK BSS 1         DISC ADDR WHERE SYSTEM BEGINS - TRACK 
SYSEC BSS 1         DISC ADDR WHERE SYSTEM BEGINS - SECTOR
* 
SSGAF BSS 1         SSGA ACCESS FLAG
SPAR2 BSS 1         SPARE VARIABLE
SPAR3 BSS 1         SPARE VARIABLE
SPAR4 BSS 1         SPARE VARIABLE
SPAR5 BSS 1         SPARE VARIABLE
* 
********************************************************* 
*                                                       * 
*  END OF COMMON STORAGE BLOCK FOR ALL SEGMENTS.        * 
*                                                       * 
********************************************************* 
* 
      SPC 4 
      SKP 
*  NOTE THE FOLLOWING RESOLVES ARITHMETIC DEF'S TO EXTERNALS
* 
SEG8  CCA           GET LOOP COUNTER
      STA TEMP1     SAVE
      LDB LSTAA     GET ADDRESS OF LIST 
LOOP  LDA B,I       GET ADDRESS 
      RSS 
      LDA A,I 
      RAL,CLE,SLA,ERA 
      JMP *-2 
      STA B,I       AND SAVE IT AGAIN 
      INB 
      ISZ TEMP1 
      JMP LOOP
      JMP \SRET     RETURN TO MAIN
* 
* 
LSTAA DEF *+1 
ATBUF DEF \TBUF+0 
      SKP 
*                                   PROGRAM CONSTANT FACTORS
P10   DEC 10
P13   DEC 13
P15   DEC 15
P17   DEC 17
P24   DEC 24
M37   OCT 37
M177  OCT 177 
M1000 OCT 1000
M1777 OCT 1777
M7777 OCT 77777 
M3777 OCT 37777 
M1776 OCT 177776
* 
LWSBP OCT 1645
* 
MES64 DEF *+1 
      ASC 9,PARTITION DRIVERS 
MESDP DEF *+1 
      ASC 2,DP      DO NOT REARRANGE
MESPD NOP                  THESE
      ASC 9,  <<PAGE  XXXX>>:      LINES
MESD1 DEF MESDP+8 
      SKP 
* 
*     LOADING CONTROL FOR DRIVER PARTITIONS:
*       - CHOOSES THE NEXT PARTITION DRIVER TO RELOCATE 
*       - ZERO-FILLS ANY REMAINING DRIVER PARTITION SPACE 
*       - UPDATE DRIVER MAP TABLE ENTRIES WITH CORRECT
*         PHYSICAL DP PAGE #
* 
*     ON ENTRY: 
*       A-REG = -1 IF DRIVER PARTITION #1 IS TO BE RELOCATED
*             =  0 IF DRIVER PARTITIONS #2 ONWARD ARE TO BE 
*                  RELOCATED WITH THE REMAINING PRD'S 
* 
\\LDP SSA,RSS 
      JMP DP2ON     GO LOAD DRIVER PARTITIONS #2 ...
* 
*     RELOCATE DRIVERS INTO DRIVER PARTITION #1 ONLY
* 
      ADA \PREL     DETERMINE THE LAST WORD OF TA I 
      STA LWTAI     AND SAVE FOR COMPUTING SAM#0
      IOR M1777     AND ROUND TO THE START OF THE 
      INA           NEXT PAGE 
      STA DPADD     SAVE LOGICAL STARTING ADDRESS OF DP'S 
      JSB CPAG#     CONVERT IT TO A PHYSICAL PAGE # AND 
      STA PAGE#     FOR UPDATING DVMAP ENTRIES
* 
      ADA DPLN      ADD # PAGES PER PARTITION 
      STA FPCOM     AND SET FIRST COMMON PAGE 
      ALF,ALF       MOVE TO CORRECT FORMAT
      RAL,RAL       AS A MEMORY ADDRESS 
      STA LWDP1     AND SAVE AS LAST WORD OF A DP, +1 
* 
      LDA SDID      GET IDENT INDEX OF SYSTEM DISK DRIVER 
      AND M3777     TO BE RELOCATED 
      STA CIDNT     INTO DP #1
      CLA           SET PROGRAM TYPE
      STA \PTYP     FOR SCDRV/IDSCN 
      STA DPFLG     SIGNAL DP RELOCATION MODE 
      JSB \SPAC 
      JSB \SPAC 
* 
      JMP LOADD     NOW LOAD DP #1
* 
DP1DN LDA LWDP1     SET THE RELOCATION ADDRESS FOR SSGA 
      STA \PREL 
      STA SSGA.     AND SAVE FOR MPFT SETTING 
      CCA           TURN OFF DP RELOCATION
      STA DPFLG     MODE
      JMP \DDON     RETURN TO LOADING CONTROL IN RT4G3
      SKP 
* 
*     RELOCATE REMAINING PARTITION-RESIDENT DRIVERS INTO DP 'S #2 ONWARD
* 
DP2ON STA \PTYP     SET IDENT SCAN TYPE 
      STA DPFLG     SIGNAL DP RELOCATION MODE 
      INA           NOW SET THE # OF DP'S ALREADY 
      STA DPNUM     RELOCATED 
* 
      LDA P17       SEND
      LDB MES64      HEADING: 
      JSB SETHD       "PARTITION DRIVERS" 
* 
*     INITIALIZE FOR PARTITION DRIVER LOADING 
* 
      CCA           SET FOR TOP-DOWN LINK 
      STA BPINC     ALLOCATION
      ADA PBREL     SAVE LOWEST LINK TO 
      STA BPLMT     ALLOCATE(LESS 1)
      STA HILNK     AND HIGHEST SYSTEM LINK ALLOCATED 
* 
      INA           SET BP SCAN ARE TO LOWEST LINK
      STA \CUBP      ABOVE HIGHEST SYSTEM LINK
      ADA \ADBP      AND SAVE ITS RT4GN 
      STA \ICBP     IMAGE AREA
* 
      LDA LWSBP     SET UPPER BP LINK SCAN AREA 
      STA \UCBP     BELOW SCOM
* 
      CCA 
      ADA LOLNK     SET FIRST LINK ADDRESS TO 
      STA PBREL     FOLLOW LAST TA-II LINK
* 
      CLA           CLEAR SO THE SYSTEM-ONLY LINKS
      STA \LRBP      ON BP WILL NOT 
      STA \URBP      BE SHARED
* 
      LDA M1000     FIXUP LINKS MUST GO IN
      STA HIBP      HIGH BASE PAGE
* 
* 
      JSB DSKEV     FORCE EVEN SECTOR BOUNDARY FOR DP #2
      STA DSKDP     AND SAVE DISK ADDR OF DP #2 (FOR $SBTB) 
* 
      LDA LPSLB     GET PHYSICAL PAGE # FOLLOWING 
      INA           THE SLOW BOOT/SAM #1
      STA PAGE#     AND SET STARTING PAGE FOR DP #2 
* 
* 
      JMP LOADD     NOW LOAD THE DRIVER PARTITIONS
* 
DPDON LDB PAGE#     NEXT AVAILABLE PAGE # 
      STB FPMBP     IS THE MEMORY RESIDENT BASE PAGE
* 
      CMB,INB       DETERMINE IF THERE WERE EVEN
      ADB \NUMP     ENOUGH PHYSICAL PAGES 
      SSB           FOR THE DRIVER PARTITIONS 
      JMP PGOV      NOPE
* 
      LDA LPSLB     DETERMINE THE # OF PAGES USED 
      CMA           BY DP'S #2 ONWARD 
      ADA FPMBP 
      STA DPNUM     AND SAVE
      CCA           TURN OFF DP 
      STA DPFLG     RELOCATION MODE 
* 
      JMP \DDON     RETURN TO RT4G3 FOR MEMORY RESIDENT LOADING 
* 
* 
PGOV  LDA ERR61     SEND ERROR DIAGNOSTIC 
      JSB \IRER     NO MORE PHYSICAL PAGES
ERR61 ASC 1,61
      SKP 
* 
* SUBROUTINE LOADD: 
*     LOADS DRIVER PARTITION #1, OR DRIVER PARTITIONS #2 ONWARD 
* 
*     ON ENTRY THE FOLLOWING HAVE ALREADY BEEN SET UP:
*        - DPNUM CONTAINS THE # OF DP'S ALREADY BUILT 
*        - BPINC,BPLMT,\CUBP,\ICBP,\UCBP,PBREL,\LRBP,\URBP INITIALIZED
*          FOR LINK ALLOCATION
*        - HIBP SET TO ALLOCATE LINKS IN UPPER BASE PAGE
*        - PAGE# INITIALIZED TO THE PHYSICAL PAGE # OF THE NEXT DP
* 
* 
LOADD EQU * 
* 
*     SEARCH FOR A  PARTITION-RESIDENT DRIVER 
* 
NEWDP JSB SCDRV     SCAN IDENTS 
      JMP DPDON     NO MORE - DONE WITH DP'S
      RSS           GOT A PRD!
      JMP NEWDP     NO, IT WAS AN SDA DRIVER
* 
*     PRINT DP HEADING
* 
SHEAD LDA DPNUM     CONVERT 
      CMA           PARTITION NUMBER
      LDB ATBUF     TO ASCII
      JSB \CONV     AND 
      LDA \TBUF+2    STORE
      STA MESPD     IN MESSAGE
      LDA PAGE#     CONVERT PAGE #
      CMA,INA         TO ASCII DECIMAL
      LDB MESD1         AND STUFF HERE. 
      JSB \CONV 
      LDA P24       PRINT : 
      LDB MESDP        DP  XX  <<PAGE  XXXX>>:
      JSB \MESS     PRINT: DP XX: 
      JSB \SPAC 
* 
      LDA \CBPA     RESET THE CP LINK AREA TO "EMPTY" 
      STA \CPL2      LAST CP AREA = LAST BP AREA
      STA CPLS      LAST "SAVE" CP AREA = LAST BP AREA
      LDA DPADD     SET STARTING  RELOCATION
      STA \PREL     ADDRESS 
      LDB DPNUM     DON'T CHANGE SPECIFICATION
      SZB           MAPS YET IF STILL DP #1 
      JSB \USRS     INITIALIZE \ABDO MAP
* 
*     LOAD THE DRIVER INTO THE PARTITION
* 
LPRD  LDA \ID3,I    GET USAGE WORD
      CLB,INB        AND SET
      IOR B          THE LOADED BIT 
      STA \ID3,I     AND RESTORE
* 
      JSB \DPLD     LOAD THE PROGRAM VIA \NLOD (RT4G4)
      JSB INCAD      UPDATE PBREL & \PREL 
      LDB LWDP1     GET LAST LOGICAL WORD ADDRESS 
      CMB,INB       OF A DP, AND CHECK FOR OVERFLOW 
      ADB A         OF THIS DRIVER'S RELOCATION 
      SSB 
      JMP SCDVM     IT FIT, NOW GO UPDATE THE DVMAP ENTRIES 
* 
      LDA ERR59     IRRECOVERABLE ERROR 
      JSB \IRER      SEND DIAGNOSTIC, AND THEN TERMINATE
ERR59 ASC 1,59       SEND DRIVER IS TOO LARGE FOR A DP
* 
* 
*     SCAN THE DRIVER MAP TABLE FOR ENTRIES MATCHING
*     THE CURRENT DRIVER IDENT, AND UPDATE THE ENTRIES
*     TO THE STARTING PAGE OF ITS PARTITION.
* 
SCDVM STB LEFTO     SAVE NEGATIVE # WORDS LEFT IN DP
      JSB \SYS      DVMAP IS IN THE SYSTEM MAP
      LDB DVMAP     GET ITS MEMORY ADDRESS
      LDA CEQT      AND THE NUMBER OF ENTRIES 
      CMA           SET A NEGATIVE
      STA TEMP1     LOOP COUNTER
* 
SCDV1 ISZ TEMP1     BUMP ENTRY COUNTER
      RSS           CONTINUE CHECKING FRO MATCHING IDENTS 
      JMP MORE?     DONE WITH THIS DRIVER - FIND NEXT 
      JSB DPRW      GET THE CONTENTS OF THE NEXT ENTRY
      RAL           CHECK FOR A NON-UPDATED ENTRY 
      SSA,RSS       FROM A PRD-DRIVER 
      JMP SCDV1     WAS AN SDA, OR UPDATED PRD
      AND M7777     CLEAR THE SIGN BIT
      RAR           AND SHIFT BACK TO CORRECT POSITION
      CPA IMAIN     IS THIS FOR THE CURRENT DRIVER? 
      RSS           YES, A MATCH
      JMP SCDV1     NO, CONTINUE THE SCAN 
* 
      LDA PAGE# ??? GET STARTING PAGE OF THIS PARTITION 
      ADB N1        MOVE BACK TO ENTRY ADDRESS
      JSB \ABDO     AND UPDATE IT 
      JMP SCDV1     LOOK FOR MORE OF THE SAME 
* 
* 
*     SEE IF ANOTHER DRIVER WILL FIT INTO THIS PARTITION
* 
MORE? LDA P10       RESET SCAN TO START AT BEGINNING
      STA CIDNT     OF IDENT TABLE
MORE1 JSB SCDRV     SCAN FOR A PRD
      JMP ZFIL      NO MORE, ZERO-FILL REMAINDER OF DP
      RSS 
      JMP MORE1     AN SDA - TRY AGAIN
* 
      LDA \ID8,I    GET THE DRIVER'S MAIN PROGRAM SIZE
      AND M3777 
      ADA LEFTO     DOES IT FIT INTO DP?
      SSA,RSS 
      JMP MORE1     NO, TRY FOR ANOTHER 
* 
      JSB CPL?      IF CPL'S IN EFFECT, GET ESTIMATED SIZE
      JMP MORE1     NOW IT'S TOO BIG, TRY FOR ANOTHER 
* 
      LDA DPNUM     DON'T CHANGE MAPS IF STILL DP #1
      SZA 
      JSB \USER     RESET CORRECT OUTPUT MAP
      LDA \ID3,I    GET USAGE WORD OF DRIVER
      CLB,INB        AND SET
      IOR B          THE LOADED BIT 
      STA \ID3,I     AND RE-STORE 
* 
      LDA \ADSK     GET THE CURRENT DISK ADDRESS
      STA EMDSK     AND SAVE IN CASE OF BACKUP *TEMP* 
      JSB \DPLD     LOAD THE DRIVER AFTER PREV. ONE IN DP 
* 
*     DETERMINE IF DP OVERFLOW OCCURRED - IN WHICH CASE BACKUP
*     MUST BE DONE
* 
      LDB LWDP1     GET LAST LOGICAL WORD ADDRESS OF A DP,+1
      CMB,INB       AND CHECK FOR OVERFLOW OF THIS
      ADB TPREL     DRIVER'S RELOCATION 
      SSB,RSS 
      JMP DPOV      TOO BAD!
* 
      STB LEFTO     SAVE #WORDS STILL LEFT IN THIS DP 
      JSB INCAD     UPDATE \PREL & PBREL
      JMP SCDVM+1   GO FILL IN THIS DRIVER'S DVMAP ENTRIES
* 
*     DRIVER PARTITION OVERFLOW 
* 
DPOV  JSB \SPAC     SEND THE WARNING ONLY 
      LDA P26       THAT A DP OVERFLOWED
      LDB BKUPM     NO OPERATOR RECOVERY
      JSB \MESS 
* 
      LDA IMAIN     MAKE SURE THAT THE
      STA \TIDN     CORRECT IDENT ENTRY 
      JSB \IDX      IS IN CORE
      JSB \ABOR     NOT THERE!
      LDA \ID3,I    NOW CLEAR ITS 
      AND M1776     LOAD BITS 
      STA \ID3,I
      LDA EMDSK     RESET THE DISK ADDRESS TO 
      STA \ADSK     THE VALUE BEFORE THE DRIVER WAS LOADED
      JSB CLFIX     CLEAR ANY FIXUP ENTRIES CREATED BY IT 
      JMP MORE1     SEE IF ANY OTHER DRIVERS WILL FIT 
* 
* 
*     ZERO-FILL THE REMAINDER OF THE DP SINCE NO MORE WILL FIT IN IT
* 
ZFIL  LDA DPNUM     RESET TO USER'S MAP 
      SZA 
      JSB \USER     FOR DP'S #2 ... 
      CCA           POSITION TO THE LAST
      ADA \PREL     USED ADDRESS IN THIS DP 
      STA B         AND SAVE
      IOR M1777     ROUND TO LAST WORD ON PAGE
      CPA B         ANY CHANGE? 
      JMP NEXT?     NO, SO NO FILL NECESSARY
      LDB A         GET LAST WORD ADDRESS 
      CLA           AND ZERO-FILL UP TO AND INCLUDING 
      JSB \ABDO     THAT ADDRESS
* 
*     INITIALIZE FOR LOADING THE NEXT DRIVER PARTITION
* 
NEXT? LDA DPNUM     IF THIS WAS THE FIRST DP
      SZA,RSS 
      JMP DP1DN     THEN WE'RE DONE FOR NOW 
      ISZ DPNUM     ELSE BUMP TO THE NEXT DP #
* 
      JSB DSKEV     FORCE OUTPUT OF LAST SECTOR 
      LDA \PREL     GET # WORDS LEFT IN CURRENT 
      CMA,INA       DRIVER PARTITION
      ADA LWDP1 
      JSB CPAG#     AND CONVERT TO THE NUMBER OF
      AND M37       UNUSED PAGES IN IT
      CMA,INA       AND SUBTRACT FOR DP LENGTH
      ADA DPLN       TO DETERMINE ACTUAL NUMBER 
      ADA PAGE#     USED
      STA PAGE#     NOW SET THE STARTING PAGE OF THE NEXT DP
* 
      LDA P10       RESET IDENT INDEX FOR 
      STA CIDNT     SCAN
      JMP NEWDP     GO START A NEW DRIVER PARTITION 
* 
LEFTO NOP 
BKUPM DEF *+1 
      ASC 13,DRIVER PARTITION OVERFLOW
P26   DEC 26
      SPC 4 
* 
* 
*      CONVERT THE ADDRESS IN THE A-REG TO A PAGE # 
* 
CPAG#  NOP
      ALF,RAL       ROTATE PAGE BITS
      RAL           TO LOW BYTE 
      AND M1777     AND MASK THEM 
      JMP CPAG#,I 
      SKP 
* 
*     SCDRV         SCANS THE IDENT TABLE FOR DRIVERS OF TYPE 0 
*                   WHOSE NAME BEGINS WITH "DV".
* 
*     RETURN:       (P+1)  END OF IDENTS
*                   (P+2)  PARTITION-RESIDENT DRIVER
*                   (P+3)  SDA DRIVER 
* 
* 
SCDRV NOP 
* 
NEXTD JSB IDSCN     SCAN IDENTS FOR A TYPE 0
      JMP SCDRV,I   END OF IDENTS 
* 
      LDA \ID1,I    GET CHARACTERS 1 & 2
      CPA "DV"      OF NAME, AND COMPARE
      RSS           MUST BEGIN WITH DV
      JMP NEXTD     TRY NEXT DRIVER 
      LDA \ID8,I    CHECK IF AN EQT 
      SSA,RSS       DEFINED FOR IT (BIT 15 SET) 
      JMP NEXTD     NOPE
      LDB \ID3,I    GET LOADED FLAG 
      SLB           IF ALREADY LOADED 
      JMP NEXTD     THEN SKIP IT
* 
      ISZ SCDRV     BUMP EXIT 
      RAL           NOW CHECK IF AN SDA 
      SSA            (BIT 14 WAS SET) 
      ISZ SCDRV     YES, BUMP EXIT
      JMP SCDRV,I   RETURN
* 
"DV"  ASC 1,DV
      SKP 
* 
*                                   PRINT HEADING, INITIALIZE IDX 
* 
*  THE SETHD SUBROUTINE PRINTS THE HEADINGS FOR THE DIFFERENT 
*  TYPES OF PROGRAMS LOADED, SETS THE NO-PROGRAMS-LOADED-YET
*  FLAG, AND ORIGINS THE SCAN OF IDENT. 
* 
*  CALLING SEQUENCE:
*    A = NO. CHARS. (POS.) IN MESSAGE 
*    B = ADDRESS OF MESSAGE 
*    JSB SETHD
* 
*  RETURN: CONTENTS OF A AND B ARE DESTROYED
* 
SETHD NOP 
      DST \TBUF      SAVE THE MESSAGE 
      JSB \SPAC     NEW LINE
      DLD \TBUF      NOW
      JSB \MESS     PRINT HEADING 
      JSB \SPAC     NEW LINE
      CCA 
      STA LFLAG     SET PROGRAMS-LOADED FLAG = -1 
      LDA P10       GET FIRST IDENT INDEX 
      STA CIDNT     SET IDENT ADDRESS FOR ID SCAN 
      JMP SETHD,I   RETURN
                                                                                                          