Beschreibung der Funktionen des Laufwerks U: von Mag!X 3.00
###########################################################

Andreas Kromke
Hannover, den 27.3.94


I Allgemeines
=============

Laufwerk U: wird bei der Initialisierung des DOS angelegt. Damit es von
gngigen Programmen als existent erkannt wird, wird das entsprechende Bit in
_drvbits gesetzt, es existiert jedoch kein entsprechendes BIOS- Laufwerk.
Dfree() liefert grundstzlich nur Nullen.

Alle Verzeichnisse sind z.Zt. auf maximal 32 Eintrge beschrnkt.

Im Gegensatz zu MiNT sind U:\PROC, U:\DEV usw. keine eigenen Dateisysteme,
sondern einfach nur Unterverzeichnisse des DFS fr Laufwerk U:. Je nach
Unterverzeichnis legt das U-DFS verschiedene Dateitypen und -treiber an.
Da die Verzeichniskontrolle dem DOS_XFS obliegt, werden Schreibzugriffe auf
z.B. ein Device im Verzeichnis per Dateidatum protokolliert. Das geht sogar
soweit, da ein Schreibzugriff auf das Wurzelverzeichnis von Laufwerk A:
automatisch das Dateidatum von U:\A verndert.

Devices, Pipes und Shared-Memory-Blcke knnen verschoben, gelscht oder
umbenannt werden. In allen Verzeichnissen von Laufwerk U: knnen symbolische
Links angelegt werden, z.B. kann man mit "ln -s U:\CON U:\CONSOLE" einen
Alias fr die Gertedatei CON anlegen. Man kann auch einfach leere Dateien
anlegen, jedoch keine Ordner, weil das Laufwerk U: keinen Speicher hat.
Im Gegensatz zu MiNT ist U:\ kein eigenes, spezielles Dateisystem. Es wird
lediglich darauf geachtet, da nur symbolische Links angelegt werden
knnen. Die Verzeichnisse U:\A usw. sind lediglich symbolische Links, die
auch entfernt oder umbenannt werden knnen.

Der Aufbau aller internen Strukturen und die schnelle registerbasierte
Parameterbergabe und -rckgabe erfordert eine Implementation aller
Dateitreiber in Assembler, zumindest fr die meisten Funktionen.

Der Aufbau des MX_DDEV- Dateitreibers hat sich seit Mag!X V2.10 gendert. Der
Beispieltreiber DEV_LPT1 darf unter Mag!X 3.00 nicht verwendet werden. Die
Konzepte sind jedoch identisch geblieben, nur ein paar Konstanten haben
sich gendert. Ein neuer Beispieltreiber ist noch nicht fertig.


1.1 Das Verzeichnis U:\
-----------------------

Auf dem Wurzelverzeichnis von U:\ knnen auer den bestehenden Dateien nur
symbolische Links (per Fsymlink()) erstellt werden. Keine Dcntl- Funktion
wird untersttzt.

Vor jedem Zugriff auf Laufwerk U: werden neu hinzugekommene Laufwerke per
symbolischem Link hinzugefgt bzw. nicht mehr existierende entfernt (wird
ber _drvbits erkannt).

Ein Symlink fr Laufwerk X: wird standardmig angemeldet unter dem Namen
"U:\X", zeigend auf "X:\". Ein Symlink kann selbstverstndlich umbenannt oder
gelscht werden. Auch ein umbenannter Symlink wird automatisch gelscht, wenn
ein Bit in _drvbits gelscht wird.

Weil die Laufwerkverzeichnisse nur symbolische Links sind, erhlt man bei
Fsfirst/next die Daten der eigentlichen Datei. D.h. da nach einem
Schreibzugriff auf das Wurzelverzeichnis von Laufwerk A: automatisch das
Dateidatum von U:\A verndert wird. Das ist aber nur ein Schmutzeffekt, der
auftritt, weil alle Schreibzugriffe per Dateidatum protokolliert werden, auch
die auf Unterverzeichnisse (diese werden jedoch nicht auf die Platte
geschrieben).

MiNT bindet die Laufwerke nicht als symbolische Links ein, daher kann man
folgende Befehlsfolge absetzen:

     Dsetdrv  U:
     Dsetpath U:\A
     Dgetpath => U:\A
     Dsetpath ..
     Dgetpath => U:\

Bei einem symbolischen Link wechselt man tatschlich den Pfad, d.h. in der
dritten Zeile erscheint A:\ als aktueller Pfad. Um dieses Problem zu umgehen,
gibt es eine Sonderbehandlung im Kernel, der die obige Befehlsfolge auch in
Mag!X ermglicht. Dabei gibt es nur ein Problem: Der Symlink darf nicht
umbenannt werden, sonst geschieht folgendes:

     Frename  U:\A U:\FLOPPY
     Dsetdrv  U:
     Dsetpath U:\FLOPPY
     Dgetpath => U:\A
     Dsetpath ..
     Dgetpath => U:\

Das sollte aber nicht weiter kritisch sein und ist bei Verwendung eines
Desktop egal, weil hier nur absolute Pfade verwendet werden.
In Zukunft ist geplant, vielleicht fr Laufwerke lngere Namen zuzulassen als
nur A: oder B:, dann knnte ein Laufwerk auch CDROM: heien und wird dann
automatisch als U:\CDROM eingebunden.

Weil alle Dateifunktionen auf U: genauso funktionieren wie auf einer
Diskette, ist es auch mglich, die Verzeichnisse U:\DEV usw. umzunenennen,
das sollte aber tunlichst vermieden werden, weil sonst die Anwenderprogramme
ihre Gertetreiber nicht mehr finden knnen.

Es gibt eine hinterhltige Mglichkeit, doch andere Dateien in U:\ anzulegen,
nmlich z.B. in U:\DEV ein Gert anzulegen und dieses per Frename() nach U:\
zu verschieben. Solche Tricks sollte man aber nur machen, wenn man wei, was
man tut.


1.2 Das Verzeichnis U:\DEV
--------------------------

Hier werden Gertetreiber (Devices) eingetragen, das sind Pseudodateien, die
Gerte reprsentieren, die nur dem DOS bekannt sind, nicht dem BIOS. Gerte
knnen nur mit Dcntl(DEV_M_INSTALL) erstellt werden. Gerte knnen mit
blichen Methoden umbenannt und gelscht werden. Im Gegensatz zu MiNT wird das
Lschen eines Gerts ber den Gertetreiber abgewickelt, der sich so aus
entsprechenden Systemvektoren zurckziehen und den Speicher freigeben kann
(wenn per Ptermres() installiert) bzw. sich beenden kann (wenn schlafen
gelegt).

ber Fcreate() knnen hier keine Dateien erzeugt werden. Wohl aber knnen
symbolische Links (sinnvollerweise auf Dateitreiber!!!) angelegt werden. So
kann man z.B. einen Link U:\DEV\COM1 anlegen, der auf U:\DEV\AUX zeigt.

Im Gegensatz zu MiNT steht die volle Funktionalitt des DOS- Dateisystems zur
Verfgung, d.h.:

- Es drfen keine Gerte gleichen Namens existieren.
- Schreibzugriffe werden mit nderung des Dateidatums berwacht.
- Schreibgeschtzte Gerte drfen nicht beschrieben, gelscht oder umbenannt
  werden.

Auf allen STs werden folgende Devices in u:\dev angelegt, bis auf CON sind
alle Gerte "raw", d.h. bercksichtigen kein ^C usw.

     NULL      leere Pseudodatei, liefert beim Schreiben immer OK und beim
               Lesen "kein Zeichen verfgbar" bzw. EOF.
               Fselect() arbeitet interruptgesteuert, d.h. der Interrupt fr
               die Lesebereitschaft tritt niemals ein.
     CON       "gekochte" Ausgabe auf den Bildschirm
               "gekochte" zeilenweise Eingabe von der Tastatur
               (mit Fread/writechar auch "raw" Modus)
     AUX       Ein-/Ausgabe von BIOS- Gert 2
     PRN       Ein-/Ausgabe von BIOS- Gert 0
               Bei der Ausgabe wird beim Timeout (Bconout->0) abgebrochen
     MODEM1    Ein-/Ausgabe von BIOS- Gert 6, ist i.a. die mit dem ST-MFP
               realisierte serielle Schnittstelle, auf dem Falcon der SCC,
               Kanal B
     MIDI      Ein-/Ausgabe von BIOS- Gert 3, beim Ausgabestatus Gert 4

  auf dem MegaSTE gibt es zustzlich folgende Gerte:

     MODEM2    BIOS- Gert 7  (i.a. SCC, Kanal B)
     SERIAL2   BIOS- Gert 8  (i.a. SCC, Kanal A)

  abweichend gibt es auf dem TT stattdessen folgende Gerte:

     MODEM2    BIOS- Gert 7  (i.a. SCC, Kanal B)
     SERIAL1   BIOS- Gert 8  (i.a. der TT-MFP)
     SERIAL2   BIOS- Gert 9  (i.a. SCC, Kanal A)

  abweichend gibt es auf dem Falcon stattdessen folgende Gerte:

     LAN       BIOS- Gert 7  (i.a. SCC, Kanal A)

  Die alten Gertenamen entsprechen folgenden Dateien:

     CON: bzw. Handle -1      => U:\DEV\CON
     AUX: bzw. Handle -2      => U:\DEV\AUX
     PRN: bzw. Handle -3      => U:\DEV\PRN
     NUL: bzw. Handle -4      => U:\DEV\NULL

Gibt man Dateinamen wie CON: an, wird dieser Dateiename bereits vom Kernel
umgewandelt in U:\DEV\CON, d.h. "CON:" ist eine Art Alias.

Dcntl() verwendet wegen des inkompatiblen Treiberformats nicht die
MiNT- Unterfunktion DEV_INSTALL (0xde02), sondern die neue Mag!X-
Unterfunktion DEV_M_INSTALL ($cd00). Treiber werden ber den Aufruf
Dcntl(DEV_M_INSTALL, fname, drvr) installiert. Der Treiberaufbau ist in
MGX_DFS.TXT beschrieben.


1.3 Das Verzeichnis U:\SHM
--------------------------

Hier werden Dateien per Fcreate() angelegt, Dcntl- Modi werden nicht
untersttzt. Erstellt werden spezielle Dateien, die "shared memory"
reprsentieren. Zur Zeit sind zwar fast alle Mechanismen vorhanden, das System
ist aber noch nie ausprobiert worden. Leider habe ich bis heute kein Programm
gefunden, das dieses Feature nutzt, daher ist dieses Unterverzeichnis zur Zeit
mehr oder weniger ohne Funktion.


1.4 Das Verzeichnis U:\PROC
---------------------------

Hier werden Prozenamen eingetragen und wieder entfernt. Proze- IDs werden
beim Programmstart (Exec- Modi 0,4,6,7) vergeben und beim Terminieren
freigegeben. Zur Zeit ist Umbenennen der Dateien mglich, sollte aber nicht
gemacht werden, ein Lschen zerstrt einen Proze und rumt ihn auf (ber den
AES- Programmanager).

Die Dateilnge gibt den Speicherverbrauch fr den Proze an. MiNT- konforme
Dateiattribute werden z.Zt. nicht untersttzt.

Der Prozename steht im Environment (Variable _PNAM seit Mag!X 1.0), die
Proze- ID in der Basepage.

Fcntl mit PBASEADDR wird untersttzt.

Dfree wird untersttzt und gibt die minimale tatschliche Blocklnge (als
"Sektoren pro Cluster" an. Z.Zt. wird der Speicher wortweise belegt, d.h. die
"Sektorgre" ist 1 Byte, Clustergre sind 2 Sektoren.


1.5 Das Verzeichnis U:\PIPE
---------------------------

Hier werden Pipes abgelegt. Es werden sowohl unidirektionale als auch
bidirektionale Pipes nach MiNT- Konventionen untersttzt.
Unidirektionale Pipes sind bisher nicht getestet worden.
Unidirektionale Pipes knnen auch ber Fpipe() erzeugt werden.
Die bidirektionalen Pipes werden mit allen Features untersttzt, die fr das
MultiTOS- konforme Drag&Drop- Protokoll bentigt werden.

Es sind bis zu 32 Pipes gleichzeitig mglich. Unidirektionale Pipes werden
untersttzt, jedoch wurde dieses Feature nie getestet.

Psignal wird nicht untersttzt, Pipes liefern grundstzlich EOF beim Lesen,
wenn sie leer sind oder kein schreibender Proze da ist. Pipes liefern EOF
beim Schreiben, wenn kein lesender Proze da ist. Der Zugriff erfolgt rein
asynchron, Applikationen warten auf Lesen/Schreiben und wecken ggf. beim
Lesen/Schrieben eine andere Applikation wieder auf. Fseek auf Pipes fhrt
grundstztlich zur Rckgabe von 0L (d.h. der Dateizeiger kann nicht
beeinflut werden).
Pipes werden automatisch nach dem Schlieen gelscht. Pipes erscheinen im
Verzeichnis mit der Lnge 2k bzw. 4k und dem korrekten Erstelldatum. Beim
ffnen einer Pipe kann es passieren ,da das Handle > 31 ist, dann ist
Fselect() nicht mglich.
