Unsere gemeinsame Wanderung über das Innere des Betriebssystems des Atari ST hat uns sehr weit geführt. Wir haben verschiedene Funktionen zur Ein- und Ausgabe sowie einen Teil der dazu vorhandenen Funktionen zur Dateimanipulation kennengelernt. In diesem dritten Teil werden wir die ! Routinen des GEMDOS abschließen und dann in unserer nächsten Ausgabe konsequent mit den Funktionen des BIOS anfangen.
$ 42 LSEEK
Die bisher von uns behandelten Dateien waren sogenannte sequentielle Dateien. Das bedeutet, daß das von uns gewählte FILE von Anfang bis Ende gelesen und in dem internen Speicher abgelegt wurde. Das FILE wird kontinuierlich Byte für Byte vom Dateianfang bis zum Dateiende gelesen. Der direkte Zugriff von Diskette auf bestimmte Teile dieser Datei ist mit dieser Methode nicht möglich. Aber daß diese Art und Weise von Dateizugriffen nicht immer ideal ist, versteht sich von selbst. Die Funktion LSEEK bietet nun andere Möglichkeiten von Zugriffen auf Daten, die nicht so eingeschränkt sind wie der sequentielle Zugriff. Durch LSEEK wird der Datenpointer so bewegt, daß jedes einzelne Byte erreichbar ist. Solch eine Form des Zugriffs wird auch „Relative Datei“ genannt. Bei der LSEEK-Funk-tion werden drei Parameter benötigt: Mit dem ersten Parameter wird die Anzahl von Bytes festgelegt, um die der Datenpointer sich bewegt. Ein zweiter Parameter übergibt den schon bekannten Filedeskriptor auf den Stack, und der letzte Parameter bestimmt die Arbeitsweise dieser Funktion. Als zulässige Werte dieses dritten Parameters kommen nur die Null, die Eins oder die Zwei in Frage. Bei dem Null-Modus wird der Zeiger am Dateianfang positioniert und von dort die angegebene Anzahl von Bytes in Richtung Dateiende bewegt. Logischerweise kommen hier nur positive Werte in Frage. Beim Modus Eins kann sich der Zeiger ab der aktuellen Position in positive sowie negative Richtung bewegen. Der Modus Zwei verhält sich genau spiegelverkehrt wie der Modus Null. Der Datenzeiger wird auf das Dateiende positioniert und von dort im negativen Sinne in Richtung Dateianfang bewegt.
Beispiel 1
MOVE.W #0,-(SP) ; Zeiger an Datei an-fang
MOVE.W F.DES,-(SP) ; Nr. des Filedeskriptor
MOVE.W #$62, -(SP) ; $62 Bytes in Richtung Datei ende. Hier werden nur positive Werte gebraucht
MOVE.W #$42, -(SP) ; Funktionsnummer
TRAP #1
ADD.L #10, SP ; Stack Korrektur
Beispiel 2
MOVE.W #1, -(SP) ; Zeiger wird von der aktuelle Position relativ bewegt
MOVE.W F.DES,-(SP) ; Filedeskriptor
MOVE.W #$-A,-(SP) ; 10 Bytes in Richtung Dateianfang bewegen.
Hier können positive sowie negative Werte verwendet werden.
MOVE.W #$42, -(SP)
TRAP #1
ADD.L #10,SP
Beispiel 3
MOVE.W #2,-(SP) ; Zeiger wird auf Dateiende positioniert
MOVE.W F.DES,-(SP) ; Filedeskriptor
MOVE.W #$-A9,-(SP) ; $A9 Bytes in Richtung Dateianfang bewegen. Hier
Hier werden nur negative Werte gebraucht
MOVE.W #$42,-(SP)
TRAP #1
ADD.L #10,SP
$ 43 CHANGE MODE
Wir haben gesehen, wie mit der Funktion CREATE eine Datei generiert wurde. Der erste Parameter, den eine Datei benötigt, ist ein sogenanntes Attribut. Das Attribut einer Datei kann folgendes sein:
Manchmal ist es notwendig, ein solches Attribut ermitteln und unter Umständen verändern zu können. Die Funktion CHANGE MODE ermöglicht das Ermitteln sowie die Änderung dieses Dateiattributes. Drei Parameter sind für die Ausführung dieser Funktion nötig: Der erste Parameter übergibt die Attributänderung auf den Stack. Natürlich nur, wenn eine Attributänderung erwünscht wird. Falls es sich nur um das Ermitteln des vorhandenen Attributes handelt, ist dieser Parameter mit einer Null versehen. Der zweite Parameter bestimmt, ob das Attribut nur gelesen wird; in diesem Fall enthält er eine Null. Falls das Dateiattribut ebenfalls geändert wird, enthält er eine Eins. Der Inhalt des dritten und letzten Parameters zeigt auf die Adresse, in der sich der Filename befindet.
$ 45 DUP
Wie schon bei anderen Funktionen erwähnt wurde, kann man den Bildschirm, einen Drucker oder die RS 232 Schnittstelle wie eine Datei behandeln. Man kann bei Änderungen der Device-Nummer Ein- und Ausgabe auf die verschiedenen oben genannten Geräte umleiten. Durch die DUP-Funktior wird einem dieser Geräte ein Filedes kriptor zugewiesen und es wie ein« normale Datei behandelt.
$ 46 FORCE
Diese Funktion erlaubt die Umleitung von Ein- bzw. Ausgabe von einem Ge rät zu einem anderen. Z. B. könnte ei ne Ausgabe statt auf dem Bildschirm auf ein Floppylaufwerk umgeleite und dort in eine Datei geschriebei werden, oder eine Eingabe kann vor einer geöffneten Datei statt über di« Tastatur erfolgen.
$47 GETDIR
Wir haben bei der Funktion CHDIR gelernt, wie ein Subdirectory zum aktuellen Directory gemacht wird. Dadurch erfolgen alle Dateizugriffe innerhalb dieses Subdirectorys. Mit der Funktion GETDIR kann man den Pfadnamen eines aktuellen Subdirectorys ermitteln. Zwei Parameter werden für diese Funktion benötigt. Der eine ist die Bezeichnung des aktiven Laufwerkes. Dabei wird durch eine Null als Parameter das aktuelle Laufwerk aktiviert; eine Eins wählt das Laufwerk A an und eine Zwei das Laufwerk B. Der zweite Parameter enthält die Adresse eines 64 Byte großen Puffers, in dem der komplette Pfadname abgelegt wird.
$ 48 MALLOC
Beim Nachladen eines Programmes wird der gesamte noch verfügbare Speicherplatz zugeordnet. Das könnte kritisch werden, falls man noch ein Programm in den Speicher laden möchte (z. B. GEM-Applikationen). Durch die Funktion MÄLLOC ist es einerseits möglich, den noch frei verfügbaren Speicherplatz zu ermitteln, und andererseits, Speicherplatz zu reservieren.
$ 49 MFREE
Die Funktion MFREE stellt die umgekehrte Funktion von MALLOC dar. Ein schon mit der vorherigen Funktion reservierter Speicherplatz wird wieder freigegeben. Der Erfolg oder Mißerfolg wird ins Register D0 weitergegeben.
$ 4A SETBLOCK
Diese Funktion stellt ein noch komfortableres Mittel zum Reservieren von freiem Speicherplatz dar. Die Parameter übergeben die Anfangsadresse sowie die Länge des zu reservierenden Speicherbereichs weiter.
$ 4B EXEC
Durch diese Funktion kann unser Programm laden oder nachgeladen werden. Außerdem kann es nach Wunsch automatisch gestartet werden. Die Funktion benötigt vier Parameter. Die ersten zwei sind sozusagen Parameter für das Programm selbst. Der erste Parameter zeigt einen Environment-Parameter, der die gewünschte Umgebung festlegt (z. B. „CLEAR SCREEN“). Wird die Umgebung nicht festgelegt, so kann man ihn mit einem Dummy-Wert (Null) versehen. Der zweite Pa rameter dient dazu, das Programm nachzuladen und mit bestimmten Hinweisen zu versehen. Die Adresse, in der sich dieser Parameter befindet, wird auf den Stack übergeben. Der dritte Parameter enthält die Adresse, in der sich der Filename der gewünschten Datei befindet. Der vierte Parameter bestimmt, ob das nachgeladene Programm automatisch starten soll. Eine 0 signalisiert, daß das Programm nach dem Laden mit der Ausführung beginnen soll. Bei einer 3 als Parameter wird das Programm nicht automatisch gestartet.
CHMOD
Beispiel 1
Attribut wird geändert
MOVE.W #2,-(SP) ; Erzeugt eine "Versteckte Datei
MOVE.W #1,-(SP) ; Dieser Parameter gibt an, Datei
Attribut soll geändert werden
MOVE.L #FINA,-(SP) ; Filename
MOVE.W #$43,-(SP) ; Funktionsnummer
TRAP #1 ; GEMDOS aufruFen
ADD.L #10, SP ; Stack Korrektur
Beispiel 2
Attribut wird ermittelt
CLR -(SP) ; Erster Parameter wird nicht benötigt
MOVE.W #0,-(SP) ; Dieser Parameter gibt an, Datei-Attribut
soll ermittelt werden
MOVE.L #FINA, -(SP) ; Filename
MOVE.W #$43, -(SP)
TRAP #1
ADD.L #8,SP
Inhalt von Register D0 :
D0 = 00000001
DUP
* OPEN Funktion *
FILNAME :
DC.L "TEST.DAT",0
MOVE.W #$2,-(SP)
MOVE.L #FILNAME,-(SP)
MOVE.W #$3D,-(SP)
TRAP #1
ADDQ.L #8,SP
* DUP Funktion *
MOVE.W #$3,-(SP) ; Drucker als Ausgabegerät
MOVE.W #$45,-(SP) ; Funktionsnummer
TRAP #1 ; GEMDOS aufrufen
ADDQ.L #4,SP ; Stack Korrektur
$ 4C TERM
Diese Funktion verhält sich ähnlich wie die Funktion TERM $ 0. Der Unterschied besteht darin, daß bei TERM $ 4C ein frei definierbarer Wert als Rückgabe weitergegeben werden kann.
$ 4E SFIRST
Diese Funktion prüft, ob eine angegebene Datei im Directory vorhanden ist. Findet diese Funktion eine Übereinstimmung, liefert der Filename das Attribut Datum und Uhrzeit, sowie die Größe der Datei zurück. Alle diese Daten, die durch die Funktion SETDIR schon festgelegt wurden, werden in einem Puffer abgelegt. Der Filename braucht nicht unbedingt komplett eingegeben zu werden. Einzelne Zeichen können durch das Zeichen „?“ ersetzt werden. Mehrere Buchstaben werden durch das Zeichen ersetzt. Bei Eingabe der Zeichenkette „.“ wird die erste Datei des Direc-tories in den Puffer geladen. Ein anderer Parameter, der diese Funktion benötigt, ist ein sogenanntes Such-Attribut. Das Such-Attribut entspricht dem Attribut, das uns bereits bekannt ist. Dateien werden folgendermaßen anhand dieses Attributes gesucht: Ist das Such-Attribut eine Null, so wird nach allen Dateien, die gelesen sowie geschrieben werden können, gesucht. Also eine Datei mit Attribut Null oder Attribut Eins. Ist das Such-Attri-but eine Zwei, wird nach allen verborgenen Dateien gesucht. Ist das Such-Attribut eine Acht, wird nach dem Volumen-Label gesucht. Ist das Suchen erfolgreich abgeschlossen, so findet man im Register D0 eine Null und in dem 44 Byte großen Puffer befinden sich die Daten, die aus dem Directory geholt wurden. Der Puffer ist folgendermaßen aufgebaut:
Aufbau des 44 Byte großen Puffers
Byte O - 20 Reserviert für GEMDQS
Byte 21 Attribut
Byte 22 - 23 Uhrzeit
Byte 24 - 25 Datum
Byte 26 — 29 Größe der Datei in Bytes
Byte 30 - 43 Dateiname und Extension
GETDIR
MOVE.W #1,-(SP) ; File von Laufwerk 'A' holen
MOVE.L #PUFFER,-(SP) ; Adresse 64-Byte Puffer
MOVE.W #$47,-(SP) ; Funktionsnummer
TRAP #1 ; GEMDOS aufrufen
ADDQ.L #8,SP ; Stack Korrektur
MALLOC
Beispiel 1
Anzahl freier Bytes wird ermittelt
MOVE.L #-1,-(SP) ; -1 veranlaßt daß die aktuelle Anzahl
freier Bytes ermittelt wird
MOVE.W #$48,-(SP) ; Funktionsnummer
TRAP #1 ; GEMDOS aufrufen
ADDQ.L #6,SP ; Stack Korrektur
Inhalt von Register D0:
D0 = 000FBC10
Beispiel 2
Speicher wird reserviert
MOVE.L #$4000,-(SP) ; $4000 Bytes wird reserviert
MOVE.W #$48,-(SP)
TRAP #1
ADDQ.L #6,SP
In Register D0 erhält man die Startadresse des reservierten Speicherbereichs.
MFREE
MOVE.L D0,-(SP) ; In Register D0 steht die Startadresse
eines reservierten Speicherbereiches
MOVE.W #$49,-(SP) ; Funktionsnummer
TRAP #1 ; GEMDOS aufrufen
ADDQ.L #6,SP ; Stack Korrektur
In Register D0 erhält man die Größe des freien Speicherplatzes.
SETBLOCK
MOVE.L A7,A5 ; Stapelzeiger in A5 retten
MOVE.L 4(A5),A5 ; A5 zeigt $100 Bytes unter Programmanfang
MOVE.L $C(A5),D0 ; $C(A5)= Programmlänge
ADD.L $14(A5),D0 ; Datenbereichslänge
ADD.L $1C(A5),D0 ; Länge des nicht initalisierten Datenbereiches
ADD.L #$200,D0 ; $200 Bytes reservieren
MOVE.L D0,-(SP) ; Länge des reservierten Bereichs in Stack ablegen
MOVE.L A5,-(SP) ; Anfangsadresse des reservierte
Speicherbereiches in Stack ablegen
MOVE.W #0,-(SP) ; Dummy—Wort
MOVE.W #$4A,-(SP) ; Funktionsnummer
TRAP #1 ; GEMDOS aufrufen
ADD.L #12,SP ; Stack Korrektur
$ 4F SNEXT
Durch SNEXT kann ermittelt werden, ob sich in dem Directory andere Dateien befinden, die mit dem angegebenen Filenamen übereinstimmen. SNEXT benötigt keine Parameter und bildet eine Erweiterung der schon oben genannten Routine. Wird allerdings nicht nach einem bestimmten Namen gesucht, so kann man mit beiden Routinen die ganze Directory durchgehen und anzeigen lassen. Das Ende des Directories kann leicht beim Überprüfen des Registers DO ermittelt ermittelt werden. Ergibt sich hier ein von Null unterschiedlicher Wert, ist ein Fehler aufgetreten oder alle Eintragungen wurden durchgesucht.
$ 56 RENAME
RENAME ermöglicht das Umbenennen von Dateien. Zwei Parameter sind hier notwendig. Der Erste enthält die Adresse eines Puffers, in dem sich der neue Name befindet, der Zweite wiederum die Adresse eines Puffers mit dem aktuellen Namen der Datei, den man ändern möchte. Im Register DO wird erkannt, ob die Ausführung korrekt behandelt wurde.
$ 57 CSDTOF
Die Eintragung einer Datei im Directory enthält außer dem Namen und der Dateigröße, Datum und Uhrzeit der Fileerstellung. Die beiden letzteren Angaben können durch die Funktion CSDTOF entweder ermittelt oder neu gesetzt werden. Voraussetzung ist, daß die Datei bereits mit OPEN oder CREAT eröffnet wurde. Als Parameter wird zuerst ein Wort übergeben, das den Modus bestimmt (1 = Datum und Zeit ermitteln, 0 = Datum und Zeit neu setzen). Der zweite Parameter ist der Filedeskriptor, den man durch OPEN oder CREATE erhält. Der Dritte Parameter ist ein vier Byte großer Puffer, in dem die Daten abgelegt werden.
MOVE.L #$0,-(SP) ; Kein Enviroment MOVE.L #KZEILE, -(SP) ;Zeile in der das benötigte Kommando steht MOVE.L #NAME, -(SP) ; Puffer in dem sich der Filename befindet MOVE.W #0, -(SP) ; Nach dem Laden automatisch starten MOVE.W #$4B, -(SP) ; Funktionsnummer TRAP #1 ; GEMDOS aufrufen ADD.L #14,SP ; Stack Korrektur
SFIRST
MOVE.L #DATA,-(SP) ;DATA ist ein Puffer in dem die gelieferte Information abgelegt wird MOVE.W #1A,-(SP) ;SET DTA legt Puffer fest TRAP #1 ;GEMDOS aufrufen ADDQ.L #6,SP ;Stack Korrektur MOVE.W #$0,-(SP) ; Setz Attribut. Wird nach normaler Datei gesucht MOVE.L #NAME,-(SP) ;Filename MOVE.W #$4E,(SP) ;Funktionsnummer TRAP #1 ;GEMDOS aufrufen ADDQ.L #8,SP
RENAME
MOVE.L #NEUERNAME,-(SP) ;Neuer Name für die Datei MOVE.L #ALTENAME,-(SP) ;Name der Datei, die umbe— nannt wird MOVE.W #0,-(SP) ;DUMMY MOVE.W #$56,-(SP) ;Funktionsnummer TRAP #1 ;GEMDOS aufrufen ADD.L #12,SP ;Stack Korrektur
GSDTOF
Beispiel 1
Datum und Uhrzeit wird ermittelt
MOVE.W #1, -(SP) ;Modus zum Ermitteln des Datums und Uhrzeit MOVE.W #FDESK, -(SP) ;Filedeskriptor MOVE.W #PUFFER,-(SP) ;Adresse eines 4 Byte großen Puffers MOVE.W #$57,-(SP) ;Funktionsnummer TRAP #1 ;GEMDOS aufrufen ADD.L #10,SP ;Stack Korektur
Beispiel 2
Datum und Uhrzeit wird gesetzt
MOVE.W #0, -(SP) ;Modus für Setzen MOVE.W #FDESK,-(SP) ;Filedeskriptor MOVE.W #PUFFER,-(SP) ;Pufferadresse MOVE.W #$57,-(SP) ;Funktionsnummer TRAP #1 ADD.L #10,SP
</div>
# Die Fehlermeldung des GEMDOS
Die GEMDOS-Funktionen geben in Register DO einen Wert zurück,
welcher signalisiert, ob die Operation ordnungsgemäß oder nicht
durchgeführt wurde. Eine Null als Rückgabe bedeutet kein
Fehler. Fehler werden durch negative Werte signalisiert.
-32 Ungültige Funktionsnummer
-33 Datei wird nicht gefunden
-34 Pfad wird nicht gefunden
—35 Keine Datei Handles mehr übrig (zu viele eröffnete Dateien)
-36 Zugriff untersagt
-37 Ungültiger Filedeskriptor
-39 Ungenügend Speicherplatz
-40 Ungültige Speicherblockadresse
-46 Ungültige Laufwerksnummer
-49 Keine anderen Dateien
# Platinenservice
Floppy-Stecker-Platine (FSP) ST 001ub DM 8,80 incl. MwSt
Treiber- und Netzteilplatine ST 002ub : DM 19,80 incl. MwSt
Der Versand erfolgt nur per Nachnahme plus DM 3,- für Porto und Verpackung.