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