File: SIDK.PA of Tape: Sources/RTS/s3
(Source file text) 

/SI DISK DRIVER FOR RTS/8

/ACCEPTS STANDARD MASS-STORAGE MESSAGE FORMAT

TASK=	SIDK
INIWT=	0
CUR=	0

DSDD=	6501	/SKIP ON D/D
DLCR=	6502	/LOAD CON.REG.
DCSR=	6504	/CLEAR STATUS
DRSR=	6505	/READ STATUS
DSDE=	6511	/SKIP ON D/E
DLSR=	6512	/LOAD SECT.REG.
DLTR=	6514	/LOAD TR.ADR.REG./READ
DLTW=	6515	/LOAD TR.ADR.REG./WRITE
DWCA=	6517	/WCCA SEQUENCE

	FIELD	CUR%10
	*3400
TMP,
START,	CAL
DONEFG,	SKPINS
TRYCT,	INTRPT

LOOP,	CAL
	RECEIV		/GET A MESSAGE
ADDR,	0
	DCA	FLD
	AC7775
	DCA	TRYCT	/TRY 3 TIMES
INIT,	ISZ	DONEFG	/INITIALIZE EVENT FLAG
	CMA CLL		/** AC MAY BE 3 HERE **
	TAD	ADDR
	DCA	ADDR	/ADDRESS OF PARAMETER BLOCK -1 IN AC
	JMS	GET
	AND	(7	/CLEAR ALL HIGH-ORDER BITS
	DCA	PAGCNT	/STORE UNIT
	JMS	GET
	AND	(7770	/GET FUNCTION WORD,
	TAD	PAGCNT	/COMBINE WITH UNIT NUMBER
	DCA	PAGCNT	/AND STORE IT AWAY
	TAD	PAGCNT
	AND	(3700
	CLL RAL
	DCA	WCT	/STORE WORD COUNT
	JMS	GET	/AND
	DCA	WCT+1	/PUT STARTING TRANSFER ADDRESS
			/IN DMA LOCATIONS
	TAD	(CUR^100/SET FIELD FOR DMA ACCESS
	DLCR		/AND CLEAR REST OF COMREG
	DCSR		/CLEAR STATUS
	AC0000
	TAD	(WCT
	DWCA		/MAKE DMA TRANSFER
	AC0001
	AND	PAGCNT
	SZA CLA		/"UNIT" = DRIVE*4+DISK*2+HALF 
			/CHECK WHICH HALF
	TAD	(6300	/SECOND HALF - ADD BLOCK NUMBER OFFSET
	JMS	GET	/TO BLOCK NUMBER
	DLSR		/LOAD 4 BITS IN SECTOR
	AND	(7760
	DCA	REC	/SAVE REST IN LOW ORDER
/HIGH ORDER IN LINK!!
	IAC
	IAC		/MAKE 2 AND LEAVE LINK
	AND	PAGCNT	/PLATTER BIT
	TAD	REC
	RTR
	RTR
	DCA	REC	/LOW ORDER TO LOW AND PLATTER TO BIT 1
	TAD	(DLTR
	DCA	DKIOU	/SET GO TO READ
	TAD	PAGCNT
	SPA
	ISZ	DKIOU	/IF WRITE CHANGE READ TO WRITE
	AND	(70	/ISOLATE BUFFER FIELD
	IAC		/ADD INTENA BIT
	BSW
	DCA	TMP
	AC0004
	AND	PAGCNT	/GET DRIVE NUMBER
	RAL		/INTO BIT 8
	TAD	TMP	/ADD IN FIELD AND INTENA
	IOF		/INTERRUPTS OFF WHILE LOADING REGISTERS!
	DLCR		/LOAD COMREG
	AC0000
	TAD	REC
DKIOU,	HLT		/R/W AND GO
	AC0000
	TAD	(FSTINT
	CDF CUR
	ION		/** NOTE THE "DCA IDISP" MUST BE NEXT
	DCA 	IDISP	/INITIALIZE INTERRUPT DISPATCH
	CAL
	WAITE
PDONFG,	DONEFG		/WAIT FOR COMPLETION
	AC0003		/LOAD CONSTANT FOR BACKING UP ADDR
	ISZ	RTRYFG	/DID EVENT FLAG SIGNIFY ERROR OR COMPLETION?
	JMP	INIT	/ERROR OR PWR FAIL - RETRY ENTIRE OPERATION
	JMS	GET	/THIS JUST SETS THE DF AND ADDR
	AC0000
	TAD	STATUS
	DCA  I	ADDR
	TAD	FLD
	DCA	PFLD
	TAD	ADDR
	TAD	(-7	/GET POINTER TO MESSAGE EVENT FLAG
	CAL
	POST
STATUS,
PFLD,	HLT
	JMP	LOOP	/GET ANOTHER MESSAGE

RTRYFG,	0		/RETRY FLAG

WCT,	0		/THIS LOC. AND NEXT FOR DMA
REC,			/LOW-ORDER BLOCK NUMBER
GET,	0
FLD,	HLT
	ISZ	ADDR
	TAD I	ADDR
	JMP I	GET

PAGCNT,	0		/PAGE COUNT FOR TRANSFER

FSTINT,	DSDE
	JMP	DKOVER
DKERR,	DRSR
	ISZ	TRYCT
	JMP	TRYAGN
DKOVER,	DCA	STATUS
	AC7777
TRYAGN,	DCA	RTRYFG
	TAD	(DONEFG
IGNORE,	DCSR
	CIF 0
	POSTDS

INTRPT,	0;0
	DSDD
	JMP I	INTRPT
	CDF CIF CUR
	JMP I	.+1
IDISP,	IGNORE

	$$