$D5C6/54726: Additional attempts for read errors
Jump from $D5B8:
D5C6: 98 TYA
D5C7: 48 PHA
D5C8: A5 7F LDA $7F ; drive number
D5CA: 48 PHA
D5CB: BD 5B 02 LDA $025B,X
D5CE: 29 01 AND #$01 ; drive number
D5D0: 85 7F STA $7F
D5D2: A8 TAY
D5D3: B9 CA FE LDA $FECA,Y ; bit model for drive
D5D6: 8D 6D 02 STA $026D
D5D9: 20 A6 D6 JSR $D6A6 ; read attempt
D5DC: C9 02 CMP #$02
D5DE: B0 03 BCS $D5E3 ; not ok?
D5E0: 4C 6D D6 JMP $D66D ; done
Jump from $D5DE:
D5E3: BD 5B 02 LDA $025B,X ; command code
D5E6: 29 F0 AND #$F0 ; isolate
D5E8: 48 PHA
D5E9: C9 90 CMP #$90 ; code for write
D5EB: D0 07 BNE $D5F4 ; no
D5ED: A5 7F LDA $7F ; drive number
D5EF: 09 B8 ORA #$B8
D5F1: 9D 5B 02 STA $025B,X
Jump from $D5EB:
D5F4: 24 6A BIT $6A
D5F6: 70 39 BVS $D631
D5F8: A9 00 LDA #$00
D5FA: 8D 99 02 STA $0299 ; counter for searches next to track
D5FD: 8D 9A 02 STA $029A
Jump from $D623:
D600: AC 99 02 LDY $0299 ; counter
D603: AD 9A 02 LDA $029A
D606: 38 SEC
D607: F9 DB FE SBC $FEDB,Y ; constants for read attempts
D60A: 8D 9A 02 STA $029A
D60D: B9 DB FE LDA $FEDB,Y
D610: 20 76 D6 JSR $D676 ; position head next to track
D613: EE 99 02 INC $0299 ; increment counter
D616: 20 A6 D6 JSR $D6A6 ; read attempt
D619: C9 02 CMP #$02 ; return message
D61B: 90 08 BCC $D625 ; smaller than 2, ok?
D61D: AC 99 02 LDY $0299 ; load counter
D620: B9 DB FE LDA $FEDB,Y ; get constants
D623: D0 DB BNE $D600 ; not yet zero (table end)?
Jump from $D61B:
D625: AD 9A 02 LDA $029A
D628: 20 76 D6 JSR $D676 ; position head
D62B: B5 00 LDA $00,X
D62D: C9 02 CMP #$02 ; return message
D62F: 90 2B BCC $D65C ; ok?
Jump from $D5F6:
D631: 24 6A BIT $6A
D633: 10 0F BPL $D644
Jump from $D65A:
D635: 68 PLA ; command code
D636: C9 90 CMP #$90 ; for writing?
D638: D0 05 BNE $D63F ; no
D63A: 05 7F ORA $7F ; drive number
D63C: 9D 5B 02 STA $025B,X ; command code in table
Jump from $D638, $D66B, $D5BF:
D63F: B5 00 LDA $00,X ; return message
D641: 20 0A E6 JSR $E60A ; set error message
Jump from $D633:
D644: 68 PLA
D645: 2C 98 02 BIT $0298
D648: 30 23 BMI $D66D
D64A: 48 PHA
D64B: A9 C0 LDA #$C0 ; command code for head positioning
D64D: 05 7F ORA $7F ; drive number
D64F: 95 00 STA $00,X ; in command register
Jump from $D653:
D651: B5 00 LDA $00,X
D653: 30 FC BMI $D651 ; wait for execution
D655: 20 A6 D6 JSR $D6A6 ; attempt command execution again
D658: C9 02 CMP #$02 ; return message
D65A: B0 D9 BCS $D635 ; incorrect?
Jump from $D62F:
D65C: 68 PLA
D65D: C9 90 CMP #$90 ; command code for writing
D65F: D0 0C BNE $D66D ; no
D661: 05 7F ORA $7F ; drive number
D663: 9D 5B 02 STA $025B,X ; in table
D666: 20 A6 D6 JSR $D6A6 ; attempt execution again
D669: C9 02 CMP #$02 ; return message
D66B: B0 D2 BCS $D63F ; error?
Jump from $D5E0, $D648, $D65F:
D66D: 68 PLA
D66E: 85 7F STA $7F ; get drive number back
D670: 68 PLA
D671: A8 TAY
D672: B5 00 LDA $00,X ; error code
D674: 18 CLC ; end-of-execution flag
D675: 60 RTS
Previous Page / Next Page