ReadTrack:				;D0=tracknr
	movem.l	d0-d7/a0-a6,-(a7)
	lea	$dff000,a5
	move.b	#$ff,$124(a6)
	move.w	d0,d4
	move.w	d0,d6
	moveq	#$08,d5		;Number of tries
	bsr	MotorOn
	bsr	CheckHead
	bsr	MoveHead
	bra.s	ReadTrackAgain1
ReadTrackAgain:
	bsr	ClearDMADiskWait
	move.w	#$4000,$0024(a5)
	move.w	#$0010,$96(a5)
	bsr	ExchangeRamDiskII
	bsr	ResetHead
	move.w	d6,d4
	bsr	MoveHead
ReadTrackAgain1:
	moveq	#$02,d7
	subq.w	#1,d5
	bmi	ErrorHandler
	bsr	DiskTick
	moveq	#$09,d7
	btst	#2,$bfe001		;Disk in drive?
	beq	ErrorHandler
	bsr	ExchangeRamDiskI	;Copy from $50c0
	bsr	SelPrecomp
	bsr	MotorReady
	bsr	ClearDMADisk		;Clear DMA buffer
	move.w	#$8010,$96(a5)	;Disk DMA enable
	move.w	#$4489,$7e(a5)	;Disk Sync Word
	move.w	#$1f00,$9e(a5)
	move.w	#$9500,$9e(a5)	;Read on sync enable
	move.l	$82(a6),a0
	move.l	a0,$20(a5)	;DMA buffert
	move.w	#$4000,$24(a5)
	move.w	#$99a0,$24(a5)	;Read $3340 bytes
	move.w	#$99a0,$24(a5)
	move.w	#$0002,$9c(a5)
	move.w	#$0010,$126(a6)	;Motor off 0.32 sec
	lea	$2f00(a0),a1
	move.w	#$07ff,d7
ReadTrack1:
	tst.w	$126(a6)
	beq	ReadTrackAgain
	tst.w	(a0)
	beq.s	ReadTrack1
ReadTrack2:
	cmpa.l	a1,a0
	bhi	ReadTrackAgain		;Cant find All Sectors
ReadTrack2a:
	tst.w	$126(a6)
	beq	ReadTrackAgain
	tst.w	(a0)
	beq.s	ReadTrack2a
	cmp.w	#$4489,(a0)+
	bne.s	ReadTrack2
ReadTrack2b:
	tst.w	$126(a6)
	beq	ReadTrackAgain
	tst.w	(a0)
	beq.s	ReadTrack2b
	cmp.w	#$4489,(a0)
	beq.s	ReadTrack2
	moveq	#$00,d4
	moveq	#$01,d3
	moveq	#$04,d2
	bsr	ReadTrackByte
	cmp.b	d0,d6
	bne.s	ReadTrack2		;Wrong Track
	bsr.s	ReadTrackByte
	cmp.b	#$0a,d0
	bhi.s	ReadTrack2		;Invalid Sector nr
	ext.w	d0
	ext.l	d0
	move.l	d0,a3			;Sector nr
	lsl.w	#8,d0
	add.w	d0,d0
	move.l	$120(a6),a2
	add.l	d0,a2
	bsr.s	ReadTrackByte
	add.l	d2,a0
	moveq	#$0f,d3
	moveq	#$10,d2
	bsr.s	ReadTrackByte
	add.l	d2,a0
	moveq	#$03,d3
	moveq	#$04,d2
	bsr.s	ReadTrackByte
	add.l	d2,a0
	tst.b	d4
	bne.s	ReadTrack2		;Checksum error
	moveq	#$04,d2
	bsr.s	ReadTrackLong
	add.l	d2,a0
	moveq	#$7f,d3
	move.w	#$200,d2
	subq.l	#4,a2
	bsr	ReadTrackLong		;Read Data
	add.l	d2,a0
	tst.l	d4
	bne.s	ReadTrack2		;Checksum error
	move.l	a3,d0
	bclr	d0,d7
	tst.w	d7
	bne	ReadTrack2
	move.b	$11c(a6),$124(a6)
	move.b	d6,$125(a6)
	move.w	#$4000,$24(a5)
	move.w	#$0010,$96(a5)
	move.w	#$0032,$126(a5)		;Drive off 1.0 sec
	bsr	UnselectDrive
	bsr	ClearDMADiskWait
	bsr	ExchangeRamDiskII	;Copy to $50c0
	movem.l	(a7)+,d0-d7/a0-a6
	rts

ReadTrackByte:
	tst.w	$126(a6)
	beq.s	ReadTrackByte1
	tst.b	0(a0,d2.w)
	beq.s	ReadTrackByte		;Wait for Disk DMA !
ReadTrackByte1:
	move.b	(a0)+,d0
	and.b	#$55,d0
	eor.b	d0,d4
	add.b	d0,d0
	move.b	-1(a0,d2.w),d1
	and.b	#$55,d1
	eor.b	d1,d4
	or.b	d1,d0
	subq.w	#1,d3
	bpl.s	ReadTrackByte
	rts

ReadTrackLong:
	tst.w	$126(a6)
	beq.s	ReadTrackLong1
	tst.w	2(a0,d2.w)
	beq.s	ReadTrackLong		;Wait for Disk DMA !
ReadTrackLong1:
	move.l	(a0)+,d0
	and.l	#$55555555,d0
	eor.l	d0,d4
	add.l	d0,d0
	move.l	-4(a0,d2.w),d1
	and.l	#$55555555,d1
	eor.l	d1,d4
	or.l	d1,d0
	move.l	d0,(a2)+
	subq.w	#1,d3
	bpl.s	ReadTrackLong
	rts

WriteLastTrack:
	movem.l	d0/a6,-(a7)
	cmp.w	#$1234,$138(a6)
	bne.s	WriteLastTrack1
	moveq	#$00,d0
	move.b	$125(a6),d0		;Buffer Track nr
	bsr.s	WriteTrack
WriteLastTrack1:
	movem.l	(a7)+,d0/a6
	rts

WriteTrack:				;D0=tracknr
	movem.l	d0-d7/a0-a6,-(a7)
	lea	$dff000,a5
	move.w	d0,d4
	move.w	d0,d6
	moveq	#$08,d5		;Number of tries
	bsr	MotorOn
	bsr	CheckHead
	bsr	MoveHead
	bra.s	WriteTrackAgain1
WriteTrackAgain:
	bsr	ClearDMADiskWait
	move.w	#$4000,$0024(a5)
	move.w	#$0010,$96(a5)
	bsr	ExchangeRamDiskII
	bsr	ResetHead
	move.w	d6,d4
	bsr	MoveHead
WriteTrackAgain1:
	moveq	#$02,d7
	subq.w	#1,d5			;Bad Disk ?
	bmi	ErrorHandler
	bsr	DiskTick
	moveq	#$09,d7
	btst	#2,$bfe001		;Disk in drive?
	beq	ErrorHandler
	moveq	#$03,d7
	btst	#3,$bfe001		;Disk WriteProtected ?
	beq	ErrorHandler
	bsr	ExchangeRamDiskI	;Copy from $50c0,clear DMA
	bsr	SelPrecomp
	bsr	MotorReady
	move.w	#$8010,$96(a5)	;Disk DMA enable
	move.w	#$4489,$7e(a5)	;Disk Sync Word
	move.w	#$1f00,$9e(a5)
	move.w	#$9100,$9e(a5)	;MFM|FAST enable
	move.w	#$4000,$24(a5)
	move.l	$82(a6),a0
	move.l	$120(a6),a2
	move.w	#$011e,d1
	move.l	#$aaaaaaaa,d2
WriteTrack1:
	move.l	d2,(a0)+
	dbf	d1,WriteTrack1
	move.l	$82(a6),$20(a5)	;DMA buffert
	move.w	#$d9a0,$24(a5)	;Write $3340 bytes
	move.w	#$d9a0,$24(a5)
	move.w	#$0002,$9c(a5)
	move.w	#$0010,$126(a6)	;Disk motor on 0.32 sec
	moveq	#$00,d7
WriteTrack2:
	move.l	a0,a1
	move.l	#$aaaaaaaa,(a0)+
	move.l	#$44894489,(a0)+
	move.w	#$ff00,d0		;Format byte
	or.b	d6,d0			;Track nr
	swap	d0
	move.b	d7,d0			;Sector nr
	lsl.w	#8,d0
	move.b	#$0b,d0
	sub.b	d7,d0			;Sector interleave
	moveq	#$04,d2
	moveq	#$00,d3
	moveq	#$00,d4
	bsr	WriteTrackLongII
	add.l	d2,a0
	moveq	#$10,d2
	moveq	#$00,d0
	bsr	WriteTrackLongII
	moveq	#$00,d0
	bsr	WriteTrackLongII
	moveq	#$00,d0
	bsr	WriteTrackLongII
	moveq	#$00,d0
	bsr	WriteTrackLongII
	bsr	CheckTrackLongBits
	add.l	d2,a0
	move.l	d4,d0
	and.l	#$55555555,d0
	moveq	#$04,d2
	bsr	WriteTrackLongII
	add.l	d2,a0
	addq.l	#8,a0
	move.w	#$0200,d2
	moveq	#$7f,d3
	moveq	#$00,d4
	bsr	WriteTrackLong
	bsr	CheckTrackLongBits
	lea	$38(a1),a0
	move.l	d4,d0
	and.l	#$55555555,d0
	moveq	#$04,d2
	bsr	WriteTrackLongII	;Data CheckSum
	add.l	d2,a0
	bsr	CheckTrackLongBits
	lea	$440(a1),a0
	addq.w	#1,d7
	cmp.w	#$000b,d7
	bne	WriteTrack2
	move.l	#$aaaaaaaa,(a0)
	bsr	CheckTrackLongBits
WriteTrack3:
	tst.w	$126(a6)
	beq	WriteTrackAgain
	btst	#1,$1f(a5)
	beq.s	WriteTrack3
	move.w	#$4000,$24(a5)
	move.w	#$9500,$9e(a5)	;Read on sync enable
	bsr	ClearDMADisk	;Clear DMA buffert
	move.l	$82(a6),a0
	move.l	a0,$20(a5)	;DMA buffert
	move.w	#$99a0,$24(a5)	;Read $3340 bytes
	move.w	#$99a0,$24(a5)
	move.w	#$0002,$9c(a5)
	move.w	#$0010,$126(a6)	;Drive off 0.32 sec
	lea	$2f00(a0),a1
	move.w	#$07ff,d7
WriteTrack4:
	tst.w	$126(a6)
	beq	WriteTrackAgain
	tst.w	(a0)
	beq.s	WriteTrack4
WriteTrack5:
	cmpa.l	a1,a0
	bhi	WriteTrackAgain		;Something doesn't match
WriteTrack5a:
	tst.w	$126(a6)
	beq	WriteTrackAgain
	tst.w	(a0)
	beq.s	WriteTrack5a
	cmp.w	#$4489,(a0)+
	bne.s	WriteTrack5
WriteTrack5b:
	tst.w	$126(a6)
	beq	WriteTrackAgain
	tst.w	(a0)
	beq.s	WriteTrack5b
	cmp.w	#$4489,(a0)
	beq.s	WriteTrack5
	moveq	#$00,d4
	moveq	#$01,d3
	moveq	#$04,d2
	bsr	ReadTrackByte
	cmp.b	d0,d6
	bne.s	WriteTrack5		;Wrong Track
	bsr	ReadTrackByte
	cmp.b	#$0a,d0
	bhi.s	WriteTrack5		;Invalid Sector nr
	ext.w	d0
	ext.l	d0
	move.l	d0,a3			;Sector nr
	lsl.w	#8,d0
	add.w	d0,d0
	move.l	$120(a6),a2
	add.l	d0,a2
	bsr	ReadTrackByte
	add.l	d2,a0
	moveq	#$0f,d3
	moveq	#$10,d2
	bsr	ReadTrackByte
	add.l	d2,a0
	moveq	#$03,d3
	moveq	#$04,d2
	bsr	ReadTrackByte
	add.l	d2,a0
	tst.b	d4
	bne.s	WriteTrack5		;Checksum error
	moveq	#$04,d2
WriteTrack6:
	tst.w	$126(a6)
	beq.s	WriteTrack6a
	tst.w	2(a0,d2.w)
	beq.s	WriteTrack6		;Wait for Disk DMA !
WriteTrack6a:
	move.l	(a0)+,d0
	and.l	#$55555555,d0
	eor.l	d0,d4
	add.l	d0,d0
	move.l	-4(a0,d2.w),d1
	and.l	#$55555555,d1
	eor.l	d1,d4
	add.l	d2,a0
	moveq	#$7f,d3
	move.w	#$200,d2
WriteTrack7:
	tst.w	$126(a6)
	beq.s	WriteTrack7a
	tst.w	2(a0,d2.w)
	beq.s	WriteTrack7		;Wait for Disk DMA !
WriteTrack7a:
	move.l	(a0)+,d0
	and.l	#$55555555,d0
	eor.l	d0,d4
	add.l	d0,d0
	move.l	-4(a0,d2.w),d1
	and.l	#$55555555,d1
	eor.l	d1,d4
	or.l	d1,d0
	cmp.l	(a2)+,d0
	bne	WriteTrack5		;Verify Error !
	subq.w	#1,d3
	bpl.s	WriteTrack7
	add.l	d2,a0
	tst.l	d4
	bne	WriteTrack5		;Checksum error
	move.l	a3,d0
	bclr	d0,d7
	tst.w	d7
	bne	WriteTrack5
	clr.w	$138(a6)		;Track Buffer Written !
	move.w	#$4000,$24(a5)
	move.w	#$0010,$96(a5)
	move.w	#$0032,$126(a6)		;Drive off 1.0 sec
	bsr	UnselectDrive
	bsr	ClearDMADiskWait
	bsr	ExchangeRamDiskII	;Copy to $50c0
	movem.l	(a7)+,d0-d7/a0-a6
	rts

WriteTrackLongII:
	movem.l	d5-d7,-(a7)
	move.l	#$55555555,d7
	bra.s	WriteTrackLong1a
WriteTrackLong:
	movem.l	d5-d7,-(a7)
	move.l	#$55555555,d7
WriteTrackLong1:
	move.l	(a2)+,d0
WriteTrackLong1a:
	move.l	d0,d1
	lsr.l	#1,d0
	and.l	d7,d0
	and.l	d7,d1
	move.l	d0,d6
	eor.l	d7,d6
	move.l	d6,d5
	add.l	d6,d6
	lsr.l	#1,d5
	btst	#0,-1(a0)
	bne.s	WriteTrackLong2
	bset	#31,d5
WriteTrackLong2:
	and.l	d5,d6
	or.l	d6,d0
	move.l	d0,(a0)+
	move.l	d1,d6
	eor.l	d7,d6
	move.l	d6,d5
	add.l	d6,d6
	lsr.l	#1,d5
	btst	#0,-5(a0,d2.w)
	bne.s	WriteTrackLong3
	bset	#31,d5
WriteTrackLong3:
	and.l	d5,d6
	or.l	d6,d1
	move.l	d1,-4(a0,d2.w)
	eor.l	d0,d4
	eor.l	d1,d4
	subq.w	#1,d3
	bpl.s	WriteTrackLong1
	movem.l	(a7)+,d5-d7
	rts

CheckTrackLongBits:
	movem.l	d5-d7,-(a7)
	move.l	#$55555555,d7
	move.l	(a0),d0
	and.l	d7,d0
	move.l	d0,d6
	eor.l	d7,d6
	move.l	d6,d5
	add.l	d6,d6
	lsr.l	#1,d5
	btst	#0,-1(a0)
	bne.s	CheckTrackLongBits1
	bset	#31,d5
CheckTrackLongBits1:
	and.l	d5,d6
	or.l	d6,d0
	move.l	d0,(a0)
	movem.l	(a7)+,d5-d7
	rts

ExchangeRamDiskI:			;Move $5400 to buffert
	movem.l	d0-d7/a0-a6,-(a7)
	move.l	$82(a6),a0
	move.l	$86(a6),a1
	add.l	a0,a1
	move.w	#$0199,d0
ExchangeRamDiskI1:
	movem.l	(a0)+,d1/d2/d3/d4/d5/d6/d7/a2
	movem.l	d1/d2/d3/d4/d5/d6/d7/a2,(a1)
	lea	$0020(a1),a1
	dbf	d0,ExchangeRamDiskI1
	movem.l	(a7)+,d0-d7/a0-a6
	rts

ClearDMADisk:
	movem.l	a5/a6,-(a7)
	move.w	#$0400,$96(a5)
	move.w	#$8040,$96(a5)
	move.l	$82(a6),$54(a5)		;Clear DMA buffert
	move.l	#$01000000,$40(a5)
	clr.w	$66(a5)
	move.w	#$3360,$58(a5)
	movem.l	(a7)+,a5/a6
	rts
ClearDMADiskWait:
	move.l	a5,-(a7)
	lea	$dff000,a5
ClearDMADiskWait1:
	btst	#6,$02(a5)
	bne.s	ClearDMADiskWait1
	move.w	#$0040,$96(a5)
	move.l	(a7)+,a5
	rts
	
ExchangeRamDiskII:			;Move buffert to $5400
	movem.l	d0-d7/a0-a6,-(a7)
	move.l	$82(a6),a0
	move.l	$86(a6),a1
	add.l	a0,a1
	move.w	#$0199,d0
ExchangeRamDiskII1:
	movem.l	(a1)+,d1/d2/d3/d4/d5/d6/d7/a2
	movem.l	d1/d2/d3/d4/d5/d6/d7/a2,(a0)
	lea	$0020(a0),a0
	dbf	d0,ExchangeRamDiskII1
	movem.l	(a7)+,d0-d7/a0-a6
	rts

UnselectDrive:
	movem.l	d0/a5/a6,-(a7)
	lea	$bfd100,a5
	move.b	$11c(a6),d0		;Current drive nr
	and.w	#$03,d0
	addq.w	#3,d0
	bset	d0,(a5)
	movem.l	(a7)+,d0/a5/a6
	rts

MotorOn:
	movem.l	d0/d1/d7/a5/a6,-(a7)
	move.w	$126(a6),d1
	lea	$bfd100,a5
	move.b	$11c(a6),d0		;Current drive nr
	and.w	#$03,d0
	addq.w	#3,d0
	or.b	#$78,(a5)
	bclr	#7,(a5)
	bclr	d0,(a5)
	move.w	#$004b,$126(a6)		;Drive motor off 1.5 sec
	movem.l	(a7)+,d0/d1/d7/a5/a6
	rts

MotorReady:
	movem.l	d0/d1/d7/a5/a6,-(a7)
	moveq	#$01,d7			;Disk not present
	move.l	#$20000,d1
MotorReady1:
	subq.l	#1,d1
	beq	ErrorHandler
	btst	#5,$bfe001
	bne.s	MotorReady1
	move.w	#$004b,$126(a6)		;Drive motor off 1.5 sec
	movem.l	(a7)+,d0/d1/d7/a5/a6
	rts

MotorOff:
	movem.l	d0/a5,-(a7)
	lea	$bfd100,a5
	or.b	#$78,(a5)
	bset	#7,(a5)
	and.b	#$87,(a5)
	or.b	#$78,(a5)
	movem.l	(a7)+,d0/a5
	rts

CheckHead:
	movem.l	d1-d3/a4-a6,-(a7)
	lea	$bfe001,a4
	lea	$bfd100,a5
	move.b	$11c(a6),d1		;Current drive nr
	and.w	#$0003,d1
	move.w	d1,d2
	add.w	#$118,d2
	tst.b	0(a6,d2.w)
	bne.s	CheckHead1
	addq.w	#3,d1
	move.b	#$78,d3
	bclr	d1,d3
	or.b	d3,(a5)
	bclr	d1,(a5)
	btst	#4,(a4)
	beq.s	CheckHead1
	bsr.s	ResetHead
CheckHead1:
	movem.l	(a7)+,d1-d3/a4-a6
	rts
	
ResetHead:
	movem.l	d1-d3/a4-a6,-(a7)
	lea	$bfe001,a4
	lea	$bfd100,a5
	move.b	$11c(a6),d1		;Current drive nr
	and.w	#$0003,d1
	move.w	d1,d2
	add.w	#$118,d2
	clr.b	0(a6,d2.w)
	addq.w	#3,d1
	bclr	d1,(a5)
	moveq	#$53,d2
	btst	#4,(a4)
	beq.s	ResetHead6
ResetHead3:
	move.b	(a5),d3
	btst	#4,(a4)
	beq.s	ResetHead5
	bset	#1,(a5)
	bclr	#0,(a5)
	bset	#0,(a5)
	bsr	DiskWaitI
	btst	#1,d3
	bne.s	ResetHead4
	bsr	DiskWaitII		;reversing direction
ResetHead4:
	dbf	d2,ResetHead3
	bset	d1,(a5)
	moveq	#$01,d7			;Device not present
	bra	ErrorHandler
ResetHead5:
	bsr	DiskWaitII		;head settle
ResetHead6:
	movem.l	(a7)+,d1-d3/a4-a6
	rts

DiskCheck:
	movem.l	d0-d2/a4-a6,-(a7)
	lea	$bfd100,a5
	lea	$bfe001,a4
	tst.w	$126(a6)
	bpl.s	DiskCheck1b		;Drive Active
	moveq	#$03,d0
DiskCheck1:
	bsr.s	DiskCheck2
	dbf	d0,DiskCheck1
DiskCheck1b:
	tst.w	$126(a6)
	bmi.s	DiskCheck1a
	subq.w	#1,$126(a6)
	bpl.s	DiskCheck1a
	move.b	(a5),d0
	and.b	#$78,d0
	cmp.b	#$78,d0
	beq.s	DiskCheck1c
	addq.w	#1,$126(a6)		;Drive is selected
	bra.s	DiskCheck1a
DiskCheck1c:
	bsr	MotorOff
DiskCheck1a:
	movem.l	(a7)+,d0-d2/a4-a6
	rts
DiskCheck2:
	move.b	(a5),d1
	and.b	#$78,d1
	cmp.b	#$78,d1
	bne.s	DiskCheck6		;Drive Active
	move.l	d0,d1
	addq.l	#3,d1
	bclr	d1,(a5)
	btst	#2,(a4)
	bne.s	DiskCheck5		;Disk inserted
	cmp.b	$11d(a6),d0	;Rootblock unit
	bne.s	DiskCheck4
	move.w	#$ffff,$11e(a6)	;Rootblock not read
DiskCheck4:
	cmp.b	$124(a6),d0
	bne.s	DiskCheck5
	move.b	#$ff,$125(a6)	;Track buffer empty
DiskCheck5:
	bset	d1,(a5)
DiskCheck6:
	rts

DiskWaitI:			;Wait for 3 milliseconds
	move.l	d0,-(a7)	;Called when stepping head
	move.w	#$0850,d0
	bsr.s	WaitTimer
	bra.s	DiskWait1
DiskWaitII:			;Wait for 15 milliseconds
	move.l	d0,-(a7)	;Called when reversing directions
	move.w	#$2990,d0
	bsr.s	WaitTimer
	bra.s	DiskWait1
DiskWaitIII:			;Wait for 100 microseconds
	move.l	d0,-(a7)	;Called when selecting diskside
	move.w	#$0047,d0	;before writing
	bsr.s	WaitTimer
DiskWait1:
	move.l	(a7)+,d0
	rts

WaitTimer:				;d0=number of E cycles
	and.w	#$fffe,$19a(a6)
	move.b	d0,$bfd400		;Timer A Low
	lsr.w	#8,d0
	move.b	d0,$bfd500		;Timer A High
	and.b	#$fe,$1bc(a6)
	or.b	#$01,$1bd(a6)
	move.b	#$81,$bfdd00		;Timer A IRQ Enable
	move.b	#$11,$bfde00		;Timer A Load & Start
WaitTimer1:
	move.w	$19a(a6),d0
	and.w	#$0001,d0
	beq.s	WaitTimer1
	rts

SelPrecomp:
	movem.l	d0-d1/a5-a6,-(a7)
	lea	$dff000,a5
	move.b	$11c(a6),d1
	ext.w	d1
	add.w	#$118,d1
	move.b	0(a6,d1.w),d1
	move.w	#$6000,$9e(a5)
	move.w	#$8000,d0
	cmp.b	#79,d1
	bls.s	SelPrecomp1
	move.w	#$a000,d0
	cmp.b	#159,d1
	bls.s	SelPrecomp1
	move.w	#$c000,d0
	cmp.b	#239,d1
	bls.s	SelPrecomp1
	move.w	#$e000,d0
SelPrecomp1:
	move.w	d0,$9e(a5)
	movem.l	(a7)+,d0-d1/a5-a6
	rts

MoveHead:
	movem.l	d0-d4/a5/a6,-(a7)	;d4 = tracknr
	lea	$bfd100,a5
	move.b	$11c(a6),d1
	ext.w	d1
	move.w	d1,d2
	add.w	#$118,d2
	addq.w	#3,d1
	move.b	0(a6,d2.w),d3
	move.b	d4,0(a6,d2.w)
	and.w	#$00fe,d3
	and.w	#$00fe,d4
	bclr	d1,(a5)
	bset	#2,(a5)
	btst	#0,0(a6,d2.w)
	beq.s	MoveHead0
	bclr	#2,(a5)	
MoveHead0:
	bsr	DiskWaitIII
	cmp.b	d3,d4
	beq.s	MoveHead4
MoveHead1:
	move.b	(a5),d0
	cmp.b	d3,d4
	beq.s	MoveHead3
	bls.s	MoveHead2
	bclr	#1,(a5)		;move forward
	bclr	#0,(a5)
	bset	#0,(a5)
	bsr	DiskWaitI
	addq.w	#2,d3
	btst	#1,d0
	beq.s	MoveHead1
	bsr	DiskWaitII	;reversing direction
	bra.s	MoveHead1
MoveHead2:
	bset	#1,(a5)		;move backward
	bclr	#0,(a5)
	bset	#0,(a5)
	bsr	DiskWaitI
	subq.w	#2,d3
	btst	#1,d0
	bne.s	MoveHead1
	bsr	DiskWaitII	;reversing direction
	bra.s	MoveHead1
MoveHead3:
	bsr	DiskWaitII	;head settle
MoveHead4:
	movem.l	(a7)+,d0-d4/a5/a6
	rts

DiskTick:
	movem.l	d0-d2/a5/a6,-(a7)
	btst	#2,$bfe001
	bne.s	DiskTick2	;Disk Inserted
	lea	$bfd100,a5
	move.b	$11c(a6),d1
	ext.w	d1
	move.w	d1,d2
	add.w	#$118,d2
	addq.w	#3,d1
	bclr	d1,(a5)
	move.b	(a5),d0
	bset	#1,(a5)		;move backward
	bclr	#0,(a5)
	bset	#0,(a5)
	bsr	DiskWaitI
	btst	#1,d0
	bne.s	DiskTick1
	bsr	DiskWaitII	;reversing direction
DiskTick1:
	bclr	#1,(a5)		;move forward
	bclr	#0,(a5)
	bset	#0,(a5)
	bsr	DiskWaitI
	bsr	DiskWaitII	;reversing direction
	bsr	DiskWaitII	;head settle
DiskTick2:
	movem.l	(a7)+,d0-d2/a5/a6
	rts

CheckWriteProt:
	movem.l	d1-d3/a4-a6,-(a7)
	lea	$bfe001,a4
	lea	$bfd100,a5
	move.b	$11c(a6),d1		;Current drive nr
	and.w	#$0003,d1
	addq.w	#3,d1
	move.b	#$78,d3
	bclr	d1,d3
	or.b	d3,(a5)
	bclr	d1,(a5)
	moveq	#$01,d0
	btst	#3,(a4)
	beq.s	CheckWriteProt1
	moveq	#$00,d0
CheckWriteProt1:
	bset	d1,(a5)
	movem.l	(a7)+,d1-d3/a4-a6
	rts

