.Page;++;--TimIt	.Equ *	Lda	#5				; Time 6 pulses	Sta	Temp2	Clc					; Should stay clear unless explicitly set	Jsr	WtZero				; Look for low, then first high	Bcs	RsOut				; 2,3	10	No edge within timeout period	Jsr	RsEdge				; 8	8	Now at known locationo	Bcs	RsOut				; 2,3	10	No edge within timeout period	Lda	#0				; 2	12	Sta	RangeL				; 3	15	Sta	RangeH				; 3	18	Zero both bytes of counter;++;	WtZero & RsEdge both have 36 cycles (18.0 uSec) per tick of RangeL:H;--$20	Jsr	WtZero				; Look for low	Bcs	RsOut				; 2,3	Jsr	RsEdge				; Wait for next edge on pulse	Bcs	RsOut				; 2,3	Dec	Temp2				; 5		When less than zero then exit	Bpl	$20				; 2,3	15*(2+@+%+#) = 180 cyclesRsOut	.Equ *	Rts					; 6		Common exit pointWtZero	.Equ *	Bit	K000				; 3		ccV set to Zero	Bvc	RsEd				; 3	6RsEdge	.Equ *					;		Look for a rising edge	Bit	K0FF				; 3	3	ccV eq 0 == low, ccV eq 1 == high	Bvs	ReEd				; 3	6RsEd	.Equ *	Ldy	#00				; 2	8	Ldx	#0A0				; 2	10	Constant timeout for pulse counting$10	Dey					; 2	2	Bne	$20				; 2,3	4,5	Dex					; 2	6	Bne	$30				; 2,3	8,9	Sec					; 2	10	When X-reg = 0 then return error	Rts$20	Nop					; 2	7	Nop					; 2	9	Waste time$30	Inc	RangeL				; 5	14	Bne	$40				; 2,3	16,17	Inc	RangeH				; 5	21	Bne	$50				; 3	24	Always taken ??$40	Pha					; 3	20	Waste more time	Pla					; 4	24$50	Lda	Q7L				; 4		Bit7=0 ==>tach low, else tach high	Bvc	$70				; 2,3	30,31	ccV ==> look for low	Bpl	$90				; 2,3	32,33	If high then fall thru & exit	Nop					; 2	34$60	Rts					; 6$70	Bpl	$60				; 2,3	33,34	If low then exit$90	Bcc	$10				; 3	36	Always taken?? -- 18.0 uSec loopChkLrg	.Equ *	Lda	#Lrge				; 5	Sta	Temp1				; For speed adjustment	Lda	#WLow	Beq	ChkCommChkSml	.Equ *	Lda	#Smal				; 1	Sta	Temp1	Lda	#TLow;++;  ChkComm;     if H < TL;       then AdjPlus;     else if H > TL;       then TstHih;     else  if L < Tl;       then AdjPlus;     else if L = TL;       then OK;  TstHih;     If H > Th;        then AdjMinus;     else if H <> Th;        then OK;     else if L <= TH;        then OK;     else AdjMinus;--ChkComm	.Equ *	Sta	InxPtrL			; Ptr to which constraints ( low of high )	Lda	CurClass			; Current track class	Asl	A			; *2 to address word array	Tay	Lda	RangeH	Cmp	@InxPtrL,y		; High must be greater than or equal to lowtable,y	Bcc	AdjPlus			; High byte low, must spin slower	Bne	TsHih			; High byte greater -- must see if w/in high boundary	Inc	Lda	RangeL	Cmp	@InxPtrL,y		; Must be greater than or equal to table,y	Bcc	AdjPlus			; High bytes = and low byte low - slow it down	Beq	ChkOK			; Both bytes are equal so within range	ClcTsHih	.Equ *				; ccC=1 if branched to here so add +1 for not 'Iny'	Tya	Adc	#TblJmp			; 9.	Tay				; Index now points at high side of range	Lda	@InxPtrL,y	Cmp	RangeH			; High byte must be <= high boundary	Bcc	AdjMinus			; High byte is too high, spin disk faster	Bne	ChkOK			; If <> then low byte must be w/in range	Iny				; Point @ low byte of boundary value	Lda	@InxPtrL,y	Cmp	RangeL			; Low byte is too high, spin disk fasterChjkOK	.Equ *	Clc	RtsAdjPlus	.Equ *				; ccC = 0 already	Ldy	CurClass	Lda	MSpdTbl,y	Adc	TEmp1			; Add adjustment value	Sta	MSpdTbl,y	Sec	RtsAdjMinus	.Equ *	Ldy	CurClass	Lda	MSpdTbl,y	Sec	Sbc	Temp1	Sta	MSpdTbl,y	Sec	RtsSpdChk	.Equ *				; Main entry point for speed check	Lda	#WHih			; '11'x	Sta	InxPtrH	Jsr	SetTach			; Make sure in Tach sense mode	Jsr	TimIt			; Time 6 pulses & abort on timeout	Bcs	SpdErr	Jsr	ChkLrg			; Must be within +/- 2%	Bcc	SpdDone	Lda	#101.			; 100 times total for attempts to adjust	Sta	Counter$10	Dec	Counter	Beq	SpdErr			; Try for 100 times and abort upon inability to adjust	Jsr	SetSpeed	Lda	ScDly	Jsr	Wait	Jsr	Timit	Bcs	SpdErr	Jsr	ChkLrg	Bcs	$10			; Loop until speed within +/- 2%$32	Sec				; Make sure error flag is set	Dec	Counter	Beq	SpdErr			; Try for 100 times and abort upon inability to adjust	Jsr	ChkSml			; Now loop until within +/- .5%	Bcc	SpdDone	Jsr	SetSpeed	Lda	ScDelay	Jsr	Wait	Jsr	TimIt	Bcc	$32SpdErr	.Equ*	Lda	#SErrTmtSpdDone	.Equ *	Rts