Programmiererecke: die neuen Dateifunktionen des TOS 1.4

Wer sich schon einmal mit dem Aufbau von Programmdateien auseinandergesetzt hat, dem ist sicherlich bekannt, daß »ph_flag« (Offset $1a-1b im Programm-Header) den Reloziervorgang sowie das Anlegen des BSS-Segmentes verhindert. Leider funktionierte dies in den bisherigen TOS-Versionen nicht ordnungsgemäß. Der Grund dafür ist, daß die geladene Programmdatei nach dem Start nicht wieder geschlossen wurde. So standen mehr und mehr Dateien offen, bis das System dann abstürzte. Dieser Fehler ist jetzt behoben. Wenn Sie auch auf älteren TOS-Versionen »ph_flag« verwenden wollen, so empfiehlt sich eine andere Methode, mit der Sie den Fehler umgehen: Das geladene Programm öffnet zunächst eine Datei mit »Fcreate«. Dabei erhält das Programm im Datenregister d0 ein Datei-Handle, an dem das Programm erkennt, ob die Programmdatei ordnungsgemäß geschlossen wurde. Hat das Handle den Wert 7, so müssen Sie anschließend den Kanal 6 schließen, der in diesem Fall der Programmdatei zugeordnet wurde.

»Pexec« stark erweitert

Danach schließen Sie die anfangs geöffnete Datei und löschen sie. Diese Methode ist zwar nicht vollkommen sicher, funktioniert jedoch in den meisten Fällen problemlos. Eine weitere Eigenschaft des ST-Betriebssystems ist mittlerweile dokumentiert. Alle Programme, die TOS mittels »Pexec« startet, beginnen im IPL 0. Dazu gehören auch die, die Sie vom Desktop aufrufen. IPL ist die Abkürzung für Interrupt Priority Level«. Diese Eigenschaft hatten alle bisherigen TOS-Versionen, und so wird es definitiv auch bleiben. Wenn Sie die Interrupt-Prioritäten verändern, so setzt TOS diese wieder auf Level 0, sobald der ST ein neues Programm lädt. Deshalb gibt es kaum Vorspänne, die auf dem Bildschirm animierte Grafik darstellen, während der ST lädt. Die meisten Intros verschwinden vom Bildschirm, sobald TOS das Hauptprogramm in den Speicher holt.

Weiterhin verabschieden sich fehlerhafte Programme, die TOS mit »Pexec« startet, nun nicht mehr nur mit Bomben. Sie geben zusätzlich die Fehlernummer des aufgetretenen Fehlers an den übergeordneten Prozeß zurück, den sogenannten Parent-Prozeß. So können beispielsweise Shells, wie es sie für verschiedene Archivprogramme gibt, endlich auf Fehlermeldungen der Archivierer reagieren. Das neue TOS bietet Ihnen weiterhin einen neuen Lademodus für die GEMDOS-Funktion »Pexec« (GEMDOS 75). Diesen Modus sprechen Sie an, indem Sie »mode« im Aufruf

a%=GEMDOS(75, mode, prgfile, cmdline, envptr)

auf 6 setzen. Die Funktionsweise dieses neuen Modus ähnelt dem Modus 4, denn auch damit starten Sie ein mit Modus 3 geladenes Programm. Der Unterschied besteht darin, daß der ST den für das Programm reservierten Speicher nach dem Programmende wieder freigibt. Um die Funktion des neuen Modus auch auf älteren Systemen zu nutzen, gehen Sie wie folgt vor: Nach dem Ende des Child-Programmes führt das Parent-Programm zwei »Mfree« Aufrufe durch. Mit dem ersten löscht der ST den Environment-String des beendeten Child-Programmes. Sie finden seine Startadresse an der Offset-Adresse 44 ($2C, »p_env«) relativ zum Basepage-Start des Child-Prozesses. Mit dem zweiten entfernt der ST dann das Child-Programm aus seinem Speicher. Dazu geben Sie in diesem zweiten »Mfree«-Aufruf die Basepage-Adresse des Childs an. Eine weitere hinderliche Beschränkung ist mit dem TOS 1.4 gefallen: Atari hat den mit 1024 Byte viel zu knapp bemessenen internen Speicher für die DESKTOP.INF-Datei endlich vergrößert, auf den Sie mit »shel_get« und »shel_put« zugreifen. TOS 1.4 nutzt jetzt 4192 Byte. Dies ist etwa für alle Anwendungsprogramme nützlich, die Sie über die Desktop-Funktion »Anwendung anmelden« installieren.

Die TOS 1.4-Dokumentation beschreibt einen neuen Weg, den Namen eines Datenträgers zu ändern, sei es Diskette oder Festplatte. Mit »Fcreate« (GEMDOS 60) haben Sie nun Gelegenheit, den Label umzubenennen, ohne den alten Label zuvor löschen zu müssen. Listing 1 zeigt Ihnen unter GFA-Basic, wie Sie dies sauber auf jeden TOS erledigen. Zu Fehlermeldungen kommt es dabei, wenn Sie noch eine der alten TOS-Versionen besitzen und bereits eine Datei mit dem gleichen Namen wie der Label existiert. Unser Programm löscht in diesem Fall aber nicht etwa eine Datei, sondern meldet den Fehler, so daß Sie darauf reagieren können. Zu Beginn des Programmes erscheint eine Datei-Auswahlbox, in der Sie das Laufwerk sowie dessen Label festlegen. Wichtig ist dabei, daß Sie wirklich ein Laufwerk angeben und nicht etwa einen relativen Pfad. Pfade dürfen Sie ohnehin nie angeben, sondern nur auf das Hauptinhaltsverzeichnis zugreifen. Fehler dieser Art erkennt das Programm und fordert eine erneute Eingabe.

Während der Entwicklung dieses Programmes fiel eine negative Eigenschaft des GFA-Basic-Interpreters auf: das Variablenhandling. In annähernd jeder anderen Programmiersprache werden Strings durch den ASCII-Code 0 beendet - nicht so in GFA-Basic. Dort nämlich kommt es vor, daß eine Variable zwar eine Länge von beispielsweise zehn Zeichen hat, dennoch aber das elfte Zeichen ungleich Null ist. Da wir die Strings aber für die Dateifunktionen des GEMDOS benötigen, sind wir auf einen mit dem ASCII-Code 0 abgeschlossenen String angewiesen. Deshalb sorgen wir durch die Zeile

POKE VARPTR(A$)+LEN(A$), 0

dafür, daß Fehler dieser Art nicht vorkommen. Ansonsten ist das Programm einfach strukturiert; während TOS 1.4 mit einem einzigen »Fcreate« auskommt, löscht unsere Routine für die alten TOS-Versionen zunächst den alten Label und verfährt dann wie unter TOS 1.4. Bekanntlich verschiebt das Desktop unter TOS 1.4 selektierte Dateien, anstatt sie zu kopieren, wenn Sie gleichzeitig die Control-Taste drücken. Dabei kopiert das Desktop zunächst die Dateien vom Quell- auf das Ziellaufwerk und löscht anschließend die selektierten Dateien. Falls die Verschiebung innerhalb eines logischen Laufwerks stattfindet, entfällt der Kopiervorgang. Der ST überträgt dann einfach den Namen der Datei von einem Pfad in den anderen, beläßt die Datei jedoch an ihrer Position auf dem Laufwerk. Diese Fähigkeit der GEMDOS-Routine »Frename« bestand schon in den ersten TOS-Versionen, Atari hat sie jedoch nie ins Desktop integriert. Wie Sie die Routine unter GFA-Basic nutzen, zeigt Ihnen unser Beispielprogramm »Frenetic« - das Listing 2. Im Gegensatz zur Desktop-Funktion verschiebt die Funktion »Frename« nur innerhalb logischer Laufwerke und nicht von einem zum anderen Laufwerk, deshalb bricht das Programm bei einem solchen Versuch mit einer Fehlermeldung ab. Durch die Verwendung von »Frename« sparen Sie sich jedoch eine ganze Menge Zeit im Vergleich zum umständlichen Kopieren der alten TOS-Versionen. Nebenbei gibt Ihnen unser Listing »Frenetic« auch die Gelegenheit, Ihre Programme umzubenennen.

Laurenz Prüßner/ba

Listing 1: Umbenennen eines Laufwerks
Listing 2: Dateien verschieben leicht gemacht



Aus: ST-Magazin 12 / 1989, Seite 68

Links

Copyright-Bestimmungen: siehe Über diese Seite