ASMB,R,Q,C
*     NAME:   SWAP
*     SOURCE: 92070-18158 
*     RELOC:  92070-16158 
*     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 SWAP,0  92070-16158  REV.1941  790807 
      ENT $DREL,$SWAP,$SWLU,$XEQ3 
      ENT $$SWA,$.SWA 
* 
      EXT $XEQ1,$TEST,$LDRS,$LDBG 
      EXT $XS1,$XS2,$FWBG,$LDAB 
      EXT $BGRS,$SWTA,$BGBP,$ROM
      EXT $LOAD,$DISC,$SC 
* 
      SUP 
* 
A     EQU 0 
B     EQU 1 
* 
* 
$XEQ3 CPB $TEST 
      JMP SELF      THE BACKGROUND PROGRAM IS THE TEST PROGRAM
      ADB =D15
      STB TEMP
      LDA B,I 
      AND =B77
      CPA =B2 
      JMP CN?       I/O SUSPENDED, CHECK FOR CONTROL REQUEST
      CPA =B60
      JMP PRIO?     SCHEDULED, COMPARE PRIORITIES 
LDBZ? LDA $LDRS 
      SZA 
      JMP LDAB?     THE RESIDENT IS BEING LOADED OR SWAPPED 
      LDB $BGRS 
      ADB =D27
      STB DISC
      CPA B,I 
      JMP ALC       VIRGIN COPY NOT AVAILABLE ON DISC 
      ADB =D-19 
      CPA B,I       IF THE PRIMARY ENTRY POINT IS ZERO, 
      JMP OVRLA       THEN NOT DISPATCHED SINCE LAST LOAD 
      LDB DISC,I
      RRL 8         PUT SWAP AREA NO. IN A-REG
      SZA 
      JMP OVRLA     NOT DISPATCHED SINCE SWAP OUT 
* 
ALC   LDA SWT#      TRY TO ALLOCATE A SWAP AREA 
      CMA,INA,SZA,RSS 
      JMP $XEQ1     NO SWAP AREAS AVAILABLE 
      STA TEMP
LP    LDB SWTP      GET CURRENT INDEX 
      INB 
      CPB SWEND 
      LDB $SWTA     END OF VALID TABLE, RESET TO START
      STB SWTP
      LDA B,I 
      SZA,RSS 
      JMP FND       THIS ONE IS AVAILABLE 
      ISZ TEMP
      JMP LP
      JMP $XEQ1     NONE AVAILABLE
* 
* 
SELF  LDA $XS1+4
      SLA 
      JMP $XEQ1     NOT SWAPPING, NOTHING CAN BE DONE NOW 
      ADB =D6 
      LDA B,I       COMPARE PRIORITY OF TEST PROGRAM
      LDB $SC         TO HIGHEST PRIORITY SCHEDULED PROGRAM 
      ADB =D6 
      CPA B,I 
      JSB $LDAB     ABORT SWAP
      JMP $XEQ1 
* 
* 
CN?   ADB =D-14 
      LDA B,I       TYPE OF I/O REQUEST 
      AND =B10003   Z-BIT AND TYPE
      CPA =B3 
      JMP LDBZ?     SWAPPABLE CONTROL REQUEST 
      JMP $XEQ1     FORGET IT 
* 
* 
PRIO? ADB =D-9
      LDA B,I       PRIORITY OF RESIDENT
      CMA,INA 
      LDB $TEST 
      ADB =D6 
      ADA B,I       SUBTRACT FROM TEST PRIORITY 
      SSA,RSS 
      JMP $XEQ1     RESIDENT TAKES PRIORITY 
      JMP LDBZ? 
* 
* 
LDAB? LDB $XS1+4    GET REQUEST CODE
      SLB,RSS 
      JMP $XEQ1     DO NOT ABORT SWAP OUT 
      LDB $XS1+5
      CPB $FWBG 
      JSB $LDAB     ABORT LOAD IF MAIN BACKGROUND PROGRAM 
      JMP $XEQ1       BUT NOT IF SEGMENT OR REAL-TIME PROGRAM 
* 
* 
OVRLA LDA TEMP,I
      RAL,CLE,ERA   CLEAR 'MR' BIT
      STA TEMP,I
      JMP $LDBG     OVERLAY CURRENT RESIDENT
* 
* 
FND   LDA $BGRS 
      STA B,I       SET 'IN USE' FLAG IN TABLE
      CMB 
      ADB $SWTA     OFFSET IN TABLE IS SWAP AREA NO.
      CMB,INB       MAKE IT POSITIVE
      LDA DISC,I
      ALF,ALF 
      RRR 8         MERGE SWAP AREA NO. WITH DISC LU
      STA DISC,I
      ALF,ALF 
      AND =B377 
      LDB =B20002   WRITE REQUEST + 'UE' BIT
RQCD  STB $XS1+4    SAVE REQUEST CODE 
      STB $XS2+4      TWICE 
      ADA =D-1
      MPY BLK/A     COMPUTE OFFSET IN SWAP FILE 
      STA TEMP
      CLE 
      LDB MBLOK+1   ADD TO STARTING BLOCK OF FILE 
      ADA MBLOK 
      SEZ 
      INB 
      DIV BLK/T     DIVIDE INTO TRACKS AND BLOCKS 
      RBL,CLE       CONVERT BLOCKS TO SECTORS 
      DST $XS1+7
* 
* 
      DLD BBLOK     ADD OFFSET TO FIRST BASE PAGE BLOCK 
      ADA TEMP
      SEZ 
      INB 
      DIV BLK/T     DIVIDE INTO TRACKS AND BLOCKS 
      RBL           CONVERT BLOCKS TO SECTORS 
      DST $XS2+7
* 
* 
      LDA $SWLU 
      STA $XS1+1    SAVE LU 
      STA $XS2+1      TWICE 
      LDA $BGBP 
      STA $XS2+5    START OF BASE PAGE
      LDA SZBP
      STA $XS2+6    SIZE OF BASE PAGE 
      LDA $FWBG 
      STA $XS1+5    STARTING ADDRESS FOR MAIN 
* 
      LDB $BGRS 
      STB $LDRS     FLAG AS OCCUPYING $LOAD 
      ADB =D22
      LDB B,I       CURRENT HIGH
      SSB 
      LDB $ROM      ALL MEMORY BIT SET
      CMA,INA 
      ADA B         SUBTRACT LOW
      STA $XS1+6    SIZE OF MAIN
* 
      LDB $TEST     USE PRIORITY OF TEST PROGRAM
      ADB =D6 
      LDA B,I 
      STA $XS1+9
      STA $XS2+9
      JSB $LOAD     START SWAP
      JMP $XEQ1 
* 
* 
TEMP  NOP 
DISC  NOP 
* 
* 
$SWAP LDB =B20001   READ REQUEST + 'UE' BIT 
      JMP RQCD      
* 
* 
$DREL NOP           RELEASE SWAP AREA 
      LDA $DISC,I 
      ALF,ALF 
      AND =B377     SWAP AREA NO. 
      SZA,RSS 
      JMP $DREL,I   NONE
      ADA =D-1
      ADA $SWTA 
      CLB           CLEAR 'IN USE' FLAG 
      STB A,I 
      LDA $DISC,I 
      AND =B377     CLEAR SWAP AREA NO. 
      STA $DISC,I 
      JMP $DREL,I 
* 
* 
* 
$SWLU NOP           LU OF SWAPPING DISC 
SWTR  NOP           STARTING TRACK OF SWAP FILE 
SWSEC NOP           STARTING SECTOR OF SWAP FILE
SWT#  NOP           NUMBER OF VALID SWAP AREAS
SWTP  NOP           CURRENT SWAP TABLE POINTER
SWEND NOP           ADDRESS OF LAST VALID ENTRY +1
SZBP  NOP           SIZE OF BASE PAGE IN WORDS
BLK/T NOP           NO. OF 128 WORD BLOCKS PER TRACK
BLK/A NOP           NO. OF BLOCKS PER SWAP AREA 
MBLOK OCT 0,0       STARTING BLOCK FOR MAIN 
BBLOK OCT 0,0       STARTING BLOCK FOR BASE PAGE
* 
* 
$$SWA EQU *         STANDARD MODULE 
$.SWA DEC 0         STANDARD MODULE 
      END 
                                                                                                                                                                                          