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 |