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 |