Google
 

Trailing-Edge - PDP-10 Archives - 704rmsf2 - 10,7/rms10/rmssrc/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
$PROLOG

REPEAT 0,<

THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.

;COPYRIGHT (C) 1977, 1978 BY DIGITAL EQUIPMENT CORPORATION


NAME:		RMSDSP
AUTHOR:		S. BLOUNT
EDIT DATE:	5-MAY-77
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)	(DAW, 2-Feb-82) Preserve registers 3 and 4;
				return status in register 2 for every verb.

****************** Start RMS-10 V1.1 *********************
********************* TOPS-10 ONLY ***********************

PRODUCT	MODULE	 SPR
 EDIT	 EDIT	 QAR		DESCRIPTION
======	======	=====		===========

 101	  4	Dev		(RMT, 12/2/85) Update copyrights.

 104	  5	Dev		(RMT, 12/2/85) Use AC0 instead of AC17
				as BLT pointer so that PSI doesn't trash
				the stack pointer.

 105	  6	Dev		(RMT, 12/2/85) Don't overwrite program's
				version number in JOBDAT

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

>;;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,<JSP T2,CALDSP>	;[60] CREATE OFFSET TO IDENTIFY CALLED ROUTINE

SMNCPY::ASCIZ\

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

\ ;

CALDSP:	SUBI	T2,RMS$10+1	;[60] GET OFFSET INTO TABLE OF ADDRESSES
	MOVEM	T2,UJSYS	;[60] STORE IT AWAY
	POP	P,RETPC		;STORE RETURN ADDRESS AWAY
	JRST	SETUP		;AND CONTINUE AS IF THIS WERE A JSYS

				; WITH THE /R OPTION, WHATEVER THAT MEANS

; ***	JSYS ENTRY LOGIC

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

VECTOR:	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==.-VECTOR		;LENGTH OF ENTRY VECTOR




RMS$20::
	SKIPA			;BYPASS TURN-OFF OF INITED FLAG
RMS20I:	SETZM	INTFLG##	;SIGNAL THAT THIS IS 1ST CALL
	MOVE	T2,UJSYS##	;[60] GET JSYS CODE
	CAMLE	T2,[RM$MAX]	;[60] JSYS TOO HIGH?
	JRST	E.JSYS		;YES
	SUB	T2,[RM$MIN]	;[60] COMPUTE JSYS OFFSET
	MOVEM	T2,UJSYS##	;[60] 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	T4,RMSINI##	;YES, INIT RMS
	MOVEM	17,USERAC##+17	;SAVE LAST AC
	MOVE	0,[1,,USERAC##+1];SET UP TO SAVE USER AC'S
	BLT	0,USERAC##+16	;SAVE THEM
	MOVE	0,USERAC##+0	;RELOAD AC 0
	JRST	RMSENT		;HOP OVER 1-TIME CODE PUT OUT BY $MAIN

$SCOPE	(TOP-LEVEL)
$MAIN	(RMSENT,TRAPERR,<IOWD PDLNG##,RMSTACK##>)
	MOVEI	T2,SU$SUC	;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
	PUSH	17,T1		;PUSH CONTROL BLOCK addr
	PUSH	17,[0]		;PUSH DUMMY ARG. ALL VERB MODULES EXPECT 2 ARGUMENTS ON STACK
	MOVE	T3,UJSYS##	;GET OFFSET INTO TABLE
	PUSHJ	17,@DSPTAB(T3)	;DISPATCH TO USER ROUTINE
				;DOESNT 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
E.JSYS:
	$CALLB	TX$TOUT##,<RM$IJC##,UJSYS##,RETPC##>
				;INVALID JSYS CODE x AT LOC y
	MOVEI	T2,ER$BUG	;HALT USER WITH BAD JSYS CODE
	MOVEM	T2,USRSTS##	;JUST GIVE A STATUS CODE
	SETZM	USRSTV##	;NO SUBSID CODE
	JRST	USRJAB		;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?
	$SKIP			;YES
	  $CALLB OABORT,<[0]>	;TELL OABORT USRSTS ALREADY SET, SO RET IN LINE
	$ENDIF
USRFOK:				;FILE ENVIR GUARAN OK BY HERE
	MOVE	0,[USERAC##+1,,1]; SET UP BLT
	BLT	0,17		;RESTORE USER AC'S (BUT AM ALLOWED TO CLOB 2-4)
	MOVE 	0,USERAC##+0	;RESTORE AC 0 
USRJAB:				;BAD JSYS CODE
	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
	CAIGE	T2,.ERBAS	;IS IT AN ERROR CODE(.GEQ. 300000?)
	JRST	@RETPC##	;NO, EXIT THRU RETURN PC
	DMOVEM	T3,USERAC+T3	;[60] Make sure ACs don't get smashed.
	MOVE	T4,RETPC	;GET ADDRESS TO RETURN TO
	MOVE	T3,(T4)		;GET INSTRUCTION THERE
	HLLZ	T4,T3		;[60] CHECK ONLY OP-CODE
	CAMN	T4,[JUMP 16,]	;[60] IS IT AN ERJMP?
	JRST	DOJMP		;YES, "GOTO" ERROR ADDRESS
	CAME	T4,[JUMP 17,]	;[60] IS IT ERCAL?
	 JRST	RETILN		;[60] No, illegal call (Didn't use RMS macro).
				;[60] So just return in-line.
	MOVE	T4,RETPC	;[60] Get return PC
	ADDI	T4,1		;SIMULATE PUSHJ AT LOCATION OF ERCAL
	PUSH	P,T4		;...BY PUSHING @RETPC+1 ON STACK
DOJMP:	HRRZM	T3,USERAC	;[60] Address to return to
	DMOVE	T3,USERAC+T3	;[60] Restore ACS 3 and 4
	JRST	@USERAC		;[60] Transfer to user routine.
RETILN:	DMOVE	T3,USERAC+T3	;[60] Restore ACs
	JRST	@RETPC		;[60] Return.
$ENDMAIN
$ENDSCOPE(TOP-LEVEL)


SUBTTL	RMS DISPATCH TABLE

DEFINE	RMSVRB(NAME)<$'NAME##>	;;FOR PUSHJ INDIRECT TO ACTUAL PROCESSING IN RMS

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)

END