	.TITLE	MBAINTDSP - MASSBUS ADAPTER INTERRUPT DISPATCHER
	.IDENT	/01/
 
;
; COPYRIGHT (C) 1977
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
; THIS SOFTWARE IS FURNISHED UNDER  A LICENSE FOR USE ONLY  ON  A
; SINGLE COMPUTER SYSTEM AND MAY BE  COPIED ONLY WITH  THE INCLU-
; SION OF  THE  ABOVE  COPYRIGHT NOTICE.  THIS SOFTWARE,  OR  ANY
; OTHER COPIES THEREOF, MAY NOT BE  PROVIDED  OR  OTHERWISE  MADE
; AVAILABLE TO ANY OTHER PERSON EXCEPT  FOR  USE  ON  SUCH SYSTEM
; AND TO  ONE WHO AGREES  TO  THESE LICENSE  TERMS.  TITLE TO AND
; OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
;
; THE INFORMATION IN THIS SOFTWARE  IS  SUBJECT TO CHANGE WITHOUT
; NOTICE AND SHOULD NOT BE CONSTRUED  AS  A COMMITMENT BY DIGITAL
; EQUIPMENT CORPORATION.
;
; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
;
; D. N. CUTLER 30-JAN-77
;
; MASSBUS ADAPTER INTERRUPT DISPATCHER
;
; MACRO LIBRARY CALLS
;
 
	$DDBDEF				;DEFINE DDB OFFSETS
	$DDTDEF				;DEFINE DDT OFFSETS
	$MBADEF				;DEFINE MBA REGISTER OFFSETS
	$IDBDEF				;DEFINE IDB OFFSETS
	$UCBDEF				;DEFINE UCB OFFSETS
	.PAGE
	.SBTTL	MASSBUS ADAPTER INTERRUPT DISPATCHER
;+
; MBA$INT - MASSBUS ADAPTER INTERRUPT DISPATCHER
;
; THIS ROUTINE IS ENTERED VIA A JSB INSTRUCTION WHEN AN INTERRUPT OCCURS
; ON A MASSBUS ADAPTER. THE STATE OF THE STACK ON ENTRY IS:
;
;	00(SP) = ADDRESS OF IDB ADDRESS.
;	04(SP) = SAVED R2.
;	08(SP) = SAVED R3.
;	12(SP) = SAVED R4.
;	16(SP) = SAVED R5.
;	20(SP) = INTERRUPT PC.
;	24(SP) = INTERRUPT PSL.
;
; INTERRUPT DISPATCHING OCCURS AS FOLLOWS:
;
;	IF THE INTERRUPTING ADAPTER IS CURRENTLY OWNED AND THE OWNER UNIT
;	IS EXPECTING AN INTERRUPT, THEN THAT UNIT IS DISPATCHED FIRST. ALL
;	OTHER UNITS ARE DISPATCHED BY READING THE ATTENTION SUMMARY REG-
;	ISTER AND SCANNING FOR UNITS THAT HAVE ATTENTION SET. AS EACH UNIT
;	IS FOUND, ITS ATTENTION SUMMARY BIT IS CLEARED AND THEN A TEST IS
;	MADE TO DETERMINE IF AN INTERRUPT IS EXPECTED ON THE UNIT. IF YES,
;	THEN THE DRIVER IS CALLED AT ITS INTERRUPT RETURN ADDRESS. ELSE
;	THE DRIVER IS CALLED AT ITS UNSOLICITED INTERRUPT ADDRESS. AS EACH
;	CALL TO THE DRIVER RETURNS, THE ATTENTION SUMMARY REGISTER IS RE-
;	READ AND AN ATTEMPT IS MADE TO FIND ANOTHER UNIT TO DISPATCH. WHEN
;	NO UNITS REQUESTING ATTENTION REMAIN, THE INTERRUPT IS DISMISSED.
;
; TWO CONDITIONS CAUSE ERROR LOG ENTRIES:
;
;	1. A NONEXISTENT (AS FAR AS SOFTWARE IS CONCERNED) UNIT REQUESTS
;	   ATTENTION.
;
;	2. NO UNITS ARE REQUESTING ATTENTION AND THE MBA IS NOT OWNED OR
;	   THE OWNER UNIT IS NOT EXPECTING AN INTERRUPT.
;-
 
	.PSECT	WIONONPAGED
MBA$INT::				;MASSBUS ADAPTER INTERRUPT DISPATCHER
	MOVL	@(SP),R3		;GET ADDRESS OF IDB
	MOVL	IDB$L_CSR(R3),R4	;GET ADDRESS OF CONFIGURATION STATUS REGISTER
	MOVL	IDB$L_OWNER(R3),R5	;GET OWNER UNIT UCB ADDRESS
	BEQL	10$			;IF EQL NO OWNER
	MOVZBL	UCB$B_SLAVE(R5),R2	;GET OWNER SLAVE CONTROLLER NUMBER
	BBS	#UCB$V_INT,UCB$W_STS(R5),30$ ;IF SET, INTERRUPT EXPECTED
10$:	BITL	#^XFF,MBA$L_AS(R4)	;ANY UNIT REQUESTING ATTENTION?
	BEQL	60$			;IF EQL NO
20$:	MOVL	@(SP),R3		;RETRIEVE ADDRESS OF IDB
	MOVL	IDB$L_CSR(R3),R4	;RETRIEVE MBA CONFIGURATION REGISTER ADDRESS
	MCOML	#0,MBA$L_SR(R4)		;CLEAR ALL MBA STATUS BITS
	MOVL	MBA$L_AS(R4),R2		;READ ATTENTION SUMMARY REGISTER
	FFS	#0,#8,R2,R2		;FIND FIRST UNIT REQUESTING ATTENTION
	BEQL	50$			;IF EQL NONE
30$:	ASHL	R2,#1,MBA$L_AS(R4)	;CLEAR ATTENTION SUMMARY BIT
	CMPB	R2,IDB$B_UNITS(R3)	;LEGAL UNIT NUMBER?
	BGEQ	60$			;IF GEQ NO
	MOVL	IDB$L_UCBLST(R3)[R2],R5	;GET ADDRESS OF UCB OR INTERRUPT DISPATCHER
	BLBS	R5,70$			;IF LBS INTERRUPT DISPATCHER ADDRESS
	BBCC	#UCB$V_INT,UCB$W_STS(R5),40$ ;IF CLR, INTERRUPT NOT EXPECTED
	MOVQ	UCB$L_FR3(R5),R3	;RESTORE DRIVER CONTEXT
	JSB	@UCB$L_FPC(R5)		;CALL DRIVER AT INTERRUPT RETURN ADDRESS
	BRB	20$			;
40$:	MOVL	UCB$L_DDB(R5),R3	;GET ADDRESS OF DDB
	MOVL	DDB$L_DDT(R3),R3	;GET ADDRESS OF DDT
	JSB	@DDT$L_UNSOLINT(R3)	;CALL DRIVER AT UNSOLICITED INTERRUPT ADDRESS
	BRB	20$			;
50$:	ADDL	#4,SP			;CLEAN STACK
	POPR	#^M<R2,R3,R4,R5>	;RESTORE REGISTERS
	REI				;
60$:					;********TEMP********
;*********
; LOG UNEXPECTED/UNDEFINED INTERRUPT
;*********
	BRB	20$			;
70$:	MOVPSL	-(SP)			;READ CURRENT PSL
	JSB	-(R5)			;CALL SLAVE CONTROLLER INTERRUPT DISPATCHER
	BRB	20$			;
	.PAGE
	.SBTTL	MASSBUS ADAPTER INITIALIZATION
;+
; MBA$INITIAL - MASSBUS ADAPTER INITIALIZATION
;
; THIS ROUTINE IS CALLED VIA A JSB INSTRUCTION AT SYSTEM STARTUP AND AFTER
; A POWER RECOVERY RESTART TO ALLOW INITIALIZATION OF MASSBUS ADAPTERS.
; 
; INPUTS:
;
;	R4 = CSR ADDRESS OF MASSBUS ADAPTER.
;	R5 = ADDRESS OF ADAPTER IDB.
;
;	ALL INTERRUPTS ARE LOCKED OUT.
;
; OUTPUTS:
;
;	THE MASSBUS ADAPTER IS INITIALIZED AND INTERRUPTS ARE ENABLED.
;-
 
MBA$INITIAL::				;MASSBUS ADAPTER INITIALIZATION
	MOVL	#MBA$M_CR_INIT,MBA$L_CR(R4) ;INITIALIZE MASSBUS ADAPTER
	MOVL	#MBA$M_CR_IE,MBA$L_CR(R4) ;ENABLE INTERRUPTS
	RSB				;
 
	.END
