Spur mit Cachedaten vergleichen
Einsprung von $C3CB, $C9E8, $CB4F:
CA00: 20 A6 CF JSR $CFA6 Blockheader lesen
CA03: A5 88 LDA $88 steht der Kopf auf der richtigen Spur ?
CA05: C5 1F CMP $1F (Sollspur mit gefundenem Wert vergleichen)
CA07: F0 03 BEQ $CA0C ja, ==>
CA09: 4C 88 CB JMP $CB88 nein (MISHD_DV_ER) ==>
Einsprung von $CA07:
CA0C: 8D 01 60 STA $6001 als aktuelle Spur merken
CA0F: 20 B7 CF JSR $CFB7 Cachepufferzeiger auf Cache-Anfang setzen
CA12: A5 96 LDA $96 aktuelle Seite merken
CA14: 85 39 STA $39 [wozu ???]
CA16: A5 92 LDA $92 Anzahl der Sektoren merken
CA18: 85 3A STA $3A
CA1A: A5 21 LDA $21 aktuelle Sektornummer
CA1C: AA TAX merken
CA1D: C5 93 CMP $93 = letzter Sektor auf der Spur ?
CA1F: 08 PHP (Ergebnis merken)
CA20: D0 06 BNE $CA28 nein, ==>
CA22: A5 94 LDA $94 1. Sektornummer auf der Spur
CA24: AA TAX merken
CA25: 38 SEC -1 [Dies ist also praktisch der Sektor, der
CA26: E9 01 SBC #$01 vor dem 1. Sektor kommt.]
Einsprung von $CA20:
CA28: 38 SEC - 1.Sektornummer [Dies ergibt die aktuelle
CA29: E5 94 SBC $94 Position im Cache.]
CA2B: 18 CLC + 1 [Folgesektor soll gelesen werden.]
CA2C: 69 01 ADC #$01
CA2E: A4 91 LDY $91 Blockgroesse holen
Einsprung von $CA34:
CA30: 88 DEY Sektornummer auf 256-Byte Sektoren
CA31: F0 03 BEQ $CA36 umrechnen (a kann nun als Hi-Byte fuer den
CA33: 0A ASL Cachepufferzeiger verwendet werden)
CA34: 90 FA BCC $CA30
Einsprung von $CA31:
CA36: 20 8D CB JSR $CB8D Cachepufferzeiger setzen
CA39: 8A TXA aktuelle physikalische Sektornummer
CA3A: 28 PLP = letzter physikalischer Sektor der Spur ?
CA3B: F0 05 BEQ $CA42 ja, ==>
CA3D: 18 CLC Sektornummer +1
CA3E: 69 01 ADC #$01
CA40: D0 02 BNE $CA44 immer ==>
Einsprung von $CA3B:
CA42: A5 94 LDA $94 1. physikalischen Sektor einlesen
Einsprung von $CA40:
CA44: 8D 02 60 STA $6002 Sektornummer an Controller uebergeben
CA47: EA .... NOP [20 NOPS]
CA5A: .... EA NOP
Einsprung von $CAB4, $CAD3:
CA5B: AD DF 01 LDA $01DF Controller-Befehl: Read-Sector
CA5E: 20 F4 CB JSR $CBF4 Kommando in Controller schreiben
CA61: A4 91 LDY $91 Blockgroesse holen
CA63: C0 03 CPY #$03 =3 (1024 Bytes) ?
CA65: D0 02 BNE $CA69 nein, ==>
CA67: C8 INY ja: y=4
CA68: EA NOP (Anzahl der Speicherseiten pro Block)
Einsprung von $CA65, $CA71, $CA88, $CA8D:
CA69: AD 00 60 LDA $6000 Controllerstatus holen
CA6C: 29 03 AND #$03
CA6E: 4A LSR
CA6F: 90 65 BCC $CAD6 b0=0: 'Controller ready', ==>
CA71: F0 F6 BEQ $CA69 b1=0: noch kein 'Byte ready', ==>
CA73: A5 9B LDA $9B aktuelles Fuellbyte holen
CA75: C9 F5 CMP #$F5 = $f5 ?
CA77: D0 08 BNE $CA81 nein, (Sektor mit Fuellbyte vergleichen) ==>
CA79: 84 82 STY $82 ja: Spurdaten mit Cachedaten vergleichen
CA7B: A0 00 LDY #$00
CA7D: B1 4A LDA ($4A),Y Wert aus dem Cachepuffer holen
CA7F: A4 82 LDY $82
Einsprung von $CA77:
CA81: CD 03 60 CMP $6003 mit den Daten der Spur vergleichen
CA84: D0 56 BNE $CADC Fehler, ==>
CA86: E6 4A INC $4A Cachepufferzeiger erhoehen
CA88: D0 DF BNE $CA69 naechstes Byte vergleichen, ==>
CA8A: E6 4B INC $4B Cachepufferzeiger Hi erhoehen
CA8C: 88 DEY Blocklaenge Hi -1
CA8D: D0 DA BNE $CA69 Block noch nicht zu Ende, ==>
CA8F: 20 3F CD JSR $CD3F Controllerstatus pruefen
CA92: D0 47 BNE $CADB Fehler, ==>
CA94: C6 3A DEC $3A Anzahl der Sektoren -1
CA96: F0 3E BEQ $CAD6 sind alle Sektoren geprueft ? ja, ==>
CA98: AD 02 60 LDA $6002 aktuelle Sektornummer merken
CA9B: EE 02 60 INC $6002 naechsten Sektor anwaehlen
CA9E: EA .... NOP [20 NOPS]
CAB1: .... EA NOP
CAB2: C5 93 CMP $93 wurde letzter Sektor der Spur verglichen ?
CAB4: D0 A5 BNE $CA5B nein, ==>
CAB6: A5 8C LDA $8C ja: Cachepufferzeiger auf Pufferanfang
CAB8: 85 4B STA $4B setzen
CABA: A5 94 LDA $94 1. physikalischen Sektor anwaehlen
CABC: 8D 02 60 STA $6002
CABF: EA .... NOP [20 NOPS]
CAC0: .... EA NOP
CAD3: 4C 5B CA JMP $CA5B naechsten Sektor vergleichen
Einsprung von $CA6F, $CA96:
CAD6: 20 3F CD JSR $CD3F Controllerstatus pruefen
CAD9: D0 06 BNE $CAE1 Fehler, ==>
Einsprung von $CA92:
CADB: 60 RTS
Previous Page / Next Page