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