@(#)XHDI/xhdispec.txt
@(#)Julian F. Reschke, 1999-05-02

Spezifikation des `XHDI'-Cookies, 1999-05-02
--------------------------------------------

Cookie-Kennung: "XHDI". Der Parameter zeigt auf die Adresse einer Routine, 
die massenspeicherbezogene Funktionen zur Verfgung stellt. Zur Absicherung 
steht vor der Routine die Long-Konstante $27011992.

Der Wert des Cookies kann sich im laufenden Betrieb ndern (wg. 
Zweitinstallation). Daher ggfs. (z. B. in Accessories) den Cookie jedesmal 
NEU abfragen!

ALLE FUNKTIONEN MUESSEN IM SUPERVISOR-MODUS AUFGERUFEN WERDEN. Das Verhalten 
fr Aufrufe im User-Modus ist undefiniert. Bis auf D0 werden keine 
Prozessorregister verndert. Undefinierte Opcodes fhren zur Fehlermeldung 
EINVFN.

Einige der Funktionsaufrufe -- insbesondere `XHReadWrite()' -- knnen zum 
Aufruf von BIOS- oder XBIOS-Routinen im Betriebssystem und damit zur 
Aktivierung des `Critical Error Handler' fhren. Im Zweifel mu der `CEH' 
also vom Aufrufer abgeschaltet werden.

Fr alle Funktionen seien folgende Return-Werte definiert:

TOS-Fehlernummern:

0:           OK (E_OK)
-1:          unspezifizierter Fehler (ERROR)
-2:          Gert nicht bereit (EDRVNR)
-15:         ungltige Device-/Targetnummer (EUNDEV)
-32:         falsche Funktionsnummer (EINVFN)
-36:         Gert ist zur Zeit `reserved' (EACCDN)
-46:         BIOS-Device wird vom Treiber nicht bedient (EDRIVE)

SCSI-Fehlernummern (Bereich von -200..-455)

(-200 - N):  SCSI-Errorcode N (der `Additional Sense Code' aus Byte 12 des
             `Extended Sense Format', siehe Anhang B in `draft proposed
             American National Standard for information systems -
             Revision 11a - SCSI-3 Primary Commands, 28 March 1997').

IDE-Fehlernummern (Bereich von -456..-711)

(-456 - N):  IDE-Errorcode N (Wert des IDE-Fehlerregisters).             

Hinweis: SCSI-Fehlercodes knnen logischerweise nur bei ACSI-/SCSI-Gerten 
auftreten. Fr Platten an IDE-Interfaces kann auch optional folgende 
Zuordnung benutzt werden:

Bit im IDE-
Fehlerregister  Bedeutung                  SCSI-Fehler  XHDI-Fehler

1               Track 0 not found          $06          -206
0               DAM not found              $13          -219
4               ID-Field not found         $12          -218
7               Bad block mark             $10          -216
6               Uncorrectable error        $11          -217
2               Command aborted            $20          -232
5               Media Change               $28          -240
3               Media Change requested     $5A          -290

(Es empfiehlt sich, die einzelnen Bits in der angegebenen Reihenfolge
zu testen).

Bei andersartigen Gerten, wie zum Beispiel Diskettenlaufwerken an der 
Floppy-Controller-Schnittstelle, knnen auch andere, hier noch nicht 
spezifizierte Error-Codes zurckgeliefert werden.

Fr die Parameterbergabe gilt die GEMDOS-bergabe-Konvention. Alle Parameter 
werden auf dem Stack abgelegt (zuletzt, also an der niedrigsten Adresse, der 
Opcode als 16-Bit-Wert). Das 32 Bit groe Ergebnis wird in D0 zurckgeliefert.

Immer dann, wenn dokumentiert ist, da der Aufrufer Nullzeiger bergeben 
darf, bedeutet die bergabe eines Nullzeigers, da der Aufrufer sich fr den 
zurckzuliefernden Wert nicht interessiert. Treibersoftware mu also solche 
Zeiger vor einer Dereferenzierung immer berprfen.

Folgende Datentypen seien vereinbart:

UWORD:  16 Bit, unsigned
LONG:   32 Bit, signed
ULONG:  32 Bit, unsigned
char *: 32 Bit, Zeiger auf eine nullterminierte Zeichenkette

Termini:

major:  Major Device Number

           0..7: Platten am ACSI-Bus mit Atari-kompatiblem Befehlssatz
          8..15: Platten am SCSI-Bus
         16..17: Platten an der primren IDE-Schnittstelle
         18..19: Platten an der sekundren IDE-Schnittstelle
         20..23: Weitere IDE-Platten
         24..63: Erweiterungen lt. PUN_INFO-Struktur (Feld: pun[])
             64: Gert am Floppycontroller
        65..255: weitere eigene Erweiterungen jenseits dem, was AHDI
                 abdeckt

minor:  Minor Device Number (fr `major' 0..15: LUN des ACSI- oder 
        SCSI-Gerts), maximal 255.

key:    Entweder ein 16-Bit-Schlssel, ermittelt von `XHReserve()', oder 0,
        wenn das Gert nicht reserviert wurde oder der Schlssel nicht
        bekannt ist.

Notation:

Numerische Werte sind, wenn nicht anders angegeben, dezimal dargestellt. 
Hexadezimale Angaben (Basis 16) sind durch ein Dollarzeichen (`$') markiert.


Die einzelnen Funktionen:

-----------------------------------------------------------------------
Opcode 0: UWORD XHGetVersion (void);

Liefert die Protokollversion zurck. Formatbeispiel: $0119 ist Version 1.19 
(identisch mit dem GEMDOS-Aufruf `Sversion()', nur sind die beiden Bytes 
NICHT verdreht). Diese Version der XHDI-Spezifikation hat die Versionsnummer 
$0130.

-----------------------------------------------------------------------
Opcode 1: LONG XHInqTarget (UWORD major, UWORD minor, ULONG *blocksize,
                            ULONG *device_flags, char *product_name);

Liefert Informationen ber das durch `major' und `minor' spezifizierte 
Gert (in `device_flags': ein Attributvektor, in `product_name': optional die 
Produktbezeichnung des Gerts). Mit `XHReserve()' vorgenommene Reservierungen 
werden dabei bercksichtigt.

block_size:   Blockgre auf dem Gert (fr `XHReadWrite()' sehr wichtig).
              Normalerweise 512.

device_flags: (Bit gesetzt -> Fhigkeit verfgbar):

      Bit 0:  Gert kann gestoppt werden (XH_TARGET_STOPPABLE)
      Bit 1:  Gert hat wechselbare Medien (XH_TARGET_REMOVABLE)
      Bit 2:  Auswurf des Gerts kann verriegelt werden (XH_TARGET_LOCKABLE)
      Bit 3:  Medium kann per Kommando ausgeworfen werden 
              (XH_TARGET_EJECTABLE)
      Bit 29: Auswurf des Gerts ist vom Treiber blockiert worden 
              (XH_TARGET_LOCKED, ab XHDI 1.25).
      Bit 30: Gert ist vom Treiber gestoppt worden (XH_TARGET_STOPPED, ab 
              XHDI 1.25).
      Bit 31: Gert ist zur Zeit blockiert (XH_TARGET_RESERVED).

              Alle weiteren Bits sind reserviert und sollten vom Treiber
              auf Null gesetzt werden.

product_name: Produktbezeichnung des Gerts (max. 33 Zeichen inkl. Nullbyte). 
              Falls die Information nicht verfgbar ist, wird eine 
              Zeichenkette der Lnge Null zurckgeliefert.

Anmerkung: fr `blocksize', `device_flags' und `product_name' drfen auch 
Nullzeiger bergeben werden.

Anmerkung: fr IDE-Gerte wird bei `product_name' gegebenenfalls auf 32 
Zeichen gekrzt. Siehe auch die neue Funktion `XHInqTarget2()'.

-----------------------------------------------------------------------
Opcode 2: LONG XHReserve (UWORD major, UWORD minor, UWORD do_reserve,
                          UWORD key);

Reserviert ein Gert bzw. gibt es wieder frei. Auf reservierte Gerte kann 
nur bei Angabe des korrekten Schlssels per `XHLock()', `XHStop()' oder 
`XHEject()' zugegriffen werden.

Sinn: man mchte nicht, da man eine Wechselplatte per CPX-Modul entriegeln 
kann, nachdem sie gerade von einer virtuellen Speicherverwaltung verriegelt 
worden ist. Dies sollte nur die Speicherverwaltung selbst machen knnen.

Beim Reservieren des Gerts wird im Erfolgsfall ein 16-Bit-Schlssel ungleich
0 zurckgeliefert. Dieser Schlssel mu bei allen weiteren Zugriffen auf das 
Gert angegeben sowie beim Wieder-Freigeben angegeben werden.

do_reserve: (1) Reservieren oder (0) wieder freigeben.
key:        (nur beim Freigeben benutzt).

-----------------------------------------------------------------------
Opcode 3: LONG XHLock (UWORD major, UWORD minor, UWORD do_lock,
                       UWORD key);

Verriegelt bzw. entriegelt den Auswurfknopf eines Gerts. Der Treiber hat 
sich darum zu kmmern, ob dieser Befehl an das Gert weitergeleitet wird oder 
nicht (falls das Medium nicht verriegelbar ist).

Welchen Code man im Fehlerfall zurckerhlt, ist undefiniert. Mehr 
Informationen werden allerdings auch nicht bentigt, da man ja mit 
`XHInqTarget()' vorher gezielt auf diese Fhigkeit abtesten kann.

do_lock: (1) Verriegeln oder (0) Entriegeln.
key:     Falls Gert reserviert, sonst Null bergeben.

-----------------------------------------------------------------------
Opcode 4: LONG XHStop (UWORD major, UWORD minor, UWORD do_stop,
                       UWORD key);

Gert wird gestoppt (geparkt) bzw. gestartet (entparkt).

Welchen Code man im Fehlerfall zurckerhlt, ist undefiniert. Mehr 
Informationen werden allerdings auch nicht bentigt, da man ja mit 
`XHInqTarget()' vorher gezielt auf diese Fhigkeit abtesten kann.

do_stop: (1) Stoppen oder (0) Starten.
key:     Falls Gert reserviert, sonst Null bergeben.

Anmerkung: Bei etwaigen Zugriffen auf das gestoppte Gert sollte der Treiber 
selbst fr das Wiederhochfahren sorgen.


-----------------------------------------------------------------------
Opcode 5: LONG XHEject (UWORD major, UWORD minor, UWORD do_eject,
                        UWORD key);

Medium wird ausgeworfen oder eingezogen.

Welchen Code man im Fehlerfall zurckerhlt, ist undefiniert. Mehr 
Informationen werden allerdings auch nicht bentigt, da man ja mit 
`XHInqTarget()' vorher gezielt auf diese Fhigkeit abtesten kann.

do_eject: Medium auswerfen (1) oder einziehen (0).
key:      Falls Gert reserviert, sonst Null bergeben.

-----------------------------------------------------------------------
Opcode 6: ULONG XHDrvMap (void);

Liefert einen Bitvektor mit den ber das XHDI-Protokoll untersttzten 
BIOS-Gertenummern (wie etwa bei `Drvmap()').

-----------------------------------------------------------------------
Opcode 7: LONG XHInqDev (UWORD bios_device, UWORD *major, UWORD *minor,
                         ULONG *start_sector, BPB *bpb);

Liefert Major Device Number, Minor Device Number, Startsektor und BPB eines 
BIOS-Gerts (im Gegensatz zu `Getbpb()' wird dadurch der Media-Change-Status 
des Gerts NICHT zurckgesetzt).

Anmerkung: es wird ein Zeiger auf eine vom Aufrufer bereitgestellte BPB-
Struktur bergeben, die vom XHDI-Treiber gefllt wird.

Return-Wert: E_OK, EDRVNR (Gert kann zur Zeit nicht angesprochen werden, zum 
Beispiel Medium nicht eingelegt), EDRIVE (falsche Gertenummer) oder eine 
andere Fehlernummer. Bei EDRVNR darf man sich darauf verlassen, da `major' 
und `minor' korrekt zurckgeliefert werden.

Ein `start_sector' mit Wert $FFFFFFFF soll auf eine Partition hinweisen, die 
zur Zeit vom Treiber nicht bedient wird (zum Beispiel, wenn ein Wechselmedium 
mit `zu wenig' Partitionen eingelegt ist).

Der zurckgelieferte BPB ist ungltig, wenn das Element `recsiz' Null ist.

Hinweis: ein Dateisystem ist durch major- und minor-Gertenummer, sowie 
Startsektor (mit der obigen Einschrnkung) exakt spezifiziert. ber die Art 
des Dateisystems (FAT oder etwas anderes) ist damit nichts ausgesagt!

Anmerkung: fr `major', `minor', `start_sector' und `bpb' drfen auch 
Nullzeiger bergeben werden.

-----------------------------------------------------------------------
Opcode 8: LONG XHInqDriver (UWORD bios_device, char *name, char *version,
                            char *company, UWORD *ahdi_version,
                            UWORD *maxIPL);

Liefert Informationen ber den Treiber, der das angegebene Gert bedient.

name:         Zeiger auf Zeichenkette mit Treibernamen (max. 17 Zeichen).
version:      Zeiger auf Zeichenkette mit Versionsnummer (max. 7 Zeichen).
company:      Zeiger auf Zeichenkette mit Namen des Herstellers (max. 17
              Zeichen).
ahdi_version: AHDI-Versionslevel (wie PUN_INFO-Struktur).
maxIPL:       Hchster IPL, unter dem der Treiber fr das angegebene Gert
              arbeitsfhig ist (Normalwert fr Treiber, die ihr Timing per
              _hz_200 erledigen: 5).

Anmerkung: fr `name', `version', `company', `ahdi_version' und `maxIPL' 
drfen auch Nullzeiger bergeben werden.

-----------------------------------------------------------------------
Opcode 9: LONG XHNewCookie (ULONG newcookie);

- OPTIONALE Funktion, darf also mit EINVFN beantwortet werden -

Installiert einen zustzlichen XHDI-Handler (Vorteil: der XHDI-Cookie zeigt 
nach wie vor auf die gleiche Adresse). Wer diese Funktion untersttzt mu 
also folgendes tun:

1. Falls dies der erste Aufruf dieser Art ist: anschlieend so vorgehen, als 
   htte der XHDI-Cookie bei der Installation bereits auf `newcookie'
   gezeigt.

2. Falls nicht: Funktion an `nchsten' Handler weiterleiten.

Wer eine Mehrfachinstallation vornehmen mchte, sollte so vorgehen:

1. Testen, ob `XHNewCookie()' zum Erfolg fhrt.

2. Anderenfalls den Cookie `per Hand' versetzen.

------------------------------------------------------------------------
Opcode 10: LONG XHReadWrite (UWORD major, UWORD minor, UWORD rwflag,
                             ULONG recno, UWORD count, void *buf);

quivalent zur BIOS-Funktion `Rwabs()' zum Lesen bzw. Schreiben 
physikalischer Blocknummern.

rwflag:       Bits 0..2: wie in den AHDI-Release-Notes (3.00, 18. April 1990) 
              beschrieben. Bit 3 (physikalischer Modus) wird ignoriert. Alle 
              weiteren Bits sind reserviert und auf Null zu setzen.
recno:        Sektornummer
count:        Anzahl der Blcke
buf:          Zeiger auf Puffer.

-----------------------------------------------------------------------
Opcode 11: LONG XHInqTarget2 (UWORD major, UWORD minor, ULONG *blocksize,
                              ULONG *device_flags, char *product_name,
                              UWORD stringlen);

- AB XHDI-Version 1.01 -

Liefert Informationen ber das durch `major' und `minor' spezifizierte 
Gert (in `device_flags': ein Attributvektor, in `product_name': optional die 
Produktbezeichnung des Gerts). Mit `XHReserve()' vorgenommene Reservierungen 
werden dabei bercksichtigt.

block_size:   Blockgre auf dem Gert (fr `XHReadWrite()' sehr wichtig).
              Normalerweise 512.

device_flags: (Bit gesetzt -> Fhigkeit verfgbar):

      Bit 0:  Gert kann gestoppt werden (XH_TARGET_STOPPABLE)
      Bit 1:  Gert hat wechselbare Medien (XH_TARGET_REMOVABLE)
      Bit 2:  Auswurf des Gerts kann verriegelt werden (XH_TARGET_LOCKABLE)
      Bit 3:  Medium kann per Kommando ausgeworfen werden 
              (XH_TARGET_EJECTABLE)
      Bit 29: Auswurf des Gerts ist vom Treiber blockiert worden 
              (XH_TARGET_LOCKED, ab XHDI 1.25)
      Bit 30: Gert ist vom Treiber gestoppt worden (XH_TARGET_STOPPED, 
              ab XHDI 1.25)
      Bit 31: Gerte ist zur Zeit blockiert (XH_TARGET_RESERVED)

              Alle weiteren Bits sind reserviert und sollten vom Treiber
              auf Null gesetzt werden.

product_name: Produktbezeichnung des Gerts (max. `stringlen' Zeichen inkl.
              Nullbyte). Falls die Information nicht verfgbar ist, wird
              eine Zeichenkette der Lnge Null zurckgeliefert.

stringlen:    Lnge der fr `product_name' bergebenen Zeichenkette.

Anmerkung: fr `blocksize', `device_flags' und `product_name' drfen auch 
Nullzeiger bergeben werden. Produktbezeichnungen von IDE-Gerten knnen bis 
zu 40 Zeichen lang sein.

-----------------------------------------------------------------------
Opcode 12: LONG XHInqDev2 (UWORD bios_device, UWORD *major, UWORD *minor,
                           ULONG *start_sector, BPB *bpb, ULONG *blocks,
                           char *partid);

- AB XHDI-Version 1.10 -

Liefert Major Device Number, Minor Device Number, Startsektor, BPB (im 
Gegensatz zu `Getbpb()' wird dadurch der Media-Change-Status des Gerts NICHT 
zurckgesetzt), Lnge und Partitionkennung (maximal drei Zeichen zzgl. 
terminierendem Nullbyte) eines BIOS-Gerts.

Anmerkung: es wird ein Zeiger auf eine vom Aufrufer bereitgestelle 
BPB-Struktur bergeben, die vom XHDI-Treiber gefllt wird.

Return-Wert: E_OK, EDRVNR (Gert kann zur Zeit nicht angesprochen werden, zum 
Beispiel Medium nicht eingelegt), EDRIVE (falsche Gertenummer) oder eine 
andere Fehlernummer. Bei EDRVNR darf man sich darauf verlassen, da `major' 
und `minor' korrekt zurckgeliefert werden.

Ein `start_sector' mit Wert $FFFFFFFF soll auf eine Partition hinweisen, die 
zur Zeit vom Treiber nicht bedient wird (zum Beispiel, wenn ein Wechselmedium 
mit `zu wenig' Partitionen eingelegt ist).

Der zurckgelieferte BPB ist ungltig, wenn das Element `recsiz' Null ist.

Wenn die Partitionkennung nicht verfgbar ist (keine Atari-Partitionierung 
oder berhaupt keine Partitionierung, beispielsweise bei normal formatierten 
Disketten in SCSI-Diskettenlaufwerken), wird als Partitionkennung eine leere 
Zeichenkette zurckgegeben.

Bei MSDOS-kompatibel partitionierten Medien wird ab XHDI-Version 1.20 die 
ein Byte lange Partitionkennung wie folgt in `partid' abgelegt: partid[0] 
= '\0' (Nullbyte), partid[1] = 'D' (fr DOS), partid[2] = Kennung.

Hinweis: ein Dateisystem ist durch major- und minor-Gertenummer, sowie 
Startsektor (mit der obigen Einschrnkung) exakt spezifiziert. ber die Art 
des Dateisystems (FAT oder etwas anderes) ist damit nichts ausgesagt!

Anmerkung: fr `major', `minor', `start_sector', `bpb', `blocks' und `partid' 
drfen auch Nullzeiger bergeben werden.


-----------------------------------------------------------------------
Opcode 13: LONG XHDriverSpecial (ULONG key1, ULONG key2,
                                 UWORD subopcode, void *data);

- OPTIONALE Funktion, darf also mit EINVFN beantwortet werden -

Dieser Opcode kann fr treiberspezifische Erweiterungen benutzt werden. Auf 
welche Art und Weise die Daten in `subopcode' und `data' interpretiert 
werden, hngt ausschlielich vom betroffenen Treiber ab. `key1' und `key2' 
dienen zur Identifikation des anzusprechenden Treibers: `key1' sollte dabei 
aus vier druckbaren ASCII-Zeichen bestehen, `key2' aus einem mglichst 
willkrlich gewhlten Long-Wert (etwa dem Datum der Definition im BCD-Format).


-----------------------------------------------------------------------
Opcode 14: LONG XHGetCapacity (UWORD major, UWORD minor, ULONG *blocks,
                               ULONG *blocksize);

- OPTIONALE Funktion, darf also mit EINVFN beantwortet werden -

Diese Funktion liefert in `blocks' die Anzahl der adressierbaren Sektoren auf 
dem Medium und in `blocksize' ihre Gre zurck (Vorsicht: je nach 
verwendeter Hardware kann die Ausfhrung dieser Funktion mehrere Sekunden 
dauern!).


-----------------------------------------------------------------------
Opcode 15: LONG XHMediumChanged (UWORD major, UWORD minor);

- OPTIONALE Funktion, darf also mit EINVFN beantwortet werden -

Informiert den Treiber darber, da das Medium in dem angegebenen Gert 
gewechselt worden ist. Der Treiber sollte daraufhin so vorgehen, als habe 
das Gert selbst einen Medienwechsel gemeldet. E_OK wird nur dann 
zurckgeliefert, wenn die Information richtig verarbeitet wurde (also alle 
logischen Laufwerke auf dem Gert entweder deaktiviert sind oder benutzt 
werden knnen).

-----------------------------------------------------------------------
Opcode 16: LONG XHMiNTInfo (UWORD opcode, void *data);

- OPTIONALE Funktion, darf also mit EINVFN beantwortet werden -

Eine Funktion zum Setzen bzw. zur Abfrage MiNT-spezifischer Informationen.

Folgende Opcodes sind definiert (unbekannte Opcodes werden mit EINVFN 
quittiert, E_OK wird genau dann zurckgeliefert, wenn die verlangte Funktion 
korrekt ausgefhrt werden konnte):

XH_MI_SETKERINFO (0) [struct kerinfo *data]

bermittelt in `data' dem Treiber einen Zeiger auf die MiNT-Kernel- 
Info-Struktur. Der Treiber kann diese benutzen, um beispielsweise direkt 
Kernelfunktionen aufzurufen.

XH_MI_GETKERINFO (1) [struct kerinfo **data]

Erfragt beim Treiber die eventuell schon bekannte Adresse der MiNT-Kernel- 
Info-Struktur. Der Zeiger auf die Struktur wird in die in `data' angegebene 
Adresse geschrieben (wenn keine Kernel-Info-Struktur bekannt ist, wird ein 
Nullzeiger zurckgeliefert).


-----------------------------------------------------------------------
Opcode 17: LONG XHDOSLimits (UWORD which, ULONG limit);

- OPTIONALE Funktion, darf also mit EINVFN beantwortet werden -

Diese Funktion erfragt beim Treiber die internen Limits des laufenden DOS 
bzw. setzt sie. Sie kann zum Beispiel von einem FAT-Dateisystemtreiber 
benutzt werden, um dem Treiber mitzuteilen, da sich einige Limits gendert 
haben. `which' gibt an, welches Limit erfragt wird, `limit' gibt den neuen 
Wert an (Null steht fr: nicht ndern). Ergebnis ist der bisherige Wert fr 
das Limit.

Ab XHDI-Version 1.30 mu ein XHDI-Treiber bei seiner Initialisierung 
versuchen, die Limits von einem vorhandenen Treiber zu bernehmen. Wird 
whrend des Betriebs ein Limit gesetzt, dann mu der Aufruf anschlieend an 
andere Treiber weitergereicht werden.

Konstanten fr `which':

XH_DL_SECSIZ (0):    maximale Sektorgre auf BIOS-Ebene
XH_DL_MINFAT (1):    minimale Anzahl von FATs
XH_DL_MAXFAT (2):    maximale Anzahl von FATs
XH_DL_MINSPC (3):    Sektoren/Cluster minimal
XH_DL_MAXSPC (4):    Sektoren/Cluster maximal
XH_DL_CLUSTS (5):    maximale Clusterzahl einer 16-Bit-FAT
XH_DL_MAXSEC (6):    maximale Zahl von Sektoren
XH_DL_DRIVES (7):    maximale Zahl der vom DOS untersttzten BIOS-Laufwerke
XH_DL_CLSIZB (8):    maximale Clustergre

- AB XHDI-Version 1.30 -

XH_DL_RDLEN (9):     max. (bpb->rdlen * bpb->recsiz / 32)
XH_DL_CLUSTS12 (12): maximale Clusterzahl einer 12-Bit-FAT
XH_DL_CLUSTS32 (13): maximale Clusterzahl einer 32-Bit-FAT
XH_DL_BFLAGS (14):   untersttzte Bits in bpb->bflags

-----------------------------------------------------------------------
Opcode 18: LONG XHLastAccess (UWORD major, UWORD minor, ULONG *ms);

- AB XHDI-Version 1.25 -

Liefert in `ms' zurck, wieviele Millisekunden seit dem letzten erfolgreichen 
Lese- oder Schreibzugriff auf das Gert vergangen sind.


-----------------------------------------------------------------------
Opcode 19: LONG XHReaccess (UWORD major, UWORD minor);

- AB XHDI-Version 1.25 -

Ein Aufruf dieser Funktion veranlat den Treiber, das angegebene Gert auf 
einen Mediachange zu berprfen und gegebenenfalls die Partitioninformationen 
entsprechend zu aktualisieren (wie `XHMediumChanged()', nur da der Treiber 
selbst das Gert befragt, ob ein Medienwechsel stattgefunden hat).

-------------------------------------------------------------------------


Installation mehrerer Programme im XHDI-Cookie
----------------------------------------------

(1) Bei der Installation feststellen, ob der Cookie schon gesetzt ist.
    Falls ja, mssen folgende zustzliche Aufrufkonventionen bercksichtigt 
    werden:
    
(2) Bei `XHGetVersion()' zunchst durch den alten Vektor springen und dann
    das Minimun der dort erhaltenen und der eigenen Versionsnummer
    zurckliefern.
    
(3) Bei `XHDrvmap()' zunchst den alten Vektor durchspringen und
    anschlieend die eigenen Drive-Bits hineinodern.
    
(4) Bei den anderen Funktionen: wenn es das eigene Gert ist, normal
    verfahren. Ansonsten: keinen Fehler melden, sondern durch den alten
    Vektor springen.

-------------------------------------------------------------------------

Partitiontyp `RAW'
------------------

XHDI-1.10-kompatible Treiber mssen zustzlich zu `GEM' und `BGM' den 
dritten Partitiontyp `RAW' untersttzen. Fr Partitionen dieses Typs mssen 
folgende Eigenschaften untersttzt werden:

(1) Die Partitionlnge ist `beliebig' (im Rahmen der 32-Bit-Sektornummern).

(2) Die Partition ist als BIOS-Gert ansprechbar; Getbpb() liefert einen
    Nullzeiger (damit GEMDOS keinen Zugriff versucht, zustzlich wird
    auch der Media-Change-Status fr das BIOS-Gert zurckgesetzt). 

(3) Es kann per `Rwabs()' (nicht nur im physikalischen Modus) und
    `XHReadWrite()' auf die Partition zugegriffen werden. Dabei wird
    die physikalische Blockgre des Mediums benutzt (siehe
    `XHInqTarget()').

(4) `XHInqDev2()' liefert im Gegensatz zu `XHInqDev()' auch die Lnge und
    den Typ der Partition zurck.

Diese Erweiterungen sollen die Programmierung zuverlssiger 
Dateisystemtreiber fr MiNT bzw. MagiC (siehe zum Beispiel das Minix-FS) 
erleichtern.

-------------------------------------------------------------------------

Empfohlene Partitionstypen
--------------------------

BGM     GEMDOS-Partition > 16 MB
GEM     GEMDOS-Partition < 16 MB
RAW     siehe oben

Folgende Typen knnen optional untersttzt (zum Beispiel anhand einer 
konfigurierbaren Liste von Kennungen) werden.

F32     TOS-kompatible FAT32-Partition
LNX     Linux-Ext2-Partition, sollte ggfs. wie `RAW' behandelt werden
MAC     Mac-HFS-Partition, sollte ggfs. wie `RAW' behandelt werden
MIX     Minix-Partition, sollte ggfs. wie `RAW' behandelt werden
QWA     QDOS-Partition, sollte ggfs. wie `RAW' behandelt werden
SWP     Swap-Partition, sollte ggfs. wie `RAW' behandelt werden
UNX     ASV (Atari System V R4), sollte ggfs. wie `RAW' behandelt werden

-------------------------------------------------------------------------

Arbitration
-----------

Fr Gertetreiber, die den SCSI-Bus arbitrierend betreiben wollen, mu fr 
den Rechner eine eigene Gertekennung vergeben werden. Diese sollte 
natrlich einheitlich und nicht auf der Festplatte gespeichert sein. Atari 
hat dafr Byte 16 im NVM des Atari TT und Falcon reserviert. Die 
Bitbelegung ist:

Bit 0..2:   Gertenummer
Bit 7:      Arbitration an (1) oder aus (0)

Die Abfrage der Gertenummer knnte zum Beispiel wie folgt geschehen:

int
arbitration_id (void)
{
    long ret = EINVFN;
    unsigned char nvmdata = 0;
    OSHEADER *Sys;
    long oldstack = Super (0L);
    Sys = *_sysbase;
    Super ((void *)oldstack);

    host_id = -1;   /* no arbitration by default */

    if (Sys->os_version >= 0x300)
        ret = NVMaccess (0, 16, (int) sizeof (nvmdata), &nvmdata);

    if (ret == E_OK && (nvmdata & 0x80))
        host_id = nvmdata & 7;

    return host_id;
}
