ASMB,R,Q,C
*     NAME:   LOAD
*     SOURCE: 92070-18156 
*     RELOC:  92070-16156 
*     PGMR:   HLC 
* 
* 
*  **************************************************************** 
*  * (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.        * 
*  **************************************************************** 
* 
* 
      NAM LOAD,0  92070-16156  REV.1941  800124 
      ENT $EX08,$EX28,$LDAB,$XEQ2 
      ENT $LDRS,$LOAD,$LDBG 
      ENT $XS1,$XS2,$$LOA,$.LOA 
* 
      EXT $XQT,$LIST,$XEQ,$A
      EXT $LOBP,$LOW,$RQP2,$DREL
      EXT $SCXX,$HIGH,$TRAK 
      EXT $CSEG,$HIBP,$SUSP 
      EXT $PRIO,$PRAM,$RQP3 
      EXT $NAME,$WRKS,$EXEX 
      EXT $XSIO,$SCHD,$ZZZZ 
      EXT $IDSQ,$ERMG,$IOCL 
      EXT $XEQ1,$TEST,$BGRS 
      EXT $XEQ3,$SWAP,$SISZ 
      EXT $FWBG,$WORK 
* 
A     EQU 0 
B     EQU 1 
* 
$EX08 EQU * 
      JSB AVAIL     SUSPEND CALLER IF $LOAD NOT AVAILABLE 
      LDB $LOBP,I   (A=0) 
      RRL 6         SHIFT SEGMENT COUNT TO A
      CMA,INA,SZA,RSS 
      JMP SC05      NO SEGMENTS, NAME NOT FOUND 
      STA MLU 
      STA BLU 
      LDA $LOW,I    SEGMENT IDENTIFIERS START AT LOW MAIN 
      STA MRQ 
      CLA 
LP1   LDB =D-7      CHECK ALL SEGMENT IDENTIFIERS 
      ADA MRQ,I 
      ISZ MRQ           FOR ACCIDENTAL ALTERATION 
      INB,SZB 
      JMP LP1+1 
      CPA MRQ,I 
      CLA,RSS       CHECKSUM OK 
      JMP SC05      NAME NOT FOUND, SOMEONE CLOBBERED IT
      ISZ MRQ 
      ISZ MLU 
      JMP LP1 
* 
      LDB $RQP2     ALL CHECKSUMS OK
      INB 
      STB MSC         SET UP POINTERS TO NAME 
      INB 
      LDA B,I 
      AND =B177400
      STA MPR 
* 
      LDB $LOW,I
LP2   STB $A,I
      LDA B,I       CHECK FOR MATCH 
      CPA $RQP2,I 
      INB,RSS 
      JMP NEXT      DOES NOT MATCH
      LDA B,I 
      CPA MSC,I 
      INB,RSS       STILL OK
      JMP NEXT
      LDA B,I 
      AND =B177400
      CPA MPR 
      JMP FND       FOUND IT!!
NEXT  LDB $A,I
      ADB $SISZ 
      ISZ BLU       LAST NAME CHECKED?
      JMP LP2 
SC05  LDB =D5 
      JMP $SCXX     NOT FOUND, ABORT
* 
* 
FND   XOR B,I 
      ADA $TRAK,I   ADD TRACK OFFSET TO MAIN TRACK
      STA MTR 
* 
      INB 
      LDA B,I 
      STA $SUSP,I   POINT OF SUSPENSION 
* 
      INB 
      STB MRQ       SAVE POINTER FOR 'READ' 
      LDA $HIGH,I 
      STA MLO       LOW MAIN OF SEGMENT = HIGH MAIN OF MAIN 
      CMA,INA 
      ADA B,I       COMPUTE SIZE
      STA MSZ 
      LDA $CSEG,I 
      ELA           'AM' BIT IN E-REG 
      LDA B,I 
      RAL,ERA       ADD 'AM' BIT TO CURRENT SEGMENT HIGH
      STA $CSEG,I   STORE CURRENT HIGH SWAP LIMIT 
* 
      LDA $HIBP,I 
      AND =B1777
      STA BLO       LOW BP OF SEGMENT = HIGH BP OF MAIN 
* 
      LDA $PRIO,I   PRIORITY OF CALLER
      LDB $XQT
      JSB READ      LOAD IT!! 
* 
      LDB $XQT
      JSB $PRAM     PASS PARAMETERS TO THE SEGMENT
      DEF $RQP3,I 
      ISZ $LIST     NEED TO SCAN SCHEDULED LIST 
      JMP $XEQ
* 
* 
AVAIL NOP           SUSPEND CALLER IF $LOAD NOT AVAILABLE 
      CLA 
      CPA $LDRS 
      JMP AVAIL,I 
      LDB $XQT
      JSB $LIST     NOT FREE, SUSPEND THE CALLER
      OCT 56
      JMP $XEQ
* 
* 
* 
      HED  REAL-TIME PROGRAM LOAD 
* 
$EX28 EQU * 
      JSB $NAME     FIND PROGRAM NAME 
      DEF $RQP2,I 
      SZB,RSS 
      JMP SC05      NOT FOUND 
      LDA $WRKS,I 
      SSA 
      JMP $EXEX     ALREADY IN MEMORY 
      CPB $LDRS 
      JMP $EXEX     CURRENTLY BEING LOADED
      ADB =D20
      LDA B,I 
      CPA $FWBG 
      JMP $EXEX     BACKGROUND PROGRAM
      JSB AVAIL     SUSPEND CALLER IF $LOAD NOT AVAILABLE 
      JSB PREP      SET UP LOAD PARAMETERS
      LDA $PRIO,I   PRIORITY OF CALLER
      LDB $WORK 
      JSB READ      LOAD IT 
      JMP $EXEX 
* 
* 
      HED  DISC LOAD SUBROUTINE 
* 
READ  NOP           LOAD PROGRAM OR SEGMENT FROM DISC 
      STA MPR       SAVE PRIORITY 
      STA BPR 
      STB $LDRS     ID SEGMENT OF OCCUPANT
      ADB =D27
      LDA B,I       DISC LU (SWAP AREA = 0) 
      STA MLU 
      STA BLU 
* 
      ISZ MRQ 
      LDA BLO 
      CMA,INA 
      ADA MRQ,I     SUBTRACT LOW BASE PAGE TO FIND SIZE 
      AND =B1777
      STA BSZ 
      CLA 
      LDB MRQ,I     GET BASE PAGE TRACK OFFSET
      RRL 6           IN A
      ADA MTR       ADD TO MAIN TRACK 
      STA BTR 
* 
      ISZ MRQ 
      LDA MRQ,I 
      RAL 
      AND =B776 
      STA MSC       MAIN SECTOR 
      LDA MRQ,I 
      RRR 7 
      AND =B776 
      STA BSC       BASE PAGE SECTOR
* 
      LDA =B20001   READ REQUEST CODE + 'UE' BIT  
      STA MRQ 
      STA BRQ 
      JSB $LOAD     MAKE I/O REQUEST
      JMP READ,I
* 
* 
      SKP 
* 
$LOAD NOP           LOAD/SWAP CALL
      LDA =D-5
      STA RTRY?     ALLOW FIVE RETRIES
      LDB $LDRS 
      ADB =D15
      STB DSTAT     STATUS ADDRESS
      JSB XSIO      DO THE I/O
      JMP $LOAD,I 
* 
* 
XSIO  NOP           SYSTEM I/O REQUESTS 
      LDA =D-2
      STA DONE?     TWO REQUESTS PER LOAD OR SWAP 
      LDA DSTAT,I 
      RAL,CLE,ERA   CLEAR THE 'MR' BIT
      STA DSTAT,I 
$XS1  JSB $XSIO     START LOAD OF MAIN
MLU   NOP 
      DEF COMP      COMPLETION ROUTINE
      NOP           LINKAGE 
MRQ   NOP 
MLO   NOP 
MSZ   NOP 
MTR   NOP 
MSC   NOP 
MPR   NOP 
      NOP           RESERVED
* 
      LDA BSZ       SKIP SECOND REQUEST IF NO LINKS 
      SZA,RSS 
      JMP NULL
* 
$XS2  JSB $XSIO     START LOAD OF BASE PAGE 
BLU   NOP 
      DEF COMP      COMPLETION ROUTINE
      NOP           LINKAGE 
BRQ   NOP 
BLO   NOP 
BSZ   NOP 
BTR   NOP 
BSC   NOP 
BPR   NOP 
      NOP           RESERVED
      JMP XSIO,I
* 
NULL  ISZ DONE? 
      JMP XSIO,I
* 
$LDRS NOP           ID SEGMENT OF OCCUPANT
DSTAT NOP           ADDRESS OF STATUS WORD
DONE? NOP           COMPLETION COUNT
RTRY? NOP           RETRY COUNT 
* 
* 
      SKP 
* 
COMP  EQU *         A REQUEST HAS BEEN COMPLETED OR ABORTED 
      ISZ DONE? 
      JMP $XEQ      FIRST COMPLETION (NOT SURE WHICH) 
      LDA DSTAT,I 
      ISZ $LOAD 
      JMP TLOG      NOT ABORTED, CHECK THE TRANSMISSION LOG 
* 
      LDB MRQ       LOADING OR SWAPPING?
      SLB 
      JMP IO?       LOAD REQUEST
* 
      LDB $LDRS     SWAP REQUEST
      JSB $IDSQ     SET UP POINTERS TO THE ID SEG 
      JSB $DREL     RELEASE THE SWAP AREA 
      LDA DSTAT,I   
      IOR =B100000  SET THE 'MR' BIT
      STA DSTAT,I 
* 
IO?   AND =B77
      CPA =D2 
      JMP DONE      I/O SUSPENDED, WAIT FOR I/O COMPLETION
* 
      LDA DSTAT,I 
      ALF,ALF 
      LDB $LDRS 
      SLA 
      STB $ZZZZ     'OF' BIT SET, ABORT THE PROGRAM 
DONE  CLA 
      STA $LDRS     CLEAR OCCUPANT FLAG 
      JSB $SCHD     SCHEDULE $LOAD WAITERS
      OCT 56
      ISZ $LIST     FLAG FOR DISPATCHER 
      JMP $XEQ
* 
* 
TLOG  IOR =B100000  SET THE 'MR' BIT
      STA DSTAT,I 
      LDA MPR       CHECK MAIN TRANSMISSION LOG 
      XOR MSZ       AGAINST REQUESTED SIZE
      LDB BPR       BASE PAGE TLOG
      CPB BSZ 
      SZA 
      CLA,RSS 
      JMP DONE      TRANSMISSION COMPLETE 
      ISZ RTRY? 
      JMP RTRY      TRY IT AGAIN
      LDB $LDRS     TOO MANY RETRIES, LOAD FAILED 
      STA $LDRS     CLEAR THE LOAD RESIDENT FLAG
      JSB $IDSQ     SET UP POINTERS TO ID SEGMENT 
      LDA =ASW      SWAP FAILURE
      LDB MRQ         IF REQUEST CODE = 2 
      SLB 
      LDA =ALD      LOAD FAILURE IF CODE = 1
      LDB =A
      JSB $ERMG     ABORT THE PROGRAM 
      JMP DONE
* 
* 
RTRY  STA MPR       MAKE IT TOP PRIORITY
      STA BPR 
      JSB XSIO      RESTART THE REQUEST 
      JMP $XEQ
* 
      HED  ABORT CURRENT LOAD 
* 
$LDAB NOP           ABORT CURRENT LOAD OR SWAP
      CCB 
      CPB $LOAD 
      JMP $LDAB,I   ALREADY ABORTED 
      STB $LOAD     SET ABORT FLAG
      JSB $IOCL     CLEAR LOAD OF BASE PAGE 
      DEF BLU 
* 
*                   DO NOT SWITCH ORDER OF CALLS
* 
      JSB $IOCL     CLEAR LOAD OF MAIN
      DEF MLU 
      JMP $LDAB,I 
* 
* 
      HED  DISPATCHER LOAD EXTENSION
* 
$XEQ2 ADB =D27
      LDA B,I 
      SZA,RSS 
      JMP $XEQ1     MEMORY RESIDENT 
      ADB =D-7
      LDA B,I       LOW MAIN ADDRESS
      CPA $FWBG 
      JMP BGLD      BACKGROUND PROGRAM
* 
      LDA $LDRS     REAL TIME PROGRAM 
      SZA 
      JMP $XEQ1     $LOAD NOT AVAILABLE 
* 
LOAD  JSB PREP      SET UP LOAD PARAMETERS
      LDB $TEST 
      ADB =D6 
      LDA B,I       PRIORITY
      LDB $TEST 
      JSB READ      LOAD IT!
      JMP $XEQ1 
* 
* 
BGLD  LDB $BGRS 
      SZB 
      JMP $XEQ3     ALREADY A PROGRAM IN BACKGROUND 
      LDB $LDRS 
      SZB 
      JMP $XEQ1     $LOAD IS NOT AVAILABLE
$LDBG LDB $TEST 
      STB $BGRS     TEST PROGRAM IS NEW BACKGROUND RESIDENT 
      ADB =D27
      LDA B,I       IF A SWAP AREA HAS BEEN ALLOCATED,
      ALF,ALF 
      AND =B377 
      SZA 
      JMP $SWAP         THE PROGRAM MUST BE SWAPPED IN
      ADB =D-7      ADDRESS OF LOW MAIN 
      JMP LOAD
* 
* 
PREP  NOP           SET UP LOAD REQUEST PARAMETERS
      LDA B,I 
      STA MLO       LOW MAIN ADDRESS
      CMA,INA 
      INB 
      ADA B,I 
      STA MSZ       SIZE OF MAIN
* 
      ADB =D2 
      STB MRQ       SAVE POINTER FOR 'READ' 
      LDA B,I 
      AND =B1777    LOW BASE PAGE 
      STA BLO 
* 
      ADB =D3 
      LDA B,I 
      STA MTR       MAIN TRACK
      JMP PREP,I
* 
* 
$$LOA EQU *         STANDARD MODULE 
$.LOA DEC 0         STANDARD MODULE 
      END 
                                                                                                                    