    Byte aus beliebigem Kanal holen ($d3aa)
    Diese Routine wird von DOS jedesmal aufgerufen, wenn ein Byte zum Computer
    uebertragen werden soll. Es werden sowohl Daten aus 'normalen' Dateien
    gelesen, als auch Daten aus dem Directory, aus REL-Dateien, oder
    Direktzugriffen ('#').
    E: $50: aktueller Kanal
    A: Byte im Ausgabepuffer $023b+KN  (Kanalnummer $50)
       Kanalstatus $0234+KN

    [kleiner Zeitvergleich:
     Die Routine benoetigt ca. 140 Taktzyklen, um bei LOAD ein Byte zu holen,
     bei SA 2-14 (PRG,SEQ,USR) sind es ca. 162 Zyklen. Dies entspricht bei
     202 Blocks einer Zeit von 3,6 - 4,2 sec.
     Wenn ein Block nachgeladen werden muss, werden ca. 910 Taktzyklen
     zusaetzlich gebraucht (reiner DOS-Aufwand, ohne Controllerprogramm)
     = 0,1 sec. bei 202 Blocks.
     Um die reale Geschwindigkeit der Routine zu testen, verwenden wir den
     Append-Befehl (SA=2). Der Vorgang dauert bei 202 Blocks 12 sec. Er selbst
     benoetigt ca. 130 Zyklen pro Byte (= 3,3 sec).
     Also braucht diese Routine tatsaechlich ca. 8,7 sec. fuer 202 Blocks. Wir
     hatten aber nur 4,3 sec. (4,2 + 0,1) ausgerechnet.
     Die restlichen 4,4 sec. werden verbraucht:
     - vom Controller (min. 3,0 sec):
       - Lesen der benoetigten Spuren (mindestens 2,8 sec.):
         - 11 x ersten Blockheader finden ( = 0,1 sec.),
         - 11 x 2 folgende Datenbereiche ueberlesen ( = 0,4 sec.)
         - 11 Spuren lesen bei 5 Umdrehungen/sec. ( = 2,2 sec.),
       - Positionieren der Schreib-/Lesekoepfe (ca. 0,3 sec.),
     - vom Controller-Programm (min. 0,5 sec.):
       - Abfragen der Jobspeicher: 266 Takte x 1200 (Timer-IRQ) +
         180 Takte x 202 x 4 (BRK) (ca. 0,2 sec.),
       - Kopieren der Daten vom Cache in den DOS-Puffer (0,3 sec.).
     Die restlichen 0.9 sec. verteilen sich auf die vielen verschiedenen
     kleineren Routinen (Log. in Phy. Format umwandeln, ...).
     (Die angegebenen Zeiten sind uebrigens alle 'Mindest-Zeiten'.)]

    Einsprung von $92FA, $AE35:

    9303: A6 50     LDX $50
    9305: 20 5F 90  JSR $905F        Filetyp holen
    9308: D0 03     BNE $930D        kein Rel-File, ==>
    930A: 4C A6 A0  JMP $A0A6        Byte aus Record-Puffer holen

    Einsprung von $9308:

    930D: A5 52     LDA $52          SA = 15 ?
    930F: C9 0F     CMP #$0F
    9311: F0 5D     BEQ $9370        ja, Fehlermeldung bzw. M-R-Byte holen

    9313: BD 34 02  LDA $0234,X      Kanalstatus holen
    9316: 29 08     AND #$08         EOI gesetzt ?
    9318: D0 15     BNE $932F        nein, ==>
    931A: 20 5F 90  JSR $905F        Filetyp holen
    931D: C9 07     CMP #$07         Direktzugriff ?
    931F: D0 08     BNE $9329        nein, ==>
    9321: A9 89     LDA #$89         b7=1: Lesen und b0=1: Schreiben ermoeglichen
    9323: 9D 34 02  STA $0234,X      b4=1: EOI loeschen
    9326: 4C 3A 93  JMP $933A        1. Byte zur Ausgabe bereitstellen

    Einsprung von $931F:

    9329: A9 00     LDA #$00         Kanal verriegeln (weder Lesen noch
    932B: 9D 34 02  STA $0234,X      Schreiben ist gesetzt)
    932E: 60        RTS

    Einsprung von $9318:

    932F: A5 52     LDA $52          SA=0: LOAD ?
    9331: F0 32     BEQ $9365        ja, ==>
    9333: 20 5F 90  JSR $905F        Filetyp holen
    9336: C9 04     CMP #$04         <4 (SEQ,PRG,USR)
    9338: 90 22     BCC $935C        ja, ==>
    Byte aus Direktzugriffskanal holen

    Einsprung von $9326:

    933A: 20 69 90  JSR $9069        Kanal- und Puffernummer holen
    933D: B5 BB     LDA $BB,X        Pufferende erreicht ?
    933F: D9 42 02  CMP $0242,Y
    9342: D0 04     BNE $9348        nein, ==>
    9344: A9 00     LDA #$00         Zeiger auf Pufferanfang setzen (1. Byte
    9346: 95 BB     STA $BB,X        ueberlesen (es enthaelt die Blocklaenge bei
                                    M-R bzw. M-W))

    Einsprung von $9342, $8B88:

    9348: F6 BB     INC $BB,X        Pufferzeiger erhoehen

    Einsprung von $8C09, $8E96:

    934A: A1 BB     LDA ($BB,X)      Byte aus Puffer holen
    934C: 99 3B 02  STA $023B,Y      und in Ausgabepuffer schreiben
    934F: B5 BB     LDA $BB,X        Pufferende erreicht ?
    9351: D9 42 02  CMP $0242,Y
    9354: D0 05     BNE $935B        nein, ==>
    9356: A9 81     LDA #$81         b4=0: EOI ausgeben
    9358: 99 34 02  STA $0234,Y

    Einsprung von $9354:

    935B: 60        RTS

    Byte aus PRG-/SEQ-/USR-Dateien holen

    Einsprung von $9338, $9368:

    935C: 20 9B 90  JSR $909B        Byte holen (im 2-Puffer-Modus)

    Einsprung von $936D:

    935F: A6 50     LDX $50
    9361: 9D 3B 02  STA $023B,X      und in Ausgabepuffer schreiben
    9364: 60        RTS

    Einsprung von $9331:

    9365: AD 6E 02  LDA $026E        <-- SA=0: DIRECTORY-Modus aktiv ?
    9368: F0 F2     BEQ $935C        nein, ==>
    936A: 20 45 B2  JSR $B245        Byte aus Directory holen
    936D: 4C 5F 93  JMP $935F        und zur Ausgabe bereitstellen

        Previous Page / Next Page