Google
 

Trailing-Edge - PDP-10 Archives - BB-H506E-SM - cobol/source/covrly.mac
There are 7 other files named covrly.mac in the archive. Click here to see a list.
; UPD ID= 639 on 12/14/77 at 5:04 PM
TITLE	COVRLY FOR LIBOL V12C
SUBTTL	OVERLAY ROUTINE		AL BLACKINGTON/CAM



	SEARCH	COPYRT
	SALL

;COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1974, 1985
;ALL RIGHTS RESERVED.
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE.

; EDIT 342	USE CHANNEL 0 AS LAST RESORT, SO OVERLAY ON 1.

	HISEG

	.COPYRIGHT		;Put COPYRIGHT statement in .REL file.

;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 <ADDRESS OF IMPURE BASE>,<ADDRESS OF "ALTER" TABLE>
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