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 |