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 entweder

- eine Implementation aller Dateitreiber in Assembler, zumindest fr
  die meisten Funktionen, oder
- Assembler-Routinen zur Umsetzung der Parameter in 'C'-Konvention.


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. Es ist mir leider kein Programm bekannt, welches
dieses Feature nutzt.


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. Nheres siehe PIPES.TXT.
