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