ùúùúÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:****************************************
*** Routines for reading DOS sectors ***
***        With error checking       ***
***         and timer waiting        ***
*** Coded 901222 by Conqueror  AGILE ***
****************************************

;	SECTORLOADER... FOR STANDARD AMIGADOS
;	PLEASE DONT SPREAD THIS ONE, KYLE !!

DriveNr:	=0		;0=df0:, 1=df1: etc
DiskBuf:	=$78000		;put disk buffer here
Retries:	=5		;# of retries if read error

Head:		=2	;dont
Count:		=4	;change

S:	Pea	Trap(pc)
	Move.L	(sp)+,$80.W
	Trap	#0
	Rts
Trap:	Move.W	#$2700,SR
	Bsr.S	LS
	Rte

LS:	Movem.L	d0-d7/a0-a6,-(sp)
	Lea	$bfd100,a5
	Bclr	#7,(a5)
	Lea	CurrentTrack(pc),a6	;put temp data here
	Bset	#DriveNr+3,(a5)
	Move.L	#$55555555,d5
	Bclr	#DriveNr+3,(a5)

	Lea	$40000,a0	;load address
	Move.W	#0,d0		;start sector
	Move.W	#23,d1		;# of sectors to load

LoadMore:
	Bsr.S	Load
	Addq.W	#1,d0
	Subq.W	#1,d1
	Bne.S	LoadMore

Exit:	Bset	#7,(a5)
	Bset	#DriveNr+3,(a5)
	Bclr	#DriveNr+3,(a5)
	Movem.L	(sp)+,d0-d7/a0-a6
	Rts


StepMore:
	Bset	#1,(a5)		;Towards Track 0
	Bsr.S	Step
FindTrack0:
	Btst	#4,$f01(a5)
	Bne.S	StepMore
	Sf	(a6)
FindTrack:
	Tst.B	(a6)
	Bmi.S	FindTrack0
NextTrack:
	Cmp.B	(a6),d2
	Beq.S	SameTrack
	Bcc.S	LowerTrack
HigherTrack:
	Bset	#1,(a5)
	Subq.B	#1,(a6)
	Bra.S	GetCloser
LowerTrack:
	Bclr	#1,(a5)
	Addq.B	#1,(a6)
GetCloser:
	Bsr.S	Step
	Bra.S	NextTrack

Step:	Bclr	#0,(a5)
	Bset	#0,(a5)
Wait:	Move.B	#$00,$500(a5)
	Move.B	#$10,$600(a5)	;change this for step delay
	Move.B	#$19,$e00(a5)
Delay:	Btst	#0,$e00(a5)
	Bne.S	Delay
SameTrack:
	Btst	#5,$f01(a5)
	Bne.S	SameTrack
	Rts

Load:	Lea	DiskBuf,a4
	Move.L	d0,d2
	Ext.L	d2
	Divu	#11,d2
	Move.L	d2,d4
	Swap	d4
	Cmp.W	Head(a6),d2
	Beq.S	InMem
	Move.W	d2,Head(a6)
	Bset	#2,(a5)
	Btst	#0,d2
	Beq.S	Side0
	Bclr	#2,(a5)
Side0:	Lsr.W	#1,d2
	Bsr.S	FindTrack
	Move.W	#Retries,Count(a6)	;retries to read if error
	Bra.S	Read
ReadError:
	Subq.W	#1,Count(a6)
	Bne.S	Read
	Moveq	#-1,d2
	Move.L	d2,(a6)
	Bra.S	Load
Read:	Lea	DiskBuf,a4
	Lea	$dff024,a3
	Move.W	#$8210,$72(a3)
	Move.L	#$00027f00,$78(a3)
	Move.W	#$9500,$7a(a3)
	Move.W	#$4489,$5a(a3)
	Move.L	a4,-4(a3)
	Move.W	#$8000+$1900,(a3)
	Move.W	#$8000+$1900,(a3)
	Move.L	#$a0000,d7
DskBlk:	Subq.L	#1,d7
	Beq.S	ReadError
	Btst	#1,-5(a3)
	Beq.S	DskBlk

InMem:

DeCode:	Moveq	#11-1,d6
FindSync:
	Cmp.W	#$4489,(a4)+
	Bne.S	FindSync
	Cmp.W	#$4489,(a4)
	Beq.S	FindSync
	Movem.L	(a4),d2/d3
	Bsr.S	DecodeLWord
	Lsr.W	#8,d2
	Cmp.W	d4,d2
	Beq.S	JustOk
	Lea	[512+28]*2(a4),a4		;loop 11 ggr
	Dbf	d6,FindSync
	Bra.S	ReadError

JustOk:	Swap	d2
	Cmp.B	Head+1(a6),d2
	Bne.S	ReadError

	Lea	$30(a4),a4
	Move.L	(a4)+,d2
	Move.L	(a4)+,d3
	Bsr.S	DecodeLWord
	Move.W	#$ff,d7		;$400 LWords raw data
	Moveq	#0,d3
CalcCheck:
	Move.L	(a4)+,d4
	Eor.L	d4,d3
	Dbf	d7,CalcCheck
	And.L	d5,d3
	Cmp.L	d3,d2		;checksum error
	Bne.L	ReadError

	Lea	-$400(a4),a4
	Moveq	#[512/4]-1,d7
DCode:	Move.L	512(a4),d3
	Move.L	(a4)+,d2
	And.L	d5,d2
	And.L	d5,d3
	Add.L	d2,d2
	Or.L	d3,d2
	Move.L	d2,(a0)+
	Dbf	d7,DCode
	Rts

DecodeLWord:
	And.L	d5,d2
	And.L	d5,d3
	Add.L	d2,d2
	Or.L	d3,d2
	Rts

CurrentTrack:
	Dc.W	-1
CurrentHead:
	Dc.W	-1
ErrCount:
	Dc.W	Retries
E:

