    Folgeblock fuer Datei suchen ($f11e)
    [Die Suche nach einem freien Block wird in 3 Phasen unterteilt:
     1. Ausgehend vom aktuellen Track wird ein Track gesucht, in dem mindestens
        ein freier Block ist. Dabei wird vom Directory weg gesucht (nach Track
        39 kommt 38; nach Track 41 kommt 42).
        Wenn bis zum Rand der Diskette (Partition) kein Track gefunden wurde
        kommt Phase 2.
     2. Es wird auf der anderen Seite des Directorys nach einem Track mit
        freien Blocks gesucht.
     3. Die Routine versucht es noch einmal auf der ersten Seite, um evtl.
        freie Blocks zu finden, die sich zwischen Directory und dem aktuellen
        Block befinden.
     Ist die aktuelle Tracknummer = Directory-Track, dann wird die Suche auf
     den Directory-Track beschraenkt.
     Achtung:
     Leider ist diese Routine nicht fuer den Cachepuffer optimiert worden:
     Wenn alle Blocks auf einem Track belegt worden sind, wird fuer den naechsten
     Sektor die Tracknummer erhoeht und der Sektorversatz zur aktuellen
     Sektornummer addiert. War der letzte Sektor nicht die Nummer 40, wird
     mitten in der Spur angefangen, die Blocks zu belegen. Die Folge ist, dass
     diese Spur spaeter 2 mal geladen werden muss.
     z.B.: Der 1. belegte Sektor ist die Nummer 4, dann wird der Cache mit der
     Seite 0 gefuellt. Nun koennen die Blocks 4-19 gelesen werden. Fuer die Blocks
     20-39 muss die Seite 1 geladen werden, und schliesslich fuer die Blocks 0-3
     wieder die Seite 0.
     Diese Situation tritt zum Glueck nur selten auf (besonders bei REL-Files).]

    Einsprung von $9118, $9C07, $9CAA, $A387, $A39A, $A459:

    B668: 20 7C 9D  JSR $9D7C        T&S der aktuellen Datei holen
    B66B: A9 03     LDA #$03
    B66D: 85 40     STA $40          Zaehler fuer Phasen der Blocksuche setzen
    B66F: A9 01     LDA #$01         Flag 'BAM veraendert' setzen
    B671: 05 35     ORA $35          [Dieses ORA stammt von der 1541 und ist
    B673: 85 35     STA $35           bei der 1581 ueberfluessig.]

    Einsprung von $B68C, $B69E, $B6AD, $B6BB, $93F5:

    B675: 20 B4 B5  JSR $B5B4        BAM-Zeiger auf aktuellen Track setzen
    B678: B1 31     LDA ($31),Y      Anzahl freier Blocks holen
    B67A: D0 43     BNE $B6BF        >0, (freie Blocks) ==>
    B67C: A5 4D     LDA $4D          'aktueller Track' mit 'Dir-Track'
    B67E: CD 2B 02  CMP $022B        vergleichen
    B681: F0 1D     BEQ $B6A0        = , Suche beenden ==>
    B683: 90 20     BCC $B6A5        < , (in Richtung Track1 suchen) ==>

    in Richtung Track80 suchen

    B685: E6 4D     INC $4D          Tracknummer erhoehen
    B687: A5 4D     LDA $4D
    B689: CD 2C 02  CMP $022C        Ist der Track innerhalb der Partition
    B68C: D0 E7     BNE $B675        ja, ==>
    B68E: AE 2B 02  LDX $022B        auf die andere Seite wechseln
    B691: CA        DEX              Suche bei 'Directory-Track -1' fortsetzen
    B692: 86 4D     STX $4D
    B694: E4 90     CPX $90          existiert die andere Seite ?
    B696: 90 17     BCC $B6AF        (bei Partitions nicht), ==>
                                    [eigentlich muesste bei Partitions die
                                     2. Phase uebersprungen werden: 2 x DEC 40.
                                     Dies geschieht aber nicht. Dadurch sucht
                                     das DOS bei den beiden letzten Phasen im
                                     gleichen Bereich.]
    B698: A9 00     LDA #$00         Sektor = 0 setzen [Spaeter wird der Sektor-
    B69A: 85 4E     STA $4E           versatz addiert! Dann wird nicht mehr am
                                     Spuranfang begonnen, Blocks zu belegen,
                                     sondern bei Sektor 1.]
    B69C: C6 40     DEC $40          naechste Phase
    B69E: D0 D5     BNE $B675        noch eine Suchphase, ==>

    Einsprung von $B681, $B6BD:

    B6A0: A9 72     LDA #$72         72, Disk full
    B6A2: 20 7C 80  JSR $807C
    in Richtung Track1 suchen

    Einsprung von $B683:

    B6A5: A5 4D     LDA $4D          Ist Start der Partition erreicht?
    B6A7: C5 90     CMP $90          [Die Abfrage kommt doch einen Track zu
                                     spaet !? (Sie wird aber zum Glueck nie
                                     gebraucht, da immer vom Directory weg
                                     gesucht wird)]
    B6A9: 90 04     BCC $B6AF        befand sich der letzte gepruefte Track vor
                                    dem Partition-Anfang ? ja, ==>
    B6AB: C6 4D     DEC $4D          Tracknummer -1
    B6AD: D0 C6     BNE $B675        Disketten-Anfang? nein, (hier klappt's) ==>

    Einsprung von $B696, $B6A9:

    B6AF: AE 2B 02  LDX $022B        Seite wechseln
    B6B2: E8        INX
    B6B3: 86 4D     STX $4D
    B6B5: A9 00     LDA #$00         Sektor = 0 setzen
    B6B7: 85 4E     STA $4E          [Spaeter wird der Sektorversatz addiert !]
    B6B9: C6 40     DEC $40          naechste Phase
    B6BB: D0 B8     BNE $B675        noch eine Suchphase, ==>
    B6BD: F0 E1     BEQ $B6A0        72, Disk full

    freien Sektor auf dem aktuellen Track suchen

    Einsprung von $B67A:

    B6BF: A5 4E     LDA $4E          Sektornummer um Sektorversatz erhoehen
    B6C1: 18        CLC
    B6C2: 65 2E     ADC $2E
    B6C4: 85 4E     STA $4E
    B6C6: A5 75     LDA $75          Anzahl Sektoren pro Track holen (40)
    B6C8: 85 28     STA $28          Jobcode ??? [Stammt noch von der 1541.]
    B6CA: C5 4E     CMP $4E          ist das Spurende ueberschritten ?
    B6CC: B0 0B     BCS $B6D9        nein, [Sektor 40 ist aber auch zu gross] ==>
    B6CE: 38        SEC              Tracknummer >= 41:
    B6CF: A5 4E     LDA $4E          Sektornummer - Anzahl der Sektoren / Track
    B6D1: E5 75     SBC $75
    B6D3: 85 4E     STA $4E
    B6D5: F0 02     BEQ $B6D9        =0, ==>
    B6D7: C6 4E     DEC $4E          -1

    Einsprung von $B6CC, $B6D5:

    B6D9: 20 46 B7  JSR $B746        naechsten freien Block auf dem Track suchen
    B6DC: F0 03     BEQ $B6E1        nicht gefunden, ==>

    Einsprung von $B6E8:

    B6DE: 4C 72 B5  JMP $B572        Block in BAM belegen

    Einsprung von $B6DC:

    B6E1: A9 00     LDA #$00         Sektornummer =0 setzen
    B6E3: 85 4E     STA $4E
    B6E5: 20 46 B7  JSR $B746        und noch einmal einen freien Block suchen
    B6E8: D0 F4     BNE $B6DE        erfolgreich, ==>
    B6EA: 4C 41 B7  JMP $B741        71, Dir Error

        Previous Page / Next Page