Das ST-Betriebssystem Teil 3

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.

LSEEK

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:

0 = Datei kann beschrieben oder gelesen werden
1 = Datei kann nur gelesen werden
2 = Datei ist eine „Versteckte Datei“ (Hidden File)
4 = Datei ist eine „Versteckte System-Datei“ (System-File)
8 = erzeugt ein sogenanntes Volumen-Label

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.

        EXEC

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

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.


Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]