Google
 

Trailing-Edge - PDP-10 Archives - bb-lw55a-bm - galaxy-sources/glxini.mac
There are 31 other files named glxini.mac in the archive. Click here to see a list.
	TITLE GLXINI - Bootstrap code for GALAXY runtime system
	SUBTTL	Preliminaries

;	COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1975, 1988.
;	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  AND  WITH  THE
;	INCLUSION OF THE ABOVE  COPYRIGHT NOTICE.  THIS  SOFTWARE OR ANY  OTHER
;	COPIES THEREOF MAY NOT BE PROVIDED  OR OTHERWISE MADE AVAILABLE TO  ANY
;	OTHER PERSON.  NO  TITLE TO  AND OWNERSHIP  OF THE  SOFTWARE IS  HEREBY
;	TRANSFERRED.
;
;	THE INFORMATION IN THIS  SOFTWARE IS SUBJECT  TO CHANGE WITHOUT  NOTICE
;	AND SHOULD  NOT  BE CONSTRUED  AS  A COMMITMENT  BY  DIGITAL  EQUIPMENT
;	CORPORATION.
;
;	DIGITAL ASSUMES NO  RESPONSIBILITY FOR  THE USE OR  RELIABILITY OF  ITS
;	SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.


;This module is loaded in the low segment of any program
;	using the GALAXY library code, GLXLIB.

	SEARCH	GLXMAC			;SEARCH GLXMAC FOR SYMBOL DEFS
	PROLOG(GLXINI,INI)

	INIMAN==:0			;Maintenance edit number
	INIDEV==:36			;Development edit number
	VERSIN (INI)			;Generate edit number

;Only assemble the rest if we are building a rel library, otherwise
;the rest is meaningless.

IFE GLXPURE,<
	Subttl	Table of Contents

;		     Table of Contents for GLXINI
;
;				  Section		      Page
;
;
;    1. Revision History . . . . . . . . . . . . . . . . . . .   3
;    2. User referenced entry vector . . . . . . . . . . . . .   4
;    3. I%INIT - Initialize the runtime system . . . . . . . .   5
;    4. ACQLIB - Acquire the run-time system . . . . . . . . .   6
;    5. CHKLIB - Routine to test if library is in place  . . .   7
;    6. TRYSEG - Routine to fetch runtime system . . . . . . .   8
SUBTTL	Revision History

COMMENT \

21			7/13/81
	Do not initialize the entry vector if already initialized.

*****  Release 4.2 -- begin maintenance edits  *****

*****  Release 5.0 -- begin development edits  *****

25	5.1002		28-Dec-82
	Move to new development area.  Clean up edit organization.  Update TOC.

*****	Release 5.0 -- begin maintenance edits	*****
30	Increment maintenance edit level for version 5 of GALAXY.

*****	Release 6.0 -- begin development edits	*****

35	6.1037		26-Oct-87
	Move sources from G5: to G6:

36	6.1225		8-Mar-88
	Update copyright notice.

\   ;End of revision history
SUBTTL	User referenced entry vector


; All references to the OTS by the user are through ENTVEC table
;
	ZZ==0				;;INITIALIZE COUNTER
DEFINE	CDO	(X),<			;;MACRO TO DEFINE ENTRY POINTS
	IFNB <X>,<X::>			;;DEFINE GLOBAL IF NOT NULL
	JRST	@.+1			;;DISPATCH
	EXP	ZZ			;;STORE INDEX INTO GLXOTS
	ZZ==ZZ+1			;;POINT TO NEXT ENTRY
>					;;END OF CDO MACRO

ENTVEC::LIBVEC				;DEFINE ALL ENTRY POINTS
	EXP	-1			;TERMINATE VECTOR

WORK:	BLOCK	20			;Get space for working
ARG:	BLOCK	6			;Get space for argument block...
					;Note: this space can also be used as
					;spillover from WORK

; Set up correct places to search for the library depending on the system.

TOPS10<
DSKDEV:	SIXBIT/DSK/
SYSDEV:	SIXBIT/SYS/
> ; End of TOPS10

TOPS20<
DSKDEV:	[ASCIZ/DSK:/]
SYSDEV:	[ASCIZ/SYS:/]
> ; End of TOPS20
SUBTTL I%INIT - Initialize the runtime system


;Entry point for segment and module initialization

;CALL IS:	S1/ Length of IB (Runtime Initialization Block)
;		S2/ Address of IB

	ENTRY	I%INIT

I%INIT:	PUSH	P,S1			;SAVE INPUT ARGS AWAY
	PUSH	P,S2			;
	PUSHJ	P,CHKLIB		;SEE IF THE LIBRARY IS ALREADY THERE
	JUMPT	INIT.2			;IT IS - SKIP LOTS OF STUFF
	PUSHJ	P,ACQLIB		;ACQUIRE THE LIBRARY SYSTEM
	SKIPE	ENTVEC+1		;Is the entry vector initialized?
	JRST	INIT.2			;Yes, don't do it again.
	SETZM	S2			;Set up index

INIT.1:	ADDM	S1,ENTVEC+1(S2)		;ADJUST INDEX INTO GLXOTS
	ADDI	S2,2			;ACCOUNT FOR TWO WORD ENTRIES
	SKIPL	ENTVEC(S2)		;END OF VECTOR ?
	JRST	INIT.1			;NO - LOOP

INIT.2:	POP	P,S2			;RESTORE USER'S S2
	POP	P,S1			;RESTORE USER'S S1

SEGIN::	HRLI	S1,%%.GLX		;LOAD VERSION
	PUSHJ	P,ENTVEC		;CONTINUE INITIALIZATION
	$RETT				;RETURN TO CALLER
SUBTTL	ACQLIB - Acquire the run-time system


; Here if the OTS is not in place.  If this is a debugging world,
; look first in DSK:.  If that fails, or if we are not debugging,
; look in SYS:.  If not found, give an error message and quit.
; If found, return the address of the dispatch table for the library
; in S1.
;
; Call:		No arguments
;
; Return:	S1 / Address of OTS dispatch table (returned from TRYSEG)
;
ACQLIB:	SKIPN	DEBUGW			;Debugging ?
	JRST	ACQL.1			;Nope - skip checking on DSK
	MOVE	S1,DSKDEV		;Try generic DSK
	PUSHJ	P,TRYSEG		;Try it again
	JUMPT	ACQL.2			;If sucessful - finish up

ACQL.1:	MOVE	S1,SYSDEV		;Try SYS
	PUSHJ	P,TRYSEG		;One more time
	JUMPT	ACQL.2			;If sucessful - finish up

TOPS10<
	OUTSTR	[ASCIZ	|? GLXINI - Unable to obtain run-time system|]
	MONRT.				;Stop
> ; End of TOPS10

TOPS20<
	HRROI	S1,[ASCIZ \? GLXINI - Unable to obtain run-time system
\]
	PSOUT
	HALTF
> ; End of TOPS20

	JRST	.-1			;We really don't want to continue

ACQL.2:	POPJ	P,			;Return
SUBTTL CHKLIB - Routine to test if library is in place

;CHKLIB	looks for the first page of the OTS library. If this page
;	is there, it is assumed that the library was loaded with the
;	calling program, or has been pre-merged.

;CALL IS:	No arguments
;
;TRUE RETURN:	Library is in place
;
;FALSE RETURN:	Library is not there

CHKLIB:

TOPS10 <
	HRRZ	S1,.JBHRL		;Get highest addr in high seg
	SKIPN	S1			;Is there a segment? Yes, skip
	TDZA	TF,TF			;LOAD "FALSE" INTO TF
	MOVX	TF,TRUE			;ELSE ITS THERE
	POPJ	P,			;RETURN IN EITHER CASE
> ;END TOPS10 CONDITIONAL

TOPS20 <
	MOVE	S1,.JBHSO		;FIRST PAGE OF LIBRARY
	JUMPE	S1,[MOVX TF,FALSE	;If zero, then not set up
		    JRST CHKL.1]	;Return false
	HRLI	S1,.FHSLF		;FOR THIS PROCESS,
	RPACS				;READ THE ACCESS BITS
	  ERJMP .+2			;IF FAILS, SAY OTS NOT THERE
	TXNN	S2,PA%PEX		;CHECK FOR PAGE'S EXISTENCE
	TDZA	TF,TF			;IF PAGES DON'T EXIST, RETURN
	MOVX	TF,TRUE			;ELSE TRUE,INDICATING OTS IN PLACE
CHKL.1:	POPJ	P,			;RETURN
> ;END TOPS20 CONDITIONAL
SUBTTL TRYSEG - Routine to fetch runtime system

;CALL IS:	S1/ Device to get runtime system from in SIXBIT (TOPS10)
;		    Address of device string (TOPS20)
;
;TRUE RETURN:	Segment is in place
;  with		S1/ Address of dispatch table
;FALSE RETURN:	Segment could not be obtained

TOPS10 <

	JS.XO==2000			;EXECUTE-ONLY BIT IN JOB STATUS WORD

TRYSEG:	MOVEM	S1,ARG+0		;STORE DEVICE NAME
	MOVE	S1,[0,,WORK+0]		;BLT THE ACS AWAY
	BLT	S1,WORK+17		;STORE THEM
	MOVX	S1,OTSNAM		;NAME OF OTS
	MOVEM	S1,ARG+1		;STORE THE FILE NAME
	HRROI	S2,.GTSTS		;GET JOB STATUS
	GETTAB	S2,			;FROM THE MONITOR
	  SETZ	S2,			;CAN'T - ASSUME NOT EXECUTE ONLY
	TRNN	S2,JS.XO		;EXECUTE ONLY?
	  TDZA	S2,S2			;NO
	MOVX	S2,UU.PHY		;YES - SET FOR PHYSICAL ONLY GETSEG
	TXO	S2,<GETSEG S1,>		;FORM INSTRUCTION
	MOVEI	S1,ARG			;GET LOCATION OF BLOCK
	XCT	S2			;ATTACH HIGH SEGMENT
	  TDZA	TF,TF			;IF FAILS, FAKE A FALSE
	MOVX	TF,TRUE			;ELSE LOAD A "TRUE"
	MOVE	S1,[WORK+S2,,S2]	;RESTORE SOME ACS
	BLT	S1,17			;
	SKIPN	TF,			;True?
	JRST	TRYS.1			;No, go return

	MOVE	S1,[XWD -2,.GTUPM]	;Get UPM word for our high seg.
	GETTAB	S1,			;Ask the monitor
	  HRLI	S1,.JBHGH		;Monitor won't give it, assume 400000
	HLRZS	S1			;Get high seg start adr
	ADDI	S1,.JBHDA		;Point past JOBDAT

TRYS.1:	POPJ	P,			;RETURN

> ;END TOPS10 CONDITIONAL
TOPS20 <

TRYSEG:	MOVE	TF,S1			;Save device string a second
	MOVX	S1,.FHSLF		;For self
	GEVEC				;Get entry vector word
	PUSH	P,S2			;And save it
	MOVE	S1,TF			;Restore s1

	HRLI	S1,(POINT 7,0)		;Make the address a byte pointer
	MOVE	S2,[POINT 7,WORK]	;Generate a pointer to destination for
					;  string
TRYS.1:	ILDB	TF,S1			;Get a byte of the device string
	JUMPE	TF,TRYS.2		;Done?
	IDPB	TF,S2			;No, save the byte
	JRST	TRYS.1			;Go get another

TRYS.2:	MOVE	S1,[POINT 7,OTSNAM]	;Get the name of the OTS

TRYS.3:	ILDB	TF,S1			;Get a byte of the OTS name
	IDPB	TF,S2			;Save the byte
	JUMPN	TF,TRYS.3		;Get till done

	MOVX	S1,GJ%SHT+GJ%OLD	;SHORT GTJFN, OLD FILE
	MOVE	S2,[POINT 7,WORK]	;Get the pointer to the beginning of
					;  the string
	GTJFN				;TRY TO GET A HANDLE ON THE FILE
	  JRST	TRYS.4			;FAKE A FALSE RETURN
	TXO	S1,GT%ADR		;SET BIT FOR ADDRESS SELECTION
	HRLI	S1,.FHSLF		;FOR MYSELF
	MOVE	S2,[1,,760]		;ALL PAGES FROM 1 TO 760
	GET				;GET THE SEGMENT
	  ERJMP	TRYS.4			;IF GET FAILS, RETURN FALSE

	MOVX	S1,.FHSLF		;For self
	GEVEC				;Get entry vector word for OTS
	HRRZS	S2,S2			;Get only the address
	MOVE	TF,S2			;Save it
	ADR2PG	S2			;Make a page number
	MOVEM	S2,.JBHSO		;Save it for DDT and CHKLIB
	HLLOM	S2,.JBHRL##		;Convince DDT to use the symbols
	POP	P,S2			;Restore entry vector word
	SEVEC				;Set it back
	MOVE	S1,TF			;Get address of dispatch vector
	MOVX	TF,TRUE			;We are ok
	JRST	TRYS.5			;go to return

TRYS.4:	MOVX	TF,FALSE		;HERE FOR FALSE RETURN
	POP	P,S2			;Restore stack
TRYS.5:	POPJ	P,			;AND RETURN
> ;END TOPS20 CONDITIONAL
INI%L:
>  ;End of IFE GLXPURE
	END