; UPD ID= 639 on 12/14/77 at 5:04 PM TITLE COVRLY FOR LIBOL SUBTTL OVERLAY ROUTINE AL BLACKINGTON/CAM ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;COPYRIGHT (C) 1974, 1981 BY DIGITAL EQUIPMENT CORPORATION ; EDIT 342 USE CHANNEL 0 AS LAST RESORT, SO OVERLAY ON 1. HISEG ;THIS ROUTINE IS CALLED BY A PUSHJ PP,OVLAY. ;IT ASSUMES THAT A FILE HAS BEEN INITIALIZED ON CHANNEL 1 ; CONTAINING THE FOLLOWING DATA: ; THE FIRST TWO BLOCKS CONTAIN FINE-TABLE INFO FOR ;THE SEGMENTS. BLOCK 1 AND THE FIRST 72 WORDS OF BLOCK 2 ;CONTAIN 2-WORD ENTRIES, ONE FOR EACH SEGMENT (0-99): ; WORD1, BITS 0-28 - RELATIVE BLOCK # FOR SEGMENT. ; BITS 29-35 - RELATIVE WORD # WITHIN BLOCK FOR ; FIRST WORD OF SEGMENT. ; WORD2, BITS 18-35 - SIZE OF THE SEGMENT (NEGATIVE) ;THE NEXT 50 WORDS OF BLOCK 2 CONTAIN "ALTER" INFORMATION ;FOR SEGMENTS 50-99: ; BITS 0-17 - LOCATION (RELATIVE TO BEGINNING OF ; NON-RESIDENT SEGMENT) OF A LIST OF ; ADDRESSES USED TO PRESET "ALTER" TABLE. ; BITS 18-35 - SIZE OF "ALTER" TABLE FOR THIS SEGMENT ; ;THE DATA IS GROUPED IN BLOCKS OF 19 WORDS. THE FIRST ; WORD CONTAINS RELOCATION INFO FOR THE NEXT 18 ; DATA WORDS, IN 2-BIT BYTES: ; BIT 1 - RELOCATE LH ; 2 - RELOCATE RH ;THE FOLLOWING LOCATIONS ARE USED BY THIS ROUTINE: EXTERNAL SEGWD. ;LH IS ADDRESS OF FIRST WORD IN RESIDENT ;AREA, RH IS ADDRESS OF FIRST WORD IN ;OVERLAY AREA. EXTERNAL ALTER. ;XWD
,
EXTERNAL SEGNO. ;SEGMENT NUMBER OF SEGMENT CURRENTLY IN CORE EXTERNAL AINFO. ;CONTAINS INFO FOR THIS SEGMENT TAKEN ;FROM FINE-TABLE EXTERNAL OVRBF. ;3-WORD BUFFER HEADER USED BY OVERLAY FILE EXTERNAL OVRIX. ;POINTER TO THE INDEX TABLE, SET UP BY "RESET" EXTERNAL KILL. ;ROUTINE WHICH TERMINATES RUN ON ERROR ;CONDITION ENTRY OVLAY. OVLAY.: MOVS TA,0(PA) ;SET RETURN ADDRESS HRRM TA,(PP) LDB TA,CURSEG ;CURRENT SEGMENT AND OVERLAY SEGMENT THE SAME? LDB TB,OVRSEG CAMN TA,TB POPJ PP, ;YES JUMPE TB,CPOPJ ;NO--IS NEXT SEGMENT RESIDENT? CAMN TB,SEGNO. ;CURRENT SEGMENT? JRST LOADED ;YES--NO I/O REQUIRED ;GET INFORMATION FROM INDEX TABLE OVLY.9: MOVEM TB,SEGNO. ;RESET CURRENT SEGMENT NUMBER LSH TB,1 ;MULTIPLY SEGMENT NUMBER BY 2 ADD TB,OVRIX. ;ADD IN BASE OF INDEX LDB WD,[POINT 7,0(TB),35] ;PICK UP RELATIVE WORD# LDB BL,[POINT 29,0(TB),28] ;PICK UP RELATIVE BLOCK# MOVS LC,1(TB) ;PICK UP SEGMENT SIZE JUMPGE LC,NOSEGM ;IF EMPTY--TROUBLE MOVE TB,SEGNO. ;SEGMENT > 49? CAIG TB,^D49 JRST LOADIT ;NO--DO NOT NEED MORE INFO ADD TB,OVRIX. ;ADD IN BASE MOVE TB,^D200-^D50(TB) MOVEM TB,AINFO. ;LOAD THE SEGMENT LOADIT: SETSTS OVR,14 ;CLEAR "SYNCHRONOUS" BIT USETI OVR,(BL) ;SET UP BLOCK # FOR READ WAIT OVR, ;WAIT FOR ALL I/O TO CEASE MOVE TA,OVRBF. ;IF THERE IS MOVE TA,(TA) ; SOMETHING IN SKIPGE (TA) ; NEXT BUFFER ALREADY, INPUT OVR, ; SKIP OVER IT PUSHJ PP,GETOVR ;GET FIRST DATA BLOCK ADDM WD,OVRBF.+1 ;START AT CORRECT WORD SUBI WD,1 MOVNS WD ADDM WD,OVRBF.+2 HRR LC,SEGWD. HLRZ PR,SEGWD. ;GET PURE RELOCATOR HLRZ IR,ALTER. ;GET IMPURE RELOCATOR ;LOAD AN 18-WORD BLOCK BLOKIN: MOVEI CT,^D18 ;SET COUNT PUSHJ PP,GETWRD ;PICK UP RELOCATION MOVE RW,WD WORDIN: PUSHJ PP,GETWRD ;PICK UP A DATA WORD JUMPGE RW,WORDI1 ;DOES LEFT-HALF NEED RELOCATION? TLZE WD,(1B0) ;BY PURE BASE? SKIPA TA,PR ;YES MOVEI TA,(IR) ;NO MOVSI TA,(TA) ;TO LEFT HALF ADD WD,TA ;RELOCATE LEFT HALF WORDI1: TLNN RW,1B19 ;IS RIGHT HALF RELOCATABLE? JRST WORDI2 ;NO TRZE WD,1B18 ;BY PURE BASE? SKIPA TA,PR ;YES MOVEI TA,(IR) ;NO ADDI WD,(TA) ;RELOCATE RIGHT HALF WORDI2: MOVEM WD,(LC) ;STORE IT LSH RW,2 AOBJP LC,NEWSEG ;JUMP WHEN DONE SOJG CT,WORDIN ;LOOP JRST BLOKIN ;SEGMENT IS IN CORE NEWSEG: PUSHJ PP, @SNRBP.## ;GO SEE IF WE HAVE TO SET ANY BREAK POINTS. LOADED: MOVE TA,SEGNO. ;SEGMENT # > 49? CAIG TA,^D49 POPJ PP, ;NO--EXIT ;RESET THE ALTER TABLE MOVE TA,ALTER. ;PICK UP ADDRESS OF ALTER TABLE HLLZ TB,AINFO. ;PICK UP RELOCATION LOC OF RESET INFO ADD TA,TB ;ADD IN LOC OF NON-RESIDENT HRRZ TB,AINFO. ;SET TB TO # OF WORDS JUMPE TB,CPOPJ ;IF NONE--FORGET IT ADDI TB,(TA) ;RELOCATE TB BLT TA,-1(TB) ;MOVE INFO CPOPJ: POPJ PP, ;RETURN ;GET A DATA WORD GETWRD: SOSG OVRBF.+2 PUSHJ PP,GETOVR ILDB WD,OVRBF.+1 POPJ PP, ;GET A BUFFER FULL GETOVR: IN OVR, POPJ PP, GETSTS OVR,ER ;ERROR--GET STATUS TRNN ER,$ERAS ;END--FILE? JRST ERROR1 ;YES OUTSTR [ASCIZ "Read error on overlay device"] JRST KILL. ERROR1: OUTSTR [ASCIZ "End-of-file on overlay device"] ERROR2: OUTSTR [ASCIZ " -- compiler error"] JRST KILL. ;EMPTY SEGMENT (COUNT WAS NOT NEGATIVE) NOSEGM: OUTSTR [ASCIZ "No segment to load"] JRST ERROR2 ;BYTE POINTERS TO SEGMENT NUMBERS IN PARAMETERS CURSEG: POINT 7,0(PA),26 ;CURRENT SEGMENT OVRSEG: POINT 7,0(PA),35 ;DESIRED SEGMENT ;ACCUMULATORS LC=1 ;CONTAINS IN RH, THE NEXT LOCATION FOR DATA ; IN LH, NUMBER OF WORDS TO GO (NEGATIVE) WD=2 ;WORD # FROM FINE TABLE, OR NEW INPUT WORD BL=3 ;BLOCK # FROM FINE TABLE CT=4 ;COUNTER RW=5 ;TO HOLD RELOCATION BITS TA=6 ;TEMPORARY TB=7 ;TEMPORARY ER=10 ;ERROR BITS FOR INPUT FILE IR=13 ;IMPURE RELOCATION PR=14 ;RESIDENT RELOCATION PA=16 ;SEGMENT NUMBER IN RH PP=17 ;PUSH-DOWN POINTER ;INPUT DEVICE OVR=1 ;[342] ;MONITOR INTERFACE $ERAS=17B21 ;ERROR FLAGS FOR I/O END