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