Google
 

Trailing-Edge - PDP-10 Archives - BB-Z759A-SM - cobol-source/covrly.mac
There are 7 other files named covrly.mac in the archive. Click here to see a list.
; UPD ID= 1259 on 6/7/83 at 12:41 PM by HOFFMAN                         
TITLE	COVRLY FOR COBOTS		
SUBTTL	OVERLAY ROUTINE		AL BLACKINGTON/CAM

	SEARCH COPYRT
	SALL

;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, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION

	SEARCH	LBLPRM
IFN	TOPS20,<	SEARCH	MONSYM, MACSYM>
IFE	TOPS20,<	SEARCH	MACTEN>

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

	HISEG
	.COPYRIGHT		;Put standard 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 ON TOPS-10
; OR ON OVRJFN JFN ON TOPS-20
; 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
IFN TOPS20,<
EXTERN	OVRJFN	;JFN OF OVERLAY FILE
>

ENTRY OVLAY.

IFN TOPS20,<
DEFINE	OUTSTR	(TEXT)<
	HRROI	T1,TEXT
	PSOUT%
>
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:
IFE TOPS20,<
	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
>
IFN TOPS20,<
	MOVE	T1,OVRJFN	;JFN
	MOVEI	T2,-1(BL)	;GET BLOCK NUMBER IN 1
	LSH	T2,7		;CONVERT TO WORDS
	SFPTR%			;SET ON IT
	  HALT
	PUSH	PP,T3		;SAVE WD
>
	PUSHJ	PP,GETOVR	;GET FIRST DATA BLOCK
IFN TOPS20,<
	POP	PP,T3
>
	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:
IFE TOPS20,<
	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.
>

IFN TOPS20,<
	MOVE	T1,OVRJFN	;JFN
	MOVE	T2,OVRBF.	;36 BIT BYTE POINTER
	MOVNI	T3,400		;2 TOPS-10 BLOCKS AT A TIME
	MOVEM	T2,OVRBF.+1	;RESET POINTER
	MOVMM	T3,OVRBF.+2	;AND COUNT
	SIN%
	  ERJMP	[MOVEI	T1,.FHSLF
		GETER%
		  TRN
		HRRZ	T2,T2		;Error only
		MOVE	T1,OVRJFN
		CAIE	T2,IOX4		;End of File?
		JRST	SINERR		;No
		ADDB	T3,OVRBF.+2	;Adjust count
		JUMPE	T3,ERROR1	;No data read at all
		JRST	.+1]
	POPJ	PP,

SINERR:	PUSH	P,T1
	MOVEI	T1,.PRIOU
	HRLOI	T2,.FHSLF
	SETZ	T3,
	ERSTR%
	  TRN
	  TRN
	POP	PP,T2
	SETZB	T3,T4
	JFNS%
	  ERJMP	.+1
	HALT
>

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
TA=1			;TEMPORARY
TB=2			;TEMPORARY
WD=3			;WORD # FROM FINE TABLE, OR NEW INPUT WORD
LC=4			;CONTAINS IN RH, THE NEXT LOCATION FOR DATA
			;         IN LH, NUMBER OF WORDS TO GO (NEGATIVE)
BL=5			;BLOCK # FROM FINE TABLE
CT=6			;COUNTER
RW=7			;TO HOLD RELOCATION BITS
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

IFN TOPS20,<
T1==TA
T2==TB
T3==WD
T4==T3+1
>

IFE TOPS20,<
;INPUT DEVICE

OVR=1		;[342]

;MONITOR INTERFACE

$ERAS=17B21		;ERROR FLAGS FOR I/O
>

	END