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
|