JOBs $80, $90: READ_DV, WRITE_DV $aa, $ac: TREAD_DV, TWRT_DV $b2, $b4: TPREAD_DV, TPWRT_DV C900: 20 A6 CF JSR $CFA6 Blockheader lesen C903: A5 88 LDA $88 Steht Kopf auf richtiger Spur ? C905: C5 1F CMP $1F (Solltrack=Track in Blockheader) C907: F0 03 BEQ $C90C ja, ==> C909: 4C 88 CB JMP $CB88 nein: Blockheader nicht gefunden ==> Einsprung von $C907: C90C: 8D 01 60 STA $6001 zu lesende Spur in Controller schreiben C90F: 20 B7 CF JSR $CFB7 Zeiger auf Cacheanfang setzen C912: A5 96 LDA $96 aktuelle Diskettenseite merken C914: 85 39 STA $39 [Ich sehe keine Verwendung] C916: A5 92 LDA $92 Anzahl der Sektoren merken C918: 85 3A STA $3A Folgesektor im Cache berechnen C91A: A5 21 LDA $21 Sektornummer aus Blockheader C91C: AA TAX merken C91D: C5 93 CMP $93 = groesste Sektornummer ? C91F: 08 PHP (Ergebnis merken) C920: D0 06 BNE $C928 nein, ==> C922: A5 94 LDA $94 1. physikalische Sektornummer holen C924: AA TAX und merken C925: 38 SEC -1 [Der letzte Sektor steht unmittelbar vor C926: E9 01 SBC #$01 dem 1. Sektor. Er ist sozusagen der 0. S.] Einsprung von $C920: C928: 38 SEC - Nummer des 1. physikalischen Sektors C929: E5 94 SBC $94 C92B: 18 CLC +1 (da der Folgesektor gelesen werden soll) C92C: 69 01 ADC #$01 C92E: A4 91 LDY $91 Blockgroesse holen Einsprung von $C934: C930: 88 DEY C931: F0 03 BEQ $C936 y-1 mal: Sektornummer *2 C933: 0A ASL C934: 90 FA BCC $C930 = Zeiger Hi in den Cachepuffer Einsprung von $C931: C936: 20 8D CB JSR $CB8D Zeiger in Cachepuffer setzen physikalischen Folgesektor berechnen C939: 8A TXA C93A: 28 PLP wurde der letzte Sektor der Spur gefunden ? C93B: F0 05 BEQ $C942 ja, ==> C93D: 18 CLC C93E: 69 01 ADC #$01 Sektornummer +1 C940: D0 02 BNE $C944 immer ==> Einsprung von $C93B: C942: A5 94 LDA $94 1. Sektor auf Spur Einsprung von $C940: C944: 8D 02 60 STA $6002 Sektornummer setzen C947: EA .... NOP [20 NOPS] C95A: .... EA NOP Einsprung von $C9AC, $C9CB: C95B: AD DF 01 LDA $01DF Controller-Befehl: Read Sector C95E: 20 F4 CB JSR $CBF4 an Controller uebergeben C961: A4 91 LDY $91 Sektorengroesse C963: C0 03 CPY #$03 1024 Bytes ? C965: D0 02 BNE $C969 nein C967: C8 INY ja, 4 Speicherseiten lesen C968: EA NOP 128-Byte-Sektoren werden nicht unterstuetzt Einsprung von $C965, $C971, $C980, $C985: C969: AD 00 60 LDA $6000 Controller-Status holen C96C: 29 03 AND #$03 C96E: 4A LSR C96F: 90 5D BCC $C9CE b0=0: Controller ready ? ja, ==> C971: F0 F6 BEQ $C969 b1=1: Byte Ready ? nein, ==> C973: 84 82 STY $82 C975: A0 00 LDY #$00 C977: AD 03 60 LDA $6003 Byte von Diskette lesen C97A: 91 4A STA ($4A),Y und in Cachepuffer schreiben C97C: A4 82 LDY $82 C97E: E6 4A INC $4A Cachepufferzeiger erhoehen C980: D0 E7 BNE $C969 C982: E6 4B INC $4B C984: 88 DEY Anzahl zu lesender Speicherseiten -1 C985: D0 E2 BNE $C969 Block noch nicht fertig, ==> C987: 20 3F CD JSR $CD3F auf Lesefehler testen C98A: D0 42 BNE $C9CE Fehler, ==> C98C: C6 3A DEC $3A Anzahl zu lesender Blocks =0 ? C98E: F0 3E BEQ $C9CE ja, ==> C990: AD 02 60 LDA $6002 Nummer des gerade gelesenen Sektors merken C993: EE 02 60 INC $6002 naechsten Sektor lesen C996: EA .... NOP [20 NOPS] C9A9: .... EA NOP C9AA: C5 93 CMP $93 letzter Sektor auf der Spur ? C9AC: D0 AD BNE $C95B nein, ==> C9AE: A5 8C LDA $8C ja, C9B0: 85 4B STA $4B Cache-Zeiger auf Pufferanfang setzen C9B2: A5 94 LDA $94 1. Sektor laden C9B4: 8D 02 60 STA $6002 C9B7: EA .... NOP [20 NOPS] C9CA: .... EA NOP C9CB: 4C 5B C9 JMP $C95B naechsten Sektor lesen Einsprung von $C96F, $C98A, $C98E: C9CE: 20 3F CD JSR $CD3F Controllerstatus pruefen C9D1: D0 0B BNE $C9DE Fehler, ==> C9D3: A5 96 LDA $96 aktuelle Seite C9D5: 85 97 STA $97 merken C9D7: A5 88 LDA $88 aktueller Track C9D9: 85 95 STA $95 als 'Track im Cache' merken C9DB: 4C E2 CD JMP $CDE2 Ende, naechsten Job testen ==> Einsprung von $C9D1: C9DE: 4C CC CD JMP $CDCC Fehlercode in Jobpuffer schreiben Previous Page / Next Page |