Forced Media Change

Bei Schreibzugriffen auf Sektoren oder direkte Controller-Programmierung sind Sie als Programmierer immer wieder auf BIOS-und XBIOS-Routinen angewiesen. Das Problematische bei Direktzugriffen über diese Routinen ist, daß das GEMDOS eine Tabelle über die FAT-Belegung sowie verschiedene Inhaltsverzeichnisse ständig in seinem internen Speicher hält.

Greifen Sie nun über BIOS oder XBIOS auf ein Speichermedium zu, verändern Sie möglicherweise den physikalischen Inhalt der FAT oder der Inhaltsverzeichnisse. GEM-DOS behält aber weiterhin seine Tabellen im Speicher. Soll später wiederum ein Zugriff über das GEMDOS erfolgen, so »weiß« es nichts über die Veränderungen und produziert bestenfalls eine Fehlermeldung, meistens jedoch Datenmüll. Das kann dazu führen, daß Sie den Inhalt einer Diskette nicht mehr lesen können oder eine ganze Festplattenpartition so verstümmelt wird, daß diese sich nur noch durch vollständiges Löschen zur Mitarbeit überreden läßt. Aus diesem Grund fordern viele Programme nach der erfolgten Datenmanipulation zum erneuten Booten auf.

Das funktioniert zwar, jedoch ist diese Methode nicht gerade die eleganteste. Seit im August letzten Jahres die »Rainbow-TOS Release Notes« erschienen ist, gibt es ein offiziell von Atari dokumentiertes Verfahren, das Abhilfe schafft [1]. Dabei bedient sich die Routine des Media-Change-Vektors. Bevor das GEMDOS auf ein Speichermedium zugreift, fragt es erst einmal ab, ob zwischenzeitlich der Datenträger gewechselt wurde. Dieses Verfahren stammt noch aus der Zeit in der keine Festplatten für die STs zu haben waren und sollte verhindern, daß das GEMDOS bei Diskettenwechseln seine RAM-FAT der alten Diskette für die neue benutzt. Sobald das GEMDOS festgestellt hat daß ein Mediawechsel stattgefunden hat, löscht es seine alten internen FATs im »OS-Pool« und liest die neuen ein.

Eine Hard-Disk kann man aber nicht so einfach »auswechseln«, deshalb zeigt eine »Media-Change«-Abfrage auf eine Hard-Disk-Partition immer den Wert 0, was bedeutet, daß das Speichermedium nicht gewechselt wurde. Die hier vorgestellte Routine gaukelt dem GEMDOS vor, es habe ein Wechsel stattgefunden. Es führt einen GEM-DOS-Aufruf auf dem gewünschten Laufwerk vor und sorgt dafür, daß das GEMDOS bei einer provozierten Media-Change-Abfrage den Status 2 (Medium gewechselt) erhält. Nun wirft das GEM-DOS seine internen Tabellen über Bord und liest die neuen ein, bevor es das gegebene Kommando ausführt. Die Routine entstammt ursprünglich den »Release Notes«, enthält jedoch einige entscheidende Verbesserungen.

Turbo-C als Bombenleger

Zunächst einmal wählte Atari für seine Assemblerroutine den Namen »mediach«. Das treibt manchen C-Compiler zur Verzweiflung, denn es existiert ja bereits eine Routine dieses Namens, nämlich BIOS 9. Vielleicht ist der »Doppelname« auch nur ein Druckfehler in den »Release Notes«, denn im Listing beginnt exakt diese Routine mit einem Unterstrich (»_«). Es ist also nicht ganz sicher, ob Ataris Programmierer oder der Drucker versagt hat. Übernehmen Sie den Namen »mediach« in eine eigene Bibliothek, so produziert beispielsweise Turbo-C einen Fehler, den es nicht anzeigt, der aber zum Absturz Ihrer Programme führt.

Unsere Routine deklariert sich global als »fmediach«, wobei das »f« für »forced«, also »zwangsweise« steht. Ein anderes Problem wird deutlich, wenn der Media-Change ausnahmsweise doch mal auf einer Diskette ausgeführt wird und der User diese gerade entnommen hat. Dann erscheint unpassenderweise eine Dialogbox, die den Anwender darauf hinweist, daß sein DiskettenLaufwerk momentan nicht ansprechbar ist und fordert ihn zur Eingabe auf. Dabei ist eine solche Eingabe im Falle des Media-Changes völlig unnötig. Denn egal, welche Eingabe der Anwender vornimmt, die RAM-FAT ist in jedem Fall gelöscht. Deshalb installiert unsere Routine ein eigenes Unterprogramm, welches dann in Aktion tritt, wenn Fehler aufgetreten sind. Zunächst einmal prüft es, welches Laufwerk den Fehler verursacht hat. Handelt es sich um eben dasjenige Laufwerk, welches gerade den MediaChange durchführen soll, so liefert die Routine intern einen Fehlerwert zurück. Davon merkt der Benutzer nichts, es erscheint auch keine Dialogbox. Tritt der Fehler auf einem anderen Laufwerk auf, so verfährt der Computer wie vorher und gibt in altbewährter Manier eine Fehlermeldung aus. Dieser Fall sollte aber bei keiner der bisherigen TOS-Versionen auftreten.

Weitere Verbesserungen betreffen den Programmcode und die Ausführungsgeschwindigkeit. Wir haben bei unserem Programm bewußt auf das XBRA-Protokoll verzichtet, weil wir seine Vorzüge nicht benötigen. Die Installation ist nur kurzzeitig, das Programm de-installiert sich vor seinem Ende selbst, und GEMDOS-Aufrufe sind im Interrupt ohnehin unmöglich.

Wir stellen Ihnen zwei Programmversionen vor. Die erste ist ein für C-Compiler entwickeltes Programm. Am besten, Sie assemblieren die Routine und nehmen sie in Ihre persönliche C-Bibliothek auf. Vielleicht ersetzen Sie unseren Namen »fmediach« auch durch das schwer zu unterscheidende »_mediach«, den Aufruf der Bibliotheksfunktion demonstriert unser C-Programm. Für das GFA-Basic-Listing haben wir die Routine etwas verändert. Da GFA-Basic kein BSS anlegen kann, haben wir dieses Segment gestrichen und durch »DC.x«-Anweisungen ersetzt.

Laurenz Prüßner/mb

Literaturverzeichnis:

[1] Atari Corporation, »Rainbow-TOS Release Notes«, Seiten 52ff., Atari Corp., 1196 Borregas Aventie, Sunnyvale, CA 94086.



Aus: ST-Magazin 05 / 1990, Seite 74

Links

Copyright-Bestimmungen: siehe Über diese Seite