;PAGE	61
;		.TITLE	'DISK	***** DISKP.SRC ***** 3/9/79 *****	4:00:00 P.M.'
;
;
;
;
;
;
STATVH	=	DVSTAT/256
STATVL	=	(-256)*STATVH+DVSTAT ;STATUS POINTER
;
;
;
;
;	CONSTANT EQUATES
;
DISKID	=	$31	;SERIAL BUS DISK I.D.
PUTSEC	=	$50	;DISK PUT SECTOR DCB COMMAND
; READ	=	$52	;DISK GET SECTOR DCB COMMAND
; WRITE =	$57	;DISK PUT SECTOR WITH READ CHECK DCB COMMAND
STATC	=	$53	;DISK STATUS DCB COMMAND
FOMAT	=	$21	;DISK FORMAT DCB COMMAND !!!!! *****
NODAT	=	0	;SIO COMMAND FOR "NO DATA" OPERATION
GETDAT	=	$40	;SIO COMMAND FOR "DATA FROM DEVICE"
PUTDAT	=	$80	;SIO COMMAND FOR "DATA TO DEVICE"
;
;
;	VECTORS
;
	.ORG	$E450
;
	JMP	DINIT	;DISK INIT. VECTOR
	JMP	DSKIF	;DISK INTERFACE ENTRY POINT
;
;
;
;
;
;
;	CONSTANTS
;
	.ORG	DSKORG
;
;
;
;
;
;
;
;
;
;***********************************************************************
;	DISK INTERFACE ROUTINE STARTS HERE
;***********************************************************************
;PAGE	62
;
;
;
;
;	DISK INTERFACE INITIALIZATION ROUTINE
;
DINIT:	LDA	#160
	STA	DSKTIM		;SET INITIAL DISK TIMEOUT TO 160 SEC
	RTS
;
;
;
;	DISK INTERFACE ENTRY POINT
;
DSKIF:	LDA	#DISKID
	STA	DDEVIC		;SET SERIAL BUS I.D IN DCB
	LDA	DSKTIM
	LDX	DCOMND
	CPX	#FOMAT		;IS COMMAND A FORMAT COMMAND?
	BEQ	PUTDTO
	LDA	#7		;NO, SET TIMEOUT TO 7 SECS.
PUTDTO: STA	DTIMLO		;PUT DISK TIMEOUT IN DCB
	LDX	#GETDAT		;SET "GET DATA" COMMAND FOR SIO
	LDY	#$80		;SET BYTE COUNT TO 128
	LDA	DCOMND		;READ COMMAND IN DCB
	CMP	#WRITE		;IS COMMAND A "PUT SECTOR" COMMAND?
	BNE	CKSTC
	LDX	#PUTDAT		;YES, SET "PUT DATA" COMMAND FOR SIO
CKSTC:	CMP	#STATC		;IS COMMAND A STATUS COMMAND?
	BNE	PUTCNT
	LDA	#STATVL
	STA	DBUFLO
	LDA	#STATVH
	STA	DBUFHI		;SET BUFFER ADDR TO GLOBAL STATUS BUFFER
	LDY	#4		;YES, SET BYTE COUNT TO 4
PUTCNT: STX	DSTATS		;PUT STATUS COMMAND FOR SIO IN DCB
	STY	DBYTLO
	LDA	#0
	STA	DBYTHI		;PUT BYTE COUNT IN DCB
	JSR	SIOV		;CALL SERIAL I/O.
	BPL	GOODST		;NO ERROR
	RTS			;NO, GO BACK
GOODST: LDA	DCOMND		;READ THE COMMAND
	CMP	#STATC		;WAS IT A STATUS COMMAND?
	BNE	PUTBC
	JSR	PUTADR		;PUT BUFFER ADDR IN TEMP REG.
	LDY	#2
	LDA	(BUFADR),Y	;READ DISK TIMEOUT VALUE BYTE OF STATUS
	STA	DSKTIM		;PUT IT IN DISK TIMEOUT REG.
PUTBC:	LDA	DCOMND
	CMP	#FOMAT		;WAS COMMAND A FORMAT COMMAND?
	BNE	ENDDIF
FMTD:	JSR	PUTADR		;YES, PUT BUFFER ADDR INTO TEMP REG
	LDY	#$FE		;SET BUFFER POINTER
 
;PAGE	63

TWICE:	INY
	INY			;INCR BUFFER POINTER BY 2
RDBAD:	LDA	(BUFADR),Y	;READ LO BYTE BAD SECTOR DATA
	CMP	#$FF
	BNE	TWICE		;IS IT "FF" ?
	INY			;YES,
	LDA	(BUFADR),Y	;READ HI BYTE BAD SECTOR DATA
	INY
	CMP	#$FF
	BNE	RDBAD		;IS IT "FF" ?
	DEY
	DEY			;YES,
	STY	DBYTLO		;PUT BAD SECTOR BYTE COUNT INTO DCB
	LDA	#0
	STA	DBYTHI
ENDDIF: LDY	DSTATS
	RTS
;
;
;
;
;	S U B R O U T I N E S
;
;
;	PUT BUFFER ADDR FROM DCB INTO TEMP REG
;
PUTADR: LDA	DBUFLO
	STA	BUFADR
	LDA	DBUFHI
	STA	BUFADR+1	;PUT BUFFER ADDR IN TEMP REG
	RTS
;****************************************************************
;
;
;	SPARE BYTE OR MODULE TOO LONG FLAG
;
CRNTP4	=	*
;
	.ORG	$14
DSKSPR: .BYTE	PRNORG-CRNTP4 ;^GDISKP TOO LONG
;
 


