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

</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.


Aus: ST-Computer 06 / 1986, Seite 6

Links

Copyright-Bestimmungen: siehe Über diese Seite