Google
 

Trailing-Edge - PDP-10 Archives - BB-V552A-SB_1983 - d6dint.mac
There are 5 other files named d6dint.mac in the archive. Click here to see a list.
TITLE D6DINT -- UUO AND INTERRUPT SERVICE FOR THE DL10 DN60 SERIES - V007
SUBTTL	ED FORTMILLER/EGF and JOHN SAUTER/JBS	29 JAN 80

	SEARCH	F,S
	$RELOC
	$HIGH




;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION
; 1976,1977,1978,1979,1980,1982
XP	V6DINT,007			;VERSION NUMBER

ENTRY	D6DINT

D6DINT:
SUBTTL	DL10 BYTE POINTER DEFINITION

COMMENT	\

	 0    2 3    5 6            13 14                    35
	--------------------------------------------------------
	I      I      I               I                        I
	I P(3) I S(3) I WORD COUNT(8) I    ADDRESS ADR (22)    I
	I      I      I               I                        I
	--------------------------------------------------------

	P	Position of byte in the PDP10 word
		(except when S=0 OR S=7)

	S	Size of byte in number of bits

	WC	Maximum number of PDP-10 words required
		for this transfer (in negative form)

	ADR	Address of indirect PDP-10 word when transfer
		is not immediate.  Data, when the transfer is immediate,
		resides in bits 20 - 35.


	S	MODE	BITS		FUNCTION

	0	I	16	The byte is put in the right-most 16
				bits, 20-35, of the ADR field of
				the Byte Pointer itself.

	1	NI	16	The byte is in location at a
				position determined by the P field. P
				is not incremented.

	2	NI I	16	The incremented pointer determines the
				byte position.  This is similar to the
				PDP-10 ILDB or IDPB operation and is used
				for packing or unpacking characters in
				PDP-10 memory. The pointer is incremented
				first before packing or unpacking.  When
				P=7, the P field is reset to 0 and no
				increment to the address is performed.

	3	NI I	12	Same as S = 2.

	4	NI I	8	Same as S = 2.

	5	NI I	7	Same as S = 2.

	6	NI I	6	Same as S = 2.

	7	I	16	Same as S = 0.

		I    = Immediate
		NI   = Not Immediate
		NI I = Not Immediate incrementing Byte Pointer

\
SUBTTL	PDP-11 INTERFACE

;COME HERE WHEN A PDP11 IS FIRST RECOGNIZED AS BEING A DN60 PDP11
;
D60III::MOVE	J,DLXWIN##(W)		;POINT TO WINDOW
	MOVE	T1,DLXMOD##(J)		;PICK UP MOD NUMBER
	CAIE	T1,D60WVR##		;RIGHT?
	STOPCD	CPOPJ##,DEBUG,8VI, 	;++DN60 WRONG PDP11 CODE
	SETOM	DLXTA##(J)		;MARK 10 AS ALIVE
	SETZM	DLXADR##(J)		;CLEAR EXAMINE ADDRESS
	SETZM	DLXDAT##(J)		;AND EXAMINE DATA
	SETZM	DLXRST##(J)		;AND RESULT CODE FROM 11
	SETZM	DLXOPX##(J)		;AND OPERATION CODE FOR 11
	SETZM	DLXSWD##(J)		;AND EXM/DEP STATUS WORD
	MOVE	T1,[PUSHJ P,D60KII]
	MOVEM	T1,DLXINI##(W)		;INTERRUPT INSTRUCTION
	MOVE	T1,[BYTE (3) 1,1 (8) 377 (4) 0 (18) DLIGTS]
	MOVEM	T1,DLXLT1##(J)		;POINTER TO LOW IDLE WORD
	TLZ	T1,(<BYTE (3) 1>) 	;SET POSITION TO ZERO
	MOVEM	T1,DLXLT2##(J)		;POINTER TO HIGH IDLE WORD
	MOVE	T1,[PUSHJ P,REMPRG ]	;
	MOVEM	T1,DLXPRG##(W)		;PURGE INSTRUCTION
	SETOM	DLXTS##(J)		;MARK 10 AS RUNNING
	PJRST	D60SUP##		;GO FINISH SETUP
SUBTTL	HERE WHEN A KNOWN DN60 INTERRUPTS

;HERE WHEN THE DL10 INTERRUPTS
;
D60KII::				;INTERRUPT ROUTINE
	PUSHJ	P,SAVE1##		;SAVE P1
	HRRZ	J,DLXFEK##(W)		;GET FEK ADDRESS
	MOVE	P1,DLXWIN##(W)		;WINDOW ADDRESS
	MOVE	T1,DLXSWD##(P1)		;GET THE STATUS WORD FOR EXAMINE/DEPOSIT
	ANDCMI	T1,D60.ER##		;ZAP THE ERROR BIT
	JUMPE	T1,IWKJOB		;IF 0 STATUS OR ERROR WAKE THE JOB
	SKIPN	DLXRST##(P1)		;NOT EXM/DEP SO CHECK RESULT CODE
	  POPJ	P,			;DISMISS THE INTERRUPT
IWKJOB:	SKIPE	T1,DLXCEU##(W)		;SEE IF JOB USING THE CAL11.
	  PJRST	D60WAK##		;YES, GET JOB OUT OF EW
	POPJ	P,			;DISMISS THE INTERRUPT

;COME HERE WHEN A DN60 GOES DOWN
;
REMPRG:	PUSH	P,W			;SAVE W
	MOVE	W,P2			;ROUTINES NEED BASE TABLE IN W
	SKIPE	T1,DLXCEU##(W)		;USER OF THE CAL11 UUO?
	  PUSHJ	P,D60WAK##		;GO WAKE AND UNLOCK HIM IF NECESSARY
	SETZM	DLXTIM##(W)		;MAKE SURE TIMER IS CLEAR
	HRRZ	W,DLXFEK##(W)		;GET FEK POINTER
	SETZM	FEKUNI##(W)		;NO MORE ONCE-A-SECOND CODE
	PJRST	WPOPJ##			;RESTORE AC(W) AND RETURN TO
					; THE CALLER
;HERE TO EXAMINE OR DEPOSIT PDP11 MEMORY
;
; CALL:	JRST	D6DED			;J CONTAINS JOB NUMBER
;					;T1 FUNCTION CODE
;					;T3 ADDRESS
;					;T4 DATA TO DEPOSIT
;					;P1 POINTS TO DL10 WINDOW
;					;W POINTS TO THE BASE TABLE
;
D6DED::	HRRZM	J,DLXCEU##(W)		;STORE OUR JOB NUMBER AND INDICATE
					; EXM/DEP BY 0 IN THE (LH)
	MOVEM	T3,DLXADR##(P1)		;PUT THE ADDRESS IN THE WINDOW
	MOVEM	T4,DLXDAT##(P1)		;PUT DATA TO DEPOSIT INTO THE WINDOW
	MOVEM	T1,DLXSWD##(P1)		;TELL THE PDP11 THE FUNCTION
	MOVEI	T1,2			;TIME TO SLEEP WHILE WAITING FOR
					; A RESPONSE TO THE EXAMINE OR
					; DEPOSIT REQUEST.
	PUSHJ	P,D60EW			;GO OFF FOR A SNOOZE
	HRRZ	T1,DLXSWD##(P1)		;GET THE STATUS WORD
	SETZM	DLXSWD##(P1)		;NOW ZERO IT SO AT INTERRUPT
					; LEVEL WHEN DOING A QUE11 WE WON'T
					; GET FOOLED BY A BIT SET HERE
	TRNE	T1,D60.ER##		;SEE IF ERROR BIT UP
	  PJRST	ECOD10##		;**ERROR-10** BECAUSE PDP11 SAID
					; ILLEGAL ADDRESS.
	PJUMPN	T1,ECOD5##		;**ERROR-5** BECAUSE THE PDP11 DIDN'T
					; ANSWER OUR DEPOSIT OR EXAMINE REQUEST
	SKIPL	T1,DLXDAT##(P1)		;GET EXAMINE DATA
					; THIS WILL SKIP IF DEPOSIT
	  PJRST	STOTC1##		;GIVE USER SKIP RETURN AND DATA
	PJRST	CPOPJ1##		;GIVE USER SKIP RETURN

;HERE FROM D60SER TO PERFORM THE DL10 PORTION OF
; THE .C11QU FUNCTION
;
;AC CONTENTS AT THIS TIME
;
;	T1	FIRST ADDRESS IN THE BUFFER TO BE USED
;	T2	POSITIVE COMPUTED WORD COUNT
;	T3	N/A, WILL NOW BECOME A SCRATCH REGISTER
;	T4	LENGTH, WILL NOW BECOME A SCRATCH REGISTER
;	P1	POINTER TO BEGINNING OF THE WINDOW
;	P2	LINE NUMBER,,DEVICE NUMBER
;	P3	START OF BUFFER, WILL NOW BE COUNTER
;		OF MAXIMUM BYTE COUNT AND BYTE POINTER ALLOWED
;	P4	FUNCTION CODE,,NUMBER OF BYTES
;	F	POSITION OF FIRST BYTE, WILL NOW CONTAIN
;		 (BYTE POSITION)- REMAINDER OF  (BYTE POSITION)/(BYTE SIZE)
;	J	JOB NUMBER, WILL NOW CONTAIN INDEX POINTER TO WINDOW
;	S	BYTE SIZE (THE NUMBER OF BYTES PER WORD)
;	U	REMAINDER FROM (BYTE POSITION)/(BYTE SIZE)
;	W	POINTER TO BASE TABLE
;
D6DQ11::HLRZM	P2,DLXLNX##(P1)		;STORE THE LINE NUMBER IN THE WINDOW
	HRRZM	P2,DLXDVX##(P1)		;STORE THE DEVICE NUMBER IN THE WINDOW
	MOVE	F,S			;COMPUTE (BYTE SIZE)-
	SUB	F,U			; REMAINDER OF (BYTE POSITION)/(BYTE SIZE)
	MOVEI	P3,^D15			;MAXIMUM NUMBER OF BYTE COUNT AND BYTE
					; POINTER PAIRS
	MOVEI	J,DLXCBP##(P1)		;WINDOW POINTER TO COUNT/POINTER PAIRS
QUE11L:	MOVE	T3,T1			;GET THE ADDRESS
	ANDI	T3,777			;MAKE IT ADDRESS WITHIN A PAGE
	MOVEI	T4,1000			;FIGURE MAX NUMBER OF WORDS
	SUBM	T4,T3			; THAT CAN BE USED IN THIS PAGE
	CAILE	T3,^D256		;IS IT MORE THAN A DL10 CAN HANDLE?
	  MOVEI	T3,^D256		;YES, SO USE ONLY DL10 MAX
	MOVE	T4,T3			;ASSUME RIGHT COUNT IS IN T3
	CAMLE	T3,T2			;BUT IS WORD COUNT LESS?
	  MOVE	T4,T2			;YES, SO USE THE WORD COUNT
	SUB	T2,T4			;COUNT-NUMBER OF WORDS FOR THIS POINTER
	PUSH	P,T1			;SAVE THE ADDRESS
	ADDM	T3,(P)			;ADD COUNT TO MAKE NEXT FIRST ADDRESS
;
;TO COMPUTE THE BYTE COUNT
;
;	((WORD COUNT - 1)*(BYTE SIZE))+((BYTE SIZE)-
;	 (REMAINDER FROM (BYTE POSITION)/(BYTE SIZE)))
;
	MOVEI	T3,-1(T4)		;WORD COUNT - 1
	IMUL	T3,S			;MULTIPLY BY BYTE SIZE
	ADD	T3,F			;SEE DEFINITION OF F ABOVE
	CAILE	T3,(P4)			;IS COMPUTED BYTE COUNT
					; .GT. REMAINING BYTE COUNT?
	  MOVEI	T3,(P4)			;YES, USE REMAINING BYTE COUNT
	SUB	P4,T3			;THE REMAINING BYTE COUNT FOR NEXT GO AROUND
	MOVEM	T3,(J)			;PUT BYTE COUNT IN THE WINDOW
	PUSHJ	P,MAKPHY		;MAKE USER VIRTUAL ADDRESS
					; INTO A 22-BIT PHYSICAL ADDRESS
;
;TO COMPUTE THE DL10 WORD COUNT FROM A
; POSITIVE WORD COUNT
;
;	400 - POSITIVE WORD COUNT
;
	MOVEI	T3,400			;MAKE COUNT IN T4 INTO
	SUBM	T3,T4			; INTO A DL10 WORD COUNT
	LSH	T4,^D22			;POSITION THE WORD COUNT
	IOR	T1,T4			;BUILD WORD COUNT INTO DL10 POINTER
	DPB	S,[POINT 3,T1,5]	;PUT THE BYTE SIZE IN
;
;TO COMPUTE THE DL10 BYTE POSITION FIELD
;
;	(BYTE SIZE) - (REMAINDER OF (BYTE POS)/(BYTE SIZE))
;		IF RESULT IS 0 MAKE IT 10
;			REGARDLESS SUBTRACT 1
;
	SUBI	U,1			;MAKE 1 LESS TO POINT TO RIGHT BYTE
					; IF WAS 0, IT IS NOW -1 WHICH TURNS
					; INTO 7 WHEN SHIFTED LEFT
	LSH	U,^D33			;POSITION FOR DL10 POINTER
	IOR	T1,U			;PUT THE POSITION FIELD IN THE DL10
					; BYTE POINTER WORD
	SETZ	U,			;MAKE 0 FOR NEXT TIME AROUND
					; NOW CAUSE WE'RE ALWAYS BEGINNING
					; AT THE BEGINNING OF WORD
	MOVE	F,S			;SAVE AS BYTE SIZE
	MOVEM	T1,1(J)			;PUT THE BYTE POINTER INTO THE WINDOW
	POP	P,T1			;GET THE NEXT ADDRESS
	ADDI	J,2			;POINT TO NEXT SPACE IN WINDOW FOR A PAIR
	JUMPLE	T2,QUE11O		;JUMP IF ALL DONE
	SOJG	P3,QUE11L		;GO MAKE THE NEXT POINTER
	  PJRST	ECOD11##		;**ERROR-11** BECAUSE OF BUFFER TO LARGE
QUE11O:	SETZM	(J)			;LAST WORD MUST BE ZERO
	SETZM	DLXRST##(P1)		;MAKE SURE RESULT CODE IS 0
	MOVE	J,.CPJOB##		;GET OUR JOB NUMBER
	TLO	J,D6.Q11##		;INDICATE QUE11 FUNCTION
	MOVSI	T1,NSHF!NSWP		;NO SHUFFLE AND NO SWAP
	TDNE	T1,JBTSTS##(J)		;SEE IF ALREADY LOCKED
	  TLO	J,D6.ALK##		;INDICATE ALREADY LOCKED
	IORM	T1,JBTSTS##(J)		;LOCK THE JOB
	MOVEM	J,DLXCEU##(W)		;STORE OUR JOB NUMBER
IFN	FTKL10,<
	PUSHJ	P,CSDMP##		;INVALIDATE THE CACHE (THE USERS
					; DATA MAY BE IN THE CACHE AND THE
					; PDP11 WILL GET DATA FROM REAL
					; MEMORY.
>;END IFN FTKL10
	HLRZM	P4,DLXOPX##(P1)		;TELL THE 11 THE FUNCTION CODE
	MOVEI	T1,2			;TIME TO SLEEP WHILE WAITING FOR
					; A RESPONSE TO REQUESTED OPERATION
QUE11S:	PUSHJ	P,D60EW			;GO OFF FOR A SNOOZE
					; DLXCEU WILL BE CLEARED UPON RETURN
IFN	FTKL10,<
	PUSHJ	P,CSDMP##		;INVALIDATE THE CACHE
>;END IFN FTKL10
	SKIPN	T1,DLXRST##(P1)		;SEE IF RESULT CODE FROM THE 11
	  PJRST	ECOD5##			;**ERROR-5** BECAUSE PDP11 DIDN'T RESPOND
	HRL	T1,DLXXFR##(P1)		;GET NUMBER OF BYTES TRANSFERRED
	SETZM	DLXRST##(P1)		;CLEAR THE RESULT CODE
	PUSHJ	P,PUTWD1##		;GIVE THE USER THE RESULT CODE
	PJRST	CPOPJ1##		; AND SKIP RETURN
;THIS ROUTINE IS CALLED TO WAKE THE PDP11
; AND PUT THE JOB INTO EVENT WAIT
;
; CALL:	PUSHJ	P,D60EW			;T1 CONTAINS NUMBER OF SECONDS
;					; TILL WE TIME-OUT
;					;W  POINTS TO THE BASE TABLE
;	RETURN				;ALWAYS WITH DLXCEU CLEAR
;
D60EW:	PUSHJ	P,D60TIM##		;PUT TIME IN THE BASE TABLE
					; THAT WE TIME-OUT AT.
	XCT	DLXI11##(W)		;TELL PDP11 THAT WE HAVE
					; SOMETHING FOR HIM TO DO.
	PJRST	D60EVW##		;GO WAIT FOR SOMETHING TO HAPPEN

;SUBROUTINE TO CONVERT A USER VIRTUAL ADDRESS INTO
;  A 22-BIT PHYSICAL ADDRESS
;
; CALL	PUSHJ	P,MAKPHY		;T1 CONTAINS THE USER VIRTUAL ADDRESS
;	RETURN				;T1 CONTAINS THE 22-BIT PHYSICAL ADDRESS
;
MAKPHY:	PUSH	P,T2			;MUST PRESERVE T2
	LSHC	T1,W2PLSH##		;CONVERT T1 TO THE PAGE NUMBER
					; T2 GETS ADDRESS WITHIN PAGE.
	ROT	T1,-1			;DIVIDE BY 2 FOR INDEX INTO
					; THE UPMP AND SET HIGH ORDER BIT
					; IF AN ODD PAGE NUMBER
	TLZE	T1,(1B0)		;NOW SEE IF AN ODD PAGE NUMBER
	  SKIPA	T1,.UPMP(T1)		;GET ADDRESS OF THE ODD PAGE
	HLRZ	T1,.UPMP(T1)		;GET ADDRESS OF THE EVEN PAGE
	ANDI	T1,17777		;KEEP ONLY THE PAGE ADDRESS
	LSHC	T1,P2WLSH##		;BRING IN THE ADDRESS WITHIN THE PAGE
					; 17777 = 22-BIT ADDRESS MASK SHIFTED
					; RIGHT P2WLSH
	PJRST	T2POPJ##		;RETURN WITH 22-BIT PHYSICAL ADDRESS IN T1
;LOW SEGMENT STORAGE

	$LOW

DLIGTS:	EXP	-1			;PDP-10 WORD FOR DL10 IDLE LIGHTS

	$HIGH

	$LIT

D6DEND::END