    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