                             	.TITLE	DK
;
;	VERSION	V005A
;			001
;	COPYRIGHT 1971,1972 DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
;
;	RK11 DISC DRIVER
;
;	GLOBL	DEFINITIONS
;
	.GLOBL	DK
	.GLOBL	DKDDB
;
;	GLOBAL REFERENCES
;
	.GLOBL	DV.STS		;ENTRY TO FAKE INTERRUPT
	.GLOBL	SRTI	;COMMON SYSTEM EXIT
	.GLOBL	STRG	;COMMON SYSTEM ENTRY
	.GLOBL	SY.DPR	;DDB-PERMANENT DDB BIT
	.GLOBL	SY.TO	;DDB-TIME OUT COUNT (0=NOT ACTIVE)
;
;	STANDARD REGISTER DEFINITIONS
;
R0=%0
R1=%1
R2=%2
R3=%3
R4=%4
R5=%5
R6=%6
PC=%7
	.IFNDF	DK.DSC
DK.DSC=1
	.ENDC
;
;	PROLOGUE
;
DK:	.WORD	0		;0 IF IDLE, DDB PTR OTHERWISE
	.BYTE	37		;STANDARD FACILITY INDICATOR
	.BYTE	200		;(NORMAL & FILE BASED)
	.BYTE	20		;STD BUFFER SIZE IS 256. WORDS
	.BYTE	DKINT-DK	;OFFSET TO INTERRUPT HANDLER
	.BYTE	240+DK.DSC-1	;LEVEL & MAX # OF RK DRIVES
	.BYTE	0		;NO OPEN ROUTINE
	.BYTE	DKSTRT-DK	;OFFSET TO TRANSFER HANDLER
	.BYTE	0		;NO CLOSE ROUTINE
	.BYTE	0		;NO SPECIAL FUNCTIONS
	.BYTE	DK.TB-DK	;MISC ENTRY
DKNAM:	.RAD50	/DK/		;DEVICE NAME
	.WORD	RKDIR		;FIRST MFD BLOCK
	.WORD	0		;BIT MAP POINTER
;
;	MISC ENTRY TABLE
;
DK.TB:	.WORD	0		;NO POWER FAIL
	.WORD	DK.TO		;TIME OUT
	.WORD	0		;NO CONTINUE
	.WORD	0		;NO CANCEL
;
;	TRANSFER INITIATE
;
DKSTRT:	MOV	@PC,DKREPT	;CLEAR RETRY INDICATOR
DKRTRY:	MOVB	#-10,SY.TO(R0)	;SET TIME OUT COUNT
	CLR	R1		;UNIT IS ZERO
	CMP	(R0)+,(R0)+	;POINTER DDB+BLOCK
	MOV	(R0)+,R2
	.IFDF	LOWDEN
	ASL	R2
	.ENDC
	CMP	R2,#4800.	;IS BLOCK WITHIN BOUNDS?
	BLO	DKIN20		;YES - BRANCH
	SUB	#6,R0		;POINT TO DDB
	MOV	#RKCS+2,R5	;GET ADDR OF WC REGISTER
	MOV	10(R0),(R5)	;SET WORD COUNT REGISTER
	CLR	SY.TO(R0)	;DISABLE TIME OUT
	JSR	R5,DV.STS	;FAKE AN INTERRUPT TO AVOID POSSIBLE...
				;...PROBLEM IF CALLED FROM DEQUEUE
	BR	DKHR06		;
DKIN10:	ADD	R2,R1		;ADD IN VALID QUOTIENT
	ASR	R2		;ADJ REMAINDER FOR DIV BY 12
	ASR	R2
	ADD	R4,R2
DKIN20:	MOV	R2,R4		;DIVIDE BY 16 - SAVE REMAINDER
	BIC	#177760,R4
	BIC	R4,R2		;EXTRACT QUOTIENT ...
	BNE	DKIN10		;... IF ANY BUILD RESULT
	CMP	R4,#12.		;CHECK REMAINDER
	BLT	.+6		;IF BETWEEN 12 & 15 ...
	ADD	#4,R4		;... CAUSE SURFACE INCR.
	ADD	R4,R1		;PUT SECTOR INTO REST
	MOV	#RKDA,R4
	MOV	R1,@R4		;SET UP DISK ADDRESS
	MOV	(R0)+,-(R4)	;SET UP MEMORY ADDRESS
	MOV	(R0)+,-(R4)	;SET UP WORD COUNT
	MOV	(R0)+,R1	;PUT IN THE FUNCTION
	MOV	R1,R2		;GET DRIVE UNIT NUMBER
	ASL	R2		;SHIFT DRIVE NUMBER...
	ASL	R2		;...TO HIGH ORDER BITS
	ASL	R2
	ASL	R2
	ASL	R2
	BIC	#17777,R2	;CLEAR EXTRANEOUS BITS
	BIS	R2,4(R4)	;SET UNIT # IN DISK ADDRESS
	BISB	@PC,R1		;SET I.D.E. AND GO BITS
	BIC	#177460,R1	;CLEAR GARBAGE -*****-
	MOV	R1,-(R4)	;SEND FUNCTION TO CONTROL
DK.RTS:	RTS	PC		;RETURN
;
;	TIME OUT ENTRY
;
DK.TO:	CLR	SY.TO(R0)	;DISABLE TIME OUT
	MOVB	DK+6,177776	;LOWER TO DEVICE LEVEL
	MOV	#RKCS+2,R5	;GET ADDRESS OF WC REGISTER
	CLR	R1		;CLEAR STATUS INDICATION
	BR	DKHER		;CLAIM HARD ERROR
;
;	INTERRUPT ENTRY
;
DKINT:	JSR	R5,STRG		;SAVE REGS
	MOV	#SRTI,-(R6)	;SAVE REGS
	MOV	DK,R0		;GET DDB ADDRESS
	BEQ	DK.RTS		;IF EQ IGNOR UNSOLICITED INTERRUPTS
	MOVB	DK+6,177776	;LOWER TO DEVICE LEVEL
	CLR	SY.TO(R0)	;DISABLE TIME OUT
	MOV	#RKDS,R5
	MOV	(R5)+,R1	;SAVE RKDS AND RKER FOR LATER
	MOV	(R5)+,R2
	MOV	(R5)+,R4	;SAVE RKCS
	BMI	DKERP		;YES - BRANCH
	BIT	#10,R4		;WAS LAST FCN A DRIVE RESET?
	BNE	DKER00		;YES - BRANCH
DKXIT:	CLR	-(R5)		;DISABLE DEVICE INTERRUPTS
	JMP	@14(R0)		;TAKE COMPLETION EXIT
;
;ERROR PROCESSOR:
;
DKERP:	ASL	R4		;HARD ERROR?
	BMI	DKHER		;YES - BRANCH
DKER00:	ROL	(PC)+		;TRIED 8 TIMES?
DKREPT:	.WORD	0
	BCC	DKRTRY		;IF CC TRY AGAIN
	BIS	#100000,12(R0)	;SET PARITY ERROR
	BR	DKHR07		;
DKHER:	MOV	#1,-(R5)	;CLEAR THE CONTROL
DKHR00:	TSTB	@R5		;DONE YET?
	BPL	DKHR00		;NO - LOOP
	BIT	#1000,R1	;IS IT SEEK INCOMPLETE?
	BEQ	DKHR05		;NO - BRANCH
	MOV	R1,4(R5)	;REPLACE DRIVE #
	MOV	#115,@R5	;SET UP FOR DRIVE RESET
	RTS	PC		;RETURN
DKHR05:	TST	(R5)+		;ADJUST R5
DKHR06:	BIS	#10000,12(R0)	;SET UNRECOVERABLE ERROR
DKHR07:	MOV	(R5),16(R0)	;SET UNTRANSFERED WORD COUNT
	BR	DKXIT		;TAKE COMPLETION RETURN
;
DKNT=0				;RK DRIVE UNIT #
DKSPN=40			;RK UNIT SUSPEND NUMBER
;
;	RK11 DDB
;
	0,0			;ACTIVE DDB CHAIN
	.WORD	0		;CHAIN LINK
	.WORD	0,0		;LEVEL COUNTS
	.WORD	DK		;DRIVER ADDRESS
DKDDB:	.WORD	0,0,0,0,0,0,0,0,0,0,0,0;
	.BYTE	0		;
	.BYTE	DKSPN
	.WORD	0,0,0,0,0	;
	.BYTE	0		;TASK RESERVED FOR
	.BYTE	SY.DPR		;FLAGS(PERMANENT DDB)
	.WORD	0,0		;SCB
	.WORD	0		;TIME OUT COUNTS
;
	.IFGE	DK.DSC-2
;
;	RK11 DDB
;
DKNT=DKNT+1			;UNIT NUMBER
DKSPN=DKSPN+1			;SUSPEND NUMBER
;
	0,0			;ACTIVE DDB QUEUE
	0			;MONITOR CHAIN LINK
	0,0			;LEVEL COUNTS
	DK			;DRIVER ADDRESS
	0
	0			;TRAN BLOCK ADDRESS
	0			;DEVICE BLOCK NUMBER
	0			;CORE TRANSFER ADDRESS
	0			;WORD COUNT
	.BYTE	0,DKNT		;UNIT #,TRANSFER FUNCTION
	0,0,0,0,0,0
	.BYTE	0,DKSPN		;SUSPEND NUMBER
	0,0,0,0,0
	.BYTE	0,SY.DPR	;PERMANENT DDB
	0,0
	0			;TIMEOUT COUNT
;
	.IFGE	DK.DSC-3
;
;	RK11 DDB
;
DKNT=DKNT+1			;UNIT NUMBER
DKSPN=DKSPN+1			;SUSPEND NUMBER
;
	0,0			;ACTIVE DDB QUEUE
	0			;MONITOR CHAIN LINK
	0,0			;LEVEL COUNTS
	DK			;DRIVER ADDRESS
	0
	0			;TRAN BLOCK ADDRESS
	0			;DEVICE BLOCK NUMBER
	0			;CORE TRANSFER ADDRESS
	0			;WORD COUNT
	.BYTE	0,DKNT		;UNIT #,TRANSFER FUNCTION
	0,0,0,0,0,0
	.BYTE	0,DKSPN		;SUSPEND NUMBER
	0,0,0,0,0
	.BYTE	0,SY.DPR	;PERMANENT DDB
	0,0
	0			;TIMEOUT COUNT
;
	.IFGE	DK.DSC-4
;
;	RK11 DDB
;
DKNT=DKNT+1			;UNIT NUMBER
DKSPN=DKSPN+1			;SUSPEND NUMBER
;
	0,0			;ACTIVE DDB QUEUE
	0			;MONITOR CHAIN LINK
	0,0			;LEVEL COUNTS
	DK			;DRIVER ADDRESS
	0
	0			;TRAN BLOCK ADDRESS
	0			;DEVICE BLOCK NUMBER
	0			;CORE TRANSFER ADDRESS
	0			;WORD COUNT
	.BYTE	0,DKNT		;UNIT #,TRANSFER FUNCTION
	0,0,0,0,0,0
	.BYTE	0,DKSPN		;SUSPEND NUMBER
	0,0,0,0,0
	.BYTE	0,SY.DPR	;PERMANENT DDB
	0,0
	0			;TIMEOUT COUNT
;
	.IFGE	DK.DSC-5
;
;	RK11 DDB
;
DKNT=DKNT+1			;UNIT NUMBER
DKSPN=DKSPN+1			;SUSPEND NUMBER
;
	0,0			;ACTIVE DDB QUEUE
	0			;MONITOR CHAIN LINK
	0,0			;LEVEL COUNTS
	DK			;DRIVER ADDRESS
	0
	0			;TRAN BLOCK ADDRESS
	0			;DEVICE BLOCK NUMBER
	0			;CORE TRANSFER ADDRESS
	0			;WORD COUNT
	.BYTE	0,DKNT		;UNIT #,TRANSFER FUNCTION
	0,0,0,0,0,0
	.BYTE	0,DKSPN		;SUSPEND NUMBER
	0,0,0,0,0
	.BYTE	0,SY.DPR	;PERMANENT DDB
	0,0
	0			;TIMEOUT COUNT
;
	.IFGE	DK.DSC-6
;
;	RK11 DDB
;
DKNT=DKNT+1			;UNIT NUMBER
DKSPN=DKSPN+1			;SUSPEND NUMBER
;
	0,0			;ACTIVE DDB QUEUE
	0			;MONITOR CHAIN LINK
	0,0			;LEVEL COUNTS
	DK			;DRIVER ADDRESS
	0
	0			;TRAN BLOCK ADDRESS
	0			;DEVICE BLOCK NUMBER
	0			;CORE TRANSFER ADDRESS
	0			;WORD COUNT
	.BYTE	0,DKNT		;UNIT #,TRANSFER FUNCTION
	0,0,0,0,0,0
	.BYTE	0,DKSPN		;SUSPEND NUMBER
	0,0,0,0,0
	.BYTE	0,SY.DPR	;PERMANENT DDB
	0,0
	0			;TIMEOUT COUNT
;
	.IFGE	DK.DSC-7
;
;	RK11 DDB
;
DKNT=DKNT+1			;UNIT NUMBER
DKSPN=DKSPN+1			;SUSPEND NUMBER
;
	0,0			;ACTIVE DDB QUEUE
	0			;MONITOR CHAIN LINK
	0,0			;LEVEL COUNTS
	DK			;DRIVER ADDRESS
	0
	0			;TRAN BLOCK ADDRESS
	0			;DEVICE BLOCK NUMBER
	0			;CORE TRANSFER ADDRESS
	0			;WORD COUNT
	.BYTE	0,DKNT		;UNIT #,TRANSFER FUNCTION
	0,0,0,0,0,0
	.BYTE	0,DKSPN		;SUSPEND NUMBER
	0,0,0,0,0
	.BYTE	0,SY.DPR	;PERMANENT DDB
	0,0
	0			;TIMEOUT COUNT
;
	.IFGE	DK.DSC-8
;
;	RK11 DDB
;
DKNT=DKNT+1			;UNIT NUMBER
DKSPN=DKSPN+1			;SUSPEND NUMBER
;
	0,0			;ACTIVE DDB QUEUE
	0			;MONITOR CHAIN LINK
	0,0			;LEVEL COUNTS
	DK			;DRIVER ADDRESS
	0
	0			;TRAN BLOCK ADDRESS
	0			;DEVICE BLOCK NUMBER
	0			;CORE TRANSFER ADDRESS
	0			;WORD COUNT
	.BYTE	0,DKNT		;UNIT #,TRANSFER FUNCTION
	0,0,0,0,0,0
	.BYTE	0,DKSPN		;SUSPEND NUMBER
	0,0,0,0,0
	.BYTE	0,SY.DPR	;PERMANENT DDB
	0,0
	0			;TIMEOUT COUNT
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
;
;	DEFINITIONS
;
RKDS=177400
RKCS=177404
RKDA=177412
RKDIR=1
	.END
                                                                                                                                                               