Google
 

Trailing-Edge - PDP-10 Archives - BB-D480C-SB_1981 - forini.mac
There are 13 other files named forini.mac in the archive. Click here to see a list.
	SEARCH FORPRM
	TITLE	FORINI	GETSEG FOROTS, 6(2033)

;COPYRIGHT (C) 1981  BY  DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;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 WHICH IS NOT SUPPLIED BY DIGITAL.

COMMENT \

***** Begin Revision History *****

BEGIN V6

1262	DAW	 9-Feb-81
	Allow FORINI to run in a non-zero section. (Assumes
	that all code is in the same section).

1530	JLC	10-Jul-81
	FOROTS becomes FOROT6.

1623	DAW	21-Aug-81
	Entry point RESET$ to test extended addressing in FOROTS.

2005	JLC	15-Oct-81
	Added REENTER code. Make DDT-20 understand symbol tables
	at other than 400000.

2007	JLC	16-Oct-81
	Fixed temp stack to be larger for reenter code.

2033	DAW	19-Nov-81
	Fixed problems in REENTER code.

***** End Revision History *****

\

	ENTRY	RESET.
	TWOSEG	400000
	FSRCH

IF20,	ENTRY	RESET$		;Map section 0 and 1 together
	EXTERN	FOROT%

;RESET. WILL GETSEG FOROTS IF IT WAS NOT LOADED WITH THE PROGRAM.
;THE SYMBOL FOROT% IS USED TO DECIDE IF FOROTS HAS BEEN LOADED.
;IF FOROTS COMES FROM FOROTS.REL (OR FORLIB.REL), FOROT% IS
;1B0+DISPATCH VECTOR ADDRESS.  IF LINK WANTS FOROTS TO BE LOADED
;AT RUNTIME, IT DEFINES FOROT%=400010.
;
;CALL:
;	JSP	16,RESET.
;	 0			;ARG, IGNORED
;
;RETURNS WITH FOROTS PRESENT AND INITIALIZED.  SETS UP P.
;CAN DESTROY ALL ACS

RESET.:
RESET0:				;Another label (used by RESET$)
IF10,<	PORTAL	.+1  >		;ALLOW CALL FROM PUBLIC PAGE

	MOVEM	17,INIACS+17	;SAVE INITIAL RUN ACS
	MOVEI	17,INIACS
	BLT	17,INIACS+16
	MOVEI	P1,INIACS	;SEND ADDRESS OF INITIAL ACS TO FOROTS
IF20,<	XMOVEI	15,DBSTP$## >	;Old P4: =  lowseg symbol where DBSTP$ is
				; called from

;(All during field test we have been setting the Old P4 to -1,
; so if programs compiled during field test are not relinked, they
; will be passing -1 in AC15 to FOROT6).

	MOVE	P,[IOWD IPDLSZ,INIPDL] ;SET UP VERY TEMP STACK


IF20,<
	MOVEI	T1,.FHSLF	;THIS FORK
	GEVEC%			;GET ENTRY VECTOR LOC
	MOVEM	T2,SAVET	;SAVE, SINCE GET WRECKS IT
	HLRZ	T1,T2		;GET JUST THE LEFT HALF	
	CAIE	T1,(JRST)	;REAL ENTRY VECTOR?
	 CAIG	T1,1		;YES. BIG ENOUGH?
	  JRST	NOENTV		;NO. JUST STORE ADDR IN .JBREN
	XMOVEI	T2,(T2)		;GET ENTRY VECTOR BASE
	SKIPN	T1,1(T2)	;GET REENTER INST
	 MOVE	T1,[JRST EXICAL];USE OURS IF NONE
	CAMN	T1,[JRST CLSFIL] ;Already setup? (Program re-started?)
	 JRST	FOROK		;Yes, skip this.
	TLNN	T1,-1		;ANY OPCODE?
	 HRLI	T1,(JRST)	;NO. PUT IN A JRST
	MOVEM	T1,USEREN	;TO EXECUTE AFTER %EXIT1
	MOVE	T1,[JRST CLSFIL];USED TO CLOSE ALL FILES
	MOVEM	T1,1(T2)	;WHEN USER TYPES "REENTER"
>;END IF20

NOENTV:	SKIPN	T1,.JBREN	;DOES USER HAVE .JBREN ADDR?
	 MOVEI	T1,EXICAL	;NO. USE AN EXIT CALL
	HRRZ	T2,T1		;Did we already do this?
	CAIN	T2,CLSFIL
	 JRST	FOROK		;Yes, don't do it again.
	HRLI	T1,(JRST)	;MAKE IT A LOCAL INSTRUCTION
	MOVEM	T1,USEREN	;TO EXECUTE AFTER %EXIT1
	XMOVEI	T1,CLSFIL	;USED TO CLOSE ALL FILES
	MOVEM	T1,.JBREN	;WHEN USER TYPES "REENTER"

FOROK:	SKIPN	T1,FBASE	;FOROTS ALREADY GETED?
	SKIPGE	T1,[FOROT%]	;NO, GET BASE ADDRESS
	  JRST	[HRRZM T1,FBASE	;BASE ADDRESS KNOWN, SAVE FOR LATER
		 JRST INIT.]	;JUMP TO FOROTS

IF10,<
	JS.XO==2000		;JBTSTS BIT, JOB IS EXECUTE ONLY

	HRROI	T1,.GTSTS	;GET JOB STATUS
	GETTAB	T1,
	  SETZ	T1,		;CAN'T, ASSUME NOT EXECUTE ONLY
	TRNN	T1,JS.XO	;EXECUTE ONLY?
	  TDZA	T2,T2		;NO
	MOVEI	T2,UU.PHY	;YES, SET FOR PHYS-ONLY GETSEG

	MOVEI	T1,['SYS   '	;GETSEG FOROTS
		    'FOROT6'
		    EXP 0,0,0,0]
	GETSEG	T1,(T2)
	  HALT			;FAILED, TYPE MONITOR ERROR MESSAGE

	MOVE	16,INIACS+16	;GETSEG WRECKED ACS, PUT THEM BACK
	SETO	15,
	MOVE	P,[IOWD IPDLSZ,INIPDL]

	MOVE	T1,[-2,,.GTUPM]	;GET BASE ADDRESS OF HIGH SEG (FOROTS)
	GETTAB	T1,
	  MOVSI	T1,FOROT%##	;FAILED, USE LINK'S VALUE
	HLRZ	T1,T1		;PUT IN RIGHT HALF
	TRZ	T1,777		;CLEAR EXTRA BITS
	TRO	T1,10		;START ADDRESS IS XXX010
	MOVEM	T1,FBASE	;STORE FOR LATER

	JRST	INIT.		;START UP FOROTS
> ;IF10
IF20,<
	MOVX	T1,RF%LNG+.FHSLF ;FUNNY CALL,,THIS FORK
	MOVEI	T2,STBLK	;POINT TO FORK STATUS BLOCK
	RFSTS%			;READ FORK STATUS
	SKIPL	STBLK+.RFSFL	;SEE IF WE ARE EXECUTE ONLY
	  SKIPA	T1,[GJ%SHT+GJ%OLD] ;NO, SET UP FOR REGULAR GTJFN
	MOVX	T1,GJ%SHT+GJ%OLD+GJ%PHY	;YES, SET UP FOR PHYSICAL-ONLY GTJFN
	HRROI	T2,[ASCIZ /SYS:FOROT6.EXE/]
	GTJFN%
	  ERJMP	RERR

	HRLI	T1,.FHSLF	;THIS FORK
	TRO	T1,GT%NOV	;ERROR IF PAGES ALREADY EXIST
	XMOVEI	T2,GARGBL	;Point to GET arg block
	TLNE	T2,-1		; Needed?
	 PUSHJ	P,GTFRS1	;SETUP FOR SECTION 1 GET%
	GET%			;GET FOROTS
	  ERJMP	RERR

	MOVEI	T1,.FHSLF	;THIS FORK
	GEVEC%			;GET FOROTS ENTRY VECTOR

	HRRZI	T2,(T2)		;LOCAL ADDR ONLY
	MOVE	T1,(T2)		;GET "START" ADDRESS
	MOVEM	T1,FBASE	;SAVE BASE ADDRESS OF DISPATCH VECTOR
	HLRZ	T2,.JBHRN-.JBHDA(T1) ;ADD HIGH SEGMENT LENGTH
	ADDI	T2,-.JBHDA-1(T1) ;TO HISEG ORIGIN-1
	HLL	T2,.JBHRN-.JBHDA(T1) ;MAKE .JBHRL LOOK LIKE ON THE -10
	SKIPN	.JBHRL		;AND IF THE USER DIDN'T HAVE ONE
	 MOVEM	T2,.JBHRL	;SAVE FOR DDT
	LSH	T1,-9		;CREATE PAGE ADDR
	SKIPN	.JBHSO		;AND IF THE USER DOESN'T HAVE ONE
	 MOVEM	T1,.JBHSO	;SAVE THE FOROTS HIGH SEG ORIGIN FOR DDT

	MOVEI	T1,.FHSLF	;THIS FORK
	MOVE	T2,SAVET	;PUT REAL ENTRY VECTOR BACK
	SEVEC%			; SO ^C, START WORKS

	JRST	INIT.		;GO DO FOROTS INITIALIZATION

;Definitions in R5 MONSYM
GT%ARG==1B22			;Arg block supplied for GET
GT%BAS==1B2			;BASE-address word supplied in arg block

;Call here to do setup for GET% into section 1 only
GTFRS1:	HLRZM	T2,GARGBL+3	;Save section number to GET into
	MOVX	T3,GT%BAS	;Tell monitor which word to use
	MOVEM	T3,GARGBL
	TXO	T1,GT%ARG	;Remember we have an arg block
	POPJ	P,		;Back to main code

RERR:	HRROI	T1,RERRBF	;POINT TO MESSAGE BUFFER
	HRLOI	T2,.FHSLF	;THIS FORK,,LAST ERROR
	MOVSI	T3,-^D80	;LIMIT OF 80 CHARS
	ERSTR%			;GET ERROR STRING
	 JRST	[HRROI T1,[ASCIZ /Undefined error number/]
		 JRST RQUIT]
	  SKIPA	T1,[-1,,[ASCIZ /Error in ERSTR/]]
	HRROI	T1,RERRBF

RQUIT:	MOVEM	T1,SAVET	;SAVE T1 FOR A WHILE
	HRROI	T1,[ASCIZ /Can't get FOROT6.EXE/]
	ESOUT%			;TYPE EXPLANATION
	MOVE	T1,SAVET	;GET POINTER BACK
	ESOUT%			;TYPE ERROR STRING
	HALTF%			;QUIT AND DON'T CONTINUE
	JRST	.-1
> ;IF20

CLSFIL:

IF10,<
	OUTSTR	CLSMSG		;GIVE USER A MSG
	INCHWL	T1		;GET THE FIRST CHAR
	CLRBFI			;CLEAR TYPE-AHEADS
>;END IF10

IF20,<
	MOVE	T1,[POINT 7,CLSMSG] ;GIVE USER A MSG
	PSOUT%
	MOVE	T1,[TXIBLB,,TXIBLK] ;Copy args to TXIBLK
	BLT	T1,TXIBLK+.TXLEN-1
	XMOVEI	T1,TXIBLK	;SETUP FOR TEXTI
	TEXTI%
	 JFCL			;?Failed

;Clear input buffer.

	MOVEI	T1,.PRIIN	;Get terminal designator
	CFIBF%			;Clear input buffer
	 ERJMP	.+1		;Ignore error

	LDB	T1,[POINT 7,YESWRD,6] ;GET THE 1ST CHAR
>;END IF20

;Here with first char of response in T1.

	CAIE	T1,"Y"		;IS IT YES
	 CAIN	T1,"y"
	  JRST	DOCLS		;YES, IT'S YES
	JRST	NDOCLS		;NO. IT'S NOT

DOCLS:	MOVEM	17,INIACS+17	;SAVE INITIAL RUN ACS
	MOVEI	17,INIACS
	BLT	17,INIACS+16
	MOVE	P,[IOWD IPDLSZ,INIPDL] ;SET UP VERY TEMP STACK
	MOVEI	T0,FO$CLS	;FOROP CALL TO CLOSE ALL FILES
	PUSHJ	P,FOROP.
	MOVSI	17,INIACS	;RESTORE INITIAL ACS
	BLT	17,16
	MOVE	17,INIACS+17
NDOCLS:	XCT	USEREN		;EXECUTE REENTER INST

IF20,<
EXICAL:	HALTF%			;STOP FOROTS
	JRST	.-1		;AND STAY THAT WAY
>

IF10,<
EXICAL:	EXIT			;HALT FOROTS
>

IF20,<
TXIBLB:	4			;LENGTH FOLLOWING
	RD%TOP!RD%JFN		;STOP ON TOPS-10 STYLE CODES
	.PRIIN,,.PRIOU		;INPUT,,OUTPUT
	POINT 7,YESWRD		;THE ANSWER POINTER
	5			;5 BYTES MAX
.TXLEN==.-TXIBLB		;Length of block

TXIBLK:	BLOCK	.TXLEN		;Real TEXTI block.
>;END IF20

CLSMSG:	ASCIZ /Do you want to close all files? (Y or N):/

	SUBTTL	RESET$ - MAP SECTION 0 AND 1 TOGETHER

;This is a temporary entry point to test extended addressing FOROTS
;RESET$ maps sections 0 and 1 together, then returns to RESET0

IF20,<
RESET$:	PORTAL	.+1		;Allow call from public page
	DMOVEM	0,INIACS	;Save a few acs
	DMOVEM	2,INIACS+2

	SETZ	T1,		;Create private section
	MOVE	T2,[.FHSLF,,1]	;Section 1
	MOVX	T3,PM%RD!PM%WR+1 ;Read Write and one section
	SMAP%			;** Create section 1 **
	 ERJMP	NOSC1		;Can't

	MOVE	T1,[.FHSLF,,0]	;Want to map section 0
	MOVE	T2,[.FHSLF,,1000] ;Into other section
	SKIPGE	[FOROT%]	;Is FOROTS loaded?
	 JRST	RSTFLD		;Yes

	MOVX	T3,PM%RWX!PM%CNT+400 ;All lowseg
	PMAP%			;Make the two sections the same
	 ERJMP	CNTMP1		;Can't map pages to section 1
	MOVE	T1,[.FHSLF,,765] ;Also copy DDT if present
	MOVE	T2,[.FHSLF,,1765]
	MOVX	T3,PM%RWX!PM%CNT+13
	PMAP%
	 ERJMP	CNTMP1

	XJRSTF	[EXP 0,<1,,.+1>] ;Enter extended addressing
	JRST	RSTGO		;Go do FOROTS initialization

NOSC1:	HRROI	T1,[ASCIZ/?FRSNS1 Can't put myself in section 1, reason:
 Can't create section 1 with SMAP%
/]
	PSOUT%
	JRST	RSTGO		;Go anyway

CNTMP1:	HRROI	T1,[ASCIZ/?FRSCM1 Can't put myself in section 1, reason:
 Can't PMAP section 0 to section 1
/]
	PSOUT%
	JRST	RSTGO		;Go do regular RESET.

;HERE IF FOROTS LOADED AND WE WANT TO GO TO SECTION 1.
;Setup T3 for PMAP% and do it.

RSTFLD:	MOVX	T3,PM%RWX!PM%CNT+1000 ; The whole section
	PMAP%
	 ERJMP	CNTMP1
	XJRSTF	[EXP 0,<1,,.+1>] ;Enter extended addressing
;	JRST	RSTGO		;Go do FOROTS initialization


RSTGO:	DMOVE	0,INIACS	;Restore acs
	DMOVE	2,INIACS+2
	XMOVEI	16,(16)		;Get section # in LH(16)
	JRST	RESET0		;Entry at RESET0
>;END IF20
	RELOC			;TO LOW SEG

FBASE:	BLOCK	1		;FOROTS BASE ADDRESS

INIACS:	BLOCK	20		;INITIAL ACS
IPDLSZ==100			;INITIAL (TEMPORARY) STACK
INIPDL:	BLOCK	IPDLSZ		;TEMP PDL UNTIL REAL ONE IS SET UP
USEREN:	BLOCK	1		;USER REENTER ADDR
YESWRD:	BLOCK	1		;WORD FOR USER RESPONSE

IF20,<

STBLK:	5			;LENGTH OF RFSTS BLOCK
	BLOCK	4		;RFSTS BLOCK
GARGBL:	BLOCK	4		;"GET" arg block

RERRBF: BLOCK	^D80/5		;BUFFER FOR ERROR MESSAGE
SAVET:	BLOCK	1		;RANDOM TEMP (NO STACK YET)

>

	RELOC			;BACK TO HIGH SEG
;REAL DISPATCH VECTOR.  JUMP TO APPROPRIATE PLACE IN FOROTS DISPATCH VECTOR

DEFINE	X (E) <
	ENTRY	E'.
E'.:	PUSHJ	P,RDISP
>

	XALL
RVEC:	FORVEC
	SALL

;This code is known by the traceback routine's PC finder.  It walks through
;these instructions to find the sixbit name of a FOROTS routine from the
;address of its entry point.  If any change is made here, fix TRACE too.

RDISP:	EXCH	1,(P)
	ADD	1,FBASE		;RELOCATE TO FOROTS ENTRY POINT

;This is OK only as long as FOROTS must be in the same section as
; the user's code. If it can be a different section, change "TLZ" to
; put FOROTS's section number in the LH.
	TLZ	1,-1		;Make local section address
	JRST	-RVEC-1(1)	;SUBTRACT JSP, JUMP TO FOROTS

	END