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