Google
 

Trailing-Edge - PDP-10 Archives - BB-M081Y-SM - monitor-sources/phym2.mac
There are 48 other files named phym2.mac in the archive. Click here to see a list.
; Edit= 8997 to PHYM2.MAC on 2-Nov-88 by LOMARTIRE
;Merge Production changes to BUG text
; Edit= 8908 to PHYM2.MAC on 16-Aug-88 by GSCOTT
;Update BUG. documentation. 
; UPD ID= 8587, RIP:<7.MONITOR>PHYM2.MAC.6,  11-Feb-88 16:55:31 by GSCOTT
;TCO 7.1218 - Update copyright date.
; UPD ID= 8434, RIP:<7.MONITOR>PHYM2.MAC.5,   4-Feb-88 15:02:06 by GSCOTT
;TCO 7.1210 - Set TM2CCI, TM2HER, TM2N2S, and TM2NUD normally not dumpable.
; UPD ID= 318, RIP:<7.MONITOR>PHYM2.MAC.4,   8-Dec-87 11:24:13 by GSCOTT
;TCO 7.1075 - Add TOC.
; *** Edit 7457 to PHYM2.MAC by GSCOTT on 23-Apr-87, for SPR #21597
; Make SET ONLINE command work for drives connected to TM02/TM03/TM78 
; UPD ID= 2158, SNARK:<6.1.MONITOR>PHYM2.MAC.10,   5-Jun-85 10:41:14 by MCCOLLUM
;TCO 6.1.1406  - Update copyright notice.
; UPD ID= 1921, SNARK:<6.1.MONITOR>PHYM2.MAC.9,   7-May-85 21:14:49 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1793, SNARK:<6.1.MONITOR>PHYM2.MAC.8,  23-Apr-85 13:14:23 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1744, SNARK:<6.1.MONITOR>PHYM2.MAC.7,   9-Apr-85 15:09:12 by MCCOLLUM
;TCO 6.1.1238 - Fix BUG. documentation
; UPD ID= 4823, SNARK:<6.MONITOR>PHYM2.MAC.6,  17-Sep-84 10:43:05 by PURRETTA
;Update copyright notice
; UPD ID= 3108, SNARK:<6.MONITOR>PHYM2.MAC.5,   7-Nov-83 21:22:55 by MCLEAN
;ADD DISPATCH FOR PORT RELEASE
; UPD ID= 2580, SNARK:<6.MONITOR>PHYM2.MAC.4,  14-Jun-83 10:19:34 by HAUDEL
;TCO 6.1668 - Add SAVEQ at TM2SIO:
; UPD ID= 1606, SNARK:<6.MONITOR>PHYM2.MAC.3,  29-Dec-82 13:48:23 by DONAHUE
;TCO 6.1410 - Change references to MTINDX to STKVAR's
; UPD ID= 903, SNARK:<6.MONITOR>PHYM2.MAC.2,   9-Jun-82 23:25:18 by MURPHY
;TCO 6.1147 - Move bugdefs from BUGS.MAC to here and put them in-line.
; UPD ID= 198, SNARK:<5.MONITOR>PHYM2.MAC.9,  18-Sep-81 11:53:01 by WACHS
;TCO 5.1516 Retry on fake format errors
; UPD ID= 2209, SNARK:<5.MONITOR>PHYM2.MAC.8,  17-Jun-81 20:36:24 by ZIMA
;TCO 5.1372 - fix up error retry count for retry succeeded case.
; UPD ID= 1900, SNARK:<5.MONITOR>PHYM2.MAC.7,  29-Apr-81 07:58:30 by WACHS
; UPD ID= 1859, SNARK:<5.MONITOR>PHYM2.MAC.6,  21-Apr-81 13:50:43 by SCHMITT
;TCO 5.1292 - Reset overdue timer before starting I/O
; UPD ID= 1821, SNARK:<5.MONITOR>PHYM2.MAC.5,  17-Apr-81 09:50:09 by WACHS
;TCO 5.1288 Maintain statistics by recording mode
; UPD ID= 739, SNARK:<5.MONITOR>PHYM2.MAC.4,   7-Jul-80 00:47:37 by DBELL
;TCO 5.1096 - ADD UDSCCK DISPATCH ENTRY
; UPD ID= 504, SNARK:<4.1.MONITOR>PHYM2.MAC.22,   1-May-80 17:40:18 by DBELL
;TCO 4.1.1154 - FIX ANOTHER CAUSE FOR TM2CCI ERRORS FROM TU77 TAPES
; UPD ID= 363, SNARK:<4.1.MONITOR>PHYM2.MAC.21,  26-Mar-80 11:07:07 by DBELL
;TCO 4.1.1119 - MAKE CHANGES REQUIRED FOR RP20 DISKS
;TCO 4.1.1114 - PREVENT TM2CCI AND PH2RAE ERRORS FOR TU77 TAPES
;<4.MONITOR>PHYM2.MAC.20, 20-Sep-79 15:31:29, EDIT BY DBELL
;TCO 4.2476 - ADD DISPATCH FOR UNIT EXISTANCE CHECK
;<4.MONITOR>PHYM2.MAC.19, 13-Sep-79 15:29:49, EDIT BY DBELL
;TCO 4.2465 - MAKE ANSI ASCII MODE ILLEGAL FOR TMO3 CONTROLLER
;<OSMAN.MON>PHYM2.MAC.1, 10-Sep-79 16:00:08, EDIT BY OSMAN
;TCO 4.2412 - Move definition of BUGHLTs, BUGCHKs, and BUGINFs to BUGS.MAC
;<4.MONITOR>PHYM2.MAC.16,  5-Jun-79 17:51:26, EDIT BY BOSACK
;CHANGES FOR PRODUCTION TU77S
;<4.MONITOR>PHYM2.MAC.15,  5-Mar-79 15:51:14, EDIT BY KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<2BOSACK>PHYM2.MAC.5, 19-Feb-79 23:56:56, EDIT BY BOSACK
;<2BOSACK>PHYM2.MAC.4, 19-Feb-79 21:18:56, EDIT BY BOSACK
;ADD LOGIC TO DETERMINE ACTUAL DENSITY SELECTED BY TM03
;<2BOSACK>PHYM2.MAC.3, 14-Feb-79 11:04:26, EDIT BY BOSACK
;RECOGNIZE TU77 AS A SPECIFIC DEVICE TYPE, CORRECT CHARS FOR TM03
;<4.MONITOR>PHYM2.MAC.12,  1-Feb-79 23:22:17, Edit by MCLEAN
;<4.MONITOR>PHYM2.MAC.11, 31-Jan-79 01:04:15, Edit by MCLEAN
;FIX PREVIOUS EDIT TO GET CORRECT ADDRESS FOR KDB ENTRY
;<4.MONITOR>PHYM2.MAC.10, 21-Jan-79 17:54:05, Edit by MCLEAN
;ADD SUPPORT FOR .DGPDL
;<4.MONITOR>PHYM2.MAC.9, 30-Aug-78 09:37:50, EDIT BY FORTMILLER
;TOC 4.1998 Set US.REW at Attention Interrupt time instead of
; at Start I/O time
;<4.MONITOR>PHYM2.MAC.8, 23-Aug-78 13:47:52, Edit by MCLEAN
;<4.MONITOR>PHYM2.MAC.7, 21-Aug-78 23:03:04, Edit by MCLEAN
;FIX IT SO REWIND DONE DOES PSI INTERRUPT
;<2MCLEAN>PHYM2.MAC.5, 30-Jul-78 14:55:08, Edit by MCLEAN
;<3A.MONITOR>PHYM2.MAC.18, 30-Jul-78 17:36:11, Edit by MCLEAN
;<4.MONITOR>PHYM2.MAC.4, 28-Jul-78 10:06:53, EDIT BY MILLER
;IFX UP FRAME COUNT ON WRITE
;<4.MONITOR>PHYM2.MAC.3, 26-Jul-78 00:22:24, Edit by MCLEAN
;DECOMMIT US.IDB
;<4.MONITOR>PHYM2.MAC.2, 22-Jul-78 14:05:44, Edit by MCLEAN
;ADD READ/WRITE COUNT TO UDB
;<3A.MONITOR>PHYM2.MAC.17, 14-Jul-78 13:44:18, EDIT BY BOSACK
;DONT IGNORE PRE/POSTAMBLE ERRORS ON PE READ
;<3A.MONITOR>PHYM2.MAC.16,  2-Jun-78 14:58:35, EDIT BY BOSACK
;ENSURE TM2POL ALWAYS LEAVES TM02/3 WITH ERRORS RESET
;<3A-NEW>PHYM2.MAC.15, 31-May-78 09:50:11, Edit by FORTMILLER
;<3A-NEW>PHYM2.MAC.14, 25-May-78 22:20:46, Edit by FORTMILLER
;ADD DX20 SUPPORT
;PUT DENSITYS DRIVE IS CAPABLE OF IN UDBCHR
;CONVERT UDBDSN TO DECIMAL SERIAL NUMBER
;<3A.MONITOR>PHYM2.MAC.13, 18-May-78 13:12:37, EDIT BY BOSACK
;CLEAR ERROR BYTE POINTER AT TERMINATION OF ERROR RECOVERY
;<3A.MONITOR>PHYM2.MAC.12, 29-Mar-78 12:11:03, Edit by MCLEAN
;FIX MTINDX TO POINT TO FREE MTCUTB
;<3A.MONITOR>PHYM2.MAC.11, 29-Mar-78 08:19:07, EDIT BY MILLER
;ADD UNIT,KONTROLLER,CHANNEL INFO TO ALL "HARDWARE" BUG TYPEOUTS
;<3A.MONITOR>PHYM2.MAC.10,  9-Mar-78 00:00:34, Edit by MCLEAN
;<3A.MONITOR>PHYM2.MAC.9,  8-Mar-78 23:56:40, Edit by MCLEAN
;MOVE INIUNI CALL SO IT DOESN'T BREAK MULTIPLE UNITS
;AND ISN'T CALLED AS OFTEN
;<2BOSACK>PHYM2.MAC.53, 24-Feb-78 01:49:19, EDIT BY BOSACK
;<2BOSACK>PHYM2.MAC.52, 24-Feb-78 01:36:56, EDIT BY BOSACK
;REWORK ERROR INTERFACE WRT DATA/DEVICE ERRORS
;<4.MONITOR>PHYM2.MAC.7,  1-Feb-78 14:51:28, Edit by MCLEAN
;FIX FOR NEW PHYALC,PHYUDB CALLING SEQ
;<4.MONITOR>PHYM2.MAC.6, 31-Jan-78 00:16:42, Edit by MCLEAN
;<4.MONITOR>PHYM2.MAC.5, 30-Jan-78 21:31:17, Edit by MCLEAN
;ADD CREATION OF UDB FOR UNIT GOING ON LINE

;	COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1976, 1988.
;	ALL RIGHTS RESERVED.
;
;	THIS SOFTWARE IS FURNISHED UNDER A  LICENSE AND MAY BE USED AND  COPIED
;	ONLY IN  ACCORDANCE  WITH  THE  TERMS OF  SUCH  LICENSE  AND  WITH  THE
;	INCLUSION OF THE ABOVE  COPYRIGHT NOTICE.  THIS  SOFTWARE OR ANY  OTHER
;	COPIES THEREOF MAY NOT BE PROVIDED  OR OTHERWISE MADE AVAILABLE TO  ANY
;	OTHER PERSON.  NO  TITLE TO  AND OWNERSHIP  OF THE  SOFTWARE IS  HEREBY
;	TRANSFERRED.
;
;	THE INFORMATION IN THIS  SOFTWARE IS SUBJECT  TO CHANGE WITHOUT  NOTICE
;	AND SHOULD  NOT  BE CONSTRUED  AS  A COMMITMENT  BY  DIGITAL  EQUIPMENT
;	CORPORATION.
;
;	DIGITAL ASSUMES NO  RESPONSIBILITY FOR  THE USE OR  RELIABILITY OF  ITS
;	SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.


	SEARCH PROLOG,PHYPAR,SERCOD ;SYSTEM PARAMETERS
	TTITLE (PHYM2,,< - Device Dependent Code for TM02/TM03/TU45/TU77>)

	SUBTTL P.KINZELMAN 25 JULY 75
	TM2VER==63		;EDIT VERSION

		ENTRY TM2DSP	;FOR LIBRARY SEARCH
	Subttl	Table of Contents

;		     Table of Contents for PHYM2
;
;				  Section		      Page
;
;
;    1. Parameters . . . . . . . . . . . . . . . . . . . . . .   3
;    2. Device Dependant Table Defs  . . . . . . . . . . . . .   5
;    3. TM02 Error Recovery Defs . . . . . . . . . . . . . . .   6
;    4. Dispatch For TM02  . . . . . . . . . . . . . . . . . .   7
;    5. TM02 Initializing Routine  . . . . . . . . . . . . . .   9
;    6. Start I/O Routine  . . . . . . . . . . . . . . . . . .  12
;    7. RH20 Command Done Interrupt  . . . . . . . . . . . . .  16
;    8. Error Retry Entry Point  . . . . . . . . . . . . . . .  28
;    9. Routine To Poll Slaves To See If Done Rewind . . . . .  35
;   10. TM02 Function Table  . . . . . . . . . . . . . . . . .  38
;   11. End of PHYM2 . . . . . . . . . . . . . . . . . . . . .  41
	SUBTTL Parameters

;DRIVE REGISTERS USED IN DATAO'S

	DO.CS1==0B5		;DRIVE CONTROL REGISTER
	DO.DS==1B5		;STATUS REGISTER
	DO.ER==2B5		;ERROR REGISTER
	DO.MR==3B5		;MAINTENANCE REGISTER
	DO.AS==4B5		;ATTENTION SUMMARY
	DO.FC==5B5		;FRAME COUNTER
	DO.DT==6B5		;DRIVE TYPE
	DO.CK==7B5		;CHECK CHARACTER REGISTER
	DO.SN==10B5		;SERIAL NUMBER
	DO.TC==11B5		;TAPE CONTROL REGISTER

;DRIVE FUNCTIONS LOADED INTO DRIVE CONTROL REGISTER

	DF.NOP==1		;NO-OP
	DF.UNL==3		;UNLOAD (REWIND OFF-LINE)
	DF.REW==7		;REWIND
	DF.CLR==11		;DRIVE CLEAR
	DF.RIPS==21		;READ-IN, PRESET
	DF.ERA==25		;ERASE
	DF.WTM==27		;WRITE TAPE MARK
	DF.SPF==31		;SPACE FORWARD
	DF.SPR==33		;SPACE REVERSE
	DF.WCF==51		;WRITE CHECK FORWARD (READ FWD)
	DF.WCR==57		;WRITE CHECK REVERSE (READ REV)
	DF.WTF==61		;WRITE FORWARD
	DF.RDF==71		;READ FORWARD
	DF.RDR==77		;READ REVERSE


	DXES==200000		;DISABLE XFER ON ERROR STOP BIT
;DRIVE STATUS REGISTER

	DS.ATA==1B20		;ATTENTION
	DS.ERR==1B21		;COMPOSITE ERROR
	DS.PIP==1B22		;POSITIONING IN PROGRESS
	DS.MOL==1B23		;MEDIUM ON LINE
	DS.WRL==1B24		;WRITE LOCKED
	DS.EOT==1B25		;END OF TAPE
				;SPARE
	DS.DPR==1B27		;DRIVE PRESENT
	DS.DRY==1B28		;DRIVE READY (NOT GO)
	DS.SSC==1B29		;SLAVE STATUS CHANGE
	DS.PES==1B30		;PHASE ENCODED STATUS
	DS.SDN==1B31		;SHUTDOWN BIT
	DS.IDB==1B32		;IDENT BURST (FOR PE)
	DS.TM==1B33		;TAPE MARK
	DS.BOT==1B34		;BEGINNING OF TAPE
	DS.SLA==1B35		;SLAVE ATTENTION


;DRIVE ERROR REGISTER

	ER.COR==1B20		;CORRECTABLE DATA/ CRC ERROR
	ER.UNS==1B21		;UNSAFE
	ER.OPI==1B22		;OPERATION INCOMPLETE
	ER.DTE==1B23		;DRIVE TIMING ERROR
	ER.NEF==1B24		;NON-EXISTANT FUNCTION
	ER.CS==1B25		;CORRECTABLE SKEW/ ILLEGAL TAPE MARK
	ER.FCE==1B26		;FRAME COUNT ERROR
	ER.NSG==1B27		;NON-STANDARD GAP (CRAP IN THE GAP)
	ER.LRC==1B28		;LRC ERROR/ FORMAT (PREAMBLE POSTAMBLE) ERROR
	ER.INC==1B29		;INCORRECTABLE DATA/ VERTICAL PARITY ERROR
	ER.DPA==1B30		;DATA BUS PARITY ERROR
	ER.FMT==1B31		;FORMAT ERROR
	ER.CPA==1B32		;CBUS PARITY ERROR
	ER.RMR==1B33		;REGISTER MODIFICATION REFUSED
	ER.ILR==1B34		;ILLEGAL REGISTER ADDRESS
	ER.ILF==1B35		;ILLEGAL FUNCTION

;DRIVE TYPE BITS NEEDED:

	DT.SPR==1B25		;A SLAVE IS SELECTED
	SUBTTL Device Dependant Table Defs

	TM2SLC==4		;[7457] Maximum number of slaves on TM02/03

;****************************
;UDB EXTENSIONS

	TU6HDN==UDBDDM		;HARDWARE DETERMINED DENSITY
				;NOTE: DONT CHANGE WITHOUT FIXING MAGTAP
	TU6EPS==TU6HDN+1	;ERROR POSITION
	TU6EBP==TU6EPS+1	;ERROR BYTE POINTER
	TU6EBC==TU6EBP+1	;ERROR BYTE COUNTER
	TU6ECL==TU6EBC+1	;TAPE CLEANER FLAG

	LU.TM2==TU6ECL+1	;LENGTH OF TM02 UDB


;****************************
;KDB DEVICE DEPENDANT PORTION

	KDBUDB==KDBDDP		;[7457] UDB table (for TM2SLC units)
	TM2ADR==KDBUDB+TM2SLC	;[7457] Massbus address of TM02
	TM.CNI==TM2ADR+1	;CONI OF RH GOES HERE
	TM.CS1==TM.CNI+1	;DATAI RH CONTROL REGISTER
	TM.DBF==TM.CS1+1	;DATAI RH DATA REGISTER

	TM2REG==TM.DBF+1	;DRIVE REGISTERS GO HERE

	DR.CS1==0		;DRIVE CONTROL REGISTER
	DR.DS==1		;STATUS REGISTER
	DR.ER==2		;ERROR REGISTER
	DR.MR==3		;MAINTENANCE REGISTER
	DR.AS==4		;ATTENTION SUMMARY
	DR.FC==5		;FRAME COUNTER
	DR.DT==6		;DRIVE TYPE
	DR.CK==7		;CHECK CHARACTER REGISTER
	DR.SN==10		;SERIAL NUMBER
	DR.TC==11		;TAPE CONTROL REGISTER

	LK.TM2==TM2REG+12	;LENGTH OF KDB
	SUBTTL TM02 Error Recovery Defs

;PRESENTLY, IF YOU BACKSPACE INTO BOT, YOU MUST WAIT 8 SEC
;TO REGAIN CONTROL OF THE DRIVE AGAIN (OPI TIMEOUT) BY GETTING AN INT.
;THE DRIVES WILL HOPEFULLY BE FIXED SOMEDAY. UNTIL THEN,
;THIS HANDLER TRIES VERY HARD TO KEEP FROM HITTING BOT
;ON A TAPE CLEAN SEQUENCE IF OPIFIX = 0. MAKE OPIFIX NOT 0
;WHEN THE DRIVES ARE FIXED TO GIVE AN INTERRUPT AS SOON AS THEY
;HIT BOT. (TAPE WILL CLEAN BETTER IF YOU LET THE DRIVE HIT
;BOT.)
	OPIFIX==0

;RETRY COUNTS:
	CLNREC==5		;SP REVERSE THIS NR RECORDS TO HIT CLEANER
	RTYOP==5		;RETRY OPERATION THIS MANY TIMES BEFORE TAPE CLEAN SEQUENCE
	RTYCLN==5		;RETRY CLEAN SEQUENCE THIS MANY TIMES ON READ
				;BEFORE GIVING UP
				;THE TOTAL NR OF RD RETRIES = RTYOP*(RTYCLN+1)

	RTYWRT==^D20		;# WRITE RETRIES MAXIMUM BEFORE ABORT


;ERROR WORDS

;	TU6EBC		;ERR BYTE COUNTER (USED IF WE HIT BOT
				;DURING TAPE CLEAN SEQUENCE)
;	TU6EBP	;ERR BYTE POINTER
;	TU6ECL	;-1= IN TAPE CLN SEQUENCE, 0= NOT
;	UDBERR(RH)		;CURRENT FUNCTION (1 - 17)
				;ON RETRY OF ORIGINAL OPERATION, THIS LOC
				;MUST BE SET TO THE ORIGINAL OPERATION

;	UDBERC ;RETRY COUNT
				;CONVERTED TO # RETRIES DONE AT END
;	TU6EPS	;WE SHOULD BE HERE WHEN WE'RE
				;READY TO RETRY OPERATION
	SUBTTL Dispatch For TM02

TM2DSP::JRST TM2INI		;0 - INITIALIZATION
	JRST TM2SIO		;1 - START I/O
	JRST TM2INT		;2 - HANDLE INTERRUPT (DATA OPERATION OR SPACE)
	JRST TM2ERR		;3 - ERROR RECOVERY
	JRST TM2HNG		;4 - HUNG DEVICE
	RET			;5 - NOT USED
	RET			;6 - NOT USED
	JRST TM2SIO		;7 - START POSITION OPERATION
	JRST TM2ATN		;10 - ATTENTION INTERRUPT (CALLED AS MANY
				;TIMES AS THERE ARE TM02 DRAS BITS UP)
	JRST TM2PRQ		;11 - SKIP IF POSITION REQUIRED
	RET			;12 - STACK SECOND COMMAND, FAIL FOR TM02/3
	JRST TM2LGL		;[7457] 13 - Check legality of a unit
	RET			;14 - CHECK FOR HALTED CONTROLLER
	RET			;15 - RELEASE PORT

;[7457] TM2LGL - Check legality of a unit
;[7457] Called with:
;[7457] 	Q2/ unit number
;[7457] Returns: RFALSE if unit out of range
;[7457]          to EXTUDB if unit not out of range

TM2LGL:	CAILE Q2,3		;[7457] Only 4 units are legal on TM02/TM03
	JRST RFALSE		;[7457] Return badly if out of range
	CALLRET EXTUDB		;[7457] Let PHYSIO do the rest of the work

;[7457] TM2HNG - Set bits when a drive is hung
;[7457] Called with:
;[7457] 	P4/ pointing to IORB

TM2HNG:	MOVX T1,IS.NRT!IS.ERR!IS.DVE ;SET FATAL BITS
	IORM T1,IRBSTS(P4)	;AND REFRESH IT
	RET
;HERE TO DETERMINE IF THIS REQUEST SHOULD GO ON PWQ OR TWQ

TM2PRQ:	LDB T1,IRYFCN		;GET FUNCTION
	MOVE T1,TM2FTB(T1)	;GET TABLE ENTRY
	TXNN T1,TB.DOP		;DATA OPERATION?
	RETSKP			;NO - POSITION ALWAYS REQUIRED
	HRRZ T2,UDBPWQ(P3)	;YES - ANY PENDING POSITION OPERATIONS?
	JUMPE T2,R		;NONE - APPEND TO TWQ
	CAIN T2,(P4)		;AT HEAD OF PWQ?
	RET			;YES - NEXT TRANSFER
	RETSKP			;APPEND TO PWQ


;ROUTINE TO READ ALL TM02 REGISTERS INTO TM2REG IN THE KDB
TM2RDR:	MOVSI T4,-LK.TM2+TM2REG	;-# REGISTERS
TM2RD1:	SETZM T2		;CLEAR REGISTER ADDRESS
	DPB T4, [POINT 6,T2,5]	;SETUP REGISTER ADDRESS
	CALL RDREG		;READ THE REGISTER
	ADD T4,P2		;POINT TO KDB
	MOVEM T1,TM2REG(T4)	;STORE IT IN THE KDB
	SUB T4,P2		;BACK TO RELATIVE POINTER
	AOBJN T4,TM2RD1		;GO BACK FOR REST OF REGISTERS
	CALL ERRCNI		;GET CONI AND DATAI
	MOVEM T1,TM.CNI(P2)	;SAVE IN KDB
	MOVEM T2,TM.CS1(P2)	; ...
	MOVEM T3,TM.DBF(P2)	; ...
	RET
	SUBTTL TM02 Initializing Routine

;THIS ROUTINE IS CALLED ONCE PER TM02 DRIVE ON THE SYSTEM
;TO SET UP UDB'S - 1 PER DRIVE ON THE TM02
;  P1/	CDB
;  Q2/	TM02 UNIT NUMBER
;  Q3/	ADDRESS TO STORE KDB
;  P5/	UNIT NUMBER TO INITIALIZE, OR -1 FOR ALL UNITS
; OUTPUT P2,P3



TM2INI:	SAVEQ			;SAVE REGISTERS
	JUMPL P5,TM2ALU		;SKIP ON IF WE INIT ALL UNITS
	MOVE P2,CDBIUN(P1)	;GET KDB ADDRESS
	ADD P2,Q2		;POINT TO CORRECT UNIT
	MOVE P2,0(P2)		;GET ENTRY
	SKIPE P3,P2		;FOUND ONE?
	JRST TM2USU		;YES DON'T CREATE A NEW ONE
TM2ALU:	MOVX T1,LK.TM2		;LENGTH OF KDB
	CALL PHYALC		;RESERVE SPACE
	RET			;RETURN IF NO SPACE FOUND
	MOVEM T1,P2		;SAVE ADDRESS IN PROPER AC
	MOVE P3,T1		;COPY KDB
	MOVEI T1,.BTKDB		;MARK AS KDB
	DPB T1,USYBKT		; ...
	MOVX T2,DO.DT		;GET DRIVE TYPE REG
	CALL RDREG3		; ...
	ANDI T1,777		;GET JUST TYPE CODE
	CAIG T1,TY.T2H		;IS THIS A TM02?
	CAIGE T1,TY.T2L		; ???
	SKIPA T1,[EXP .UTTM3]	;NO - IS TM03
	MOVX T1,.UTTM2		;YES - SET UP UNIT TYPE IN KDB
	STOR T1,USTYP,(P2)	;...
UNINI:	MOVSI T1,-TM2SLC	;[7457] Set up AOBJN index to slaves
	HRRI T1,KDBUDB(P2)	;MAKE RH POINT TO UDB ENTRIES IN KDB
	MOVEM T1,KDBIUN(P2)	;INITIAL POINTER
	MOVEM T1,KDBCUN(P2)	;CURRENT POINTER
	HRRZM Q2,TM2ADR(P2)	;SAVE KDB ADDRESS
	MOVEI T1,TM2DSP		;INSERT DISPATCH VECTOR
	MOVEM T1,KDBDSP(P2)	; ...
TM2USU:	SKIPGE Q1,P5		;[7457] Skip loading Q1 if doing a single unit
	MOVSI Q1,-TM2SLC	;[7457] Load AOB pointer for all units
INILP:	CALL INIUNI		;INITIALIZE A SINGLE UNIT
	 JFCL			;IGNORE ERROR RETURN
NODRV:	AOBJN Q1,INILP		;TRY NEXT SLAVE
TOORET:	MOVE T1,P2		;TELL RETURN TO PUT KDB INTO CDB
	RET
;THIS ROUTINE IS CALLED TO INITIALIZE A SPECIFIC SLAVE
;INPUT C(P1)=CDB  C(Q1)=UNIT C(P2)KDB  NR; OUTPUT P3


INIUNI:	STKVAR <MTINDX>		;INDEX TO MTCUTB
	HRRZ T2,Q1		;GET CURRENT SLAVE #
	HRLI T2,(DO.TC)		;SET UP FOR TAPE CNTL REGISTER
	CALL WTREG3		;DO IT
	MOVX T2,DO.DT		;GET DRIVE TYPE
	CALL RDREG3
	TXNN T1,DT.SPR		;DOES IT EXIST?
	RET			;NOPE
	HRLOI T3,-MTAN-1	;IF 1ST TIME THRU
INIUN1:	AOBJP T3, [BUG.(INF,TM2N2S,PHYM2,HARD,<PHYM2 - More drives than table space, excess ignored>,,<

Cause:	The number of tape drives on the system exceeds the value of MTAN.
	All drives after MTAN are ignored.

Action:	To accommodate more tape drives, the monitor must be rebuilt with a
	larger value of MTAN.
>,,<DB%NND>)			;[7.1210] 
		JRST TOORET]	;DON'T INITIALIZE ANY MORE SLAVES
	SKIPE MTCUTB(T3)	;CHECK TO SEE IF UNIT FREE
	JRST INIUN1		;NOPE TRY NEXT ONE
	MOVEM T3,MTINDX		;SAVE CURRENT LOGICAL INDEX
	MOVE T3,[TM2DSP,,LU.TM2] ;YES, SET UP ADDRESS,,LENGTH
	ADD P2,Q1		;POINT TO PROPER KDB ENTRY
	CALL PHYUDB		;AND ASK FOR UDB ALLOCATION
	RET			;RETURN IF NO SPACE FOUND
	HRRZM P3,KDBUDB(P2)	;SAVE LINK
	SUB P2,Q1		;FUDGE IT BACK
	HRRZM P2,UDBKDB(P3)	;SAVE BKWDS LINK
	MOVE T3,MTINDX		;GET CURRENT LOGICAL INDEX
	HRLZM P1,MTCUTB(T3)	;SAVE LINK TO CDB IN LOGICAL TABLE
	HRRM P3,MTCUTB(T3)	;SAVE LINK TO UDB
	MOVX T2,DO.DS		;GET DRIVE STATUS
	CALL RDREG3
	MOVX T3,US.TAP		;INDICATE A TAPE TYPE DEVICE
	TXNN T1,DS.MOL		;ON LINE?
	TXO T3,US.OFS		;NO, SET OFF LINE BIT
	TXNE T1,DS.WRL		;WRITE LOCKED?
	TXO T3,US.WLK		;YES
	HLLM T3,UDBSTS(P3)	;SAVE UDB STATUS
	SETOM TU6HDN(P3)	;INDICATE UNKNOWN DENSITY
	MOVX T2,DO.DT		;GET DEVICE TYPE AGAIN
	CALL RDREG3		; ...
	ANDI T1,737		;MASK (40 BIT IS ON FOR TM03)
	CAIN T1,TY.T77		;A TU77?
	SKIPA T3,[EXP .UTT77]	;YES, SET CORRECT TYPE
	MOVX T3,.UTT45		;NO - TU45 UNIT TYPE
	STOR T3,USTYP,(P3)	;SAVE IT
	MOVX T3,UC.200!UC.556!UC.800!UC.160!UC.CD!UC.AA!UC.IC ;DENSITYS AND MODES DRIVE IS CAPABLE OF
	LOAD T2,USTYP,(P2)	;GET CONTROLLER TYPE
	CAIE T2,.UTTM2		;A TM02?
	TXZ T3,UC.200!UC.556!UC.AA ;NO - ASSUME NO 200, 556 OR ANSI ASCII
	MOVEM T3,UDBCHR(P3)	; AND PUT THAT INFO INTO THE UDB
	MOVX T2,DO.SN		;NOW SERIAL NR
	CALL RDREG
	CALL PHCVBO		;CONVERT BCD TO OCTAL
	MOVEM T1,UDBDSN(P3)	;STORE IT
	HRRZM Q1,UDBSLV(P3)	;SET UP SLAVE ADDRESS
	AOS JB0FLG		;THIS WILL REQUEST JOB0 INCASE CALLER SETS MTAJB0
	RETSKP			;RETURN
	SUBTTL Start I/O Routine

;C(P4)=IORB C(P1)=CDB C(P2)=KDB C(P3)=UDB
;IF IN ERR RECOVERY, GET FN FROM RH(UDBERR)
;RET MEANS RE-CALL IN 1 MIN TO TRY AGAIN
;PUTS TM02 FN IN Q1, AND DATAO (IF NEEDED) IN T2
;RETSKP (CHSTRT) MEANS OK, IT'S STARTED

TM2SIO:	SAVEQ
	HRRZ Q1,UDBERR(P3)	;GET FUNCTION IF ERROR RECOVERY
	SKIPN Q1		;IN ERROR RECOVERY?
	LOAD Q1,ISFCN,(P4)	;NO, GET FN FROM IORB
	SKIPG Q1,TM2FTB(Q1)	;VALID FN?
	JRST BADSIO		;REFUSE TO START IT

	SKIPGE IRBSTS(P4)	;MAKE SURE PAGEM NOT SET
	JRST BADSIO		;IS SET REFUSE IT
	CALL TM2CON		;CONNECT TO DRIVE (AND CLEAR ERRORS)
	 RET			;ERROR
	MOVX T2,DO.FC		;IN CASE WE DON'T WANT TO LOAD FC
	TXNE Q1,TB.NFC		;DO WE LOAD FC WITH SOMETHING SPECIAL?
	JRST NOFC		;NO- LOAD 0
	TXNN Q1,TB.DOP		;DATA OPERATION?
	JRST TM2NDO		;NO, T2=-#RECORDS ON SPACE
	MOVN T2,IRBCNT(P4)	;BYTE COUNT FROM IORB
	LOAD T1,IRBDM,(P4)	;GET DATA MODE
	HLRZ T1,MTBFMT(T1)	;GET MULTIPLIER
	SKIPE T1		;SAVE TIME IF FRAMES=BYTES
	IMUL T2,T1		;CALCULATE # FRAMES
	JRST TM2DO		;WE'RE A DATA OPERATION
BADSIO:	BUG.(CHK,PM2SIO,PHYM2,HARD,<PHYM2 - Illegal function at start IO>,,<

Cause:	The IORB function code provided to TM2SIO is less than or equal to
	zero or the short form (PAGEM) request bit is set in the IORB.

Action:	If this BUGCHK is reproducable, set it dumpable, and send in an SPR
	with the dump and how to reproduce the problem.
>)
	MOVX T1,IS.ERR!IS.NRT!IS.DVE	;MARK AN ERROR OCCURED
	IORM T1,IRBSTS(P4)	;IN IORB
	RET

TM2NDO:	SKIPE UDBERR(P3)	;IN ERROR RECOVERY?
	SKIPA T2,[-1]		;YES, SPACE 1 RECORD
	MOVN T2,IRBCNT(P4)	;NO, DO # RECORDS FROM IORB
TM2DO:	ANDI T2,177777		;16 BITS OF FRM COUNT
	HRLI T2,(DO.FC)		;DO FRM COUNT TO FRM COUNT REGISTER
NOFC:	ANDI Q1,77		;6 BITS OF TM02 FN
	HRRZM P3,KDBACT(P2)	;SAVE CURRENT UDB IN KDB
	JRST CHSTRT		;NOW START THINGS MOVING
;ROUTINE TO SELECT A SLAVE, SET UP TCREG
;CHECK FOR NECESSARY STATUS BITS
;CALL IT TO BEGIN AN OPERATION WITH C(Q1)=FN TABLE ENTRY
;RET WITH BITS SET IF NOT RDY (OFF-LINE, ETC.) RETSKP IF ALL OK
TM2CON:	MOVX T2,DO.DS		;READY TO READ STATUS REG
	CALL RDREG		;READ IT
	TXNN T1,DS.ERR!DS.SSC	;IS ERROR IR SSC UP?
	JRST TM2CNO		;NO, DON'T DO DRIVE CLR
	MOVX T2,DO.TC		;YES, DO DRIVE CLR
	HRR T2,UDBSLV(P3)	;BUT FIRST SELECT DRIVE ABOUT TO BE USED
	CALL WTREG		;BECAUSE WE KNOW IT'S NOT BUSY
	MOVEI T4,^D10		;COUNT OF ATTEMPTS TO CLEAR ERR
CON1:	MOVX T2,DF.CLR		;FIRST CLEAR OUT DRIVE
	CALL WTREG		;DO IT
	MOVX T2,DO.DS		;SELECT STATUS
	CALL RDREG
	TXNE T1,DS.ERR		;IS ERROR UP?
	JRST [	SOJG T4,CON1	;RETRY EXHAUSTED?
		RET]		;CANT START IO
	CALL TM2POL		;CHECK FOR REWIND DONE
TM2CNO:	HRRZ T2,UDBSLV(P3)	;GET SLAVE #
	HRLI T2,(DO.TC)		;SELECT TAPE CNTL REGISTER
	LOAD T1,IRBDN,(P4)	;GET DENSITY
	CAIG T1,4		;TOO BIG?
	SKIPGE T1,MTBDEN(T1)	;OR ILLEGAL?
	JRST CONBAD		;YES, GIVE ERROR
	DPB T1,[POINT 3,T2,27]	;SET IN POSITION IN ACC
	LOAD T1,IRBPAR,(P4)	;GET PARITY
	DPB T1,[POINT 1,T2,32]	;SET IN POSITION
	LOAD T1,IRBDM,(P4)	;GET DATA MODE
	CAIN T1,.SJDMA		;ANSI ASCII MODE?
	JRST [	LOAD T3,USTYP,(P2)	;YES, GET CONTROLLER TYPE
		CAIN T3,.UTTM3		;DOING ANSI ASCII ON TMO3?
		JRST CONBAD		;YES, THAT'S NOT POSSIBLE
		JRST .+1]		;OTHERWISE IT'S OK
	CAIG T1,4		;TOO BIG?
	SKIPGE T1,MTBFMT(T1)	;OR ILLEGAL?
	JRST CONBAD		;YES, LOSE
	DPB T1,[POINT 4,T2,31]	;SET FMT
	CALL WTREG		;FIRE 1!
	MOVX T2,DO.DS
	CALL RDREG		;GET STATUS IN T1
	TXNE Q1,TB.WRT		;[7457] Is it a write operation?
	SKIPA T2,[DS.MOL!DS.DRY!DS.WRL] ;[7457] Yes include write lock be 0
	MOVX T2,DS.MOL!DS.DRY	;[7457] No, MOL and DRY should be 1
	TXC T1,DS.MOL!DS.DRY	;[7457] Complement bits to be set to one
	TDNN T1,T2		;[7457] Skip if bits not set right
	RETSKP			;[7457] Return OK if all bits are OK
	TXC T1,DS.MOL!DS.DRY	;[7457] Reset online and ready bits

;[7457] Drive is not in the correct state, update UDB and IORB bits

	MOVX T2,US.WLK		;SET UP THESE BITS
	ANDCAM T2,UDBSTS(P3)	;1ST CLEAR THEM
	TXNE T1,DS.WRL		;[7457] Write locked?
	IORM T2,UDBSTS(P3)	;SET STATUS IN UDB
	MOVE T2,IRBSTS(P4)	;[7457] Load IORB status bits
	TXNE Q1,TB.WRT		;WRITE OPERATION?
	TXNN T1,DS.WRL		;AND WRITE LOCKED?
	SKIPA			;NO
	TXO T2,IS.ERR!IS.NRT!IS.DVE ;YES, SET ERROR BITS
	TXNN T1,DS.WRL		;WRITE LOCKED?
	TXZA T2,IS.WLK		;[7457] Not write locked, clear bit
	TXO T2,IS.WLK		;[7457] Write locked, set bit
	TXNN T1,DS.MOL		;[7457] Is the unit offline?
	TXO T2,IS.ERR!IS.DVE	;[7457] Drive is offline, light error bits
	MOVEM T2,IRBSTS(P4)	;[7457] Store updated status
	CALLRET TM2OFC		;DO ONLINE/OFFLINE CHECK AND RETURN

;HERE IF CAN'T CONNECT BECAUSE OF BAD DENSITY OR MODE:

CONBAD:	MOVX T1,IS.ERR!IS.NRT!IS.DVE	;ILLEGAL, TREAT AS HARD ERR
	IORM T1,IRBSTS(P4)	;STORE THE STATUS
	RET			;RETURN BAD
	SUBTTL RH20 Command Done Interrupt

;C(P1)=CDB  C(P2)=KDB
TM2INT:	PUSH P,Q2		;LATER DON'T SAVE TILL AFTER FTLCHK
	PUSH P,Q1		;LIKEWISE, I'M SURE
	SKIPN P3,KDBACT(P2)	;DO WE HAVE A CURRENT UDB?
	JRST TM2INU		;NO UDB
	SETZM KDBACT(P2)	;CLEAR THE CURRENT UDB
	CALL SETIRB		;GET ACTIVE IORB
	CALL FTLCHK		;CHECK FOR FATAL ERRS AND PUT DRDS REGISTER
	 JRST [POP P,Q1		;INTO Q2, TM2FTB FN ENTRY INTO Q1
		POP P,Q2
		RET]		;FATAL ERR
	TXNN Q1,TB.WRT		;ARE WE READING?
	TXZ T1,ER.NSG		;YES, IGNORE NSG ERR
TMENTY:	TXNE Q1,TB.REV		;ARE WE BACKWARDS?
	SOSA UDBPS2(P3)		;YES, THEN SUBTRACT 1 RECORD
	AOS UDBPS2(P3)		;NO, ADD 1
	HRRM T1,Q1		;SAVE ERROR REGISTER (LH OF Q1 IS FLAGS)
	TXNN Q2,DS.TM		;IS IT TAPE MARK?
	JRST NOTM		;NOT TM
	TXNE Q1,TB.REV		;ARE WE REVERSE
	SOSA UDBPS1(P3)		;YES, BACK UP 1 FILE
	AOS UDBPS1(P3)		;NO, FORWARD 1 FILE
NOTM:	TXNN Q2,DS.BOT		;ARE WE AT BOT?
	JRST NOBOT		;NO
	SETZM UDBPS1(P3)	;YES, FILE 0
	SETZM UDBPS2(P3)	;RECORD 0
	SETOM TU6HDN(P3)	;UNKNOWN DENSITY
NOBOT:	TXNE Q2,DS.PES		;ARE WE IN PE MODE?
	TXNE Q1,TB.WRT		;AND READ?
	SKIPA			;NO
	TXZ Q1,ER.COR!ER.CS	;YES, THESE ARE NOT ERRORS
	TXNE Q1,TB.RD		;ON READ FCE IS LEGAL
	TXZ Q1,ER.FCE
	TXNN Q1,ER.COR!ER.CS!ER.FCE!ER.NSG!ER.LRC!ER.DPA!ER.INC ;RETRY?
	JRST CKCONI		;NO DATA RETRY ERRS HERE
DORTY:	TXNE Q1,TB.RD		;IN READ?
	TXNN Q2,DS.TM		;AND TM?
	SKIPA			;NO
	JRST NODERS		;YES, THEN DON'T RETRY
	MOVX T3,IS.ERR!IS.DTE	;YES, ERROR- DO RETRY
	IORM T3,IRBSTS(P4)	;SET IORB ERR (DATA ERR)
	CALL TM2RDR		;GET DEVICE REGISTERS
	JRST POPPOL		;POP STACK AND POLL SLAVES
				;DON'T BOTHER SETTING UP STATUS BITS
;HERE WHEN DONE INTERRUPT AND NO SAVED UDB

TM2INU:	HRRZ T1,CDBADR(P1)	;[8908] Get channel number
	HRRZ T2,TM2ADR(P2)	;[8908] Get TM02 address
	BUG.(CHK,TM2NUD,PHYM2,HARD,<PHYM2 - Channel done interrupt but no unit active>,<<T1,CDBADR>,<T2,TM2ADR>>,<

Cause:	A command done interrupt was issued by an RH20 channel but there was no
	unit active on that channel.  If an OVRDTA had previously occured, and
	the device finally responds, this BUGINF happens.  This usually
	indicates a hardware failure.

Action:	Field Service should check the devices on the channel listed in the
	additional data; any channel/controller/unit listed in OVRDTA BUGCHKs
	should be suspected.

Data:	CDBADR - channel number
	KDBADR - controller number
>,,<DB%NND>)			;[8908][7.1210] 
	JRST POPPOL		;CLEAN UP STACK
CKCONI:	TXNN Q1,TB.DOP		;DATA OPERATION?
	JRST NODERS		;NO - DONT ASK CHANNEL IF ANY ERRS
	CALL CKERR		;SEE IF ANY RETRIABLE ERRS IN CONI
	 JRST DORTY		;YES, RETRY THE TRANSFER
NODERS:	SKIPGE P5,TU6HDN(P3)	;GET DENSITY FROM HARDWARE
	LOAD P5,IRBDN,(P4)	;NOT AVAILABLE, GET IT FROM IORB
	CAIE P5,.SJD16		;1600 BPI (PE MODE)?
	SKIPA P5,P3		;NO, SET TO COUNT NRZI STATISTICS
	MOVEI P5,1(P3)		;YES, ACCUMULATE PE STATS
	TXNN Q1,TB.RD		;ARE WE READING?
	JRST SPENTY		;NO, DON'T TELL ABT FRM COUNT
	MOVSI T1,(US.BOT)	;WERE WE AT BOT?
	TDNE T1,UDBSTS(P3)	; ???
	CALL GTHDEN		;YES - FIGURE OUT HARDWARE
	MOVX T2,DO.FC		;GET FRM COUNT
	CALL RDREG
	ADDM T1,UDBRED(P3)	;ACCUMULATE FRAMES READ
	ADDM T1,UDBRNR(P5)	;ACCUMULATE NRZI/PE FRAMES READ
	AOS UDBRCT(P3)		;INCR READ COUNT
	LOAD T3,IRBDM,(P4)	;GET DATA MODE
	CAIG T3,4		;LEGAL?
	SKIPGE T3,MTBFMT(T3)	;AGAIN?
	JRST [	BUG.(CHK,TM2IDM,PHYM2,HARD,<PHYM2 - Illegal data mode at Done interrupt>,<<T3,MODE>>,<

Cause:	The TM02/3 IORB data mode was invalid or illegal when a done interrupt
	occurs.

Action:	There is probably a TM02/3 hardware problem that should be checked by
	Field Service.

Data:	MODE - TM02/3 data mode at done interrupt
>)
		MOVEI T3,0	;ACT LIKE WORDS
		JRST .+1]
	HLRZ T3,T3		;#FRAMES/BYTE
	JUMPE T3,NODIV		;SAVE TIME IF FRAMES=BYTES
	IDIV T1,T3		;CALCULATE # BYTES
	SKIPE T2		;REMAINDER?
	AOS T1			;YES, ANOTHER BYTE
NODIV:	MOVEM T1,IRBCNT(P4)	;TELL HOW MANY FRAMES ON READ
SPENTY:	TXNN Q1,TB.WRT		;WRITE?
	JRST NOTWRT		;NO
	LOAD T3,IRBDM,(P4)	;GET DATA MODE
	HLRZ T3,MTBFMT(T3)	;GET FRAMES/BYTE
	SKIPN T3		;FRAMES=BYTES?
	SKIPA T3,IRBCNT(P4)	;YES. GET COUNT AND SAVE MULTIPLY
	IMUL T3,IRBCNT(P4)	;GET FRAMES
	ADDM T3,UDBWRT(P3)	;ACCUMULATE FRAMES WRITTEN
	ADDM T3,UDBWNR(P5)	;ACCUMULATE NRZI/PE WRITE STATS
	AOS UDBWCT(P3)		;UPDATE READ COUNT
NOTWRT:	MOVX T2,IS.BOT!IS.EOT!IS.TPM!IS.WLK ;ZERO BITS
	ANDCAM T2,IRBSTS(P4)	;DO IT TO IT
	TXNN Q2,DS.BOT		;AT BOT?
	TXZ T2,IS.BOT		;NO
	TXNE Q1,TB.WRT		;ARE WE WRITING?
	TXNN Q2,DS.EOT		;AND AT EOT?
	TXZ T2,IS.EOT		;NO TO EITHER
	TXNN Q2,DS.TM		;TP MK 
	TXZ T2,IS.TPM		;NO, CLEAR TM FLAG
	TXNE Q1,TB.REV		;SPACE REVERSE OR READ REVERSE
	TXNN Q2,DS.BOT		;AND AT BOT?
	SKIPA			;NO TO EITHER
	TXO T2,IS.TPM		;YES TO BOTH, RETURN TAPE MARK
	TXNN Q2,DS.WRL		;WRITE LOCKED?
	TXZ T2,IS.WLK		;NO
	IORM T2,IRBSTS(P4)	;AND SAVE IT (LEAVE ERR SET IF IT WAS SET)
	MOVX T2,US.BOT		;CLEAR THESE BITS
	ANDCAM T2,UDBSTS(P3)	;DO IT
	TXNN Q2,DS.BOT		;AT BOT?
	TXZ T2,US.BOT		;NO, CLEAR BIT
	IORM T2,UDBSTS(P3)	;SAVE IT
	MOVE T1,Q2		;GET ERRORS
	CALL TM2OFC		;DO OFFLINE CHECK
	TXNE Q1,TB.DOP		;IF A DATA  OPERATION,
	AOS -2(P)		;SKIP RETURN TO THE CHANNEL
	JRST POPPOL		;ANYBODY DONE A REWIND?
				;AND THEN A WORD FROM OUR SPONSOR...
;HERE TO DETERMINE WHAT DENSITY THE TAPE HARDWARE REALLY READING AT

;	P1,2,3 SETUP
;	RH(Q2) DRIVE STATUS REGISTER
;	CALL GTHDEN
;RETURNS+1(ALWAYS):
;	DENSITY STORED IN UDB FOR MAGTAP (OR LEFT AS UNKNOWN FOR TM02)

GTHDEN:	LOAD T1,USTYP,(P2)	;DO WE HAVE A TM03?
	CAIE T1,.UTTM3		; ???
	RET			;NO - ASSUME DENSITY AS SET
	MOVEI T1,.SJDN8		;YES - FIRST ASSUME 800BPI
	TRNE Q2,DS.PES		;PHASE ENCODED?
	MOVEI T1,.SJD16		;YES - IS REALLY 1600BPI
	MOVEM T1,TU6HDN(P3)	;STORE FOR MAGTAP
	RET			;RETURN
;COMES HERE ON AN ATA INTERRUPT (INCLUDING SPACING OPS)
;C(P1)=CDB C(P2)=KDB
;WILL SET C(P4)= 0 IF NONE
;SETS C(P3)=UDB
;ALWAYS RET (NEVER SKP RET'S)
;IF ERR, IS.ERR AND EITHER <IS.DVE OR IS.DTE> WILL BE SET
;IF IS.ERR NOT SET, WE ARE FINISHED WITH THIS IORB
TM2ATN:	PUSH P,Q2		;SAVE Q2
	MOVE Q2,TM2ADR(P2)	;GET OUR MASSBUS ADDRESS
	MOVX T2,1
	LSH T2,(Q2)		;MASK TO CLEAR OUR ATTENTION BIT
	HRLI T2,(DO.AS)		;REGISTER ADDRESS
	CALL WTREG3		;CLEAR THE BIT
	PUSH P,Q1
	HRRZ P3,KDBACT(P2)	;GET ACTIVE UDB (IF ANY)
	JUMPE P3,CHKNEW		;IF NO UDB, JUST CHECK FOR REWS AND UNITS ON LINE
	MOVX T1,US.ACT		;UNIT ACTIVE?
	TDNE T1,UDBSTS(P3)	; ??
	JRST CKNDOP		;YES - FINISH UP THEN POLL
	HRRZ Q1,UDBADR(P3)	;GET UNIT ADDRESS
	MOVE P3,TM2ADR(P2)	;GET KONTROLLER ADDRESS
	HRRZ T1,CDBADR(P1)	;GET CHANNEL ADDRESS
	BUG.(INF,TM2UNA,PHYM2,HARD,<PHYM2 - Done interrupt and UDB not active>,<<T1,CDBADR>,<P3,UDBADR>>,<

Cause:	The TM02/3 driver got a done interrupt from a unit, but did not believe
	that the unit was active.  If an OVRDTA had previously occured, and the
	device finally responds, this BUGINF will happen.  This usually
	indicates a hardware failure.

Action:	Field Service should check the devices on the channel listed in the
	additional data; any channel/controller/unit listed in OVRDTA BUGCHKs
	should be suspected.

Data:	CDBADR - CDB address
	UDBADR - UDB address
>)				;[8908]
	SETZB P3,KDBACT(P2)	;RESET SAVED UDB
	JRST POPPOL		;AND GO POLL
CKNDOP:	CALL SETIRB		;GET CURRENT IORB
	HRRZ Q1,UDBERR(P3)	;GET FUNCTION CODE
	SKIPN Q1		;IN ERROR RECOVERY?
	LOAD Q1,ISFCN,(P4)	;NO, GET IT FROM IORB
	MOVE Q1,TM2FTB(Q1)	;GET FUNCTION ENTRY
	TXNN Q1,TB.DOP		;DATA OPERATION?
	JRST NDOP		;NO
;THE FOLLOWING COMMENTED CODE CAUSES THE 2020 TO GET INTO AN
;INTERRUPT LOOP SINCE THE OPERATION APPEARS NOT TO BE CORRECTLY TERMINATED
;	MOVX T2,DO.DS		;CHECK IF DEVICE STILL ON LINE
;	CALL RDREG		; ...
;	TXNN T1,DS.MOL		;ONLINE?
;	JRST NDOP		;NO - TREAT AS IF TERMINATING NONDATA OP
	MOVEI P4,0		;YES, ENSURE RECALL AT INTERRUPT ENTRY
	JRST TM2ATX		;AND EXIT ATN
NDOP:	SETZM KDBACT(P2)	;CLEAR SAVED UDB
	CALL FTLCHK		;ANY FATAL ERRORS? (PUT DRIVE STATUS IN Q2,
TM2ATX:	 JRST [POP P,Q1		;YES		TM2FTB ENTRY IN Q1)
		POP P,Q2
		RET]		;FATAL ERR

	MOVE P5,P3		;POINT P5 AT UDB TO UPDATE WRITE COUNTERS
	TXNE Q1,TB.TM		;WRITE TM OPERATION?
	JRST TMENTY		;YES, USE DATA ROUTINES
	TXNE Q1,TB.ERA		;ERASE OPERATION?
	JRST SPENTY		;YES, DON'T CHECK TAPE POSITION
	TXNE Q1,TB.REW		;REWIND?
	JRST REWSTA		;YES, CLEAR REC CNTRS
	MOVSI T1,(US.BOT)	;WERE WE AT BOT?
	TDNE T1,UDBSTS(P3)	; ??
	CALL GTHDEN		;YES - FIGURE OUT HARDWARE
	MOVX T2,DO.FC
	CALL RDREG
	MOVN T3,T1		;NEGATE FRM COUNT
	ANDI T3,177777		;ITS ONLY 16 BIT NEG NR
	SKIPE T1,UDBERR(P3)	;ARE WE IN ERR RECOVERY?
	JRST RTYATN		;YES
	EXCH T3,IRBCNT(P4)	;SAVE RESIDUE (# RECORDS NOT SPACED)
	SUB T3,IRBCNT(P4)	;CALCULATE # RECORDS MOVED
	TXNE Q1,TB.REV		;IN REVERSE DIR?
	MOVNS T3		;YES, NEGATE
	ADDM T3,UDBPS2(P3)	;UPDATE REC COUNT
	MOVE T3,IRBCNT(P4)	;GET FRM COUNT AGAIN
	JUMPE T3,NOCKER		;IF ALL RECORDS SPACED, DON'T CHECK ERR
RES1:	TXNN Q2,DS.BOT!DS.EOT!DS.TM ;EARLY TERM OK IF EOT, BOT, OR TM
RESERR:	JRST [	MOVX T1,IS.ERR!IS.DVE!IS.NRT ;INDICATE ERRORS
		IORM T1,IRBSTS(P4)
		CALL TM2RDR	;GET DEVICE REGISTERS
		JRST SPENTY]

	PUSH P,Q2		;MUST EXPLICITLY CLEAR TM02 HERE
	MOVE Q2,TM2ADR(P2)	;GET DEVICE ADDRESS
	MOVX T2,DF.CLR		;CLEAR
	CALL WTREG3		; ...
	POP P,Q2
	; ...
	; ...
;ALL RECORDS SPACED, DON'T BOTHER CHKING ERROR BITS


NOCKER:	TXNN Q2,DS.TM		;TAPE MK?
	JRST NOSTM		;NO
	TXNE Q1,TB.REV		;IN REVERSE DIR?
	SOSA UDBPS1(P3)		;YES, THEN -1
	AOS UDBPS1(P3)		;NO, THEN +1 FILE
NOSTM:	TXNN Q2,DS.BOT		;AT BOT?
	JRST SPENTY		;NO
REWENT:	SETZM UDBPS2(P3)	;YES, ZERO RECORDS
	SETZM UDBPS1(P3)	;ZERO FILES
	SETOM TU6HDN(P3)	;UNKNOWN DENSITY
	JRST SPENTY		;NOW SET STATUS AND RET

REWSTA:	MOVX T1,US.REW		;SET REWINDING
	IORM T1,UDBSTS(P3)	; IN THE UDB
	JRST REWENT		;

POPPOL:	POP P,Q1		;RESTORE REGISTERS
	POP P,Q2
	JRST TM2POL		;AND CHECK FOR REWIND INTERRUPTS

				;COME HERE AT END OF SPACE DURING RETRY
RTYATN:	JUMPN T3,RESERR		;FRAME COUNT 0?
	TXNN Q1,TB.REV		;IN REVERSE DIRECTION?
	AOSA UDBPS2(P3)		;NO FORWARD THE RECORD COUNTER
	SOS UDBPS2(P3)		;YES, BACK IT UP
	TRNN Q2,DS.BOT		;AT BOT?
	JRST NOCKER		;NO, CONT
	JRST RESERR		;CONFUSED ERROR RECOVERY

CHKNEW:	MOVE T4,KDBIUN(P2)	;GET AOBJN POINTER
CHKNW1:	SKIPE (T4)		;EXIST?
	JRST CHKNW2		;YUP DON'T BOTHER WITH IT
	MOVE Q1,T4		;GET UNIT NUMBER
	SUB Q1,KDBIUN(P2)
	HRRZS Q1		;UNIT ONLY
	CALL INIUNI		;INITALIZE UNIT
	SKIPA			;NOT FOUND
	AOS MTAJB0		;TELL JOB0 ABOUT IT
CHKNW2:	AOBJN T4,CHKNW1		;GET NEXT UNIT
	JRST POPPOL		;DO POLLING
;ROUTINE TO CHECK FOR ANY OBVIOUS FATAL ERRORS
;RET IF ERR (WITH IORB STATUS BITS SET)
;SKP RET IF OK
;RETURNS WITH C(T1) THE ERROR REGISTER, C(Q2) DRIVE STATUS REGISTER
;AND C(Q1) THE TABLE ENTRY FOR CURRENT
;FTLCHK MUST NOT BE CALLED UNLESS AN IORB EXISTS FOR THE UNIT

FTLCHK:	MOVX Q1,IS.DVE!IS.DTE	;READY TO CLEAR THESE BITS
	ANDCAM Q1,IRBSTS(P4)	;DO IT TO IT
	HRRZ T4,UDBERR(P3)	;GET FUNCTION IF ERROR RECOVERY
	SKIPN T4		;IN ERROR RECOVERY?
	LOAD T4,ISFCN,(P4)	;GET FN
	SKIPG Q1,TM2FTB(T4)	;VALID?
	JRST [	BUG.(CHK,TM2IF2,PHYM2,HARD,<PHYM2 - Illegal function on command done>,<<Q1,FNC>>,<

Cause:	FTLCHK detected an illegal function code either in the IORB or UDBERR
	at command done for a TM02/3 based tape drive.

Action:	If this BUGCHK is reproducable, set it dumpable, and send in an SPR
	with the dump and how to reproduce the problem.

Data:	FNC - TM02/3 driver function code
>)
		JRST FTLERR]
	MOVSI T2,(DO.ER)	;GET ERROR REGISTER
	CALL RDREG		; ...
	TXNN T1,ER.RMR!ER.UNS!ER.FMT!ER.DTE!ER.ILR!ER.ILF!ER.CPA ;FATAL ERRS
	JRST DOPCK		;NO FATAL ERRORS HERE
	TXNE T1,ER.FMT		;FORMAT ERROR?
	TXNN T1,ER.COR!ER.CS!ER.FCE!ER.NSG!ER.LRC!ER.INC ;YES. ANY TAPE MOTION?
	JRST FTLERR		;NOT FORMAT ERR, OR FORMAT AND NO TAPE MOTION
	JRST DOPCK		;FAKE FORMAT ERROR, RETRY
FTLERR:	CALL TM2RDR		;READ ALL REGISTERS
	MOVE T1,TM2REG+DR.ER(P2) ;GET ERROR REG AGAIN
	TXNE T1,ER.UNS		;UNS ERR?
	CALL PHYOFL		;DECLARE OFF-LINE
	MOVX T3,IS.NRT!IS.ERR!IS.DVE ;SET BITS
	IORM T3,IRBSTS(P4)	;PUT BITS IN IRBSTS
	HRRZ T1,TM2REG+DR.DS(P2) ;GET STATUS REG
	MOVX T3,IS.WLK		;CLEAR STATUS BIT
	ANDCAM T3,IRBSTS(P4)	;CLEAR WRITE LOCK BIT
	TXNE T1,DS.WRL		;WRITE LOCKED?
	IORM T3,IRBSTS(P4)	;YES, SET THE BIT AGAIN
	LDB T2,USYTYP		;IS THIS A TU77?
	CAIE T2,.UTT77		; ???
	JRST TM2POL		;NO
	MOVSI T2,(DO.TC)	;YES - SELECT SLAVE
	HRR T2,UDBSLV(P3)	; ...
	CALL WTREG
	MOVX T2,DF.CLR		;NOW CLEAR IT
	CALL WTREG
	JRST TM2POL		;REWINDS DONE? (THEN RET)
DOPCK:	MOVE Q2,T1		;SAVE ERROR REGISTER
	MOVSI T2,(DO.DS)	;GET DRIVE STATUS REGISTER
	CALL RDREG		; ...
	EXCH Q2,T1		;PUT DS IN Q2, ER IN T1
	TXNE Q1,TB.RD		;ON READ FCE IS LEGAL (IT IS SHORT RECORD)
	JRST DOPCK1
	TXNE Q1,TB.DOP		;DATA OPERATION?
	TXNE Q2,DS.TM		;EOF ERROR (EOF CAUSES FCE ON RH11)
	JRST DOPCK1		;NON DATA OR EOF -- ALL OK
	TXNE T1,ER.FCE		;FRAME COUNT ERROR CHECK
	JRST FTLERR		;FATAL ERROR ON DATA OPERATIONS
DOPCK1:	CAIE T4,IRFRUN		;UNLOAD FUNCTION?
	TXNE Q2,DS.MOL		;NO, MEDIUM ON LINE?
	SKIPA			;YES, OK
	JRST FTLERR		;NO - QUITE FATAL.
	TXNN T1,ER.OPI!ER.NEF	;OPI OR NEF?
	RETSKP			;OK RET, NO ERR
	TXNE Q1,TB.REV		;IF ERRS, OK IF REVERSE
	TXNN Q2,DS.BOT		;AND AT BOT
	JRST FTLERR		;BAD RET
	RETSKP			;GOOD RET
	SUBTTL Error Retry Entry Point

;P1, P2, P3, P4 SET UP
;ROUTINE PUTS ER BLK ADDRESS IN Q1

TM2ERR:	SAVEQ
	CALL SETIRB		;GET OUR IORB
	HRRZ Q1,UDBERP(P3)	;GET ERROR BLOCK IF PRESENT
	HLLZ T1,IRBSTS(P4)	;GET IORB STATUS
;IF UNS (OFF-LINE ERR), SOMEDAY SHOULD RETRY IN A MIN OR SO.
	HRRZ T4,UDBERR(P3)	;GET FUNCTION IF ERROR RECOVERY
	SKIPN T4		;IN ERROR RECOVERY?
	LOAD T4,ISFCN,(P4)	;NO, GET FN FROM IORB
	MOVE T4,TM2FTB(T4)	;NOW TABLE ENTRY
	TXNN T1,IS.NRT!IS.IER	;FATAL OR INHIBIT ERR RECOVERY?
	JRST TMERTY		;NO, RETRY THE ERROR
	SKIPE TU6EBP(P3)	;WAS FATAL ERR DURING RETRY?
	JRST ABTNOS		;YES, WE ALREADY HAVE BEGIN DATA
	AOS (P)			;SKIP RET FROM LOD1 - DONE WITH IORB
	JRST LOD1		;LOAD UP ERR BLK FOR FATAL ERR
				;DO RETRY
TMERTY:	HLR T4,T4		;COPY LH OF FNTBL
	TRZ T4,777770		;SAVE ONLY RETRY INDEX IN RH
	SKIPE UDBERC(P3)	;1ST TIME FOR HERE?
	JRST NOT1ST		;NO
	SETZM TU6ECL(P3)	;NOT DOING TAPE CLEAN
	SKIPN T1,RTYBPT(T4)	;GET RETRY BYTE POINTER
	JRST [	BUG.(INF,TM2IDX,PHYM2,HARD,<PHYM2 - Illegal retry byte pointer>,<<T1,RTYBPT>>,<

Cause:	An error occured during a TM02/3 operation but the retry type for
	the function code is illegal.

Action:	If this BUGCHK is reproducable, set it dumpable, and send in an SPR
	with the dump and how to reproduce the problem.

Data:	RTYBPT - Retry byte pointer
>)
		JRST ABTNOS]	;CALL IT FATAL
	MOVEM T1,TU6EBP(P3)	;SAVE IT
	MOVE T1,UDBPS2(P3)	;GET # RECORDS
	SOS T1			;CALCULATE WHERE WE SHOULD BE AFTER REPOS
	TXNE T4,TB.REV		;IF IN FORWARD, WE WANT (CUR POSITION-1)
	ADDI T1,2		;IF REVERSE, WE WANT (CUR POSITION+1)
	MOVEM T1,TU6EPS(P3)	;WHERE WE SHOULD BE SOMEDAY
	MOVEI T1,RTYWRT+1	;ON WRITE, THIS MANY RETRIES
	TXNN T4,TB.WRT		;ARE WE RIGHT (WRITE)?
	MOVE T1,[RTYCLN+1,,RTYOP+1] ;NO, THIS IS FOR READ
	MOVEM T1,UDBERC(P3)	;THE RETRY COUNTER
	CALL LOD1		;LOAD UP ERR BLK WITH BEGIN DATA
	JRST NXTBYT		;1ST TIME THRU TM2ERR
NOT1ST:	MOVE T1,TU6EBP(P3)	;GET RETRY BYTE POINTER
	ILDB T1,T1		;LOOK AT NEXT OPERATION
	CAIE T1,16		;END OF RETRY?
	JRST CKBOT		;NO
	HLLZ T1,IRBSTS(P4)	;GET IORB STATUS
	TXNN T1,IS.DTE		;WAS THERE DATA ERR?
	JRST RTYNOE		;NO, WE'VE RECOVERED!
	MOVE T1,RTYBPT(T4)	;GET BYTE POINTER
	MOVEM T1,TU6EBP(P3)	;RESET IT
	SETZM TU6ECL(P3)	;NOT DOING TAPE CLN SEQUENCE
	HRRZ T1,UDBERC(P3)	;GET ABORT COUNTER
	SOS T1			;ANOTHER RETRY - SEE IF WE'VE LOST
	HRRM T1,UDBERC(P3)	;SAVE IT
	JUMPN T1,NXTBYT		;IF NOT 0, TRY AGAIN
	TXNE T4,TB.DOP		;DATA OP?
	TXNN T4,TB.RD		;WRITE OR READ?
	JRST ABTRTY		;NONDATA OR WRITE - WE'VE FAILED
	HLRZ T1,UDBERC(P3)	;GET TAPE CLNR COUNTER
	SOJE T1,ABTRTY		;RUN OUT OF RETRIES? - YES
	HRLM T1,UDBERC(P3)	;NO, UPDATE CLN COUNTER
	MOVX T1,RTYOP+1		;NOW RESET (RH) COUNTER
	HRRM T1,UDBERC(P3)	;FOR NEXT CLEAN RETRY
	MOVE T1,RTYBPT+1(T4)	;GET CLEANER SEQ BYTE POINTER
	MOVEM T1,TU6EBP(P3)	;SAVE FOR USE LATER
	SETZM TU6EBC(P3)	;RESET COUNT FOR USE IF WE HIT BOT
	SETOM TU6ECL(P3)	;WE ARE DOING A CLEAN
	JRST NXTBYT		;NOW DO NEXT OPERATION

CKBOT:	SKIPN TU6ECL(P3)	;DOING TAPE CLEAN?
	JRST NXTBYT		;NO DON'T CHECK BOT
	HLLZ T1,IRBSTS(P4)	;GET STATUS
IFE OPIFIX,<SKIPE UDBPS2(P3)>;	ARE WE ALMOST AT BOT?
	TXNE T1,IS.BOT		;OR DID WE HIT BOT?
	SKIPA T1,[CLNREC]	;YES, FIGURE OUT HOW TO FUDGE BYTE POINTER
	JRST NXTBYT		;NO, CONTINUE NORM RETRY
	LOAD T3,ISFCN,(P4)	;GET ORIGINAL FN
	MOVE T3, TM2FTB(T3)	;GET FLAGS
	TXNE T3,TB.WRT		;IS IT A WRITE?
	JRST NXTBYT		;WRITE RETRY WON'T EVER HIT BOT SO NO FUDGE
	TXNN T3,TB.REV		;ADD 1 IF FORWARD
	AOS T1			;DO IT ON FORWARD
	SUB T1,TU6EBC(P3)	;SUBT # RECORDS SPACED
	LSH T1,1		;TIMES 2 (COMMENTS ASSUME CLNREC=5)
	AOS T1			;ON FORWARD, SKIP (6-CNT)*2+1 BYTES
	CAIL T1,1		;ON REVERSE, SKIP (5-CNT)*2+1 BYTES
IFN OPIFIX,<CAILE T1,^D9>;	RESULT MUST BE BETWEEN 1 AND 9
IFE OPIFIX,<CAILE T1,^D11>;	BETWEEN 1 AND 11 IF OPI NOT FIXED
	JSP CX,CNFERR		;BAD INCR, WE ARE CONFUSED
IFE OPIFIX,<SKIPE UDBPS2(P3)>;	IF ALMOST AT BOT, FUDGE 1 LESS
IBPLP:	IBP TU6EBP(P3)		;INCR THE POINTER
	SOJG T1,IBPLP		;ANOTHER?
NXTBYT:	AOS TU6EBC(P3)		;ANOTHER BYTE FOR THE COUNTER
	ILDB T3,TU6EBP(P3)	;GET NEXT FUNCTION
	CAIE T3,17		;IS IT CHECK POSITION OPERATION?
	JRST NOTCKP		;NO
	MOVE T1,UDBPS2(P3)	;YES, GET OUR POSITION
	CAMN T1,TU6EPS(P3)	;ARE WE WHERE WE WANT TO BE?
	JRST NXTBYT		;YES, ALL OK
	JSP CX,CNFERR		;POSITION CONFUSED,SIGNAL ERROR
	JRST ABTNOS		;BOMB OUT

NOTCKP:	CAIE T3,16		;END OF RETRY?
	SKIPG T3		;IS FUNCTION VALID?
	JRST [	BUG.(INF,TM2IRF,PHYM2,HARD,<PHYM2 - Illegal function during retry>,<<T3,FNC>>,<

Cause:	An illegal function code was encountered during a TM02/3 retry
	operation.

Action:	If this BUGCHK is reproducable, set it dumpable, and send in an SPR
	with the dump and how to reproduce the problem.

Data:	FNC - Retry function code
>)
		JRST ABTNOS]	;IMAGINE FATAL
	HRRM T3,UDBERR(P3)	;SAVE FUNCTION
	CALL SETIO		;SET UP FOR I/O
	CALL CDSSIO(T1)		;START IO
;SHOULD RETRY EVERY MIN OR SO
	 JRST ABTNOS		;COULDN'T START UP RETRY OPERATION
	RET			;AND WAIT
RTYNOE:	TXNE T1,IS.NRT		;HARD ERRS SHOULDN'T EVER GET HERE
	BUG.(CHK,TM2HER,PHYM2,HARD,<TM2ERR - IS.HER set on successful retry>,,<

Cause:	A retry operation has been completed succesfully but bit IS.HER
	indicating a hard error was set in the IORB.  Error recovery should
	not be done for hard errors.

Action:	If this BUGCHK is reproducable, set it dumpable, and send in an SPR
	with the dump and how to reproduce the problem.
>,,<DB%NND>)			;[7.1210] 
	MOVX T1,IS.ERR		;WE DID IT! CLEAR ERR BIT
	ANDCAM T1,IRBSTS(P4)	;AND SKP RETURN
	TXNN T4,TB.WRT		;ARE WE WRTING?
	AOSA UDBSRE(P3)		;NO, A SOFT READ ERR
	AOS UDBSWE(P3)		;YES, A SOFT WRITE ERR
	SOS UDBERC(P3)		;FIX UP THE RETRY COUNT
	JRST ABTNOS
;HERE WHEN ERROR RECOVERY GETS CONFUSED(FLAKEY HARDWARE W I L L DO IT)

CNFERR:	HRRZ T1,UDBADR(P3)	;GET UNIT NUMBER
	MOVE Q1,TM2ADR(P2)	;GET KNOTROLLER NUMBER
	HRRZ T3,CDBADR(P1)	;GET CHANNEL NUMBER
	BUG.(CHK,TM2RFU,PHYM2,HARD,<PHYM2 - Error recovery confused>,<<T1,UNIT>,<Q1,CONT>,<T3,CHAN>>,<

Cause:	The error recovery process has become confused. This could be caused by
	a malfunction in the hardware.

Action:	Field Service should check out the hardware.  If the hardware checks
	out, and this BUGCHK is reproducable, set it dumpable, and send in an
	SPR with the dump and how to reproduce the problem.

Data:	UNIT - Unit number
	CONT - Controller number
	CHAN - Channel number
>)
	MOVSI T1,(IS.ERR!IS.NRT) ;INDICATE RATHER HARD ERR
	IORM T1,IRBSTS(P4)	; ...
	JRST ABTNOS		;AND ABORT
ABTRTY:				;WE RAN OUT OF RETRIES
	TXNN T4,TB.WRT		;ARE WE WRTING?
	AOSA UDBHRE(P3)		;NO, A HARD READ ERR
	AOS UDBHWE(P3)		;YES, A HARD WRITE ERR
ABTNOS:	AOS (P)			;SKIP RET FROM LODE
	HRRZ Q1,UDBERP(P3)	;GET ERROR BLOCK
	SKIPN TU6EBP(P3)	;DONE ANY RETRIES?
	JRST LODE		;NO, LOAD UP ERR BLK WITH END DATA
	TXNN T4,TB.WRT		;YES, IN A WRITE?
	JRST RDCNT		;NO
	MOVEI T1,RTYWRT+1	;YES, CALCULATE # RETRIES DONE
	SUBM T1,UDBERC(P3)	;RESIDUE
	JRST LODE		;NOW LOAD UP ERR BLK

RDCNT:	HLRZ T1,UDBERC(P3)	;GET CLN COUNTER
	IMULI T1,RTYOP		;CONVRT JUST TO # RETRIES
	ADD T1,UDBERC(P3)	;ADD IN REGULAR RETRIES
	MOVEI T2,<RTYCLN+2>*RTYOP+1 ;COUNT AT START
	SUB T2,T1
	HRRZM T2,UDBERC(P3)	;SAVE # RETRIES
	JRST LODE		;NOW LOAD UP ERR BLK
				;LOAD UP ERR BLK AT START OF ERR
				;C(Q1)=ERR BLK

LOD1:	JUMPE Q1,R		;IF NO ERROR BLOCK, PUNT
	MOVE T1,Q1		;COPY ERROR BLOCK
	MOVE T2,[-NITAB,,ITAB]	;POINTER TO INFORMATION TABLE
	CALL SEBCPY		;COPY INFORMATION
	 JFCL
	MOVS T1,UDBPS1(P3)	;GET FILE 
	HRR T1,UDBPS2(P3)	;AND RECORD (JUST AFTER ERROR)
	MOVEM T1,SEBDAT+MB%LOC(Q1) ;AND SAVE AS LOCATION OF ERROR
	MOVEI T1,SEBDAT+MB%REG(Q1) ;MOVE REGISTERS TO HERE
	MOVEM T1,T2		;SAVE FOR RH OF BLT
	ADDI T2,11		;11 WDS
	HRLI T1,TM2REG(P2)	;GET REGISTERS FROM HERE
	HRLI T2,(BLT T1,)	;SET UP INST FIELD
	XCT T2			;DO IT
	RET


				;LOAD UP ERR BLK AT END

LODE:	SETZM TU6EBP(P3)	;RESET ERROR BYTE POINTER
	JUMPE Q1,R		;IF NO ERROR BLOCK, CANT SAVE DATA
	MOVE T3,[-12,,TM2REG]	;CASE FOR START
	ADD T3,P2		;POINTS TO REGISTER DATA
	MOVEI T2,SEBDAT+MB%REG(Q1) ;REGISTER DATA GOES HERE
LDELP:	MOVE T1,(T3)		;GET REGISTER
	HRLM T1,(T2)		;PUT IT
	AOS T2			;NEXT WD
	AOBJN T3,LDELP		;DONE?
	MOVE T1,TM.CNI(P2)	;GET CONI
	MOVEM T1,SEBDAT+MB%CIF(Q1) ;SAVE
	MOVE T1,TM.CS1(P2)	;GET TCR
	MOVEM T1,SEBDAT+MB%D1F(Q1) ;SAVE
	MOVE T1,TM.DBF(P2)	;GET BAR
	MOVEM T1,SEBDAT+MB%D2F(Q1) ;SAVE
	RET


;TABLE OF ITEMS TO COPY INTO ERROR BLOCK

ITAB:	SEBPTR MB%CS0,SBTWD,CDBCS0(P1) ;CHANNEL STATUS 0
	SEBPTR MB%CS1,SBTWD,CDBCS1(P1) ;CHANNEL STATUS 1
	SEBPTR MB%CS2,SBTWD,CDBCS2(P1) ;CHANNEL STATUS 2
	SEBPTR MB%CC1,SBTWD,CDBCC1(P1) ;CCW 1
	SEBPTR MB%CC2,SBTWD,CDBCC2(P1) ;CCW 2
	SEBPTR MB%ICR,SBTWD,CDBICR(P1) ;INITIAL CONTROL REGISTER
	SEBPTR MB%CNI,SBTWD,TM.CNI(P2) ;CONI INITIAL
	SEBPTR MB%D1I,SBTWD,TM.CS1(P2) ;TCR
	SEBPTR MB%D2I,SBTWD,TM.DBF(P2) ;BAR/DBF

NITAB==.-ITAB
	SUBTTL Routine To Poll Slaves To See If Done Rewind

TM2POL:	PUSH P,P4		;SAVE PERMANENT ACCUMULATORS
	MOVEI P4,11		;GUARD AGAINST BROKEN HARDWARE
	PUSH P,Q2		;WE WILL CLOBBER IT
	PUSH P,P3		;IN CASE WE MUST SWITCH UNITS
	PUSH P,[0]		;VARIABLE FOR REWIND DONE
POLAGN:	MOVSI T4,-TM2SLC	;[7457] Load AOBJN for number possible slaves
	SETOM T1		;SAYS THAT WE HAVEN'T READ A REGISTER YET
POLLP:	ADD T4,P2		;BUILD POINTER TO KDB ENTRY
	MOVE P3,KDBUDB(T4)	;GET UDB ADDRESS FOR THIS SLAVE
	SUB T4,P2		;FUDGE IT BACK
	MOVE Q2,TM2ADR(P2)	;GET TM02 ADDRESS
	JUMPE P3,TM2PNO		;UNIT NOT KNOWN
	MOVX T2,DO.TC		;READY TO LOAD TAPE CNTL REGISTER
	TRO T2,(T4)		;SELECT THIS SLAVE
	CALL WTREG3		;...
	MOVX T2,DO.DS		;NOW GET STATUS REGISTER
	CALL RDREG3
	HLLZ T2,UDBSTS(P3)	;GET STATUS OF DRIVE
	MOVX T3,US.BOT!US.REW!US.WLK ;CLEAR THESE BITS
	ANDCAM T3,UDBSTS(P3)	;DO IT
	TXNN T1,DS.BOT		;AT BOT?
	TXZA T3,US.BOT		;NO
	JRST [SETZM UDBPS1(P3)	;YES, ZERO REC CNTRS
		SETZM UDBPS2(P3)
		SETOM TU6HDN(P3)	;UNKNOWN DENSITY
		JRST .+1]
	TXNN T1,DS.PIP		;REWINDING? (PIP=1?)
	TXZ T3,US.REW		;NO, CLEAR BIT
	TXNN T1,DS.WRL		;WRITE LOCKED?
	TXZ T3,US.WLK		;NO
	IORM T3,UDBSTS(P3)	;STORE THE STATUS
	TXNE T2,US.REW		;ARE WE REWINDING?(T2 IS OLD UDBSTS)
	JRST	[MOVX T2,US.REW	;OLD STATUS WAS REWINDING, CHECK
		TDNE T2,UDBSTS(P3) ;NEW STATUS FOR CHANGE
		JRST .+1	;CONTINUE LOOP
		MOVEM P3,(P)	;SAVE UDB WHICH FINISHED REWIND
		MOVX T2,US.PSI	;SET REWIND PSI
		IORM T2,UDBSTS(P3)
		LDB T2,USYTYP	;IS THIS A TU77
		CAIE T2,.UTT77	; ??
		JRST .+1	;NO
		PUSH P,T1	;YES - SAVE T1
		MOVX T2,DF.CLR	;AND CLEAR IT
		CALL WTREG3	; ...
		POP P,T1	;RESTORE
		JRST .+1]	;AND CONTINUE LOOP
	CALL TM2OFC		;DO OFFLINE CHECK
	TXNN T1,DS.SLA!DS.SSC	;SLAVE ATTENTION OR SLAVE STATUS CHANGE?
	JRST TM2PNO		;NO
	LDB T2,USYTYP		;YES - IS IT A TU77?
	CAIE T2,.UTT77		; ??
	JRST TM2PNO		;NO
	PUSH P,T1		;YES - SAVE T1
	MOVX T2,DF.CLR		;MUST CLEAR IT
	CALL WTREG3		; ...
	POP P,T1		;RESTORE
TM2PNO:	AOBJN T4,POLLP		;DO REST OF SLAVES
	JUMPGE T1,TM2NRD	;JUMP IF WE HAVE READ THE STATUS REGISTER
	MOVE Q2,TM2ADR(P2)	;IF NOT, READ IT NOW
	MOVX T2,DO.DS
	CALL RDREG3		;READ THE DRIVE STATUS REGISTER
TM2NRD:	TRNE T1,DS.SSC!DS.ERR	;IS SSC OR ERR UP?
	JRST FNDCLR		;YES, FIND AN INACTIVE DRIVE FOR DRIVE CLEAR
TM2BCK:	POP P,P3		;RECOVER POSSIBLE REWIND DONE UDB
	JUMPE P3,TM2NR1		;IS THERE ONE?
	SKIPN -2(P)		;YES, IS IT LEGAL TO START UP
	CALL PHYRWD		;YES, NOTIFY PHYSIO, MAY START IO
TM2NR1:	POP P,P3
	POP P,Q2
	POP P,P4
	RET
FNDCLR:	MOVE T2,KDBIUN(P2)	;GET AOBJN POINTER
FNDLP:	SKIPN P3,(T2)		;IS ENTRY 0?
	JRST RDYCLR		;YES, DO DRIVE CLEAR HERE
	MOVE T3,UDBSTS(P3)	;GET UDB STATS
	TXNE T3,US.REW		;ARE WE REWINDING?
	AOBJN T2,FNDLP		;YES, TRY NEXT DRIVE
RDYCLR:	SUB T2,KDBIUN(P2)	;SUBT AOBJN POINTER BASE
	HRLI T2,(DO.TC)		;IF ALL REWINDING, DO IT TO 7
	CALL WTREG3		;SELECT IT
	MOVX T2,DF.CLR		;SET UP TO DO CLEAR
	CALL WTREG3		;LOAD IT INTO CONTRL REGISTER (0)
	SOJN P4,POLAGN		;BEGIN POLL AGAIN (THANX TO MATEL ENG)
	BUG.(CHK,TM2CCI,PHYM2,HARD,<PHYM2 - TM02 SSC or SLA won't clear>,,<

Cause:	11 (octal) attempts to clear a TM02/3 SSC or SLA have failed.

Action:	This is a hardware problem.  Field Service should check out the TM02 or
	TM03 controller.
>,,<DB%NND>)			;[7.1210] 
	JRST TM2BCK		;HOPE AND HOPE

;HERE TO CHECK IF ONLINE/OFFLINE STATUS CHANGE

TM2OFC:	SAVET			;SAVE TEMPS
	HLLZ T2,UDBSTS(P3)	;GET CURRENT STATUS
	TXNN T2,US.OFS		;IS IT OFFLINE?
	JRST TM2ONC		;YES CHECK TO SEE IF DRIVE WENT ONLINE
	TXNN T1,DS.MOL		;IS DRIVE ONLINE
	RET			;NO STILL OFFLINE
	CALLRET	PHYONL		;CHANGE OF STATUS SET IT ONLINE

TM2ONC:	TXNE T1,DS.MOL		;CURRENT STATE IS ONLINE IS IT REALLY
	RET			;YES ALL OK
	CALLRET PHYOFL		;NO DECLARE OFFLINE
	SUBTTL TM02 Function Table

;EACH ENTRY MUST BE NON-0

;1B0			;ILLEGAL FUNCTION
	TB.WRT==1B1		;THIS FUNCTION WRITES ON TAPE
	TB.REV==1B2		;THIS OPERATION MOVES TAPEIN REVERSE DIRECTION
	TB.DOP==1B3		;THIS IS A DATA OPERATION
	TB.SPC==1B4		;THIS IS A SPACE OPERATION
	TB.RD==1B5		;THIS IS A READ
	TB.ERA==1B6		;ERASE OPERATION
	TB.TM==1B7		;WRITE TAPE MARK
	TB.NFC==1B8		;DON'T LOAD FRM COUNT WHEN DOING OPERATION
	TB.REW==1B9		;OPERATION IS A REWIND


;BITS 15,16,17 CONTAIN AN INDEX TO RTYBPT TO TELL US HOW
;TO RETRY AN OPERATION (0 IF NO RETRY)

;BITS 30-35 CONTAIN THE EQUIVALENT TM02 FUNCTION

TM2FTB:	1B0			;0- ILLEGAL
	TB.DOP!TB.RD!TB.NFC!2B17!DF.RDF ;1- READ FORWARD (IRFRED)
	1B0			;2- ILL (RD FMT)
	TB.WRT!TB.DOP!1B17!DF.WTF ;3- WRITE FORWARD (IRFWRT)
	1B0			;4- ILL (WRT FMT)
	1B0			;5- ILL (SEEK)
	TB.SPC!DF.SPF 		;6- SPCE FORWARD
	TB.REV!TB.SPC!DF.SPR	 ;7- SPCE REVERSE
	TB.WRT!TB.TM!6B17!DF.WTM ;10- WRITE TM
	TB.WRT!TB.ERA!TB.NFC!DF.ERA ;11- ERASE
	TB.NFC!TB.REW!DF.REW 	;12- REWIND
	TB.NFC!DF.UNL		 ;13- UNLOAD
	TB.REV!TB.DOP!TB.RD!TB.NFC!4B17!DF.RDR ;14- READ REVERSE
	1B0			;15- ILL (RECOVERY RD)
	1B0			;16- ILL (USED FOR END OF RECOVERY ACTION)
	1B0			;17- ILL (USED FOR CHECK POSITION ACTION)

;CONVT SOFTWARE MODE CODE TO TM02/3 FMT CODE (1B0 IS ILLEGAL)
;LH IS #FRAMES/BYTE (0 MEANS FRAMES=BYTES), RH IS TM02 FORMAT TYPE
MTBFMT:	1B0			;0 - ILLEGAL FMT
	5,,0			;1 - COR DMP (LH MEANS 5 FRAMES PER BYTE)
	1B0			;2 - SIXBIT (7TRK) ILLEGAL
	2			;3 - 7-BIT (ASCII)
	3			;4 - 8-BIT (COMPAT)

;CONVT SOFTWARE DENS CODE TO TM02/3 DENSITY CODE (1B0 IS ILLEGAL)
MTBDEN:	1B0			;0 - ILLEGAL DEN
	0			;1 - 200BPI
	1			;2 - 556BPI
	2			;3 - 800BPI
	4			;4 - 1600BPI

;RETRY TABLES TO TELL HOW TO RETRY

RTYBPT:	0			;ILLEGAL RETRY
	POINT 4,TBRWRT		;WRITE RETRY
	POINT 4,TBRRF		;READ FORWARD RETRY
	POINT 4,TBRRFC		;READ FORWARD TAPE CLEAN
	POINT 4,TBRRR		;READ REVERSE RETRY
	POINT 4,TBRRRC		;READ REVERSE TAPE CLEAN
	POINT 4,TBRWTM		;WRITE TAPE MARK
	0			;ILLEGAL
;THE FOLLOWING MACROS HELP ME GET AROUND SOME SHORTCOMINGS IN MACRO:
;NOTE: THE MACRO'S MUST BE FIXED IN THE UNLIKELY EVENT THAT
;SOMEBODY WANTS TO CHANGE TO A BYTE SIZE WHICH DOESN'T GO
;EVENLY INTO 36(10). RIGHT NOW IT'S 4.

	DEFINE FOO (XXA) <
		WD==0
		BYC==0
		ZZ==0		;FLIP-FLOP
	IRP XXA,<
	IFE ZZ,<RP==XXA>
	IFN ZZ,<FOO1 RP,XXA>
	ZZ==ZZ+1
	IFE ZZ-2,<ZZ==0>>
	IFN BYC,<EXP WD>>

	DEFINE FOO1 (A1,A2) <
	REPEAT A1,<
		WD==WD+<A2>B<4*BYC+3>
		BYC==BYC+1
	IFGE BYC-^D9, <
			EXP WD
			WD==0
			BYC==0>>>

TBRWRT:	BYTE (4) IRFBSB,IRFERG,17,IRFWRT,16
				;WRITE RETRY - SPACE REVERSE, ERASE, CHECK POSITION, WRITE
TBRWTM:	BYTE (4) IRFBSB,IRFERG,17,IRFWTM,16
			;WTM RETRY - SPACE REVERSE, ERASE, CHECK POS, WTM, EOR
TBRRF:	BYTE (4) IRFBSB,17,IRFRED,16
				;READ FORWARD RETRY - SPACE REVERSE, CHECK POSITION, READ FORWARD
TBRRR:	BYTE (4) IRFFSB,17,IRFRDR,16
				;READ REVERSE RETRY - SPACE FORWARD, CHECK POSITION, READ REVERSE

TBRRFC:	FOO<CLNREC+1,IRFBSB, CLNREC,IRFFSB, 1,17, 1,IRFRED, 1,16>
				;RD FORWARD TAPE CLEAN: 6 SP REVERSE, 5 SP FORWARD, CHECK POSITION, RD FORWARD
TBRRRC:	FOO<CLNREC,IRFBSB, CLNREC+1,IRFFSB, 1,17, 1,IRFRDR, 1,16>
				;RD REVERSE TAPE CLEAN: 5 SP REVERSE, 6 SP FORWARD, CHECK POSITION, RD REVERSE
	SUBTTL End of PHYM2

	TNXEND
	END