;<134-TENEX>SSASRV.MAC;16    23-MAY-75 11:39:45    EDIT BY ALLEN
; EXTERNED BUGCHK
;<134-TENEX>SSASRV.MAC;15    22-MAY-75 22:52:49    EDIT BY ALLEN
; REMOVE REFERENCE TO FILEDEF
;<133-TENEX>SSASRV.MAC;14     9-DEC-74 16:18:22    EDIT BY CLEMENTS
; ADDED SPECIFIC BUGCHK IN CASE OF NXM SEEN BY SA10
;<TENEX-132>SSASRV.MAC;13     7-JUN-74 17:05:59    EDIT BY ALLEN
;<TENEX-132>SSASRV.MAC;12     5-JUN-74 18:25:13    EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;11    19-MAY-74 17:46:42    EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;10    13-MAY-74 12:36:22    EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;9     9-MAY-74 08:40:24    EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;8    30-APR-74 22:53:47	EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;7    30-MAR-74 20:28:54	EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;6    30-MAR-74 15:03:04	EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;5    30-MAR-74 14:31:22	EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;4    29-MAR-74 19:34:31	EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;3    29-MAR-74 19:21:08	EDIT BY CLEMENTS
;<TENEX-132>SSASRV.MAC;2    29-MAR-74 19:10:09	EDIT BY CLEMENTS
;<CLEMENTS>SSASRV.MAC;5    23-MAR-74 17:26:22	EDIT BY CLEMENTS
;<CLEMENTS>SSASRV.MAC;4    12-MAR-74 00:13:49	EDIT BY CLEMENTS
;<CLEMENTS>SSASRV.MAC;3    21-FEB-74 11:50:53	EDIT BY CLEMENTS
;<CLEMENTS>SSASRV.MAC;2    19-FEB-74 13:52:22	EDIT BY CLEMENTS
;<CLEMENTS>SSASRV.MAC;1    19-FEB-74 12:14:20	EDIT BY CLEMENTS
; FIRST EDITION OF SSASRV.MAC - RCC - 19 FEB 74
; COPYRIGHT (C) BOLT, BERANEK & NEWMAN, INC., 1974

	SEARCH PROLOG,STENEX	;GET GLOBAL DEFINITIONS

IFDEF SSACHN,<			;CONDITION THIS WHOLE FILE ON EXISTENCE
				; OF SSA DEVICE

	TITLE SSASRV ; COMMON ROUTINE FOR SA10 SUBSYSTEM ADAPTOR
; FOR MAGTAPE AND/OR DISK, AND OTHER IBM DEVICES
	SUBTTL R CLEMENTS, BBN

	SSABAS==:160	; BASE ADDRESS OF UP TO 16. WORDS FOR 4 CHANNELS
	SSA==274	; PDP-10 I/O BUS ADDRESS OF THE SSA

;EXTERNALS

EXTERN SSACHR		; RETURN FROM INTERRUPT
EXTERN DEVMPE		; IN CASE OF PARITY ERRORS
EXTERN BUGCHK
IFDEF SSATF,<
EXTERN MTASV,MTAUNT
>
IFDEF SSADF,<
EXTERN DSKSV,DPDEVL
>

EXTERN BITS,R,SKPRET,BHC,PWRDWN	;USUAL COMMON GLOBALS

;INTERNALS

INTERN SSAINI,SSARST,SSASV

;STORAGE FOR SSA

LS SSAERD,6		; ERROR DATA FROM CHANNEL MEMORY ERRORS
LS SSAACP,1		; SAVE AC P ON INTERRUPT
LS SSAICH,1		; CHANNEL NUMBER WHICH IS INTERRUPTING
LS SSASVR,1		; INTERRUPT RETURN PC

GS SSAMPF,4		; PARITY ERROR FLAG, ONE PER SUBCHANNEL
LS SSAPDL,30		; STACK FOR PI LEVEL


;INITIALIZATION ROUTINE CALLED ON COLD START

SSAINI:	CONO SSA,SA.INI!SA.CME	; CLEAR THE CHANNEL CONTROL
IFDEF SSADF,<
	MOVSI A,(3B1)		; FLAG TO ENTER BLOCK MULTIPLEXOR MODE
	HRRI A,DPDEVL		; LOW CORE ADDRESS OF DISK BMX AREA
	MOVEM A,SSABAS+<4*SSADC> ; CONTROL WORD FOR DISC CHANNEL NUMBER
IFE SA10BF,<
	MOVSI A,(<BMX.T>B7!<I.DDEV>B15)>
IFN SA10BF,<
	MOVSI A,(<BMX.T>B15!<I.DDEV>B7)>
				; SET BMX CONTROL TO "TERMINATED",
	MOVSI B,-NPACKS		;  FOR ALL DRIVES.
SSAIN1:	MOVEM A,DPDEVL(B)	; THIS DRIVE IS "TERMINATED"
IFE SA10BF,<
	ADD A,BITS+^D15>	; ADD 1B15, COUNT DEVICE NUMBER.
IFN SA10BF,<
	ADD A,BITS+7>
	AOBJN B,SSAIN1
	SETZM DPDEVL(B)		; AND A ZERO TO TERMINATE THE LIST
	CONO SSA,SA.PIE!SA.SET!<SSADC>B32 ; TURN ON PI ENB, DSK CHAN
>
IFDEF SSATF,<			; IF TAPES ON SSA
	SETZM SSABAS+<4*SSATC>	; NOT BLOCK MULTIPLEXOR ON TAPES.
>
	CONO SSA,SSACHN		; NOW TURN ON THE PI CHANNEL ASSIGNMENT.
	RET			; BACK TO SYSGO

;RESTART CODE

SSARST:	CONO SSA,SA.INI!SA.CME	; CLEAR THE CHANNEL CONTROLLER

IFDEF SSADF,<
	MOVSI A,(300B7)		;REGENERATE LOW CORE BMX JUMP
	HRRI A,DPDEVL		;TO DISK CONTROL BLOCK
	MOVEM A,SSABAS+<4*SSADC>
;
;RESTART ANY ACTIVE TRANSFERS
;
	CONO SSA,SA.PIE!SA.SET!<SSADC>B32	; ALLOW PI'S FROM DISK
	CONO SSA,SA.GOF!SA.SET!<SSADC>B32	; SET DISK CHAN GO FLAG
>
IFDEF SSATF,<
	SKIPN MTAUNT		;ANY MAGTAPE GOING AT CRASH?
	JRST SSARS1		;NO
;
;RESTART MAGTAPE OP
;
	CONO SSA,SA.GOF!SA.SET!<SSATC>B32	; SET TAPE CHAN GO FLAG
SSARS1:
>
	CONO SSA,SSACHN		; ALLOW PI'S FROM THE SSA
	RET

SSASV:	XWD SSASVR,.+1		; JSYS HERE FROM PISRV ON SSACHN
	CONSO SSA,SA.PIR	; IS THE SSA REQUESTING AN INTERRUPT?
	JRST @SSASVR		; NO.
	MOVEM P,SSAACP		; YES. SET UP A LOCAL STACK
	MOVE P,SSAPDP		; SET UP PI LEVEL STACK
	SKIPE PWRDWN		; IS THE WORLD COMING TO AN END?
	JRST SSAPWF		; YES. POWER FAIL ROUTINE.
	CONI SSA,A		; NORMAL CASE. READ THE STATE OF SA10.
	TRNE A,SA.MPE!SA.NXM	; FATAL MEMORY ERRORS?
	JRST SSAMPE		; YES. BAD NEWS. GO HANDLE.
	ANDI A,17B32		; THE FOUR CHANNELS WHICH COULD MAKE PI.
	JFFO A,.+2		; SEE WHICH ONE.
	JRST SSANCI		; NO CHANNEL INTERRUPTING."CAN'T HAPPEN"
	MOVEI B,-^D29(B)	; SAVE THE CHANNEL NUMBER
	MOVEM B,SSAICH		; AS "INTERRUPTING CHANNEL".
	MOVEI C,(B)		; COPY THE CHANNEL NUMBER, AND CONVERT
	LSH C,2			;  IT TO CORE OFFSET TO CONTROL BLOCK
	ADDI C,SSABAS		; HERE IS THE CHANNEL CONTROL BLOCK
	LDB A,[POINT 8,1(C),23]	; DEVICE NUMBER WHICH CAUSED THIS INT
	MOVE D,1(C)		; CHANNEL AND DEVICE STATUS BYTES
IFDEF SSATF,<			; FOR TAPES ...
	CAIN B,SSATC		; IS IT THE CHANNEL WHICH CONTROLS TAPES
	JRST [	PUSHJ P,MTASV	; YES. CALL DEVICE ROUTINE.
		JRST SSAXT1]	; AND DISMISS INTERRUPT
>
IFDEF SSADF,<			; FOR DISKS ...
	CAIN B,SSADC		; IS IT THE CHANNEL WHICH CONTROLS DISKS
	JRST [	PUSHJ P,DSKSV##	; YES. CALL THE DEVICE ROUTINE
		JRST SSAXT1]	; AND DISMISS INTERRUPT
>
SSANCI:	BUG(CHK,<SSA - INTERRUPT FROM UNUSED CHANNEL>)
SSAXIT:	MOVE B,SSAICH		; GET THE CHANNEL NUMBER WHICH INT'ED
	LSH B,3			; TO CHANNEL SELECTION FIELD
	CONO SSA,SA.STS+SSACHN(B) ; CLEAR THE STATUS INTERRUPT FLAG
SSAXT1:	MOVE P,SSAACP		; RESTORE AC P BEFORE INTERRUPT
	JRST SSACHR		; DISMISS ROUTINE IN PISRV

SSAPWF:
IFDEF SSADF,<			; IF DISKS ON SSA,
	PUSHJ P,DSKPWF##>	; CLEAR THEM
	JRST SSAXT1		; THATS ALL.
SSAMPE:	MOVSI 1,-6		;SIX WORDS OF DIAGNOSTIC DATA
	MOVEI 2,0		; CONO RH
	CONO SSA,0(2)		; SELECT THE WORD
	ADDI 2,10		; SLIGHTLY FASTER BETWEEN 2 I/O INSTS
	DATAI SSA,SSAERD(1)	; GET ERROR INFO
	AOBJN 1,.-3		; LOOP 6 WORDS
	CONO SSA,SA.CME+SSACHN	; LET OTHER CHANNELS GO ON
	TRNE A,SA.NXM		; MEMORY OFF LINE?
	JRST SSANXM		; YES.
	HLRZ 1,SSAERD		; GET CHANNEL USING MEMORY
	ANDI 1,3		; TWO BITS
	AOS SSAMPF(1)		; FOR DEVICE ROUTINE TO SEE IT
	MOVSI 1,(SIXBIT /SSA/)	; ERROR DEVICE
	MOVEM 1,DEVMPE		; FOR CLOCK ROUTINE
	JRST SSAXT1		; DISMISS

SSANXM:	BUG(CHK,<NXM DETECTED BY SA10>)
	JRST SSAXT1

;TABLES OF EXECUTED INSTRUCTIONS, INDEXED BY CHANNEL NUMBER

SSASGO:				; SET GO FLOP FOR SUBCHANNEL
	CONO SSA,SA.GOF!SA.SET!SA.CH0!SSACHN
	CONO SSA,SA.GOF!SA.SET!SA.CH1!SSACHN
	CONO SSA,SA.GOF!SA.SET!SA.CH2!SSACHN
	CONO SSA,SA.GOF!SA.SET!SA.CH3!SSACHN

SSAPDP:	XWD -30,SSAPDL-1		; STACK POINTER

;END OF IFDEF BEFORE TITLE STATEMENT
>

	END

