@(#)XHDI/xhdispec.txt
@(#)Julian F. Reschke, 9. Oktober 1994

Spezifikation des `XHDI'-Cookies, 9. Oktober 1994
-------------------------------------------------

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 (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 Abschnitt 7.2.14 in `draft
             proposed American National Standard for information systems -
             SMALL COMPUTER SYSTEM INTERFACE - 2 (SCSI-2) March 9, 1990').

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 am IDE-Interface des `ST-Book' oder 
`Falcon030' (oder Maschinen, bei denen ein derartiges Interface 
nachgerstet worden ist), 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-kompatiblen Befehlssatz
          8..15: Platten am SCSI-Bus
         16..17: Platten an der IDE-Schnittstelle
         18..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.


Die einzelnen Funktionen:

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

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

-----------------------------------------------------------------------
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.
              Leerzeichen). 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 
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: 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.
              Leerzeichen). 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. terminierender Null) eines BIOS-Gerts.

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

Return-Wert: 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. 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, 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 kein Treiber 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 interne Limits des laufenden DOS 
bzw. setzt sie. Sie kann zum Beispiel von einem FAT-Dateisystemtreiber 
benutzt werden, um den Harddisk-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.

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
XH_DL_MAXSEC (6): maximale Zahl von Sektoren
XH_DL_DRIVES (7): maximale Zahl der vom DOS untersttzen BIOS-Laufwerke


-----------------------------------------------------------------------
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 
Filesystemtreiber fr MiNT (siehe zum Beispiel das Minix-FS) erleichtern.

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

Empfohlene Partitiontypen
-------------------------

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.

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 Systen 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;
}

