RECAL

.Page
ClcScDly	.Equ *
	Cmp	#13
	Bcs	$43			; If 'a' >= 13 then only wait for head settling
	Tay				; Save the number of steps
	Lda	#0			; ccC already = '0'
$31	Adc	#2			; Use 10 msec/Step instead of 12 msec
	Dey
	Bne	$31
	Sta	Temp1
	Lda	ScDly
	Sec
	Sbc	Temp1
	Bcs	$65			; If ccC=1 then result is positive
$43	Lda	HeaDelay			; Assume only wait for head settling
	Rts
$65	Cmp	HeaDelay			; See if head settling time is also included
	Bcc	$43
	Rts

;++
;		Recalbrt
;--
RecalMtr	.Equ *
	Lda	MtrOn
	Bne	Recall			; If motor is not on then turn it on & wait 400ms
	Jsr	TMOn

Recalbrt	.Equ *				; Entry point for Recalbrt
Recall	.Equ *
	Ldy	#0
	Sty	CurTrack
	Jsr	SetSpdy			; Set CurClass to '0' also
	Dey
	Sty	HostSeek			; Tell 68K that I am seeking
	Ldx	#Inward
	Jsr	SetDrctX
	Ldx	#RclStep
	Stx	Temp3			; 3 steps awau from track 00 for bad power supply
$06	Jsr	DoStep			; step away from track 0
	Dec	Temp3
	Bne	$06			; Loop 2 times for 3 total steps
	Lda	#TurnRnd			; Must wait for stepper to come to it's senses
	Jsr	Wait

	Ldx	#TmOutRcl
	Stx	Temp3			; Timeout if unable to leave track 0 being true
$17	Jsr	ReadIndx			; Read track 0 line
	Bcs	$21			; If ccC = 1 then /Trk00 is false
	Jsr	DoStep			; Step away from track 00 ( direction is already set )
	Dec	Temp3			; Maximum of 80 steps
	Bne	$17			; Loop while less than 80 steps
	Beq	$72			; Abort upon underflow

$21	Ldx	#Outward
	Jsr	SetDrctX			; Seek away from spindle toward Track 00
	Stx	Temp2
$43	Dec	Temp2			; For each step save a counter
	Beq	$78			; Abort upon underflow
	Jsr	DoStep
	Jsr	ReadIndx
	Bcs	$43
	Lda	#TmOutRcl
	Sbc	Temp2			; Result will be positive & = number of steps
	Jsr	ClcScDly			; Calc speed change delay time, return in 'A'
	Jsr	Wait			; Now wait for about 150 ms
	Jsr	SpdChk			; Check/Adjust the speed at track 0 & return error
$68	Ldx	#0
	Stx	HostSeek			; Done seeking
	Rts

$72	Lda	#DErrTk0			; Unable to leave track 0 behind
	Bne	$82

$78	Lda	#DErrCal			; Timeout during recal constant
$82	Sta	Iob+DrvError
	Sec
	Bcs	$68

.Page

ClpEnty	.Equ *				; Entry point used by clamp command
Clamp	.Equ *				; Entry point for clamp
	Rts
.Page
;++
;
;		uSWait
;
; ****
; *  The followig codes assume
; *  a cycle time of 0.5 uSec
; ****
;
; Delays a specified number of 100 uSec intervals for timing purposes
; a call to uSWait takes E X A C T L Y (A-reg * 100 uSec) to complete,
; including the Jsr-Rts, therefore the following code takes 301 uSec to
; execute:
;	Lda	#3		  1 uSec (  2 Cycles)
;	Jsr	uSWait		300 uSec (600 Cycles)
;
;--
;
; REGISTERS
;  IN
;	A =	Number of 100 uSec intervals to delay
;	X =	Any value
;	Y =	Any value
;  OUT
;	A =	Destroyed
;	X =	Destroyed
;	Y =	Unchanged
;--

WaitAlt	.Equ *				; Alternate entry point fo DoStep
	Lda	StpDly			; Load delay time

uSWait	.Equ *				; Entry point for uSWait
	Ldx	#023			; (2)
uSWait1	Dex				; (2)
	Bne	uSWait1			; (3,2)
	Ldx	#026			; (2)
	Nop				; (2)
	Sec				; (2)
	Sbc	#001			; (2)
	Bne	uSWait1			; (3,2)
	Nop				; (2)
	Rts				; (6)

.Page
;++
;
;			Wait
;
;  Wait A-reg times 5 miliseconds
;
;--
;
; REGISTERS
;  IN
:	A =	Number of 5 msec intervals to wait
;	X =	Any value
;	Y =	Any value
;  OUT
;	A =	Destroyed
;	X =	Destroyed
;	Y =	'0'
;
; CALLS
;	uSWait	Wait A-reg number of 100 uSec intervals
;--

Wait	.Equ *				; Entry point for wait
	Tay
Wait1	Lda	#50.			; Call uSWait for 50*100 = 5000 uSec
	Jsr	uSWait
	Dey
	Bne	Wait1
	Rts