Google
 

Trailing-Edge - PDP-10 Archives - BB-M080K-SM - monitor-sources/phyh11.mac
There are 47 other files named phyh11.mac in the archive. Click here to see a list.
;------------------------- Autopatch Tape # 12 -------------------------
; UPD ID= 2154, SNARK:<6.1.MONITOR>PHYH11.MAC.14,   5-Jun-85 10:38:54 by MCCOLLUM
;TCO 6.1.1406  - Update copyright notice.
; UPD ID= 1907, SNARK:<6.1.MONITOR>PHYH11.MAC.13,   4-May-85 21:59:07 by MCCOLLUM
;TCO 6.1.1238 - Fix BUG. documentation
; UPD ID= 1784, SNARK:<6.1.MONITOR>APRSRV.MAC.196,  23-Apr-85 12:40:03 by MCCOLLUM
; UPD ID= 4522, SNARK:<6.MONITOR>PHYH11.MAC.12,  13-Jul-84 20:01:07 by PURRETTA
;Update copyright notice
; UPD ID= 1408, SNARK:<6.MONITOR>PHYH11.MAC.11,   3-Nov-82 16:36:03 by MOSER
;TCO 6.1345 - CHANGES TO READ PE FORMAT TAPES WITH CORRECTED ERRORS ON KS
; UPD ID= 860, SNARK:<6.MONITOR>PHYH11.MAC.10,   7-Jun-82 09:41:10 by MURPHY
;TCO 6.1147 - Move bugdefs from BUGS.MAC to here and put them in-line.
; UPD ID= 225, SNARK:<5.MONITOR>PHYH11.MAC.9,  29-Sep-81 09:36:51 by DONAHUE
;TCO 5.1523 - Set CDB offline if can't clear error at CLRRAE
; UPD ID= 1453, SNARK:<5.MONITOR>PHYH11.MAC.8,  20-Jan-81 05:46:32 by WACHS
;TCO 5.1234 ADD DUMMY FOR RETRY MAGTAPE ERRORS IN OPPOSITE DIRECTION
; UPD ID= 578, SNARK:<5.MONITOR>PHYH11.MAC.6,  31-May-80 23:03:10 by DBELL
;TCO 5.1048 - ADD NEW DISPATCH FOR EXTRACTING ADDRESS FROM CCW WORDS
; UPD ID= 482, SNARK:<4.1.MONITOR>PHYH11.MAC.64,  26-Apr-80 11:59:19 by DBELL
;TCO 4.1.1149 - CALL LOWER LEVEL ROUTINES FOR HUNG CALLS
; UPD ID= 361, SNARK:<4.1.MONITOR>PHYH11.MAC.63,  26-Mar-80 11:06:57 by DBELL
;TCO 4.1.1119 - MAKE CHANGES NECESSARY FOR RP20 DISKS
;<4.MONITOR>PHYH11.MAC.62, 20-Sep-79 15:04:36, EDIT BY DBELL
;TCO 4.2476 - ADD DISPATCH FOR UNIT EXISTANCE CHECK
;<OSMAN.MON>PHYH11.MAC.1, 10-Sep-79 15:58:04, EDIT BY OSMAN
;TCO 4.2412 - Move definition of BUGHLTs, BUGCHKs, and BUGINFs to BUGS.MAC
;<4.MONITOR>PHYH11.MAC.60, 17-Aug-79 14:16:00, EDIT BY OSMAN
;CHANGE P2RAE2 TO P2RAEX TO AVOID CONFLICT WITH PHYH2.MAC
;<4.MONITOR>PHYH11.MAC.59,  5-Mar-79 15:45:59, EDIT BY KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<2BOSACK>PHYH11.MAC.4, 14-Feb-79 22:32:17, EDIT BY BOSACK
;<2BOSACK>PHYH11.MAC.3, 14-Feb-79 22:27:45, EDIT BY BOSACK
;HAVE CKERR CHECK TAPE CHAR BIT RATHER THAN UNIT TYPE
;<4.MONITOR>PHYH11.MAC.57, 21-Jan-79 17:53:29, Edit by MCLEAN
;ADD SUPPORT CODE FOR DIAG JSYS .DGPDL
;<4.MONITOR>PHYH11.MAC.56, 10-Jul-78 13:20:35, Edit by MCLEAN
;ADD MORE INFO ON RH11LOST INTERRUPT BUGCHK
;<3A.MONITOR>PHYH11.MAC.53,  7-Jul-78 01:47:02, Edit by MCLEAN
;MAKE TM03'S WORK
;<4.MONITOR>PHYH11.MAC.54,  5-Jun-78 13:17:37, Edit by MCLEAN
;<4.MONITOR>PHYH11.MAC.53,  5-Jun-78 13:15:30, Edit by MCLEAN
;<3A-NEW>PHYH11.MAC.52, 26-May-78 16:19:59, Edit by FORTMILLER
;PUT CODE IN FOR DX20 EVEN THOUGH IT MAY NEVER BE USED
;<3.SM10-RELEASE-3>PHYH11.MAC.95,  8-May-78 11:13:12, Edit by MCLEAN
;REMOVE PHYDLT BUGINF MUTTER MUTTER
;<3A.MONITOR>PHYH11.MAC.50, 27-Apr-78 23:15:29, Edit by MCLEAN
;<3A.MONITOR>PHYH11.MAC.49, 27-Apr-78 21:44:09, Edit by MCLEAN
;<3A.MONITOR>PHYH11.MAC.48, 27-Apr-78 21:16:30, Edit by MCLEAN
;MORE READBACKWARDS
;<3A.MONITOR>PHYH11.MAC.47, 27-Apr-78 00:16:26, Edit by MCLEAN
;MAKE READ BACKWARDS WORK
;<3.SM10-RELEASE-3>PHYH11.MAC.94, 24-Apr-78 14:51:52, Edit by MCLEAN
;STORE LH OF WINDOW (INTERESTING PART ON ERROR)
;<3.SM10-RELEASE-3>PHYH11.MAC.92,  2-Apr-78 15:46:30, Edit by MCLEAN
;FIX ERROR RECOVERY TO USE CDBCNI (UNUSED IN PHYH11) TO BE AN
;INDICATOR AS TO WHETHER DOING DATA OP OR NOT ON XFER COMPLETION
;<3.SM10-RELEASE-3>PHYH11.MAC.91, 31-Mar-78 15:04:03, Edit by MCLEAN
;PUT ERROR REGISTER 2 DEFINITION IN CORRECT PLACE
;<3A.MONITOR>PHYH11.MAC.43, 29-Mar-78 21:18:49, Edit by MCLEAN
;<3.SM10-RELEASE-3>PHYH11.MAC.88, 28-Mar-78 00:23:04, Edit by MCLEAN
;<3.SM10-RELEASE-3>PHYH11.MAC.87, 28-Mar-78 00:21:13, Edit by MCLEAN
;FIX CKERR TO RETURN CHANNEL ERROR CORRECTLY
;<3.SM10-RELEASE-3>PHYH11.MAC.86,  7-Mar-78 15:40:47, Edit by MCLEAN
;SOME CODE CLEANUPS
;<3A.MONITOR>PHYH11.MAC.38,  3-Mar-78 16:13:00, Edit by MCLEAN
;<3.SM10-RELEASE-3>PHYH11.MAC.85,  3-Mar-78 13:35:36, Edit by MCLEAN
;FIX UBGOOD CALL
;<3.SM10-RELEASE-3>PHYH11.MAC.32, 22-Feb-78 16:32:23, Edit by MCLEAN
;MAKE IT WORK IF RH IS NOT THERE
;<3.SM10-RELEASE-3>PHYH11.MAC.32, 22-Feb-78 16:32:23, Edit by MCLEAN
;MAKE IT WORK IF RH IS NOT THERE
;<4.MONITOR>PHYH11.MAC.34,  1-Feb-78 14:50:07, Edit by MCLEAN
;FIX PHYALC FOR NEW CALLING SEQ
;<4.MONITOR>PHYH11.MAC.33, 30-Jan-78 21:31:04, Edit by MCLEAN
;ADD CHANGES FOR UNIT GOING ON LINE
;<1MCLEAN>PHYH11.MAC.3, 25-Jan-78 15:19:16, Edit by MCLEAN

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY  BE  USED
;OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT  (C)  DIGITAL  EQUIPMENT  CORPORATION  1976, 1985.
;ALL RIGHTS RESERVED.


	SEARCH PROLOG		;PARAMETER FILE
	TTITLE (PHYH11,,< - CHANNEL DEPENDENT CODE FOR RH11 CONTROLLER>)
	SUBTTL R. MCLEAN (FROM PHYH2 T. HESS,T. WACHS,L. BOSACK)
	SEARCH PROKS
	SEARCH PHYPAR		;PHYSIO PARAMETERS

	SUBTTL PARAMETERS

; DEVICE EPENDENT STUFF


;DEVICE INDEPENDENT REGISTERS

DO.AS==4B5			;ATTENTION SUMMARY REGISTER
DO.DA==5B5			;DESIRED ADDRESS REGISTER
DO.DT==6B5			;DRIVE TYPE REGISTER

DO.LR==1B6			;LOAD REGISTER ENABLE
DO.DRE==1B9			;DISABLE RAE STOP

;DEVICE DEPENDENT DEFINITIONS IN THE CDB

RC1CS1==CDBDDP+0		;CONTROL STATUS 1
RC1DS==CDBDDP+1			;DRIVE STATUS REGISTER
RC1ER1==CDBDDP+2		;ERROR REGISTER 1
RC1MR==CDBDDP+3			;MAINT REGISTER
RC1AS==CDBDDP+4			;ATTENTION SUMMARY REGISTER
RC1DA==CDBDDP+5			;DESIRED ADDRESS REGISTER
RC1DT==CDBDDP+6			;DRIVE TYPE REGISTER
RC1LA==CDBDDP+7			;LOOK AHEAD REGISTER
RC1SN==CDBDDP+10		;SERIAL NUMBER REGISTER
RC1OF==CDBDDP+11		;OFFSET REGISTER
RC1DC==CDBDDP+12		;DESIRED CYL REGISTER
RC1CA==CDBDDP+13		;CURRENT CYL REGISTER
RC1ER2==CDBDDP+14		;ERROR REGISTER 2
RC1ER3==CDBDDP+15		;ERROR REGISTER 3
RC1EC1==CDBDDP+16		;ECC REGISTER 1
RC1EC2==CDBDDP+17		;ECC REGISTER 2
RC1WC==CDBDDP+20		;WORD COUNT REGISTER
RC1BA==CDBDDP+21		;CURRENT ADDRESS REGISTER
RC1CS2==CDBDDP+22		;CONTROL AND STATUS REGISTER 2
RC1CNT==23			;COUNT OF ABOVE REGISTERS
UBADSW==CDBDDP+23		;UNIBUS STATUS REGISTER ADDRESS
UBBASA==CDBDDP+24		;UNIBUS BUS ADDRESS BASE ADDRESS

L.RH2==CDBDDP+RC1CNT-CDBINT+2	;LENGTH OF RH11 CDB

CHXFR==1B0			;INDICATE XFER WORD
CHJMP==1B1			;INDICATE CHANNEL JUMP
CHLST==1B1			;INDICATE LAST XFER
CHREV==1B2			;INDICATE REVERSE

CCYADR:	POINT 22,T1,35		;BYTE POINTER TO CCW ADDRESS FIELD
CCYCNT:	POINT 11,T1,13		;BYTE POINTER TO CCW COUNT FIELD

;BITS IN CHANNEL LOGOUT AREA

CS1MPE==1B1			;MEMORY PARITY ERROR
CS1NSE==1B2			;NEGATION OF SBUS ERR
CS1NC0==1B3			;NEGATION OF WORDCOUNT = 0
CS1NXM==1B4			;NONEXISTANT MEMORY
CS1LTE==1B9			;LAST TRANSFER ERROR
CS1RHE==1B10			;RH11 ERROR
CS1LWC==1B11			;LONG WORD COUNT (RH11 FINISHED BEFORE CHANNEL)
CS1SWC==1B12			;SHORT WORD COUNT (CHANNEL FINISHED BEFORE RH11)
CS1OVR==1B13			;OVERRUN (MBOX BUFFER)

;SOFTWARE FLAGS IN FUNCTION (USED BY CHSTRT)
ERETRY==200
RQDUBW==MAXPPB			;NUMBER OF UNIBUS WINDOWS TO ALLOCATE
;RH11 CHANNEL STATUS BITS


;STATUS BITS IN CONTROL AND STATUS 1
RH1SC==1B20		;SPECIAL CONDITION
RH1TRE==1B21		;TRANSFER ERROR
RH1CPE==1B22		;MASS I/O CONTROL PARITY ERROR
RH1PSL==1B25		;PORT SELECT
RH1UAD==3B27		;UNIBUS ADDRESS EXTENSION BITS
RH1RDY==1B28		;READY
RH1IE==1B29		;INTERRUPT ENABLE
RH1ERR==RH1TRE!RH1CPE 	;BITS THAT CAUSE ERRORS

;STATUS BITS IN CONTROL AND STATUS 2

RH1DLT==1B20		;DATA LATE
RH1WCE==1B21		;WRITE CHECK ERROR
RH1PE==1B22		;PARITY ERROR
RH1NED==1B23		;NON EXISTENT DISK
RH1NEM==1B24		;NON EX MEMORY
RH1PGE==1B25		;PROGRAM ERROR
RH1MXF==1B26		;MISSED TRANSFER
RH1MDP==1B27		;MASS BUS PARITY ERROR
RH1CLR==1B30		;CONTROLLER CLEAR (ALSO CLEARS DRIVES)
RH1UNI==7B35		;UNIT SELECT BITS

; ERROR REGISTER 1 DEFINITIONS

ER.CPE==1B32			;CONTROL BUS PARITY ERROR
ER.FCE=1B26			;FRAME COUNT ERROR

RHOFF:	BYTE (6)0,12,14,24,16,6
	BYTE (6)26,20,30,32,34,36
	BYTE (6)40,42,44,46,2,4
	BYTE (6)10


; CHANNEL ADDRESS TABLE

RH1CTB:	RH11CA			;ADDRESS OF CHANNEL 0
	RH21CA			;ADDRESS OF CHANNEL 1
RH1CTZ==.-RH1CTB		;SIZE OF RH11 CHANNEL TABLE

RH1IVT:	RH11IV/4		;UNIBUS ADAPTER #,,INTERRUPT VECTOR ADDRESS CHANNEL 0
	RH21IV/4		;UNIBUS ADAPTER #,,INTERRUPT VECTOR ADDRESS CHANNEL 1
;CHANNEL DISPATCH TABLE FOR RH11

RH2DSP::JRST RH2INI		;0 - INITIATION
	RET			;1 - STACK CHAN COMMAND - RETURN FAILURE ON RH11
	JRST RH2SIO		;2 - START I/O
	JRST RH2POS		;3 - POSITION REQUEST
	JRST RH2LTM		;4 - RETURN BEST XFER
	JRST RH2INT		;5 - INTERRUPT PROCESSING
	JRST RH2CCW		;6 - MAKE CHANNEL XFER WORD
	JRST RH2HNG		;7 - TRANSFER HUNG
	JRST RH2RST		;10 - RESET CHANNEL
	JRST RH2CHK		;11 - PERIODIC CHECK
	JRST EXTKDB		;12 - CHECK UNIT EXISTANCE
	JRST RH2CCA		;13 - EXTRACT ADDRESS FROM CCW WORD

;DUMMIES

RH2LTM:	RET
	SUBTTL INITIALIZATION

RH2INI:	MOVE Q1,RH1CTB		;GET CHANNEL ADDRESS
	PUSH P,[0]		;SAVE ON PDL
RH2NCH:	MOVE T1,Q1		;GET ADDRESS OF DEVICE
	CALL UBGOOD		;CHECK TO SEE IF IT EXISTS
	JRST RH2NOU		;NOT HERE FORGET IT
	MOVEI T1,L.RH2		;GET LENGTH OF CDB
	CALL PHYALC		;ALLOCATE SOME STORAGE
	JRST PA1		;FAILURE QUIT INITALIZATION
	MOVEI P1,-CDBINT(T1)	;CDB BASE ADDRESS TO P1
	MOVEM P1,CHNTAB(P4)	;SAVE CDB IN CHANNEL TABLE
	HRRZM P4,CDBADR(P1)	;STORE CHNTAB INDEX
	AOS P4			;ADVANCE TO NEXT
	MOVE T2,0(P)		;FIND CHANNEL NUMBER
	HLRZ T1,RH1CTB(T2)	;GET UNIBUS ADAPTER NUMBER
	MOVEI T2,RQDUBW		;NEED WINDOWS
	CALL ALUBWA		;ALLOCATE WINDOW
	BUG.(HLT,NOUBWA,PHYH11,SOFT,<RH2NCH - No unibus window for RH11>,,<

Cause:	This BUGHLT can only occur on the 2020. It happens when the call to
	ALUBWA from the disk initialization code gets a failure return.
	The only reason ALUBWA would give such a failure return is if no
	more unibus adapter windows are available.
>)
	MOVEM T1,UBADSW(P1)	;SAVE ADDRESSES
	MOVEM T2,UBBASA(P1)	;SAVE UNIBUS BASE ADDRESS
	MOVEI T1,.CTRH3		;SET TYPE
	DPB T1,CSYTYP		;..
	MOVEI T4,RC1CS1(P1)	;START THE SAVE OF ADDRESSES
	MOVNI T1,RC1CNT		;GET SIZE OF TABLE
	MOVE T2,[POINT 6,RHOFF] ;GET ADDRESS TABLE
RH11DL:	ILDB T3,T2		;FIND THE OFFSET
	ADD T3,Q1		;CREATE AN ADDRESS
	MOVEM T3,0(T4)		;STORE IN CDB
	AOS T4			;POINT TO NEXT
	AOJL T1,RH11DL		;DO ALL REGISTERS
	MOVEI T3,CDBINT(P1)	;ADDRESS FOR XPCW ON INTERRUPT
	HRLI T3,(<XPCW>)	;BUILD INSTRUCTION
	MOVE T1,0(P)		;GET CHANNEL NUMBER
	HLRZ T2,RH1CTB(T1)
	HRRZ T1,RH1IVT(T1)	;GET VECTOR
	ADD T1,SMTEPT(T2)	;AND TABLE ADDRESS
	MOVEM T3,0(T1)		;STORE XPCW IN INTERRUPT VECTOR LOCATION
	MOVEI T3,CDBINT+4(P1)	;SET JUMP ADDRESS
	MOVEM T3,CDBINT+3(P1)	;SET IN XFER VECTOR
	SETZM CDBINT+2(P1)	;SET FLAGS TO 0
	MOVEI T1,KIEPT		;ADDRESS OF CHANNEL ICP AREA
	HRRM T1,CDBICP(P1)	;STASH IN CDB
; ...
	MOVE T1,[MOVEM P1,CDBSVQ]
	ADDI T1,0(P1)		;INSTRUCTION TO STORE P1 IN CDB
	MOVEM T1,CDBINT+4(P1)	;BUILD INTERRUPT CODE
	MOVE T1,[JSP P1,PHYINT]
	MOVEM T1,CDBINT+5(P1)	;DISPATCH TO PHYSIO
	MOVE T1,[BLT 17,17]	;INSTRUCTION TO RESTORE ACCUMULATORS
	MOVEM T1,CDBJEN(P1)	;PUT IN CDB
	MOVEI T1,CDBRST(P1)	;BUILD DATAO CDBRST, TO RESET THE
	MOVEI T1,CDBINT(P1)	;ADDRESS OF INTERRUPT PC
	HRLI T1,(<XJEN 0>)	;BUILD XJEN INSTRUCTION
	MOVEM T1,CDBJEN+1(P1)	;STORE
	MOVEI T1,RH2DSP		;INSERT DISPATCH VECTOR
	MOVEM T1,CDBDSP(P1)	;SET UP DISPATCH
				;NOW FIND UNITS & TYPES
	MOVE Q3,[-MAXRH,,CDBUDB] ;AOBJN POINTER TO UDB TABLE
	ADDI Q3,0(P1)		;RELOCATE POINTER
	MOVEM Q3,CDBCUN(P1)	;STORE IN CDB
	MOVEM Q3,CDBIUN(P1)	;...
	SETOM CDBXFR(P1)	;INDICATE CHANNEL FREE
	MOVEI Q2,0		;FIRST UNIT #
RH2UNL:	MOVEI T2,RH1CLR		;RESET CONTROLLER ERRORS
	WRIO T2,@RC1CS2(P1)
	SETZM P3		;IN CASE NOT WANTED
	SETOM P5		;INDICATE TO CREATE ALL UDBS AND KDBS
	CALL RH2UNS		;SELECT A UNIT
RH2NXU:	MOVEM P3,0(Q3)		;STORE IN CDB IF ANY (0 IF NONE)
	AOS Q2			;NEXT UNIT #
	AOBJN Q3,RH2UNL		;KEEP GOING
	MOVE T1,CDBIUN(P1)	;CHECK IF ANY DEVICES FOUND.
	SETOM CDBXFR(P1)	;SET NO TRANSFER IN PROGRESS
	SETZ T2,0		;UNIT 0
RH2CKU:	SKIPE (T1)		;UNIT PRESENT?
	JRST RH2NXT		;YES, GO ON TO NEXT CHANNEL
	AOS T2			;NEXT UNIT NUMBER IN CLEAR REQUEST
	AOBJN T1,RH2CKU		;NO, LOOP FOR MORE
	MOVSI T1,(CS.OFL)	;NONE PRESENT, MARK OFFLINE.
	IORM T1,CDBSTS(P1)	; ...
	JRST RH2NOU		;NO UNIT FOUND
;THE FOLLOWING SEQUENCE IS REQUIRED BECAUSE THE RH11 REQUIRES
;THAT A CLEAR INSTRUCTION BE FOLLOWED IMMEDIATELY BY A SELECTION
;OF AN EXISTANT UNIT NUMBER OTHERWISE ANY ATTEMPT TO ACCESS
;A REGISTER THAT IS NOT IN THE RH (CS1) WILL CAUSE
;MASSBUS PARITY ERRORS.

RH2NXT:	MOVEI T1,RH1CLR		;CLEAR RH11
	WRIO T1,@RC1CS2(P1)	;ISSUE CLEAR
	WRIO T2,@RC1CS2(P1)	;CLEAR CONTROLLER
	MOVEI T1,RH1IE+RH1TRE	;RESET AND ENABLE INTERRUPTS
	WRIO T1,@RC1CS1(P1)
RH2NOU:	AOS Q1,0(P)		;LOOK AT NEXT AND RESTORE DEVICE CODE
	CAIL Q1,RH1CTZ		;BEYOND LAST?
	JRST PA1		;PRUNE AND EXIT
	MOVE Q1,RH1CTB(Q1)	;GET NEXT CHANNEL ADDRESS
	JRST RH2NCH		;TRY NEXT


; ROUTINE TO DETERMINE THE SPECIFIC UNIT TYPES AND
; REQUEST KDB AND UDB POINTERS BE SET UP



RH2UNS::WRIO Q2,@RC1CS2(P1)	;SET UNIT NUMBER
	MOVEI T1,1		;ISSUE A NOP TO GET NED
	WRIO T1,@RC1CS1(P1)
	RDIO T1,@RC1CS2(P1)	;CHECK FOR ERROR
	TRNE T1,RH1NED		;NON EX DEVICE?
	RET			;YES, NEXT UNIT
RH2UNA:	RDIO T1,@RC1DT(P1)	;GET DRIVE TYPE
	LDB T1,[POINT 9,T1,35]	;GET DEVICE TYPE CODE
	CAIG T1,TY.RPH		;WITHING RP04,5,6 RANGE?
	CAIGE T1,TY.RPL		; ??
	SKIPA			;NO
	JRST RH2IRP		;YES - INITIALIZE IT
	CAIN T1,TY.RS4		;RS04 TYPE?
	JRST RH2IRS		;YES - INITIALIZE IT
	CAIN T1,TY.DXA		;DX20 TYPE?
	JRST RH2IDX		;YES, INITIALIZE IT
	CAIG T1,TY.T3H		;WITHIN TM03 RANGE?
	CAIGE T1,TY.T3L		;
	SKIPA			;NO
	JRST RH2ITM		;YES
	CAIG T1,TY.T2H		;GREATER THAN HIGHEST TM02 TYPE
	CAIGE T1,TY.T2L		;OR LOWER THAN LOWEST?
	RET			;YES - NOT TM02
	JRST RH2ITM		;IS TM02 - GO INITIALIZE
;ROUTINE TO INVOKE RP04/RS04 INITIATION

RH2IRS:	SKIPA T1,[.UTRS4]	;RS04 TYPE
RH2IRP:	MOVEI T1,.UTRP4		;RP04 TYPE
	CALL FNDUTP		;FIND TABLE ENTRY
	 CALL UDSINI(T1)	;CALL INITIALIZE IF FOUND
	RET			;ADVANCE TO NEXT UNIT

;HERE TO INITIALIZE A DX20

RH2IDX:	MOVX T1,.UTDXA		;SEARCH FOR
	JRST RH2ITD		; A DX20

;HERE TO INITIALIZE A TM02

RH2ITM:	MOVEI T1,.UTTM2		;SEARCH FOR TM02
RH2ITD:	MOVEI P2,0		;IN CASE NOT FOUND IN TABLES
	CALL FNDUTP		; ...
	 CALL UDSINI(T1)	;FOUND - CALL INITIALIZE, RETURN KDB IN P2
	MOVE P3,P2		;COPY KDB TO WHERE COMMON CODE WANTS IT
	RET			;LOOP FOR MORE

;ROUTINE TO SCAN CHANNEL/UNIT TABLES FOR TYPE GIVEN IN T1
;RETURNS TABLE ENTRY IN T1 (SKIP RETURN ON NOT FOUND)

FNDUTP:	MOVE T2,[PHYUNL,,PHYUNT] ;ENTRY FOR UNIT TABLE
FNDTPL:	HLRZ T3,0(T2)		;GET LH = TYPE CODE
	CAME T1,T3		;TYPES MATCH?
	AOBJN T2,FNDTPL		;NO - TRY NEXT
	JUMPGE T2,RSKP		;SKIP RETURN IF NO MATCH
	HRRZ T1,0(T2)		;MATCH - GET DISPATCH ADDRESS
	RET			;RETURN
	SUBTTL START I/O AND POSITIONING

;HERE TO START POSITIONING (P3 := UDB)

RH2POS:	HRRZ T1,UDBDSP(P3)	;ADDRESS OF DEVICE ROUTINE
	JRST UDSPOS(T1)		;START IT

;HERE TO START ACTUAL OPERATION (P3 := UDB , P4 := IORB)

RH2SIO:	HRRZ T1,UDBDSP(P3)	;DISPATCH TO DEVICE CODE
	CALL UDSSIO(T1)		;ATTEMPT TO START IO
	 JRST CLRCHL		;LOSE
	RETSKP			;WIN
	SUBTTL HUNG, RESET AND CHECK ENTRIES
;HERE ON A HUNG TRANSFER
;CALLED WITH PI OFF

RH2HNG:	CALL CLRRAE		;CLEAR POSSIBLE RAE
	MOVEI T1,RH1CLR		;CLEAR RH11
	WRIO T1,@RC1CS2(P1)
	WRIO T2,@RC1CS2(P1)
	CALL CLRCHL		;RESET THE CHANNEL
	HRRZ T1,UDBDSP(P3)	;GET DISPATCH ADDRESS
	CALLRET UDSHNG(T1)	;CLEAR THE CONTROLLER AND UNIT ALSO

;HERE TO RESET THE CHANNEL AND ALL UNITS
;T1/ 0 TO RESET JUST THE CHANNEL
;T1/ 1 FOR FULL RESET

RH2RST:	JUMPE T1,CLRCHL		;SIMPLE RESET
	JRST RH2HNG


;HERE EVERY NOW AND THEN (ABOUT 1 SEC) TO CHECK PIA.

RH2CHK:	MOVSI T1,(CS.OFL)	;CHECK FOR OFF LINE
	TDNE T1,CDBSTS(P1)
	RET			;OFF LINE IGNORE THIS REQUEST
	MOVEI T1,RH1IE		;CHECK FOR INTERRUPT ENABLE
	TIOE T1,@RC1CS1(P1)	;ON?
	RET			;YES ALL OK
	MOVE T2,RC1CS1(P1)	;GET FAILURE ADDRESS
	BUG.(CHK,PH1PIE,PHYH11,HARD,<PHYH11 - RH11 lost interrupt enable>,<<T2,RH11STS>>,<

Cause:	An RH11 is no longer enabled for interrupts. TOPS-20 will enable
	interrupts for the RH11.

Data:	RH11STS - RH11 status

>)
	BSIO T1,@RC1CS1(P1)	;SET INTERRUPT ENABLE (THIS WILL CAUSE IMMEDIATE INTERRUPT!)
	RET
	SUBTTL CHANNEL UTILITY ROUTINES

;DUMMY ROUTINE TO SATISYY GLOBALS
REVCCW::RET

;ROUTINE TO READ A MASS-BUSS REGISTER
;CALL - C(T2) := REGISTER TO BE READ
;	C(P3) := UDB POINTER
;	C(P1) := CDB POINTER
;RETURNS VALUE IN T1 , PRESERVES T4

RDREG::	HRRZ T3,UDBAKA(P3)	;GET UNIT #
	SKIPL T2		;INTERNAL REGISTER?
	TLO T2,(DO.DRE)		;NO - TRY FIRST WITH DRAES ON
	TLOA T2,(T3)		;SET UNIT NUMBER
RDREG3::TLO T2,<(DO.DRE)>(Q2)	;UNIT # IN Q2
	LDB T1,[POINT 3,T2,17]	;GET THE UNIT NUMBER
	WRIO T1,@RC1CS2(P1)	;SET THE UNIT NUMBER
RDREGX:	MOVEI T3,^D10		;INITIALIZE RETRY COUNTER
RDREGL:	LDB T1,[POINT 6,T2,5]	;GET THE REGISTER NUMBER
	ADD T1,P1		;POINT TO REGISTER ADDRESS
	RDIO T1,@RC1CS1(T1)	;READ REGISTER
	PUSH P,T1		;SAVE RESULT
	RDIO T1,@RC1CS2(P1)	;CHECK FOR DRIVE
	TRNE T1,RH1NED		;NON EX DISK?
	JRST RDRAE		;YES - BAD NEWS
RDRAE1:
	RDIO T1,@RC1CS1(P1)	;READ STATUS REGISTER
	TRNE T1,RH1CPE		;CONTROL BUS PAR ERR?
	JRST RDREGE		;YES - ERROR
RDEXIT:	POP P,T1		;RSTORE RESULT
	ANDI T1,177777		; CLEAR OUT GARBAGE
	RET			;EXIT

;HERE WHEN CBPE OR MISSING TRA

RDREGE:	SOJG T3,RDREGA		;LOOP IF RETRY STILL POSITIVE
	TLZ T2,(DO.DRE)		;TRY ONE MORE TIME - IF RAE, BOMB WORLD
	JUMPL T3,RDEXIT		;IF NOW NEGATIVE, DEPART, TRAGIC ERROR
RDREGA:	POP P,T1		;RESTORE REGISTER
	JRST RDREGL		;TRY AGAIN

;HERE WHEN A REGISTER ACCESS ERROR IS DETECTED

RDRAE:	PUSH P,T2		;SAVE ANOTHER REGISTER
	TLNE T2,(DO.DRE)	;DRAES?
	JRST RDRAE2		;YES - JUST CLEAR RAE
	BUG.(CHK,P1NED1,PHYH11,HARD,<PHYH11 - RH11 non existent disk reading register>,<<T1,RH11STS1>,<T2,RH11STS2>>,<

Cause:	This BUG is not documented yet.

Data:	RH11STS1 - RH11 status register 1
	RH11STS2 - RH11 status register 2
>)
	CALL CLRRAE		;RESET RAE
	POP P,T2		;RESTORE REGISTERS
	JRST RDEXIT		;ALL WE COULD DO...

RDRAE2:	CALL CLRRAE		;CLEAR ERROR
	POP P,T2
	JRST RDRAE1		;CONTINUE ATTEMPT
;ROUTINE TO WRITE A MASS-BUSS REGISTER
;CALL - C(T2) := REGISTER TO BE WRITTEN & DATA
;	C(P1) := CDB , C(P3) := UDB
;PRESERVES T1,T4

WTREG::	HRRZ T3,UDBAKA(P3)	;GET UNIT #
	TLOA T2,(T3)		;SET IN LHS AND LR ENABLE
WTREG3::TLO T2,(Q2)		;SET LR AND UNIT NUMBER FROM Q2
	PUSH P,T1		;SAVE A REGISTER
	HLRZ T1,T2
	ANDI T1,7		;MAKE UNIT NUMBER
	WRIO T1,@RC1CS2(P1)	;SET UNIT NUMBER
	SKIPA
WTREGX:				;WRITE A REGISTER WHEN THE DRIVE NUMBER DOESNT MATTER
	PUSH P,T1		;SAVE REGISTER
	LDB T1,[POINT 6,T2,5]	;GET THE COMMAND NUMBER
	SKIPN T1		;SET INTERRUPT ENABLE IF REGISTER 0
	IORI T2,RH1IE
	ADD T1,P1		;FIND ADDRESS OF REGISTER
	WRIO T2,@RC1CS1(T1)	;WRITE THE REGISTER
	RDIO T1,@RC1CS1(P1)	;READ THE STATUS BACK
	TRNE T1,RH1NED		;NON EX DISK?
	JRST WTRAE		;YES - BAD NEWS
	RDIO T1,@RC1ER1(P1)	;CHECK FOR CONTROL BUS PARITY ERRORS
	TRNE T1,ER.CPE		;YES?
	BUG.(CHK,P11PAR,PHYH11,HARD,<PHYH11 - Control write parity error>,<<T1,RH11ERR>,<T2,REG>>,<

Cause:	A parity error occurred while writing an RH11 register.

Data:	RH11ERR - RH11 error register
	REG - Word written to status register
>)
	POP P,T1		;NO - RESTORE REGISTER
	RET			;RETURN

;HERE WHEN NED ON WRITE

WTRAE:	PUSH P,T3		;SAVE REGISTER
	RDIO T3,@RC1CS1(P1)
	BUG.(CHK,P2RAEX,PHYH11,HARD,<PHYH11 - Register access error writing reg>,<<T1,RH11ERR>,<T2,REG>,<T3,RH11STS>>,<

Cause:	TOPS-20 attempted to write an RH11 register but got a "non-existent
	disk" error.

Data:	RH11ERR - RH11 error register
	REG - Word written to status register
	RH11STS - RH11 status register
>)
	MOVE T3,T2		;SAVE ATTEMPTED REGISTER
	CALL CLRRAE		;CLEAR RAE
	MOVE T2,T3		;RESTORE
	POP P,T3		;RESTORE
	POP P,T1
	RET

;HERE TO CLEAR RAE

CLRRAE:	SETZ T2,0		;STOP CURRENT TRANSFER
	MOVE T1,CDBIUN(P1)	;GET UNIT TABLE
NOTQUI:	MOVEI T4,RH1CLR		;CLEAR RH
	WRIO T4,@RC1CS2(P1)
	WRIO T2,@RC1CS2(P1)	;WRITE UNIT NUMBER
	AOBJN T1,CLRRA1		;TRY NEXT SLOT
	MOVSI T1,(CS.OFL)	;SET IT OFFLINE
	IORM T1,CDBSTS(P1)
	BUG.(CHK,CLRACE,PHYH11,HARD,<Unable to clear register access error>,,<

Cause:	This BUGCHK occurs only on the 2020.  It will happen if the
	CLRRAE routine fails to find an existing unit.  The CLRRAE is looking
	for an existing unit to select in order to clear the register access
	error.

	If no existent unit is found, the attempt to clear the register
	access error will cause another error immediately, so the BUGCHK
	is provided to indicate that none was found. The CDB is then
	set offline. The set online function of DIAG% can be used to turn it
	back online when the problem is corrected.
>)
	JRST XINT		;DISMISS THE INTERRUPT
CLRRA1:	RDIO T4,@RC1CS1(P1)	;FORCE AN ERROR BY GOING TO DRIVE
	MOVEI T4,RH1NED		;CHECK TO SEE IF IT IS STILL THERE
	TIOE T4,@RC1CS2(P1)
	AOJA T2,NOTQUI		;NOT QUITE THIS ONE DISAPPEARED
	MOVEI T2,RH1TRE!RH1IE	;CLEAR CONTROLLER ONLY
	WRIO T2,@RC1CS1(P1)	;CLEAR
	RET
;ROUTINE TO CLEAR RH20 CONTROLLER

CLRCHL::
ZAPCHL::MOVEI T1,RH1TRE!RH1IE	;RESET INTERRUPTING BITS
	WRIO T1,@RC1CS1(P1)
	RET			;RETURN
;ROUTINE TO START CHANNEL I/O
;CALLED WITH PI OFF
;C(T2) := DATAO , C(Q1) := FUNCTION , C(P3) := UDB POINTER
;C(Q1) = -1 IMPLIES ONLY DATAO FROM T2
;GIVES SKIP RETURN TO SHOW ALL OK

CHSTRT::SKIPE T2		;CHECK FOR VALID OPS
	SKIPN Q1		; ...
	BUG.(HLT,RH1ICF,PHYH11,SOFT,<PHYH11 - Invalid channel function>,,<

Cause:	This BUGHLT can only happen on the 2020. The CHSTRT routine is
	called to perform disk operations.  On the call, Q1 is supposed to
	contain a function code, and T2 is supposed to contain the value to
	be used for a DATAO.  However, -1 in Q1 denotes that T2 contains
	the DATAO but that no function is to be done.

	The BUGHLT will occur if T2 is 0, or if T2 is non-0 and Q1 is 0,
	which can only occur due to some caller supplying CHSTRT with
	bad arguments.
>)
	HRRZ T1,UDBAKA(P3)	;GET UNIT NUMBER
	WRIO T1,@RC1CS2(P1)	;SET UNIT NUMBER SELECT
	CAMN Q1,[EXP -1]	;NON CHANNEL FUNCTION
	JRST CHST2		;DO JUST 1 DATAO
	CAIGE Q1,50		;DATA TRANSFER OPERATION?
	JRST CHST1		;NO
	SETOM CDBCNI(P1)	;INDICATE NOW DOING DATA XFER OPERATION
	PUSH P,T2		;SAVE DATAO
	PUSH P,UBADSW(P1)	;SAVE ADDRESS OF UNIBUS WINDOW
	PUSH P,UBBASA(P1)	;SAVE PDP11 ADDRESS
	PUSH P,Q2		;SAVE ANOTHER REGISTER
	MOVSI T2,(CS.ACL)	;TOGGLE  CCW LIST
	XORM T2,CDBSTS(P1)
	MOVEI T1,CDBCCL(P1)	;YES - DO SETUP
	MOVEI T2,CDBCCL+1(P1)
	TRZN Q1,ERETRY		;ECC RETRY?
	CALL PHYXFL		;NO - GET HEAD OF TRANSFER LIST
	MOVE T4,T1		;SAVE VIRTUAL ADDRESS
	MAP T1,(T1)		;GET PHYSICAL ADDRESS
	TLZ T1,777760		;FLUSH ACCESS BITS ETC
	TLO T1,(CHJMP)		;BUILD CHANNEL JUMP
	HRRZ T3,CDBICP(P1)	;AND STORE IN
	MOVEM T1,(T3)		;CHANNEL ICPC
	SETZM 1(T3)		;CLEAR CS1
	MOVE T1,0(T4)		;SET UP THE ADDRESS DEPENDENT REGISTERS
	MOVEM T1,2(T3)		;SAVE INITIAL CCW
	MOVSI T3,(CHLST)	;SET LAST TRANSFER
	IORM T3,-1(T2)		;IN CCW LIST
	SETZ Q2,0		;SET BYTE COUNT TO 0
	TLNE T1,(CHREV)		;CHECK FOR REVERSE READ
	JRST [	MOVEI T2,<RQDUBW-1>*4000+2 ;FIND END OF ADDRESS SPACE
		ADDM T2,UBBASA(P1) ;UPDATE POINTER
		MOVEI T2,RQDUBW-1 ;ALSO WINDOW POINTER
		ADDM T2,UBADSW(P1)
		JRST .+1]
	LDB T2,CCYADR		;FIND THE CURRENT ADDRESS
	ANDI T2,777		;FIND A UNIBUS ADDRESS
	LSH T2,2		;MAKE INTO UNIBUS ADDRESS
	ADD T2,UBBASA(P1)	;GET THE UNIBUS OFFSET
	WRIO T2,@RC1BA(P1)	;SET THE BUS ADDRESS
	LSH T2,-^D8		;MOVE HIGH ORDER ADDRESS BITS TO CONTROL
	ANDI T2,1400		;CORRECT POS FOR CONTROL STATUS REG
	IORM T2,Q1		;STORE IN COMMAND REGISTER WORD
CHSLP:	MOVE T1,0(T4)		;GET CHANNEL COMMAND
	LDB T2,CCYCNT		;GET THE COUNT
	MOVNS T2		;SET TO NEGATIVE
	LSH T2,1		;MAKE PDP11 WORD COUNT
	ADD Q2,T2		;UPDATE WORD COUNT
	LDB T2,CCYADR		;GET REST OF ADDRESS
	SKIPN T2
	BUG.(HLT,RH11CC,PHYH11,SOFT,<PHYH11 - Illegal channel command word>,,<

Cause:	This BUGHLT can only occur on the 2020. This BUGHLT will happen if
	the CHSTRT routine encounters an address of 0 in the channel
	control word.  The right half of the channel control word is the
	address.
>)
	LSH T2,-^D9		;GET PAGE NUMBER
	MOVSI T3,(US.TAP)	;MAGTAPE?
	TDNE T3,UDBSTS(P3)
	JRST [	TLNE T1,(CHREV)	;YES CHECK FOR READ/REVERSE
		TROA T2,UNBVBT!UNBRPW ;SET READ/PAUSE WRITE
		TRO T2,UNBVBT	;NOT BACKWARDS ONLY VALID BIT
		JRST .+2]
	TRO T2,UNBVBT!UNB36B	;SET 36BIT TRANSFER AND VALID
	WRIO T2,@UBADSW(P1)	;WRITE THE UNIBUS STATUS REGISTER
	TLNE T1,(CHREV)		;REVERSE?
	SOSA UBADSW(P1)		;YES DOWN COUNT
	AOS UBADSW(P1)		;POINT TO THE NEXT UNIBUS WINDOW
	TLNN T1,(CHLST)		;LAST?
	AOJA T4,CHSLP		;NO -- DO NEXT WINDOW
	WRIO Q2,@RC1WC(P1)	;YES -- WRITE WORD COUNTER
	POP P,Q2		;RESTORE
	POP P,UBBASA(P1)	;RESTORE PDP11 ADDRESS
	POP P,UBADSW(P1)
	POP P,T2		;RECOVER DATAO

CHST1:	CALL WTREG		;WRITE REGISTER
	MOVEM Q1,CDBICR(P1)	;SAVE INITIAL TCR FOR LOGGER
	MOVE T2,Q1		;GET CONTROL REGISTER
CHST2:	CALL WTREG		;WRITE AND START WORLD
	RETSKP			;INDICATE SUCCESS
;ROUTINE TO GENERATE A CHANNEL XFER WORD FOR THE RH11
;CALL - C(T1) := MODE,,+COUNT(1B0 IF BACKWARDS) , C(T2) := PHYSICAL-ADDRESS
;RETURNS+1(ALWAYS):
;T1/ CCW FOR THIS TRANSFER
;NOTE: THE MAXIMUM TRANSFER WHICH WILL ALWAYS WORK IS 1 PAGE.
;	THE CALLER IS EXPECTED TO WORRY ABOUT PAGE CROSSING PROBLEMS

RH2CCW:	PUSH P,T1		;SAVE ARGUMENT
	HRRZ T3,T1		;GET WORD COUNT
	HLRZS T1		;GET MODE IN CORRECT PLACE
	TRZ T1,(1B0)		;CLEAR BACKWARDS BIT FROM MODE
	CAIN T1,IRMWRD		;CHECK FOR WORD MODE
	JRST RH2CW1		;YES SKIP JUNK
	SKIPLE T1		;CHECK MODE FOR LEGALITY
	CAILE T1,IRMMAX		; ...
	JRST [	BUG.(CHK,PH1IHM,PHYH11,HARD,<PHYH11 - Illegal hardware mode - word mode assumed>,,<<

Cause:	An illegal hardware mode was specified for an RH11 transfer.
	TOPS-20 is assuming word mode.
>)
		MOVEI T1,IRMWRD	;ASSUME WORD MODE
		JRST .+1]
	IDIV T3,MODTAB(T1)	;CONVERT TO WORDS
	SKIPE T4		;ROUND?
	AOS T3			;YES
RH2CW1:	POP P,T4		;GET ARGUMENT BACK
	MOVSI T1,(CHXFR)	;BUILD CCW
	DPB T3,CCYCNT		;STORE COUNT IN T1
	DPB T2,CCYADR		;STORE ADDRESS IN T1
	SKIPGE T4		;BACKWARDS?
	TLO T1,(CHREV)		;YES
	RET			;RETURN




;RH2CCA - EXTRACT THE PHYSICAL MEMORY ADDRESS FROM A CCW TRANSFER WORD.
;ARGUMENTS:
;  T1/	CCW WORD
;RETURNS:
;  T1/	ADDRESS, OR ZERO IF NONE


RH2CCA:	LDB T1,CCYADR		;GET ADDRESS FROM CCW WORD
	RET			;DONE
;ROUTINE TO DETERMINE IF ANY CHANNEL DEPENDENT ERROR OCCURED
;RETURN +1 IF ERROR , +2 IF NONE

CKERR::	RDIO T1,@RC1CS1(P1)	;GET RH11 STATUS
	ANDI T1,RH1ERR		;SEE IF ERRORS IN CONI
	MOVSI T3,(US.TAP)	;CHECK FOR MAGTAPE
	TDNN T3,UDBSTS(P3)	;TAPE?
	JRST CKERR2		;NO -- DON'T CHECK FOR FCE
	MOVEI T3,ER.FCE		;CHECK FOR FRAME COUNT ERROR
	TIOE T3,@RC1ER1(P1)	;CHECK REGISTER
	JRST CKERR3		;YES -- BUT IT IS OK
CKERR2:	SKIPGE CDBXFR(P1)	;DATA TRANSFER?
	JRST [	JUMPN T1,CKERR1	;NO - CONI ERRORS
		RETSKP]		;NO TO BOTH, RETURN GOOD
	TXNE T1,RH1CPE		;DATA TRANSFER, CHECK CONI ERRORS
	CALL CKERR1		;YES - FLAG AND DO CHANNEL CHECKS
CKERR3:	HRRZ T1,CDBICP(P1)	;NONE IN CONI, CHECK CHANNEL
	SKIPN T1,1(T1)		;GET STATUS WORD 1
	JRST CKERR1		;NOT STORED, CALL IT AN ERROR
	TLNE T1,(CS1MPE!CS1NXM!CS1RHE!CS1OVR) ;OR OTHER DEFINITE ERRORS?
	JRST [	TLNE T1,(CS1MPE) ;A PARITY ERROR?
		AOS CDBPAR(P1)	;YES - NOTE
		TLNE T1,(CS1NXM) ;NONEXISTANT MEMORY?
		AOS CDBNXM(P1)	;YES - NOTE
		TLNE T1,(CS1OVR) ;AN OVERRUN?
		AOS CDBOVR(P1)	;YES - NOTE
		CALL CKERR1	;INDICATE SOME ERROR HAPPENED
		JRST .+1]	;AND CONTINUE WITH LENGTH ANALYSIS
	MOVSI T2,(CS1LWC!CS1SWC) ;WORD COUNT ERROR BITS
	MOVSI T3,(US.TAP)	;MAGTAPE?
	TDNN T3,UDBSTS(P3)
	TLNN T1,(CS1LWC)	;CHECK FOR LONG WORD COUNT
	JRST CKERR4		;NO CHECK FOR ERROR RETURN
	MOVSI T1,(IS.RTL)	;FLAG LENGTH ERROR IN IORB
	IORM T1,IRBSTS(P4)	; ...
CKERR1:	MOVSI T1,(IS.DVE)	;DECLARE A DEVICE ERROR
	IORM T1,IRBSTS(P4)	; ...
	RET

CKERR4:	MOVSI T1,(IS.DVE)	;ERROR SET?
	TDNE T1,IRBSTS(P4)
	RET			;YES RETURN BAD
	RETSKP			;NOPE ALL GOOD
;ROUTINE TO GET CONI AND DATAI'S ON ERROR
;RETURNS T1=RC1CS1, T2=RC1CS2  T3=UBA MAP REGISTER,,UBA STATUS
ERRCNI::HRRZ T1,CDBICP(P1)	;GET CHANNEL LOGOUT AREA
	DMOVE T2,(T1)		; CS0,1
	DMOVEM T2,CDBCS0(P1)	;SAVE
	MOVE T2,2(T1)		;GET CS2
	MOVEM T2,CDBCS2(P1)	;SAVE
	MOVE T1,(T1)		;GET ICCW
	TLNE T1,(CHXFR)		;IF NOT JUMP,
	JRST ERCNI1		;DON'T TRY FOR CCWS
	LDB T1,CCYADR		;GET ADDRESS PART OF JUMP
	LSH T1,-PGSFT		;AS A PAGE
	PIOFF			;INTERLOCK WINDOW
	CALL MAPRCA		;MAP THIS PAGE
	HRRZ T2,CDBICP(P1)	;GET CHAN BLOCK AGAIN
	MOVE T3,(T2)		;GET JUMP CCW BACK
	ANDI T3,777		;GET ADDRESS WITHIN PAGE
	ADD T3,T1		;GET INDEX INTO WINDOW PAGE
	MOVE T4,(T3)		;GET FIRST POSSIBLE CCW
	MOVEM T4,CDBCC1(P1)	;SAVE IN CDB
	ADDI T3,1		;INCREMENT POINTER
	MOVEI T4,0		;DONT STORE GARBAGE IF OVERFLOW
	TRNE T3,777		;STILL WITHIN WINDOW BOUND?
	MOVE T4,(T3)		;YES - FETCH SECOND POSSIBLE CCW
	MOVEM T4,CDBCC1+1(P1)	;SAVE IN CDB
	CALL UNMRCA		;FREE WINDOW
	PION			;ALLOW INTERRUPTS AGAIN
ERCNI1:	RDIO T1,@RC1CS1(P1)	;READ STATUS 1
	RDIO T2,@RC1CS2(P1)	;READ STATUS 2
	HLLZ T4,UBADSW(P1)	;GET ADDRESS OF UBA
	RDIO T4,UNBSTW(T4)
	RDIO T3,@UBADSW(P1)	;GET STATUS
	HLRS T3			;SAVE INTERESTING BITS
	HRL T3,T4		;PUT TOGETHER
	RET
	SUBTTL INTERRUPT ROUTINE

;ENTER FROM PHYSIO W/ C(P1) := CDB CAUSING INTERRUPT.

RH2INT:	RDIO T2,@RC1CS2(P1)	;READ STATUS 2
	TRNN T2,RH1NED		;IS NED SET?
	JRST RH2IN1		;NO - GO ON
	BUG.(INF,P1NED3,PHYH11,HARD,<PHYH11 - NON EX DISK ON DONE OR ATN INTERRUPT>,<<T1,D>,<T2,D>>,<

Cause:	The RH11 status register reports a "non-existent disk" error on an
	attention or done interrupt.
>)
	CALL CLRRAE		;CLEAR RAE
RH2IN1:	MOVSI T2,(DO.AS)	;SET TO READ ATTENTION SUMMARY REGISTER
	CALL RDREGX		; READ (ANY UNIT WILL DO)
	MOVEI Q1,0		;INITIAL UNIT #
	ANDI T1,377		;MASK OUT IMPOSSIBLE BITS
	TRNN T1,377		;ANY ATTENTION ON?
	JRST NOATTN		;NO - CHECK DATA TRANSFER
ATCHKN:	LSHC T1,-1		;SHIFT 1 BIT OVER
	JUMPGE T2,ATCHK2	;JUMP IF NOT THIS UNIT
	PUSH P,T1		;SAVE REMAINDER
	HRRZ T1,Q1		;GET UNIT #
	CALL SETUDB		;SET UP P3 := UDB ADDRESS, T2 := DISPATCH
	JUMPE P3,ATNXU		;SPURIOUS INTERRUPT IF NO UNIT THERE
	SETZ P4,		;P4=0 IF NO ERRORS
	CALL UDSATN(T2)		;INFORM LOWER LEVEL
				;SETS LH(Q1) TO -1 IF POS DONE INTERRUPT
	JUMPN P4,ATNIRB		;IF DONE OR AN ERROR, GO RETURN
ATCHK1:	POP P,T1		;RESTORE ATTENTION REGISTER
ATCHK2:	SKIPE T1		;DONE IF ZERO
	AOJA Q1,ATCHKN		;INCR UNIT # AND TRY NEXT

NOATTN:	MOVE T1,CDBCNI(P1)	;PICK UP THE STATUS
	SKIPL T4,CDBXFR(P1)	;TRANSFER IN PROGRESS?
	JRST XFR		;YES - ANALYZE
NOATT1:	HLLE P4,Q1		;NO TRANSFER, SET P4=-1 OR 0
NOATT2:	MOVEI T1,RH1IE		;CHECK FOR INTERRUPT ENABLE
	TION T1,@RC1CS1(P1)	;IF INTERRUPT ENABLE SET LEAVE IT ALONE
	WRIOB T1,@RC1CS1(P1)	;OTHERWISE SET IT
	RETSKP			;AND LET PHYSIO DO ITS THING

XFR:	WRIOB T4,@RC1CS2(P1)	;SET UNIT NUMBER
	MOVEI T1,RH1RDY		;CHECK FOR READY
	TIOE T1,@RC1CS1(P1)
	SKIPN CDBCNI(P1)	;CHECK FOR DATA OPERATION
	JRST [	SETZ P4,	;YES, MUST BE FROM ERRPSI (PHYRP4)
		JRST NOATT2]	; SO JUST DISMISS THE INTERRUPT
	SETZM CDBCNI(P1)	;SET NO DATA OPERATION IN PROGRESS
	HRRZ T1,CDBICP(P1)	;FIND THE INITIAL CCW
	MOVE T1,2(T1)
	RDIO T2,@RC1WC(P1)	;FIND THE WORD COUNT
	MOVNS T2		;MAKE IT +
	ANDI T2,177777		;MASK OFF GOOD BITS
	LSH T2,-1		;MAKE  WORDS (PDP10)
	LDB T3,CCYCNT		;GET OLD COUNT
	DPB T2,CCYCNT		;SET IN NEW CCW
	SUB T3,T2		;FIND COUNT LEFT
	ADD T1,T3		;MAKE ADDRESS
	HRRZ T2,CDBICP(P1)	;FIND THE ADDRESS AGAIN
	MOVEM T1,2(T2)		;STORE IN LOGOUT AREA
	LDB T1,CCYCNT		;FIND THE COUNT AGAIN
	SKIPN T1		;SET WORD COUNT 0 IF TRUE
	TLOA T1,(CS1NC0)	;SET BIT
	TLO T1,(CS1LWC)
	HLLZS T1		;ZERO RIGHT HALF
	RDIO T3,@RC1CS2(P1)	;GET CS2
	TXNE T3,RH1NEM		;NON EXISTANT MEM?
	TXO T1,CS1NXM		;SET NXM
	TXNE T3,RH1DLT		;CHECK FOR DATA LATE
	TXO T1,CS1OVR		;DECLARE OVERRUN
	TXNE T3,RH1PE!RH1MDP	;PARITY ERROR OF SOME SORT
	TXO T1,CS1MPE		;FLAG IT
	TXNE T3,RH1PGE!RH1MXF	;PROG ERROR OR MISSED TRANSFER
	TXO T1,CS1RHE		;CALL IT AN RH ERROR
	TLO T1,400000		;INDICATE CHANNEL LOGOUT
	MOVEM T1,1(T2)		;SET IN CHANNEL LOGOUT
	HRRZ T1,CDBXFR(P1)	;GET UNIT NUMBER OF XFERRING UNIT
	ANDI T1,7		;MASK UNIT NUMBER
	CALL SETUDB		;SET UP P3,T2
	CALL UDSINT(T2)		;CALL INTERRUPT SERVICE
	 CALLRET CLRCHL		;ERRORS BELOW, RESET CHAN AND RETURN
	CALL CLRCHL		;NO ERRORS
	RETSKP
;HERE WHEN AN IORB FINISHED DURING ATTN INT SERVICE, OR A SEEK ERR

ATNIRB:	HRRZS P4		;CLEAR ANY ERROR FLAG
	POP P,(P)		;SCRAP STACK
	MOVEI T1,RH1IE		;CHECK FOR INTERRUPT ENABLE
	TION T1,@RC1CS1(P1)	;IF INTERRUPT ENABLE SET LEAVE IT ALONE
	WRIOB T1,@RC1CS1(P1)	;OTHERWISE SET IT
	RETSKP			;AND RETURN

;HERE ON AN INTERRUPT FROM A NONEXISTANT UNIT.

ATNXU:	PUSH P,Q1		;SAVE A REGISTER
	HRRZ Q2,Q1
	WRIOB Q2,@RC1CS2(P1)	;SET UNIT NUMBER
	CALL RH2UNA		;SELECT A UNIT
	ADD Q2,P1
	MOVEM P3,CDBUDB(Q2)	;STORE NEW UDB POINTER
	POP P,Q1
	MOVEI T2,1		;CLEAR ATTENTION DIRECTLY
	LSH T2,(Q1)		;POSITION BIT
	HRLI T2,(DO.AS)		;IN ATTENTION SUMMARY REGISTER
	CALL WTREGX		;SPECIAL REGISTER, NEEDS NO UNIT
	JRST ATCHK1		;AND CONTINUE LOOKING


;HERE WHEN DONE IS UP AND THE CHANNEL IS NOT OCCUPIED.
	SUBTTL ECC CHANNEL LOGIC

;THE FOLLOWING ROUTINES, AS IN SEVERAL OTHER PLACES, ASSUME THE
;CCW LIST IS EXACTLY ONE WORD LONG.

;HERE TO RETURN THE PHYSICAL ADDRESS OF THE START OF THE LAST BLOCK
;TRANSFERRED.

;	CALL ECCADR
;RETURNS+1(ALWAYS):
;T1/ PHYSICAL ADDRESS OF START OF LAST SECTOR TRANSFERRED
ECCADR::HRRZ T1,CDBICP(P1)	;GET STATUS AREA
	MOVE T1,2(T1)		;GET CS2, THE UPDATED CCW
	LDB T1,CCYADR		;GET ADDRESS PART
	SUBI T1,1		;BACK UP INTO LAST SECTOR TRANSFERRED
	TRZ T1,177		;MASK TO START OF 128WD BLOCK
	RET

;HERE TO UPDATE THE CCW LIST TO TRANSFER ANY DATA AFTER THE SECTOR
;WHICH WAS ECC CORRECTED.

;	CALL ECCUCL
;RETURNS+1:
;	NO MORE DATA TO TRANSFER
;RETURNS+2:
;	UPDATED CCW AT CDBCCL(P1)
;T1/ NUMBER OF WORDS TRANSFERED INCLUDING SECTOR ECC CORRECTED

ECCUCL::HRRZ T4,CDBICP(P1)	;GET STATUS AREA
	MOVE T1,2(T4)		;GET UPDATED CCW
	LDB T3,CCYCNT		;GET WORD COUNT
	JUMPE T3,R		;IF 0, ALL DONE.
	TLO T1,(CHXFR!CHLST)	;FORCE LAST TRANSFER
	MOVEM T1,CDBCCL(P1)	;STORE IN CDB
	SETZM CDBCCL+1(P1)	;CLEAR TAIL
	CALL PHYCNT		;GET IORB COUNT
	SUB T1,T3		;LESS WORDS TRANSFERRED
	RETSKP
	TNXEND
	END