@(#)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 ver„ndert. Undefinierte Opcodes fhren zur Fehlermeldung EINVFN. Einige der Funktionsaufrufe -- insbesondere `XHReadWrite()' -- k”nnen 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: Ger„t nicht bereit (EDRVNR) -15: ungltige Device/Targetnummer (EUNDEV) -32: falsche Funktionsnummer (EINVFN) -36: Ger„t 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 k”nnen logischerweise nur bei ACSI-/SCSI- Ger„ten 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 Ger„ten, wie zum Beispiel Diskettenlaufwerken an der Floppy-Controller-Schnittstelle, k”nnen 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 grože 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: Ger„t 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-Ger„ts), maximal 255. key: Entweder ein 16-Bit-Schlssel, ermittelt von `XHReserve()', oder 0, wenn das Ger„t 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 Ger„t (in `device_flags': ein Attributvektor, in `product_name': optional die Produktbezeichnung des Ger„ts). Mit `XHReserve ()' vorgenommene Reservierungen werden dabei bercksichtigt. block_size: Blockgr”že auf dem Ger„t (fr `XHReadWrite()' sehr wichtig). Normalerweise 512. device_flags: (Bit gesetzt -> F„higkeit verfgbar): Bit 0: Ger„t kann gestoppt werden (XH_TARGET_STOPPABLE) Bit 1: Ger„t hat wechselbare Medien (XH_TARGET_REMOVABLE) Bit 2: Auswurf des Ger„ts kann verriegelt werden (XH_TARGET_LOCKABLE) Bit 3: Medium kann per Kommando ausgeworfen werden (XH_TARGET_EJECTABLE) Bit 29: Auswurf des Ger„ts ist vom Treiber blockiert worden (XH_TARGET_LOCKED, ab XHDI 1.25). Bit 30: Ger„t ist vom Treiber gestoppt worden (XH_TARGET_STOPPED, ab XHDI 1.25). Bit 31: Ger„t ist zur Zeit blockiert (XH_TARGET_RESERVED). Alle weiteren Bits sind reserviert und sollten vom Treiber auf Null gesetzt werden. product_name: Produktbezeichnung des Ger„ts (max. 33 Zeichen inkl. Leerzeichen). Falls die Information nicht verfgbar ist, wird eine Zeichenkette der L„nge Null zurckgeliefert. Anmerkung: fr `blocksize', `device_flags' und `product_name' drfen auch Nullzeiger bergeben werden. Anmerkung: fr IDE-Ger„te 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 Ger„t bzw. gibt es wieder frei. Auf reservierte Ger„te kann nur bei Angabe des korrekten Schlssels per `XHLock()', `XHStop()' oder `XHEject()' zugegriffen werden. Sinn: man m”chte 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 k”nnen. Beim Reservieren des Ger„ts wird im Erfolgsfall ein 16-Bit-Schlssel zurckgeliefert. Dieser Schlssel muž bei allen weiteren Zugriffen auf das Ger„t 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 Ger„ts. Der Treiber hat sich darum zu kmmern, ob dieser Befehl an das Ger„t weitergeleitet wird oder nicht (falls das Medium nicht verriegelbar ist). Welchen Code man im Fehlerfall zurckerh„lt, ist undefiniert. Mehr Informationen werden allerdings auch nicht ben”tigt, da man ja mit `XHInqTarget()' vorher gezielt auf diese F„higkeit abtesten kann. do_lock: (1) Verriegeln oder (0) Entriegeln. key: Falls Ger„t reserviert, sonst Null bergeben. ----------------------------------------------------------------------- Opcode 4: LONG XHStop (UWORD major, UWORD minor, UWORD do_stop, UWORD key); Ger„t wird gestoppt (geparkt) bzw. gestartet (entparkt). Welchen Code man im Fehlerfall zurckerh„lt, ist undefiniert. Mehr Informationen werden allerdings auch nicht ben”tigt, da man ja mit `XHInqTarget()' vorher gezielt auf diese F„higkeit abtesten kann. do_stop: (1) Stoppen oder (0) Starten. key: Falls Ger„t reserviert, sonst Null bergeben. Anmerkung: Bei etwaigen Zugriffen auf das gestoppte Ger„t 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 zurckerh„lt, ist undefiniert. Mehr Informationen werden allerdings auch nicht ben”tigt, da man ja mit `XHInqTarget()' vorher gezielt auf diese F„higkeit abtesten kann. do_eject: Medium auswerfen (1) oder einziehen (0). key: Falls Ger„t reserviert, sonst Null bergeben. ----------------------------------------------------------------------- Opcode 6: ULONG XHDrvMap (void); Liefert einen Bitvektor mit den ber das XHDI-Protokoll untersttzten BIOS-Ger„tenummern (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-Ger„ts (im Gegensatz zu `Getbpb()' wird dadurch der Media- Change-Status des Ger„ts 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 (Ger„t kann zur Zeit nicht angesprochen werden, zum Beispiel Medium nicht eingelegt), EDRIVE (falsche Ger„tenummer) 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-Ger„tenummer sowie Startsektor (mit der obigen Einschr„nkung) 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 Ger„t 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: H”chster IPL, unter dem der Treiber fr das angegebene Ger„t arbeitsf„hig 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 zus„tzlichen 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: anschliežend so vorgehen, als h„tte der XHDI-Cookie bei der Installation bereits auf `newcookie' gezeigt. 2. Falls nicht: Funktion an 'n„chsten' Handler weiterleiten. Wer eine Mehrfachinstallation vornehmen m”chte, 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 Bl”cke 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 Ger„t (in `device_flags': ein Attributvektor, in `product_name': optional die Produktbezeichnung des Ger„ts). Mit `XHReserve ()' vorgenommene Reservierungen werden dabei bercksichtigt. block_size: Blockgr”že auf dem Ger„t (fr `XHReadWrite()' sehr wichtig). Normalerweise 512. device_flags: (Bit gesetzt -> F„higkeit verfgbar): Bit 0: Ger„t kann gestoppt werden (XH_TARGET_STOPPABLE) Bit 1: Ger„t hat wechselbare Medien (XH_TARGET_REMOVABLE) Bit 2: Auswurf des Ger„ts kann verriegelt werden (XH_TARGET_LOCKABLE) Bit 3: Medium kann per Kommando ausgeworfen werden (XH_TARGET_EJECTABLE) Bit 29: Auswurf des Ger„ts ist vom Treiber blockiert worden (XH_TARGET_LOCKED, ab XHDI 1.25) Bit 30: Ger„t ist vom Treiber gestoppt worden (XH_TARGET_STOPPED, ab XHDI 1.25) Bit 31: Ger„te ist zur Zeit blockiert (XH_TARGET_RESERVED) Alle weiteren Bits sind reserviert und sollten vom Treiber auf Null gesetzt werden. product_name: Produktbezeichnung des Ger„ts (max. `stringlen' Zeichen inkl. Leerzeichen). Falls die Information nicht verfgbar ist, wird eine Zeichenkette der L„nge Null zurckgeliefert. stringlen: L„nge der fr `product_name' bergebenen Zeichenkette. Anmerkung: fr `blocksize', `device_flags' und `product_name' drfen auch Nullzeiger bergeben werden. Produktbezeichnungen von IDE-Ger„ten k”nnen 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 Ger„ts NICHT zurckgesetzt), L„nge und Partitionkennung (maximal drei Zeichen zzgl. terminierender Null) eines BIOS-Ger„ts. Anmerkung: es wird ein Zeiger auf eine vom Aufrufer bereitgestelle BPB-Struktur bergeben, die vom XHDI-Treiber gefllt wird. Return-Wert: OK, EDRVNR (Ger„t kann zur Zeit nicht angesprochen werden, zum Beispiel Medium nicht eingelegt), EDRIVE (falsche Ger„tenummer) 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-Ger„tenummer sowie Startsektor (mit der obigen Einschr„nkung) 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, h„ngt ausschliežlich 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 m”glichst willkrlich gew„hlten 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 Gr”že 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 Ger„t gewechselt worden ist. Der Treiber sollte daraufhin so vorgehen, als habe das Ger„t selbst einen Medienwechsel gemeldet. OK wird nur dann zurckgeliefert, wenn die Information richtig verarbeitet wurde (also alle logischen Laufwerke auf dem Ger„t entweder deaktiviert sind oder benutzt werden k”nnen). ----------------------------------------------------------------------- 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 ge„ndert 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 Sektorgr”že 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 Ger„t vergangen sind. ----------------------------------------------------------------------- Opcode 19: LONG XHReaccess (UWORD major, UWORD minor); - AB XHDI-Version 1.25 - Ein Aufruf dieser Funktion veranlažt den Treiber, das angegebene Ger„t auf einen Mediachange zu berprfen und gegebenenfalls die Partitioninformationen entsprechend zu aktualisieren (wie `XHMediumChanged()', nur daž der Treiber selbst das Ger„t 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 zus„tzliche Aufrufkonventionen bercksichtigt werden: (2) Bei `XHGetVersion()' zun„chst durch den alten Vektor springen und dann das Minimun der dort erhaltenen und der eigenen Versionsnummer zurckliefern. (3) Bei `XHDrvmap()' zun„chst den alten Vektor durchspringen und anschliežend die eigenen Drive-Bits hineinodern. (4) Bei den anderen Funktionen: wenn es das eigene Ger„t ist, normal verfahren. Ansonsten: keinen Fehler melden, sondern durch den alten Vektor springen. ------------------------------------------------------------------------- Partitiontyp `RAW' ------------------ XHDI-1.10-kompatible Treiber mssen zus„tzlich zu `GEM' und `BGM' den dritten Partitiontyp `RAW' untersttzen. Fr Partitionen dieses Typs mssen folgende Eigenschaften untersttzt werden: (1) Die Partitionl„nge ist `beliebig' (im Rahmen der 32-Bit-Sektornummern). (2) Die Partition ist als BIOS-Ger„t ansprechbar; Getbpb() liefert einen Nullzeiger (damit GEMDOS keinen Zugriff versucht, zus„tzlich wird auch der Media-Change-Status fr das BIOS-Ger„t zurckgesetzt). (3) Es kann per `Rwabs()' (nicht nur im physikalischen Modus) und `XHReadWrite()' auf die Partition zugegriffen werden. Dabei wird die physikalische Blockgr”že des Mediums benutzt (siehe `XHInqTarget()'). (4) `XHInqDev2()' liefert im Gegensatz zu `XHInqDev()' auch die L„nge und den Typ der Partition zurck. Diese Erweiterungen sollen die Programmierung zuverl„ssiger 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 k”nnen 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 Ger„tetreiber, die den SCSI-Bus arbitrierend betreiben wollen, muž fr den Rechner eine eigene Ger„tekennung 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: Ger„tenummer Bit 7: Arbitration an (1) oder aus (0) Die Abfrage der Ger„tenummer k”nnte 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; }