ASMB,R,Q,C
*     NAME:   SWAP
*     SOURCE: 92071-18158 
*     RELOC:  92071-16158 
*     PGMR:   HLC 
* 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  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  92071-16158  REV.2041  800520 
      ENT $DREL,$SWIN,$SWLU,$XEQ3 
      ENT $XEQ4,$$SWA,$.SWA,$EX22 
* 
      EXT $XEQ1,$LDRS,$PR?
      EXT $XS1,$XS2,$LDAB,$BGPR 
      EXT $SWTA,$MATV,$MATA,$SC#
      EXT $LOAD,$DISC,$SC,$MASZ 
      EXT $RQ.2,$EXEX,$ERAB,$STAT 
* 
      SUP 
* 
A     EQU 0 
B     EQU 1 
* 
* 
$EX22 LDB $RQ.2     SET SWAPPING OPTION 
      CLE,ERB 
      SZB 
      JMP SC02      ILLEGAL OPTION
      LDA $STAT,I 
      IOR =B100     ASSUME NON-SWAPPABLE
      SEZ,RSS 
      XOR =B100     OPTION ZERO, SWAPPABLE
      STA $STAT,I   UPDATE 'ML' BIT 
      JMP $EXEX     DONE
* 
SC02  LDB =B2 
      LDA =ASC
      JMP $ERAB     'SC02' ERROR
* 
* 
*                   NO FREE PARTITIONS ARE AVAILABLE
* 
* 
$XEQ4 LDA SWT#      TRY TO ALLOCATE A SWAP AREA 
      CMA,INA,SZA,RSS 
      JMP $XEQ1     NO SWAP AREAS AVAILABLE 
      STA CNT 
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 CNT 
      JMP LP
      JMP $XEQ1     NONE AVAILABLE
* 
* 
FND   EQU *         FIND A SWAPPABLE PARTITION
      STA BBP       BEST BACKGROUND PARTITION TO SWAP 
      STA BRP       BEST REAL-TIME PARTITION TO SWAP
      LDA =B77777 
      STA BBPSZ     BEST (SMALLEST) SIZE SO FAR 
      STA BRPSZ 
* 
* 
      LDA $MATV 
      CMA,INA 
      STA CNT       NUMBER OF PARTITIONS
      LDB $MATA 
LP2   STB TP        PARTITION TABLE POINTER 
      LDA B,I       ID ADDRESS OF OCCUPANT
      SSA,RSS       IF THE PARTITION IS NOT VALID 
      SZA,RSS         OR NOT OCCUPIED,
      JMP BUMP          IT IS NOT LARGE ENOUGH
      INB 
      LDB B,I       SIZE OF PARTITION 
      ADB $XS1+5    (MSZ) SUBTRACT REQUIRED SIZE IN PAGES 
      SSB 
      JMP BUMP      TOO SMALL 
* 
      STA ID
      ADA =D15  
      LDA A,I       OCCUPANT'S STATUS 
      RRR 6 
      SLA 
      JMP BUMP      'ML' (MEMORY LOCK) BIT SET
* 
      RRL 6 
      AND =B77
      CPA =B2       IO SUSPENDED? 
      JMP CN?       YES, CHECK FOR SWAPPABLE CONTROL REQUEST
* 
SWOK  LDB ID        PARTITION OCCUPANT IS SWAPPABLE 
      JSB $PR?      COMPARE PRIORITIES
      JMP BUMP      OCCUPANT TAKES PRIORITY 
* 
* 
      LDB TP        SEE IF THIS IS THE BEST SIZE SO FAR 
      INB 
      LDA B,I 
      STA B         SIZE OF PARTITION 
      SEZ,RSS       '$PR?' RETURNS E=1 IF REAL-TIME OCCUPANT
      JMP BG        BACKGROUND PROGRAM CURRENTLY IN PARTITION 
* 
      CMA,INA 
      ADA BRPSZ     REAL TIME 
      SSA           IS THIS THE BEST FIT SO FAR?
      JMP BUMP      NO
      STB BRPSZ     YES, SAVE THE SIZE
      LDA TP
      STA BRP       SAVE THE PARTITION TABLE POINTER
* 
BUMP  LDB TP        BUMP POINTER TO NEXT PARTITION
      ADB $MASZ 
      ISZ CNT 
      JMP LP2 
* 
      LDA BBP       LAST PARTITION
      SZA,RSS       WAS A BACKGROUND PARTITION FOUND? 
      LDA BRP       NO, HOW ABOUT REAL TIME?
      SZA,RSS 
      JMP $XEQ1     NO SWAPPABLE PARTITIONS AVAILABLE 
      STA TP
* 
EXACT LDB A,I       ID SEGMENT ADDRESS OF OCCUPANT
      STB ID
      ADA =D2 
      LDB A,I       STARTING PAGE OF PARTITION
      STB $XS1+9    (MPA) SAVE IN I/O REQUEST 
* 
* 
      CLA 
      STA $XS2+5    (BSZ) ONE REQUEST ONLY
      STA $XS1+4    (MLO) LOW ADDRESS = 0 
* 
      LDB ID
      STB SWTP,I    SET 'IN USE' FLAG IN SWAP TABLE 
      LDA SWTP
      CMA 
      ADA $SWTA     OFFSET IN TABLE IS SWAP AREA NO.
      CMA,INA       MAKE IT POSITIVE
      STA $XS1+10   (MST) 
      ADB =D27
      ALF,ALF 
      IOR B,I       MERGE SWAP AREA NO. WITH DISC LU
      STA B,I       SAVE IN ID SEGMENT
* 
      LDB =B20002   WRITE REQUEST + 'UE' BIT
      STB $XS1+3    (MRQ) SAVE REQUEST CODE 
* 
      LDB ID
      JSB $SWIN     SET UP THE SIZE AND DISC ADDRESS
* 
      LDB ID
      JSB $LOAD     MAKE I/O REQUEST
      JMP $XEQ1 
* 
* 
BG    CMA,INA 
      ADA BBPSZ     IS THIS THE BEST BACKGROUND PARTITION?
      SSA 
      JMP BUMP      NO
      LDA TP
      CPB $XS2+5    (BSZ) COMPARE TO REQUIRED SIZE IN PAGES 
      JMP EXACT     EXACT FIT, QUIT LOOKING 
      STA BBP       BEST SO FAR 
      STB BBPSZ     BEST SIZE 
      JMP BUMP
* 
* 
CN?   LDA ID        CHECK FOR SWAPPABLE IO REQUEST
      INA 
      LDA A,I       TYPE OF I/O REQUEST 
      AND =B10003   Z-BIT AND TYPE
      CPA =B3 
      JMP SWOK      SWAPPABLE CONTROL REQUEST 
      JMP BUMP      FORGET IT 
* 
* 
* 
* 
* 
* 
$SWIN NOP           SET UP PARAMETERS FOR SWAP
      ADB =D24
      LDA B,I 
      SSA 
      JMP AM        'AM' BIT SET
* 
      LDA $SC#
      CMA,INA 
      STA NCOM      NEG. SIZE OF SYSTEM COMMON
* 
      ADB =D-9
      LDA B,I       STATUS WORD 
      ALF,ELA       SHIFT 'SC' BIT INTO E-REG 
      ADB =D7 
      LDA B,I       CURRENT SEGMENT HIGH ADDRESS
      SEZ 
      ADA NCOM      SUBTRACT SIZE OF SYS COM IF USED
STSZ  STA $XS1+5    (MSZ) 
* 
      LDA $XS1+10   (MST) SWAP AREA NUMBER
      ADA =D-1
      MPY BLK/A     COMPUTE OFFSET IN SWAP FILE 
      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+6    (MTR) 
* 
* 
      LDA $SWLU 
      STA $XS1      (MLU) SAVE LU 
      JMP $SWIN,I 
* 
* 
AM    AND =B76000   NUMBER OF PAGES - 1 
      ADA =B2000
      JMP STSZ      SWAP ENTIRE PARTITION 
* 
* 
* 
CNT   NOP 
NCOM  NOP 
TP    NOP 
BBP   NOP 
BRP   NOP 
BBPSZ NOP 
BRPSZ NOP 
ID    NOP 
* 
      SKP 
* 
$XEQ3 LDA $XS1+3    (MRQ) 
      CPB $LDRS     IS THE TEST PROGRAM IS BEING SWAPPED? 
      SLA 
      JMP $XEQ1     NOT SWAPPING, NOTHING CAN BE DONE NOW 
      ADB =D20
      LDA B,I 
      SZA,RSS 
      JMP $XEQ1     FULL TIME QUANTUM USED, FINISH SWAP 
      ADB =D-14 
      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 
* 
* 
* 
* 
      SKP 
* 
$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
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 
* 
* 
$$SWA EQU *         STANDARD MODULE 
$.SWA DEC 0         STANDARD MODULE 
      END 
                                                                                                                                                                            