.Page ;++ ; ; Read ; ; Read will read a sector from Drive/Side/Track/Sector, doing offtrack ; stepping if neccessary to find the data. It will also verify the ; checksum found if commanded to do so. ; ; REGISTERS ; IN ; All = Any value ; OUT ; All = Destroyed ; ; CALLS ; Seek Seeks to Drive/Track/Side ; RdAdr Read address header field ; Read16 Reads data and checksum ; VfyCkSum Verifies checksum that was read ; BadAddr Handles all errors during read ;++ ReadBf .Equ * ; Read w/o checksum verify entry point Lda #0FF Bne Read01 Read .Equ * Lda #00 Read01 Sta RwCsmFlg ; Save in global flag Jsr Seek ; Seek to track, zero error cnts, init retry Read1 Jsr RdAdr ; Find Sector Bcs Read3 ; Error, go and check it Jsr Read16 ; Read the sector Bcs Read3 Ldx RwCsmFlg ; Fetch the checksum flag Bne Read4 ; If <> 0 then ignore checksum verify Jsr VfyCkSum ; Verify the checksum Bcc Read4 ; If carry clear, then all is fine Inc CSError ; Increment the checksum error counter Read3 Jsr BadAddr ; Find out what went wrong ( ccC = 1) Bcc Read1 ; Try once more Lda #SErrRd ; No goog, signal read error Read4 Rts .Page ;++ ; BadAddr ;-- ; ; REGISTERS ; IN ; All = Any value ; OUT ; All = Destroyed ; Carry = Retry status (=Clear, don't retry; =Set, please retry) ; ; CALLS ; Recalbrt Recalibrate the drive ; SeekAlt Seek to Track/Side ;-- .Page BadAddr .Equ * ; Entry point of BadAddr (ccC =1) Dec RetryCnt ; If we've tried enough times to find data Beq BadAddr2 Clc Lda RaStrt ; Or we can't find start bitslip Adc RaTrk ; Or we're on the wrong trk Beq BadGood ; Try again Cmp RecalCnt ; if >= recalibration count then abort Beq BadBad ; ccC = 1 when A = memory Cmp RtyFlg ; See if new RaStrt or RaTrk error Beq BadGood ; If equal then no change from last time Sta RtyFlg ; a change -- save new error count Bne BadAddr4 ; Recalibrate head location BadAddrd2 Dec RecalCnt Beq BadBad ; abort upon timeout (ccC still = 1) BadAddr4 Jsr Recalbrt ; But don't bother with spd errors at this time Jsr SeekAlt ; And get back to where we were on target track Lda MaxRetry ; Pick up fresh maximum number of retrys count Sta RetryCnt ; and refresh the counter BadGood Clc ; We're trying again mate! BadBad Rts