Google
 

Trailing-Edge - PDP-10 Archives - BB-H138F-BM_1988 - 7-sources/rmsdsp.mac
There are 6 other files named rmsdsp.mac in the archive. Click here to see a list.
TITLE	RMSDSP -- ENTRY VECTOR AND DISPATCH TABLE FOR RMS
SEARCH	RMSINT,RMSMAC,MONSYM						;m501
$PROLOG

REPEAT 0,<

;
;	COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1977, 1986.
;	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.
;




NAME:		RMSDSP
AUTHOR:		S. BLOUNT
EDIT DATE:	22-Apr-83
FUNCTION:	RMS-20 JSYS DISPATCHER



REVISION HISTORY:

EDIT	DATE		WHO	PURPOSE
====	====		===	=======

1	5-MAY-77	SB	CHANGE ENTRY DISPATCH VECTOR TO SYMBOLIC FORM
2	12-DEC-79	AU	1. CHANGE REGISTER USAGE SO THAT AC 1 COULD BE
				   USED THE ARGUMENT POINTER.
				2. ADD CODE TO USE RMS'S OWN STACK.
				3. MODIFY CODE TO SUIT NEW USER INTERFACE

*************************************************
*						*
*		NEW REVISION HISTORY		*
*						*
*************************************************

PRODUCT	MODULE	 SPR
 EDIT	 EDIT	 QAR		DESCRIPTION
======	======	=====		===========
60	3	(MBROWN,SWE)	Preserve registers 3 and 4; return
				status in register 2 for every verb.

66	4	NONE		(RL, 19-Apr-83) Fix entry vector
				definition.  Use MACRO to define EV in
				RMSEVC.REL with RMS$EV, rather than
				using LINK /START:RMS.EV, which was
				changed with LINK v5.1.

71				Add copyright notice to executable

	***** END OF REVISION HISTORY *****

	***** Start Version 2 development *****

PRODUCT	MODULE	 SPR
 EDIT	 EDIT	 QAR		DESCRIPTION
======	======	=====		===========
301	300	XXXXX		Support for extended addressing

302	301	(SWE, FTS-20)	Allow ERJMP or ERCAL to use indexing
				and/or indirection

450	450	(SWE,DIL)	(RL, 13-Jan-84) Turn off trapping for
				nonexistent page interrupts on entry
				to RMS; turn it on again on exit.
				If the $NOMESSAGE JSYS has been issued
				(which turns on bit 35 in RMSSTS),
				then don't do any checking for traps.
*** VERSION 3 ***

501		Development	(AN, 17-May-84) Add new functions

507		Development	(AN, Jul-84) Put in hooks for $Rename

521		Development	(AN, 8-Nov-84) Don't clobber AC2
>;;END OF REPEAT 0

LOC 137						;FOR VERSION # ON 10
$VERS

$PURE
SUBTTL	ENTRY POINTS TO RMS

	RELOC	400000

	ENTRY	RMS.EV

; ***	 PUSHJ ENTRY LOGIC
;
RMS$10::	REPEAT XX$MAX,<JSR CALDSP>
				; Make JSR to not lose AC2		;m521
				;[507] CREATE OFFSET TO IDENTIFY CALLED ROUTINE

;[71] Copyright notice, RL, 1-Jun-83
SMNCPY::ASCIZ\

	COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1977, 1986.
	ALL RIGHTS RESERVED.

\ ;[71]

CALDSP: Z
	MOVEM	T2,USERAC##+T2  ;[507] Preserve AC2
	MOVE	T2,CALDSP	;[507] Get calling addr
	SUBI	T2,RMS$10+1	;[3] GET OFFSET INTO TABLE OF ADDRESSES
	HRRZM	T2,UJSYS	;[3] STORE IT AWAY ;M506
	TLNN	T2,37		; SECTION 0? ;A506
	 JRST	[POP P,RETPC	; YES.	     ;A506
		 JRST SETUP]	; 	     ;A506
	POP	P,RETPC+1	;STORE RETURN ADDRESS AWAY ;M506
	JRST	SETUP		;AND CONTINUE AS IF THIS WERE A JSYS

				; WITH THE /R OPTION, WHATEVER THAT MEANS

; ***	JSYS ENTRY LOGIC

RMS.EV==:VECLNG,,RMS$EV		;FOR SETTING RMS20 ENTRY VECTOR WITH LINK... /ST:RMS.EV

RMS$EV::JRST	RMS$20		;ADDRESS OF NORMAL DISPATCHER
	JRST	RMS20I		;ADDRESS OF RMS INITIALIZATION ROUTINE
	$VERS			;RMS VERSION #
	UJSYS##			;PLACE TO STORE JSYS CODE FROM MONITOR
	RETPC##			;PLACE TO STORE RETURN PC
VECLNG==.-RMS$EV		;LENGTH OF ENTRY VECTOR




RMS$20::
	SKIPA			;BYPASS TURN-OFF OF INITED FLAG
RMS20I:	SETZM	INTFLG##	;SIGNAL THAT THIS IS 1ST CALL
	MOVEM	T2,USERAC##+T2	;Don't clobber AC2 ;a521
	MOVE	T2,UJSYS##	;[3] GET JSYS CODE
	HRLI	T2,(JSYS)	;[300] Make "JSYS nnn"
	CAMLE	T2,[RM$MAX]	;[3] JSYS TOO HIGH?
	JRST	E.JSYS		;YES
	SUB	T2,[RM$MIN]	;[3] COMPUTE JSYS OFFSET
	MOVEM	T2,UJSYS##	;[3] STORE OFFSET INTO TABLE
;	JRST	SETUP		;MERGE WITH PUSHJ ENTRY
SUBTTL	RMS COMMON ENTRY/EXIT CODE

;THIS ROUTINE IS THE FIRST ONE TO GET CONTROL AFTER A RMS MACRO
; HAS BEEN EXECUTED.  IT PERFORMS THE FOLLOWING FUNCTIONS:
;
;	1.  SAVE USER AC'S
;	2.  DISPATCH TO PROPER RMS ROUTINE
;
;COME HERE ON EITHER A DIRECT CALL (PUSHJ) OR AN RMS-20 JSYS.
;
SETUP:
	SKIPN	INTFLG##	;1ST CALL?
	JSP	T2,RMSINI##	;[300] YES, INIT RMS
	MOVE	T2,USERAC##+T2	;Don't clobber AC2 (it was already saved) ;a521
	MOVEM	17,USERAC##+17	;SAVE LAST AC
	MOVEI	17,USERAC##	;SET UP TO SAVE USER AC'S
	BLT	17,USERAC##+16	;SAVE THEM
	JRST	RMSENT		;HOP OVER 1-TIME CODE PUT OUT BY $MAIN

$SCOPE	(TOP-LEVEL)
$MAIN	(RMSENT,TRAPERR,<IOWD PDLNG##,RMSTACK##>)

	;
	; See if we are in a nonzero section
	; if so, stack should be global.
	;
	SKIPE	RMSSEC		;In nonzero section?			;a525
	 HLL	P,RMSSEC	;Yes. make stack global 		;a525

IFN TOP$20,<								;a572
	;[450]  Turn off trapping for page creation
	;[450]  Note: By way of a crock, the $NOMESSAGE JSYS
	;[450]        may be used to skip the following code,
	;[450]        if trap-checking is not wanted.  The
	;[450]        $NOMESSAGE and $MESSAGE JSYSes no longer
	;[450]        affect message output, and so are being
	;[450]        used to control this code.  Bit 35 of
	;[450]        RMSSTS is STSNOMESSAGE, which once turned 
	;[450]        off message output; it now turns off
	;[450]        trap checking.
	;[450] 
	MOVE	T5,RMSSTS##	;[450] Check if we should bother
	TRNE	T5,1		;[450]   to look at trapping
	  JRST	NOCHK1		;[450] Don't bother - go on
	PUSH	17,T1		;[450] Save T1
	MOVEI	T1,.FHSLF	;[450] Get our interrupt mask
	RCM%			;[450] ...
	  ERCAL	MONERR##	;[450] ...
	AND	T1,[EXP 1B22]	;[450] Save .ICNXP bit
	MOVEM	T1,INTMSK##	;[450] ...
	SKIPN	INTMSK##	;[450] Is trapping enabled?
	  JRST	NONXP1		;[450] No - don't worry
	MOVEI	T1,.FHSLF	;[450] Deactivate the channel
	MOVE	T2,[EXP 1B22]	;[450] ...
	DIC%			;[450] ...
	  ERCAL	MONERR##	;[450] ...
NONXP1:	POP	17,T1		;[450] Restore T1
> ; END IFN TOP$20						;A572

NOCHK1:	MOVEI	T2,SU$SUC	;[450] ASSUME A SUCCESSFUL CONCLUSION
	MOVEM	T2,USRSTS##	;STORE IT IN USER STATUS FIELD
	SETZM	USTOSF##	;START WITH NO STATUS SUGGESTION
	SETZM	OAFLAGS		;INDIC NO OPEN ACTIVITY EXTANT
	SETZM	USRSTV##	;CLEAR STATUS-VALUE
	SETZM	ERRADR##	;CLEAR ERROR ADDRESS
	SKIPN	RMSSEC##	;[300] Is this extended addressing?
	 JRST	RMSEN1		;[300] No, don't worry about this.
	MOVE	T2,RETPC+1	;[300] Get PC just incase it is
	HLLZM	T2,USRSEC##	;[300] Store user's section for this call.
	TLNN	T1,-1		;[300] Is user's control block in sec 0?
	 HLL	T1,T2		;[300] Yes, default to JSYS call section.
	HLLZM	T1,BLKSEC##	;[300] Remember section where his block is.
RMSEN1:	PUSH	17,T1		;PUSH CONTROL BLOCK addr
	PUSH	17,USERAC##+T2	;[507] PUSH SECOND CONTROL BLOCK addr
				;       ignored unless $RENAME
	MOVE	T3,UJSYS##	;GET OFFSET INTO TABLE
	MOVE	T2,DSPTAB(T3)	;[300] Get address of routine
	PUSHJ	17,(T2)		;[300] Dispatch to routine,
				;[300]  doesn't return.
SUBTTL	EXIT CODE

UA%BLK==1			;?AB ADDRESS ORIG PASSED IN AC1

TRAPERR:			;ABORTIVE ERROR OCCURRED
	MOVEI	T1,ER$BUG	;RET BUG VAL
	MOVEM	T1,USRSTV##	; IN 2NDARY STATUS FIELD
	MOVE	T2,USRSTS##	;IS THERE ANOTHER CODE ALREADY?
	CAIN	T2,SU$SUC	;JUMP IF YES
	MOVEM	T1,USRSTS##	;NO, SET AS PRIMARY CODE TOO
	JRST	USRFOK		;SKIP OABORT CHK

;Here if user calling error (Bad JSYS).
; Have to make sure RMS is setup.
;He gets an error on his TTY, despite $MESSAGE or $NOMESSAGE.

E.JSYS::
	SKIPN	INTFLG##	;1ST CALL?
	JSP	T2,RMSINI##	;[300] YES, INIT RMS
	MOVEM	17,USERAC##+17	;SAVE LAST AC
	MOVEI	17,USERAC##	;SET UP TO SAVE USER AC'S
	BLT	17,USERAC##+16	;SAVE THEM
	MOVE	17,[IOWD PDLNG##,RMSTACK##] ;Setup our own stack.
	HRRZ	T2,UJSYS##	;Get octal JSYS code
	PUSH	P,T2
	SKIPE	RMSSEC##	;In extended section?
	 JRST	[PUSH P,RETPC##+1 ;Yes, save PC
		JRST .+2]	;Instead of 1-word one.
	PUSH	P,RETPC##	;"at" (Octal PC)
	PUSH	P,[MF$IJC##]	;"?Invalid JSYS code "
	PUSHJ	P,TX$OUT##
	ADJSP	P,-3		;Fix stack after call.
	MOVEI	T2,ER$BUG	;HALT USER WITH BAD JSYS CODE
	MOVEM	T2,USRSTS##	;JUST GIVE A STATUS CODE
	SETZM	USRSTV##	;NO SUBSID CODE
	JRST	USRFOK		;On return

USRERR::			;COME HERE ON BAD RETURN FROM RMS
	JFCL			;NO-OP, HERE ONLY TO PROVIDE PLACE TO SET BRK-PT
USRRET::			;COME HERE ON GOOD RETURN FROM ALL RMS MACRO'S
	SKIPN	OAFLAGS##	;OPEN LEFT HANGING?
	 JRST	USRFOK		;No

	PUSH	P,[0]		;Tell OABORT USRSTS already set, so ret in line
	PUSHJ	P,OABORT##	;Clean-up after error.
	ADJSP	P,-1		;Fix stack after call.
USRFOK:				;FILE ENVIR GUARAN OK BY HERE
IFN TOP$20,<								;a572

	;[450] 
	;[450]  Restore user's page-creation trapping state
	;[450] 
	SKIPN	INTMSK##	;[450] Was user trapping?
	  JRST	NONXP2		;[450] No - don't reset anything
	MOVEI	T1,.FHSLF	;[450] Turn trapping on again
	MOVE	T2,[EXP 1B22]	;[450] ...
	AIC%			;[450] ...
	  ERJMP	MONERR##	;[450] ...
NONXP2:
> ;End of IFN TOP$20							;a572
	MOVE	UA%BLK,USERAC##+UA%BLK ;[450][301] User's AC
	TLNN	UA%BLK,-1	;[300] Local sec # (LH zero)?
	 IOR	UA%BLK,BLKSEC## ;[300] Yes, get whole address.
	MOVE	T2,USRSTV##	;[4] GET STATUS VALUE
	$STORE	T2,STV,(UA%BLK)	;[4] STORE IT IN CONTROL BLOCK
	HRRZ	T2,USRSTS##	;GET THE USER'S ERROR CODE
	$STORE	T2,STS,(UA%BLK)	;STORE IT IN CONTROL BLOCK
IFN TOP$10,<
	SETOM	USERAC		;[572] Indicate success
>
	CAIGE	T2,.ERBAS	;IS IT AN ERROR CODE(.GEQ. 300000?)
	 JRST	RETILN		;[301] No, just return in-line
IFN TOP$10,<
	SETZM	USERAC		;[572] Indicate failure
>
	SKIPE	RMSSEC##	;[300] In Non-zero section?
	 SKIPA	T4,RETPC+1	;[300] Yes, get PC
	MOVE	T4,RETPC	;[300] GET ADDRESS TO RETURN TO
	MOVE	T3,(T4)		;[300] GET INSTRUCTION THERE
	AND	T3,[777740,,0]	;[301] Check only opcode and AC field
	CAMN	T3,[JUMP 16,]	;[3] IS IT AN ERJMP?
	JRST	DOJMP		;YES, "GOTO" ERROR ADDRESS
	CAME	T3,[JUMP 17,]	;[3] IS IT ERCAL?
	 JRST	RETILN		;[3] No, illegal call (Didn't use RMS macro).
				;[3] So just return in-line.
	MOVE	T1,USERAC+17	;[301] Fetch user's pushdown ptr.
	SKIPN	RMSSEC##	;[300] Skip if extended addressing
	 JRST	DOCALN		;[300] Non-extended, easy.

;Have to simulate PUSHJ in extended addressing. Be careful of
; the user's local stack ptr.

	MOVE	T4,RETPC+1	;[300] Get return PC
	JUMPGE	T1,DOCLN1	;[300] Global stack, ok
	PUSH	P,USRSEC	;[300] Remember user's section #
	EXCH	T1,USRSEC	;[300] Get user's section #
	HRR	T1,USRSEC	;[300] Make global PDP
	ADDI	T4,1		;[300] This will be put on user's stack
	PUSH	T1,T4		;[300] Simulate PUSHJ
	MOVE	T1,USRSEC	;[300] Re-fetch user's PDP
	ADJSP	T1,1		;[300] Fix it.
	MOVEM	T1,USERAC+17	;[301] Save updated pushdown ptr.
	POP	P,USRSEC	;[300] Restore user's section #
	JRST	DOJMP		;[300] and return.

DOCALN:	MOVE	T4,RETPC	;[3] Get return PC
DOCLN1:	ADDI	T4,1		;SIMULATE PUSHJ AT LOCATION OF ERCAL
	PUSH	T1,T4		;...BY PUSHING @RETPC+1 ON STACK
	MOVEM	T1,USERAC+17	;[301] Save updated pushdown ptr.
;	JRST	DOJMP		;[301] and return.
;Do EACALC and return to where user told us.
; If not extended addressing, then we don't need to do an
;Effective address calcalation, because the section number will
;always be zero. Instead, just take the ERJMP instruction and
;make the opcode a JRST and the ac field be zero. Then XCT it after
;restoring the user's AC's.

DOJMP:	SKIPE	RMSSEC##	;[301] Extended addressing is hard.
	 JRST	DOJMPE		;[301] Hard EACALC.
	MOVE	T3,RETPC	;[301] Get place where ERJMP/CAL is.
	MOVE	T3,(T3)		;[301] Get instruction
	TLZ	T3,777740	;[301] Turn off opcode, AC field
	IOR	T3,[JRST]	;[301] Make unconditional jump
	MOVEM	T3,USRSEC	;[301] Store here a sec..
	MOVSI	17,USERAC##	;restore user AC's
	BLT	17,17
	HRRZ	2,USRSTS	;[301] Setup user status. Note - the original
				;[301] AC2 has been smashed.. it can't be used
				;[301] for indexing in the ERJMP/ERCAL.
	XCT	USRSEC		;[301] Jump to desired location.

;Extended addressing EACALC

DOJMPE:	MOVE	T3,RETPC+1	;[301] Get place where ERJMP is
	MOVE	T3,(T3)		;[301] Fetch instruction.
	MOVE	T2,USRSEC	;[301] Current EACALC section is user's section
	HRR	T2,T3		;[301] Get "E" if no indirect, indexing
	TLNN	T3,37		;[301] Skip if indirect bits on
	 JRST	DOJE		;[301] Got "E"

;Got some indexing or indirection here!
;Here with T3 = next instruction word
;	T2 (6:17) = E (6:17)

IWLOOP:	HRRZ	T4,T3		;T4 = "Y"
	TLNN	T3,17		;Indexing = 0?
	 JRST	IWLUP1		;No
	LDB	T1,[POINT 6,T2,17] ;Get register number
	MOVE	T1,USERAC(T1)	;Get T1=contents of index register
	TLNN	T2,7777		;Section # = 0?
	 JRST	IWLUP2		;Yes, sign doesn't matter
	JUMPLE	T1,IWLUP2	;neg or zero, just add RH to Y
	TLZ	T1,770000	;Clear junk, get bits 6-35 of index reg.
	TLNE	T1,-1		;"Local" indexing used?
	 HLL	T1,T2		;Yes, use local section number.
	ADD	T1,T4		; + Y
	MOVE	T2,T1		; = E.
	JRST	IWCHKI		;go check indirection

;Local (section 0) indexing calculation.
; or Contents of index register is negative.

IWLUP2:	HRRZ	T1,T1		;Get RH of index register
	ADD	T1,T4		; + Y
	HRR	T2,T1		; = E (RH)
	JRST	IWCHKI		;Go check indirection

IWLUP1:	HRR	T2,T4		;Y --> E(RH)

;Here when indexing done (if needed). Do indirection if needed.

IWCHKI:	TXNN	T3,1B13		;Indirection?
	 JRST	DOJE		;No, got "E"
INDWLP:	MOVE	T3,@T2		;Fetch indirect word from E
	 ERJMP	RETILN		;? EACALC error, return in-line
				; (Should really give RMS error as well)
	TLNN	T2,7777		;In section 0?
	 JRST	IWLOOP		;Yes, only instruction formats used.
	TXNN	T3,1B0		;Global indirect bit on?
	 JRST	INDWL1		;Yes
	TXNN	T3,1B1		;Yes, 10?
	 JRST	IWLOOP		;Yes, local indirect - instruction format
	JRST	RETILN		;11 = error ("Page fail trap").
INDWL1:	MOVE	T4,T3		;Get T4= "Y"
	TLZ	T4,770000
	LDB	T1,[POINT 4,T3,5]	;Index register number
	JUMPN	T1,INDWL2	;Jump if global indexing
	MOVE	T2,T4		;Y--> E
	JRST	INDWL3		;Check global indirection as well..

INDWL2:	MOVE	T1,USERAC(T1)	;Get contents of index register
	TLZ	T1,770000	;Delete junk bits
	ADD	T1,T4		;XR + Y
	MOVE	T2,T1		; = E

INDWL3:	TXNE	T3,1B1		;Global indirection?
	 JRST	INDWLP		;Yes, chain to next word.

;Here when got final "E" in T2.

DOJE:	MOVE	0,T2		;Put "E" in T0
	EXCH	0,USERAC##	;Restore user ac 0
	MOVE	17,[USERAC+1,,1]
	BLT	17,17		;Restore user ac's
	HRRZ	2,USRSTS	;Return RMS status in AC 2
	JRST	@USERAC		;[3] Transfer to user routine.

;Here to return in-line (through return PC)

RETILN:	MOVSI	17,USERAC##	;RESTORE USER AC'S
	BLT	17,17		;...
	HRRZ	2,USRSTS	;Return RMS status in AC 2
	SKIPE	RMSSEC		;[300] In extended addressing?
	 XJRSTF	RETPC		;[300] Yes, return via XJRSTF
	JRST	@RETPC		;[3] Return.

NOVALRET::	;USE THIS INSTEAD OF USRRET IF NO BLOCK ($DEBUG, $MESSAGE)

	SKIPN	INTMSK##	;[571] Was user trapping?
	  JRST	RETILN		;[571] No - don't reset anything
	MOVEI	T1,.FHSLF	;[571] Turn trapping on again
	MOVE	T2,[EXP 1B22]	;[571] ...
	AIC%			;[571] ...
	  ERJMP	MONERR##	;[571] ...
	JRST	RETILN		;[571]

$ENDMAIN
$ENDSCOPE(TOP-LEVEL)
SUBTTL	RMS DISPATCH TABLE

DEFINE	RMSVRB(NAME)<$'NAME##> ;;FOR PUSHJ INDIRECT TO ACTUAL PROCESSING IN RMS
					; New verbs added		;a501
DSPTAB::
	RMSVRB (OPEN)
	RMSVRB (CLOSE)
	RMSVRB (GET)
	RMSVRB (PUT)
	RMSVRB (UPDATE)
	RMSVRB (DELETE)
	RMSVRB (FIND)
	RMSVRB (TRUNCATE)
	RMSVRB (CONNECT)
	RMSVRB (DISCONNECT)
	RMSVRB (CREATE)
	RMSVRB (DEBUG)
	RMSVRB (RELEASE)
	RMSVRB (FLUSH)
	RMSVRB (MESSAGE)
	RMSVRB (NOMESSAGE)
	RMSVRB (DISPLAY)
	RMSVRB (ERASE)
	RMSVRB (FREE)
	RMSVRB	(UTLINT)
 	RMSVRB (NXTVOL)
 	RMSVRB (REWIND)
 	RMSVRB (WAIT)
 	RMSVRB (READ)
 	RMSVRB (SPACE)
 	RMSVRB (WRITE)
 	RMSVRB (PARSE)
 	RMSVRB (SEARCH)
 	RMSVRB (ENTER)
 	RMSVRB (EXTEND)
 	RMSVRB (REMOVE)
 	RMSVRB (RENAME)

END