Cachepuffer auf Diskette schreiben

Pruefen, ob der Kopf auf der richtigen Spur steht

Einsprung von $C12E:

C600: 20 A6 CF  JSR $CFA6        Blockheader lesen
C603: A5 95     LDA $95          steht der Kopf auf der richtigen Spur ?
C605: C5 1F     CMP $1F          (Spur im Cache mit gefundener Nummer vgl.)
C607: F0 03     BEQ $C60C        ja, ==>
C609: 4C 88 CB  JMP $CB88        nein: MISHD_DV_ER ==>

Berechnen, welcher Sektor als naechstes geschrieben werden kann
und seine Position im Cachepuffer bestimmen

Einsprung von $C607:

C60C: 8D 01 60  STA $6001        Spurnummer setzen
C60F: 20 E3 CF  JSR $CFE3        Precompensation ein-/ausschalten
C612: 20 B7 CF  JSR $CFB7        Zeiger auf Cachepuffer-Anfang setzen
C615: A5 92     LDA $92          Anzahl der Sektoren holen
C617: 85 3A     STA $3A
C619: A5 21     LDA $21          aktuelle Sektornummer holen
C61B: AA        TAX              und merken
C61C: C5 93     CMP $93          letzten Sektor der Spur erreicht ?
C61E: 08        PHP              (Ergebnis merken)

- Position des Folgesektors im Cachepuffer bestimmen

C61F: D0 06     BNE $C627        nicht letzter Sektor der Spur, ==>
C621: A5 94     LDA $94          1. Sektornummer auf der Spur holen
C623: AA        TAX              und merken
C624: 38        SEC              -1 [ergibt einen gedachten Sektor vor dem
C625: E9 01     SBC #$01             1. Sektor - entspricht letztem Sektor.]

Einsprung von $C61F:

C627: 38        SEC              aktuelle Sektornummer
C628: E5 94     SBC $94          - '1. Sektornummer auf der Spur'
C62A: 18        CLC
C62B: 69 01     ADC #$01         +1 (Folgesektor wird gesucht)

C62D: A4 91     LDY $91          Blockgroesse holen

Einsprung von $C633:

C62F: 88        DEY              [Um dir Position im Cache zu bekommen,
C630: F0 03     BEQ $C635         muss die Sektornummer mit der Blockgroesse
C632: 0A        ASL               multipliziert werden
C633: 90 FA     BCC $C62F         (*256, *512, oder *1024)]

Einsprung von $C630:

C635: 20 8D CB  JSR $CB8D        Zeiger in Cache setzen
- physikalische Sektornummer des Folgesektors bestimmen

C638: 8A        TXA              aktuelle Sektornummer holen
C639: 28        PLP              = letzter Sektor der Spur ?
C63A: F0 05     BEQ $C641        ja, ==>
C63C: 18        CLC              Sektornummer +1
C63D: 69 01     ADC #$01
C63F: D0 02     BNE $C643        immer ==>

Einsprung von $C63A:

C641: A5 94     LDA $94          1. Sektornummer der Spur

Einsprung von $C63F:

C643: 8D 02 60  STA $6002        Sektor anwaehlen
C646: EA  ....  NOP            [20 NOPS]
C659: ....  EA  NOP

Einsprung von $C6AA, $C6C9:

C65A: AD E0 01  LDA $01E0        Controller-Befehl: 'Write sector'
C65D: 20 F4 CB  JSR $CBF4        in Controller schreiben

Anzahl der zu schreibenden Seiten pro Sektor berechnen

C660: A4 91     LDY $91          Blockgroesse holen
C662: C0 03     CPY #$03         [y=1:  256 Bytes, 1 Seite;
C664: D0 01     BNE $C667         y=2:  512 Bytes, 2 Seiten;
C666: C8        INY               y=3: 1024 Bytes, 4 Seiten.]

Sektor schreiben

Einsprung von $C664, $C66F, $C67E, $C683:

C667: AD 00 60  LDA $6000        Controller-Status einlesen
C66A: 29 03     AND #$03
C66C: 4A        LSR
C66D: 90 5D     BCC $C6CC        b0=0: 'Controller ready', ==>
C66F: F0 F6     BEQ $C667        b1=0: noch kein 'Byte ready', ==>
C671: 84 82     STY $82
C673: A0 00     LDY #$00
C675: B1 4A     LDA ($4A),Y      Byte aus Cachepuffer holen
C677: 8D 03 60  STA $6003        und auf Diskette schreiben
C67A: A4 82     LDY $82
C67C: E6 4A     INC $4A          Pufferzeiger erhoehen
C67E: D0 E7     BNE $C667
C680: E6 4B     INC $4B
C682: 88        DEY              noch eine Speicherseite abspeichern ?
C683: D0 E2     BNE $C667        ja, ==>
C685: 20 3F CD  JSR $CD3F        Controller-Status pruefen
C688: D0 42     BNE $C6CC        Fehler, ==>
C68A: C6 3A     DEC $3A          noch einen Sektor schreiben ?
C68C: F0 3E     BEQ $C6CC        nein, ==>
C68E: AD 02 60  LDA $6002        aktuellen Sektor merken
C691: EE 02 60  INC $6002        naechsten Sektor anwaehlen
C694: EA  ....  NOP            [20 NOPS]
C6A7: ....  EA  NOP

auf Spurende pruefen

C6A8: C5 93     CMP $93          wurde gerade der letzte Sektor der Spur
C6AA: D0 AE     BNE $C65A        geschrieben ? nein, ==>
C6AC: A5 8C     LDA $8C          Cachezeiger auf Cachepufferanfang setzen
C6AE: 85 4B     STA $4B
C6B0: A5 94     LDA $94          1. physikalischen Sektor anwaehlen
C6B2: 8D 02 60  STA $6002
C6B5: EA  ....  NOP            [20 NOPS]
C6C8: ....  EA  NOP
C6C9: 4C 5A C6  JMP $C65A

auf korrekte Durchfuehrung des Schreibvorgangs pruefen

Einsprung von $C66D, $C688, $C68C:

C6CC: 20 3F CD  JSR $CD3F        Controller-Status pruefen
C6CF: F0 03     BEQ $C6D4        kein Fehler, ==>
C6D1: 4C CC CD  JMP $CDCC        Jobauftrag beenden

Einsprung von $C6CF:

C6D4: 4C E1 C9  JMP $C9E1        Verify durchfuehren

    Previous Page / Next Page