`Loaderp &<C@E$g: <1AY&B&f"8*A$ $<!*!&2Q!adNu"x." "4V"GBIZ2۷mG"&AB@4<[Q4/</<?BK*U,M/ ?<NNJ@k:`IG:ܹm*N2<0<4]Q:/</<?B/?< NNJ@kD f0B?<"NNTм/# /<NN 8LNOP LOOKING THROUGH THIS BOOT SECTOR YOU LAME GIT`O  @o! #@%`')+-1 3@5`79;=?A C@E`GKMOQ S@U`WY[]_/c@e`O  @o! #@%`')+-1 3@5`79;=?A C@E`GKMOQ S@U`WY[]_/c@e`XHDI-125 `. `.. INTRO ENG WB! INTRO TXT WBD LIESMICH VP nREADME PP XHDI C &x XHDI H VB XHDISPECENG IUXHDISPECTXT I/dDF TTP mHI1^DF MAN Pa@(#)XHDI/intro.eng @(#)Julian F. Reschke, 2. Oktober 1994 The purpose of the XHDI (`eXtended HardDisk Interface') specification is to enhance the communication with drivers for block oriented mass storage media. We started with the thought to create a uniform interface for some additional driver features. One goal was to create a standard method for virtual memory systems to lock the eject button of Syquest harddisk drives (you don't want the user to remove the cartridge with the swap partition). After further discussion, it was clear that the information available via the PUN_INFO structure just wasn't enough and that the missing information should be available with the help of this XHDI specification. Reasons: - the PUN_INFO structure only has room for 16 devices, but BIOS (and some GEMDOS replacements) allow 32 devices - it is impossible to install more than one AHDI compatible harddisk driver in the system (there is only one PUN_INFO structure). - Atari's definition of device numbers only works for drives with Logical Unit Number 0. For these reasons, the purpose of the XHDI specification (version 1.25) is: - to provide more information about the installed devices - to support new driver features like Stop/Start or Lock/Unlock. The XHDI specification doesn't define new driver features -- it should be easy to retrofit it into existing drivers. For questions and suggestions, ask: Julian F. Reschke Hensenstrasse 142 D-48161 Muenster email: jr@ms.maus.de People involved in this specification ([eMail address], (product name/company)) Stefan Baucke [Stephan_Baucke@ac.maus.de] Michael Bernards [Michael_Bernards@k2.maus.de] (Rufus, Creativ/Color Concept) Claus Brod [Claus_Brod@bb.maus.de] (Scheibenkleister, Maxon) Stefan Eissing [Stefan_Eissing@st.maus.de] (Gemini) Alexander Herzlinger [herzling@rhrk.uni-kl.de] (VRAM, OverScan) Johannes Hill [Johannes_Hill@wi2.maus.de] (TempleMon) Karsten Isakovic [Karsten_Isakovic@b.maus.de] (SysMon, OverScan) Hans-Dieter Jankowski [Hans-Dieter_Jankowki@un.maus.de] (HuSHI, Hard & Soft) Laurenz Prner [Laurenz_Pruessner@b.maus.de] Julian Reschke [jr@ms.maus.de] (SCSI-Tool, Hard & Soft) Hansi Richstein [Hansi_Richstein@ac3.maus.de] (Kobold, Kaktus) Uwe Seimet [seimet@rhrk.uni-kl.de] (Diskus, CCD) Eric Smith [ersmith@netcom.com] (MiNT) Dirk Steins [Dirk_Steins@k2.maus.de] (ProStream, Protar) New in XHDI 1.10 ---------------- - IDE specific documentation completed - new functions to support non-GEMDOS filesystems New in XHDI 1.20 ---------------- - Support for more advanced DOS versions - Support for MS DOS partition types Neu in XHDI 1.25 ---------------- - New status calls - better support for parking of drives - comments on arbitration @(#)XHDI/intro.txt @(#)Julian F. Reschke, 2. Oktober 1994 Wie unschwer am Namen (`eXtended HardDisk Interface') zu erkennen ist, soll die XHDI-Spezifikation die Mglichkeiten der Kommunikation mit Treibern fr blockorientierte Massenspeicher verbessern. Ausgangspunkt war die berlegung, einige zustzliche Eigenschaften, die viele Treiber bereits haben, ber eine dokumentierte Schnittstelle nach auen zu fhren. Dies sollte speziell Virtual-Memory-Programmen die Mglichkeit geben, Wechselplatten zu verriegeln (wer wollte schon, da die Swap- Partition whrend des Swappens entfernt werden kann...). Mit fortschreitender Diskussion hat sich herausgestellt, da auch die durch die PUN_INFO-Struktur bereitgestellten Informationen nicht immer ausreichen und daher ber die XHDI-Spezifikation erweitert werden sollten. Grnde: - die PUN_INFO-Struktur hat nur Platz fr 16 Gerte, obwohl das BIOS (und einige GEMDOS-Aufstze) 32 Gerte erlauben. - eine Installation mehrerer AHDI-kompatibler Treiber im System ist nicht mglich. - die Atari-Definition von Gertenummern geht davon aus, da immer nur LUN 0 eines ACSI- oder SCSI-Targets benutzt wird. Der Sinn und Zweck der XHDI-Spezifikation (in der Version 1.25, Erweiterungen sind natrlich denkbar) sieht damit so aus: - flexiblerer und umfassenderer Zugang zu den Informationen ber die einzelnen Gerte. - Untersttzung erweiterter Treiberfunktionen wie Stop/Start oder Verriegeln/Entriegeln. Nicht Sinn der Sache ist, vllig neue Anforderungen an Treiber festzulegen. Die XHDI-Spezifikation soll sich nach Mglichkeit auf einfache Weise in bestehende Treiber integrieren lassen. Fragen und nderungswnsche bitte an: Julian F. Reschke Hensenstrae 142 D-48161 Mnster email: jr@ms.maus.de An der Formulierung des Standards waren beteiligt (in eckigen Klammern: eMail-Adresse, ggfs. in runden Klammern: Produkt/Firma): Stefan Baucke [Stephan_Baucke@ac.maus.de] Michael Bernards [Michael_Bernards@k2.maus.de] (Color Concept) Claus Brod [Claus_Brod@bb.maus.de] (Scheibenkleister, Maxon) Stefan Eissing [se@st.maus.de] (Gemini) Alexander Herzlinger [herzling@rhrk.uni-kl.de] (VRAM, OverScan) Johannes Hill [Johannes_Hill@wi2.maus.de] (TempleMon) Karsten Isakovic [ki@b.maus.de] (SysMon, OverScan) Hans-Dieter Jankowski [Hans-Dieter_Jankowki@un.maus.de] (HuSHI, Hard & Soft) Laurenz Prner [Laurenz_Pruessner@b.maus.de] Julian Reschke [jr@ms.maus.de] (SCSI-Tool, Hard & Soft) Hansi Richstein [Hansi_Richstein@ac3.maus.de] (Kobold, Kaktus) Uwe Seimet [seimet@rhrk.uni-kl.de] (Diskus, CCD) Eric Smith [ersmith@netcom.com] (MiNT) Dirk Steins [Dirk_Steins@k2.maus.de] (ProStream, Protar) Neu in XHDI 1.10 ---------------- - IDE-Dokumentation vervollstndigt - Neue Funktionen speziell fr das Einbinden `fremder' Dateisysteme. Neu in XHDI 1.20 ---------------- - Support fr fhigere DOS-Versionen - Support fr MS-DOS-Partitiontypen Neu in XHDI 1.25 ---------------- - Neue Statusabfragen - Support fr Harddiskparker - Erluterungen zur Arbitration Liebe(r) Software-Entwickler(in)! Dies ist die neueste Fassung der XHDI-Spezifikation (nheres dazu in den anderen Dateien in diesem Archiv). Die vorliegende Version ist das Resultat einer ausfhrlichen Diskussion zwischen Treiberentwicklern und Programmierern von Anwendungsprogrammen (Virtueller Speicher, Kopier- Utilities, Disk-Tools, andere Dateisysteme). Dieses Archiv SOLL frei weitergegeben werden, vorausgesetzt, keine der Dateien wird dabei entfernt oder verndert. Die lterem Fassungen XHDI-100.ZOO, XHDI-101.ZOO, XHDI-110.ZOO und XHDI-120.ZOO bitte ich berall zu lschen. Folgende Dateien liegen bei: intro.{txt|eng} - Einleitung (rationale) xhdispec.{txt|eng} - Die eigentliche Spezifikation xhdi.c, xhdi.h - Bindings fr Turbo C bzw. Pure C df.ttp, df.man - Beispielapplikation, die XHDI benutzt WARNUNG ------- Ich garantiere fr nichts, speziell nicht dafr, da DF.TTP, XHDI.C und XHDI.H keine Fehler enthalten!!! Benutzung auf eigene Gefahr! Alle weiteren Informationen bitte ich der Datei `intro.*' zu entnehmen. Julian Reschke, 2. Oktober 1994 Dear software developer! This is the lastest edition of the XHDI specification (see the other files for details). This version is the result of a long discussion between driver and application developers (virtual memory, copying tools, disk tools, filesystem drivers). This archive may be distributed freely, as long as all original files are included (and only those). Please delete the older versions XHDI-100.ZOO, XHDI-101.ZOO, XHDI-110.ZOO and XHDI-120.ZOO wherever you find them. Included files are: intro.{txt|eng} - Rationale xhdispec.{txt|eng} - The specification xhdi.c, xhdi.h - Bindings for Pure C df.ttp, df.man - A sample XHDI aware application WARNING ------- NO WARRANTY: I guarantee for nothing, especially not for the correctness of DF.TTP, XHDI.C and XHDI.H. Use at your own risk! See `intro.*' for further deatails. Julian Reschke, 2. Oktober 1994 /* @(#)XHDI/xhdi.c Julian F. Reschke, 21. August 1994 Bindings for the XHDI functions --- NOT FULLY TESTED, USE AT YOUR OWN RISK --- Important: Do calls only if XHGetVersion() was successful */ #include #include #include #include #include "xhdi.h" #define XHDIMAGIC 0x27011992L typedef LONG cdecl (*cookie_fun)(UWORD opcode,...); static long cookieptr (void) { return *((long *)0x5a0); } static int getcookie (long cookie, long *p_value) { long *cookiejar = (long *)Supexec (cookieptr); if (!cookiejar) return 0; do { if (cookiejar[0] == cookie) { if (p_value) *p_value = cookiejar[1]; return 1; } else cookiejar = &(cookiejar[2]); } while (cookiejar[-2]); return 0; } static cookie_fun get_fun_ptr (void) { static cookie_fun XHDI = NULL; static int have_it = 0; if (!have_it) { LONG *magic_test; getcookie ('XHDI', (LONG *)&XHDI); have_it = 1; /* check magic */ magic_test = (LONG *)XHDI; if (magic_test && (magic_test[-1] != XHDIMAGIC)) XHDI = NULL; } return XHDI; } UWORD XHGetVersion (void) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; UWORD ret = 0; /* 0: kein Cookie da */ if (!Super ((void *)1L)) oldstack = Super (0L); if (XHDI) ret = (UWORD) XHDI (0); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHInqTarget (UWORD major, UWORD minor, ULONG *block_size, ULONG *device_flags, char *product_name) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (1, major, minor, block_size, device_flags, product_name); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHReserve (UWORD major, UWORD minor, UWORD do_reserve, UWORD key) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (2, major, minor, do_reserve, key); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHLock (UWORD major, UWORD minor, UWORD do_lock, UWORD key) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (3, major, minor, do_lock, key); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHStop (UWORD major, UWORD minor, UWORD do_stop, UWORD key) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (4, major, minor, do_stop, key); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHEject (UWORD major, UWORD minor, UWORD do_eject, UWORD key) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (5, major, minor, do_eject, key); if (oldstack) Super ((void *)oldstack); return ret; } ULONG XHDrvMap (void) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (6); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHInqDev (UWORD bios_device, UWORD *major, UWORD *minor, ULONG *start_sector, BPB *bpb) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (7, bios_device, major, minor, start_sector, bpb); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHInqDriver (UWORD bios_device, char *name, char *version, char *company, UWORD *ahdi_version, UWORD *maxIPL) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (8, bios_device, name, version, company, ahdi_version, maxIPL); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHNewCookie (void *newcookie) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (9, newcookie); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHReadWrite (UWORD major, UWORD minor, UWORD rwflag, ULONG recno, UWORD count, void *buf) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (10, major, minor, rwflag, recno, count, buf); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHInqTarget2 (UWORD major, UWORD minor, ULONG *block_size, ULONG *device_flags, char *product_name, UWORD stringlen) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (11, major, minor, block_size, device_flags, product_name, stringlen); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHInqDev2 (UWORD bios_device, UWORD *major, UWORD *minor, ULONG *start_sector, BPB *bpb, ULONG *blocks, char *partid) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (12, bios_device, major, minor, start_sector, bpb, blocks, partid); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHDriverSpecial (ULONG key1, ULONG key2, UWORD subopcode, void *data) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (13, key1, key2, subopcode, data); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHGetCapacity (UWORD major, UWORD minor, ULONG *blocks, ULONG *bs) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (14, major, minor, blocks, bs); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHMediumChanged (UWORD major, UWORD minor) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (15, major, minor); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHMiNTInfo (UWORD opcode, void *data) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (16, opcode, data); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHDOSLimits (UWORD which, ULONG limit) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (17, which, limit); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHLastAccess (UWORD major, UWORD minor, ULONG *ms) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (18, major, minor, ms); if (oldstack) Super ((void *)oldstack); return ret; } LONG XHReaccess (UWORD major, UWORD minor) { cookie_fun XHDI = get_fun_ptr (); LONG oldstack = 0; LONG ret; if (!Super ((void *)1L)) oldstack = Super (0L); ret = XHDI (19, major, minor); if (oldstack) Super ((void *)oldstack); return ret; } void XHMakeName (UWORD major, UWORD minor, ULONG start_sector, char *name) { if (major < 8) { sprintf (name, "ACSI.%d.%d.%ld", major, minor, start_sector); return; } if (major < 16) { sprintf (name, "SCSI.%d.%d.%ld", major - 8, minor, start_sector); return; } if (major < 18) { sprintf (name, "IDE.%d.%ld", major - 16, start_sector); return; } if (major == 64) { sprintf (name, "FD.%d.%ld", minor, start_sector); return; } sprintf (name, "XHDI.%d.%d.%ld", major, minor, start_sector); } /* @(#)XHDI/xhdi.h Julian F. Reschke, 2. Oktober 1994 Bindings for the XHDI functions --- NOT FULLY TESTED, USE AT YOUR OWN RISK --- Important: Do calls only if XHGetVersion() was successful */ #ifndef __XHDI__ #define __XHDI__ #ifndef BPB #include #endif #ifndef UWORD #define UWORD unsigned int #endif #ifndef LONG #define LONG long #endif #ifndef ULONG #define ULONG unsigned long #endif #define XH_TARGET_STOPPABLE 0x00000001L #define XH_TARGET_REMOVABLE 0x00000002L #define XH_TARGET_LOCKABLE 0x00000004L #define XH_TARGET_EJECTABLE 0x00000008L #define XH_TARGET_LOCKED 0x20000000L #define XH_TARGET_STOPPED 0x40000000L #define XH_TARGET_RESERVED 0x80000000L #define XH_MI_SETKERINFO 0 #define XH_MI_GETKERINFO 1 #define XH_DL_SECSIZ 0 #define XH_DL_MINFAT 1 #define XH_DL_MAXFAT 2 #define XH_DL_MINSPC 3 #define XH_DL_MAXSPC 4 #define XH_DL_CLUSTS 5 #define XH_DL_MAXSEC 6 #define XH_DL_DRIVES 7 /* Inquire protocol version number */ UWORD XHGetVersion (void); /* Inquire informations about one target */ LONG XHInqTarget (UWORD major, UWORD minor, ULONG *block_size, ULONG *device_flags, char *product_name); /* Reserve or release a target */ LONG XHReserve (UWORD major, UWORD minor, UWORD do_reserve, UWORD key); /* Lock or unlock a target with removable media */ LONG XHLock (UWORD major, UWORD minor, UWORD do_lock, UWORD key); /* Stop or start target */ LONG XHStop (UWORD major, UWORD minor, UWORD do_stop, UWORD key); /* Eject medium */ LONG XHEject (UWORD major, UWORD minor, UWORD do_eject, UWORD key); /* Get bit mask of available XHDI devices */ ULONG XHDrvMap (void); /* Get major device number (eg. target), minor device number (eg. LUN), starting sector and BPB */ LONG XHInqDev (UWORD bios_device, UWORD *major, UWORD *minor, ULONG *start_sector, BPB *bpb); /* Get informations about the driver */ LONG XHInqDriver (UWORD bios_device, char *name, char *version, char *company, UWORD *ahdi_version, UWORD *maxIPL); /* Install additional XHDI handler */ LONG XHNewCookie (void *newcookie); /* Do a physical access */ LONG XHReadWrite (UWORD major, UWORD minor, UWORD rwflag, ULONG recno, UWORD count, void *buf); /* Make printable device name */ void XHMakeName (UWORD major, UWORD minor, ULONG start_sector, char *name); /* New version of XHInqTarget */ LONG XHInqTarget2 (UWORD major, UWORD minor, ULONG *block_size, ULONG *device_flags, char *product_name, UWORD stringlen); /* New version of XHInqDev */ LONG XHInqDev2 (UWORD bios_device, UWORD *major, UWORD *minor, ULONG *start_sector, BPB *bpb, ULONG *blocks, char *partid); /* Special opcode for custom driver extensions */ LONG XHDriverSpecial (ULONG key1, ULONG key2, UWORD subopcode, void *data); /* Inquire drive capacity */ LONG XHGetCapacity (UWORD major, UWORD minor, ULONG *blocks, ULONG *bs); /* Inform driver about media change */ LONG XHMediumChanged (UWORD major, UWORD minor); /* Get/set MiNT kernel information */ LONG XHMiNTInfo (UWORD opcode, void *data); /* Get/set DOS limits */ LONG XHDOSLimits (UWORD which, ULONG limit); /* Get ms since last access */ LONG XHLastAccess (UWORD major, UWORD minor, ULONG *ms); /* Force reaccess of device */ LONG XHReaccess (UWORD major, UWORD minor); #endif @(#)XHDI/xhdispec.eng @(#)Julian F. Reschke, 9. Oktober 1994 Specification of the `XHDI' cookie, October 9, 1994 --------------------------------------------------- Cookie id: "XHDI". The contents of the cookie points to the start address of a function, which provides procedures for dealing with block storage devices. As an additional check, the function is preceded by the long constant $27011992. The contents of the XHDI cookie may change (because it can be used by more than one driver). Therefore, in some applications (example: DA's) the cookie contents must be inquired each time before the handler is called. ALL FUNCTIONS HAVE TO BE CALLED FROM SUPERVISOR MODE. The effects of a call in user mode are undefined. All processor registers except d0 are preserved. EINVFN is returned for invalid opcodes. Some of the function calls -- notably `XHReadWrite()' -- might be implemented by calls to BIOS or XBIOS functions and therefore can activate the `Critical Error Handler'. It's the responsibility of the caller to switch of the `CEH', if this is needed. Some error codes: TOS error codes: 0: OK (OK) -1: unspecified error (ERROR) -2: device not responding (EDRVNR) -15: unknown device (EUNDEV) -32: invalid function number (EINVFN) -36: access denied, device is reserved (EACCDN) -46: invalid drive number (EDRIVE) SCSI error codes (ranging from -200 to -455) (-200 - N): SCSI error code N (the `Additional Sense Code', Byte 12 in the `Extended Sense Format', see section 7.2.14 in `draft proposed American National Standard for information systems - SMALL COMPUTER SYSTEM INTERFACE - 2 (SCSI-2) March 9, 1990'). IDE error codes (ranging from -456 to -711) (-456 - N): IDE error code N (value of the IDE error register) Note: obviously, you can get SCSI error codes only for ACSI or SCSI devices. For other device types -- like the IDE drives in the `ST Book' or `Falcon 030' (or machines with a third-party IDE interface) -- the following assignments may be used: Bit in IDE error register meaning SCSI error XHDI error 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 (it is recommended to test the bits in the above order). For other devices (like disk drives connected to the floppy controller) there may be other, not yet defined, error codes. Parameters are passed the same way as to GEMDOS functions. All values are put onto the stack, with the 16 bit opcode last, i.e. at the lowest address. The 32 bit result is returned in d0. Wherever it is specified that `the caller may pass a zero pointer' for a pointer parameter, then passing such a zero pointer indicates that the caller is not interested in the value to be returned. Drivers must always check pointers for zero before dereferencing them. Definition of data types: UWORD: 16-Bit, unsigned LONG: 32-Bit, signed ULONG: 32-Bit, unsigned char *: 32-Bit, pointer to a zero terminated string Terms: major: Major Device Number 0..7: Devices on the ACSI bus with ATARI-compatible command set 8..15: Devices on the SCSI bus 16..17: Devices connected to the IDE interface 18..63: Extensions as defined in the pun field in the PUN_INFO structure. 64: Devices on the standard floppy controller 65..255: Extensions outside the scope of AHDI. minor: Minor Device Number (for 'major' 0..15: LUN of the ACSI or SCSI device), maximal 255. key: A 16 bit key, returned by `XHReserve()', or 0, if the device is not locked or if the key is unknown. The XHDI functions: ----------------------------------------------------------------------- Opcode 0: UWORD XHGetVersion (void); Returns the current protocol version. Example: $0119 is Version 1.19 (the format is similar to that returned by `Sversion()', but high and low byte are not reversed). This version of the XHDI specification has the version number $0120. ----------------------------------------------------------------------- Opcode 1: LONG XHInqTarget (UWORD major, UWORD minor, ULONG *blocksize, ULONG *device_flags, char *product_name); Returns information about the device specified by `major' and `minor'. Reservation made with `XHReserve()' are reflected in `device_flags'. block_size: Block size for this device (important for `XHReadWrite()'). Usually 512. device_flags: (Bit set -> Capability available) Bit 0: Device is stoppable (XH_TARGET_STOPPABLE) Bit 1: The medium is removable (XH_TARGET_REMOVABLE) Bit 2: The eject mechanism can be locked (XH_TARGET_LOCKABLE) Bit 3: The device can physically eject the medium (XH_TARGET_EJECTABLE) Bit 29: Eject mechanism has been locked by the driver (XH_TARGET_LOCKED, from XHDI 1.25 up) Bit 30: Device has been stopped by the driver (XH_TARGET_STOPPED, from XHDI 1.25 up) Bit 31: The device is currently reserved (XH_TARGET_RESERVED) All other bits are reserved, drivers should set them to zero. product_name: Product name of the device, similar to the information returned by the SCSI command INQUIRE (max. 33 characters incl. terminating zero). If this information is not available, the driver should return a zero length string. Note: the caller may pass a zero pointer for `blocksize', `device_flags' and `product_name'. Note: for IDE devices, product name information might have to be truncated to fit into 32 characters. See `XHInqTarget2'. ----------------------------------------------------------------------- Opcode 2: LONG XHReserve (UWORD major, UWORD minor, UWORD do_reserve, UWORD key); Reserves or releases a device. `XHLock()', `XHStop()' and `XHEject()' only work for reserved devices if the correct key parameter is passed. Example: take a virtual memory manager which has locked a removable hard disk with the swap partition. You don't want the user to be able to unlock this device with a CPX module! On success, a 16 bit key is returned. do_reserve: (1) Reserve or (0) release. key: (only used for release). ----------------------------------------------------------------------- Opcode 3: LONG XHLock (UWORD major, UWORD minor, UWORD do_lock, UWORD key); Locks or unlocks the eject mechanism of the device. do_lock: (1) Lock or (0) unlock. key: if the device is reserved pass the key, otherwise zero. ----------------------------------------------------------------------- Opcode 4: LONG XHStop (UWORD major, UWORD minor, UWORD do_stop, UWORD key); Stops (ships) or starts the device. do_stop: (1) Stop or (0) start. key: if the device is reserved pass the key, otherwise zero. Note: if the drive is accessed, the driver should restart it without an explicit restart call. ----------------------------------------------------------------------- Opcode 5: LONG XHEject (UWORD major, UWORD minor, UWORD do_eject, UWORD key); Ejects or inserts the medium. do_eject: Eject (1) or insert (0) medium. key: if the device is reserved pass the key, otherwise zero. ----------------------------------------------------------------------- Opcode 6: ULONG XHDrvMap (void); Returns a bit mask of BIOS devices supported by the XHDI driver(s) (as the return value from `Drvmap()'). ----------------------------------------------------------------------- Opcode 7: LONG XHInqDev (UWORD bios_device, UWORD *major, UWORD *minor, ULONG *start_sector, BPB *bpb); Returns major device number, minor device number, starting sector and BPB of a given BIOS device (Note: getting the BPB this way will NOT reset the internal media change state). Note: the caller provides a pointer to the BPB structure, which is filled by the driver. Return values: OK, EDRNVR (device not responding, eg. medium not inserted), EDRIVE (wrong BIOS device number) or some other applicable error code. If the error code is EDRVNR, `major' and `minor' contain the correct values anyway. If `start_sector' is $FFFFFFFF, the device is only temporarily inaccessible (example: you have inserted a cartridge with two partitions, but three drive bits have been reserved for the device). The BPB is invalid if the structure element `recsiz' is zero. Note: a file system is fully described by major and minor device number and the starting block number. This does NOT mean, that it is necessarely a FAT file system. Note: the caller may pass a zero pointer for `major', `minor', `start_sector' and `bpb'. ----------------------------------------------------------------------- Opcode 8: LONG XHInqDriver (UWORD bios_device, char *name, char *version, char *company, UWORD *ahdi_version, UWORD *maxIPL); Gets information about the driver for the bios_device. name: Name of driver (max. 17 characters). version: String with version number (max. 7 characters). company: Name of company/programmer (max. 17 characters). ahdi_version: AHDI version level (as defined in the PUN_INFO structure). maxIPL: Highest IPL under which the driver can work (usually 5 for drivers which use _hz_200 for timing loops). Note: the caller may pass a zero pointer for `name', `version', `company', `ahdi_version' and `maxIPL'. ----------------------------------------------------------------------- Opcode 9: LONG XHNewCookie (ULONG newcookie); - OPTIONAL function, may return EINVFN - /* send translations to reschke@math.uni-muenster.de */ ------------------------------------------------------------------------ Opcode 10: LONG XHReadWrite (UWORD major, UWORD minor, UWORD rwflag, ULONG recno, UWORD count, void *buf); Read or write physical blocks. rwflag: Bits 0..2: as defined in the AHDI Release Notes (3.00, April 18, 1990). Bit 3 (physical mode) is ignored. All other bits are reserved and should be set to zero. recno: block number count: block count buf: pointer to buffer ----------------------------------------------------------------------- Opcode 11: LONG XHInqTarget2 (UWORD major, UWORD minor, ULONG *blocksize, ULONG *device_flags, char *product_name, UWORD stringlen); - only with XHDI version 1.01 and above - Returns information about the device specified by `major' and `minor'. Reservations made with `XHReserve()' are reflected in `device_flags'. block_size: Block size for this device (important for `XHReadWrite()'). Usually 512. device_flags: (Bit set -> Capability available) Bit 0: Device is stoppable (XH_TARGET_STOPPABLE) Bit 1: The medium is removable (XH_TARGET_REMOVABLE) Bit 2: The eject mechanism can be locked (XH_TARGET_LOCKABLE) Bit 3: The device can physically eject the medium (XH_TARGET_EJECTABLE) Bit 29: Eject mechanism has been locked by the driver (XH_TARGET_LOCKED, from XHDI 1.25 up) Bit 30: Device has been stopped by the driver (XH_TARGET_STOPPED, from XHDI 1.25 up) Bit 31: The device is currently reserved (XH_TARGET_RESERVED). All other bits are reserved, drivers should set them to zero. product_name: Product name of the device, similar to the information returned by the SCSI command INQUIRE (max. `stringlen' characters incl. terminating zero). If this information is not available, the driver should return a zero length string. stringlen: Length of string buffer passed in `product_name'. Note: the caller may pass a zero pointer for `blocksize', `device_flags' and `product_name'. Product names of IDE devices may contain up to 40 characters. ----------------------------------------------------------------------- Opcode 12: LONG XHInqDev2 (UWORD bios_device, UWORD *major, UWORD *minor, ULONG *start_sector, BPB *bpb, ULONG *blocks, char *partid); - only with XHDI version 1.10 and above - Returns major device number, minor device number, starting sector, BPB, size and partition ID of a given BIOS device (Note: getting the BPB this way will NOT reset the internal media change state). Note: the caller provides a pointer to the BPB structure, which is filled by the driver. Return values: OK, EDRNVR (device not responding, eg. medium not inserted), EDRIVE (wrong BIOS device number) or some other applicable error code. If the error code is EDRVNR, `major' and `minor' `start_sector' contain the correct values anyway. If `start_sector' is $FFFFFFFF, the device is only temporarily inaccessible (example: you have inserted a cartridge with two partitions, but three drive bits have been reserved for the device). The BPB is invalid if the structure element `recsiz' is zero. If the partition ID isn't available (possible reason: no standard Atari root sector or no root sector at all), an empty string is returned. Starting with XHDI 1.20 for MSDOS compatible media the one byte partition code is returned as: partid[0] = '\0' (zero byte), partid[1] = 'D' (for 'DOS'), partid[2] = partition code. Note: a file system is fully described by major and minor device number and the starting block number. This does NOT mean, that it is necessarely a FAT file system. Note: the caller may pass a zero pointer for `major', `minor', `start_sector', `bpb', `blocks' and `partid'. ----------------------------------------------------------------------- Opcode 13: LONG XHDriverSpecial (ULONG key1, ULONG key2, UWORD subopcode, void *data); - OPTIONAL function, may return EINVFN - This opcode may be used for driver specific extensions. It's up to the driver how to interpret the arguments in `subopcode' and `data'. `key1' and `key2' are used to specify for which driver the call is: `key1' should contain four printable ASCII characters, `key2' a `random' ULONG value (example: date of definition in BCD format). ----------------------------------------------------------------------- Opcode 14: LONG XHGetCapacity (UWORD major, UWORD minor, ULONG *blocks, ULONG *blocksize); - OPTIONAL function, may return EINVFN - This functions returns the number of adressable sectors in `blocks' and their size in `blocksize'. Note that -- depending of the device used -- this function may need several seconds to complete. ----------------------------------------------------------------------- Opcode 15: LONG XHMediumChanged (UWORD major, UWORD minor); - OPTIONAL function, may return EINVFN - Informs the driver that the medium in the given device has been changed. Upon this notice, the driver should do the same things as if the device itself would have returned a media change status. The return value is OK if and only if this information has been correctly interpreted (this means: all logical drives on the device are either disabled or ready to use). ----------------------------------------------------------------------- Opcode 16: LONG XHMiNTInfo (UWORD opcode, void *data); - OPTIONAL function, may return EINVFN - A function for setting/inquiring MiNT related information. The following opcodes are defined (for unknown opcodes EINVFN is returned, OK is returned if and only if the call has been executed correctly). XH_MI_SETKERINFO (0) [struct kerinfo *data] Sends (through `data') a pointer to the MiNT kernel info structure to the driver. The driver can use it for direct calls of kernel functions. XH_MI_GETKERINFO (1) [struct kerinfo **data] Inquires for a previously set MiNT kernel info pointer. The pointer is returned in the struct kerinfo * pointed by `data'. If the adress of the MiNT kernel info structure is unknown, `data' is filled with a NULL pointer. ----------------------------------------------------------------------- Opcode 17: LONG XHDOSLimits (UWORD which, ULONG limit); - OPTIONAL function, may return EINVFN - This functions aks the driver for the internal limits of the currently running DOS (or sets the driver's limits). Example: it can be used by a FAT file system driver to inform the driver about the change of some of the limits. `which' describes the type of limit, `limit' is the new value (with zero meaning that the value shouldn't be changed). The function returns the previous value for the limit: Constants for `which': XH_DL_SECSIZ (0): maximal sector size (BIOS level) XH_DL_MINFAT (1): minimal number of FATs XH_DL_MAXFAT (2): maximal number of FATs XH_DL_MINSPC (3): sectors per cluster minimal XH_DL_MAXSPC (4): sectors per cluster maximal XH_DL_CLUSTS (5): maximal number of clusters XH_DL_MAXSEC (6): maximal number of sectors XH_DL_DRIVES (7): maximal number of BIOS drives supported by the DOS ----------------------------------------------------------------------- Opcode 18: LONG XHLastAccess (UWORD major, UWORD minor, ULONG *ms); - only with XHDI version 1.25 and above - Returns in `ms' the amount of milliseconds since the last successfull read or write operation on the device. ----------------------------------------------------------------------- Opcode 19: LONG XHReaccess (UWORD major, UWORD minor); - only with XHDI version 1.25 and above - Calling this function causes the driver to check the device for a possible media change and to actualize partition informations if needed (like `XHMediumChange()', but the driver checks for the media change status before continuing). ------------------------------------------------------------------------ How to install more than one XHDI driver ---------------------------------------- (1) During the installation, check if the cookie is alreay set. If so: (2) For `XHGetVersion()' first jump through the old vector and return the minimum of this and your own version number. (3) For `XHDrvmap()' first jump through the old vector and then or-in the drive bits for the devices supported by you. (4) For all other functions: check, if one of `your' devices. If not, jump through the old vector. ------------------------------------------------------------------------ Partition type `RAW' -------------------- XHDI-1.10 compliant drivers shall support the third partition type `RAW' (in addition to `GEM' and `BGM'). For these partitions, the following should be true: (1) The partition size is `arbitrary' (32 bit sector numbers). (2) The partition can be accessed as BIOS device; Getbpb() returns a NULL pointer (so that GEMDOS won't access it; however, calling Getbpb() resets the driver internal media change state). (3) `Rwabs()' (in physical or logical mode) and `XHReadWrite()' may be used to access the partition. The physical block size of the medium is used (see `XHInqTarget()'). (4) `XHInqDev2()' (as compared to `XHInqDev()') returns size and type of the partition. These extensions have been made to make it easier to create drivers for new filesystems for MiNT (like the Minix file system). ------------------------------------------------------------------------ Recommended partition types --------------------------- BGM GEMDOS partition > 16MB GEM GEMDOS partition < 16MB RAW see above The following types can be supported optionally (for example with a configurable list of partition ID's in the driver). MAC MAC HFS partition, should be handled like `RAW' MIX Minix partition, should be handled like `RAW' QWA QDOS partition, should be handled like `RAW' SWP Swap partition, should be handled like `RAW' UNX ASV (Atari System V) partition, should be handled like `RAW' ------------------------------------------------------------------------- Arbitration ----------- For device drivers which support SCSI arbitration, the machine needs an own SCSI device number which must be unique and shouldn't be stored on disk. Atari has reserved byte 16 in the Non Volatile Memory of the Atari TT and Falcon computers. Bit assignments: Bit 0..2: device number Bit 7: arbitration on (1) or off (0) The current arbitration number could be inquired this way: 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; } @(#)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; } `>!``[ >>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#[3[ k #[ Ј<.@#[Jy[g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON&`0 J"LNN? 9>g @N 9>g @NN5?<LNAADONuADa<2SAgNu#??>NuH0OE[ *fD6*`6pg*a"DH?pAC?CDAa'XO4pC5@`fRC| e` ja&H f ja `Da!H?CDAa&TOCAa.CAa J@f0||@f4 JO(L Nua"a"#\By\ADa#\aNu// a"&$x Ca" g" AHDIRf jVCRf jZe J`$_&NuH(O(Ha!$H"LAa.a LJ@gAa Aa/* 7\g CDAa.CDAa-I\ La!pAa"H6 Ja!JCfA`OLNuH,O6a2$HBAa~I\ g| l"/ g A _METf"h10gBH?CD La%LTOK*INFO+|N MBB"a ~// /9[CDA[Na#O `B@ La6AaJCgB@`X ,", a84'@&'T Jav(H g/CDA a#XO`C?A a,\0a"HAa,LpOLNuH,O8$H(I:PO"Jgtf.p\g`" g|l<5@f4H 5(gp/ /9[ y?>"hA[Na"lPOp`N0/f "fJFg ha!TO8 g" ЀЁЁ"a78,`|JEftHo / / /"/a62Ha7/ /"/a62Ha6/ /"/a62Ha6/A3a+JgA3`A/Aa!TO`n/ / /"/ a6`2Ha6/ / "/a6F2Ha6/ /"/a602Ha6r/A/a*JgA/`A/Aa OB@OdL4xNuH:O&H,IE("K Ja* Ja`p\ Ja)&H f Jp:a)&HI? gCAa) JaJ@f>CAaDJ@f0 o<0`* < NaAaJ@fCAaJ@gp` o<0ogB@O(L\NuH>O,*HBC?CJC?BArGQ>aaM? g @f*E#[BE?ELE[N`JGf20@AH>7 0|Pgvn J@gS@gN`t|ag\| g^`daHhAaXO/9[ y?> PalXO y?>/(A aXXO`aJHhA8aDXOB@`0v`"P JaRXO/9[ y?>"h Ja:XO`bHWHoC M a PO>R@fUtnp`B@?@NJCgBoNBoPr a*\(H f pa//9[C JaPOp`.9UtMR`^"N  uaJJ@fp0.")`:09>a\/ /5/9[ y?>"h JavO )Rna&H`~B@8JCf2/Ngp2/NgJ@g Sep`B@.9Ut`r2$劲(f )(p8RnJ@g$??42/PCNA0aXOJ@g?|Pa&H f.9UtMR`v "4kjHVCX uaXOJ@g009>af/ /5/9[ y?>"h JaO ` p?Bg42/PCNAX0aDXOJ@g?|PRn0/POTL|Nu 8Nu// &$HAap @ gf g$p` PH (fB@$_&Nu/ EE0*f$ J Jf6`C JNR@fp`bA0 \f /:gpdB /:f,HN9|N%/fB@`"AN%6` AN%60gp`B@OL Nu/ $H]ffB]f *fgN%t JN5RB@$_NuH0&H(BCE]. f6`B "K2H R pN2~J@f0H R"p 1=Hf0`RC0H R"0fpL Nu// $HN2@& JaJ@j`r҃4H y]. p($_&NuH08GIZEATN2SAgSAg` E`Ev`2H ЀЁЀrf r`RC|1m?"j KN)TO KL Nu 8Nu// &$HAN& @ gf g$p` PH (fB@$_&NuHO&H(N%(<A|:B@AN%6AN2@rfCU"AN10JCf2Jf 3>`,AN2@cC KN1A`3>`3>OLNuN%VHrಀfB`NuAXFNAU$!HH2SAgNu!|UHHNuH<(HE]*& N4&H "*CN6KUt "C$*A(N6 "K"*ҕAN6 Ѫ$ KN5RL<NuH>QO&,H.GUtB +fa6K]*I] f8r&*)A B W -f9|`AXRNf gBl`9k g @f lf> , g"g Na` g)S `Ro  v -f(g*g@CXb  vN1J@f(R , g"g Na` , f)S *&f , g&`  v -f(f0,fp`t 'vRp`b ,g" v (-ft`BB  vC ( ,gF" v -f6 (-g4+g&/TBD:`R og<=f$lBl `J /"T RN2~J@f. o/ RN2@"f *J<, x` f*J<, `zE Rl fJEg.JDf*0+g"/6/ k"PA[NN(PO`p g9F R ogt4-o RH'H`0+gD" v (-f//"k"iA[NN(PO`/  vH?/"k"iA[NN(O ` mf>o 'vR`,0+g"/6/ k"h A[NN(PO` TN2@є -g @0 B@`~0+g"" v (-g"TH WN1x fj0+gV" v (-f//"k"iA[NN(PO`*/  vH?/"k"iA[NN(O TN2@є`| TRH WN1x/H"TfR /g<:fT0+gJ< m<m H?/ k"hA[NN(\O`H?/ k"hA[NN(\Op?`l o (:f\ (:f"Tg'TR`DB`> Tf춓f(2+gH?/"k"i A[NN(\O~?` 'vRBHPOL|Nu#] NJ@f o0]$NuN%HHrಀfB`Nu 8NuYOA <_AKPNJ@g `AN& @ h0(HXONuaS@gS@g[@g S@g`pNupNuB@NuH8(HEXf JNf&H f LNf&H f ANf&H gC KN4J@gC KN4J@fB@`C KN4J@gnC KN4J@fp``C" KN4J@fp`L KN2@rb:+HN9jJ@g*+HN9jJ@g +_f df +efp`aLNu?6N9|6|am|zoB@` |aN%(N%r€gt`BB06Nu/ y[$h,`&pCX JN2~J@fA` JN2@Rf֑$_NuH>O6,H$IKX y[^gB3[^ANf f,pN0J@g pA N%(Jk2`rpN$pN%d#].A]2N$ y[ (f a8&H(K f"J N0HN|`BC`RCp"M2H rN2~J@f0HBfpC LN2~J@g`ZL,Kv`RffroK`pЃN4*H&Nv` +Rff"B gR`LBD,L`"HN9\J@g<0HD@8H|Ag<,f ,fRN(Np0o uBf"J M N|8A׻g MN5R0OL|Nu/p0?N$|\ONu/?/?t7?N$|ONu/ $y]^ y]b0<N$ y]^0<N$N$_NupNuA0<N$#]^A0<N$#]bNu/ $HN2@SA$_NuH:O$H&IBCN2@(d`rd< Jp\N1x f.N$8H JN1x fpЄ 2:f"J KN1`Jg"pЄ 2\g/N$8"2fv`BCCXAN1CX KN1 *:gN%(<A`TJHNJ@f 3>`0 \gtN$8gdHN9|?AN2@A0N%8J@f.Aa/H \g(/N$8 _gCXAN10` 3>`"JAN10N#RJ@gAN#AN2@e 3>`~M`p\ NN1x(H gBCX NN1J@g\CX NN1J@g&g .:gCX KN10"N KN10`$p\ KN1/H f 3>p`B oB,L gRN gfpJCf KN2@rf +:fCX KN10B@OL\NuH0$HCXAdN10N$&HAN$pAdN%6H KN$JfBR`pϰf4` ` #]fBfpL Nu// $HB@AdN%&f `&%CfpAdN%&rಀg tgjp$_&Nu// OCNR@g|"<ppN4@&H f 3>`\CAdN1AdN2@7@d 3\cgCXAdN10Rkd Ka@&Jg Ka&Jg3> KN5R` KO&_&NuH0$H PgD0f0`>N$&HAN$N%6H KN$pϰf4` Jg 3>`.RjC"ApN1ApN2jApN2@5@nAjL Nu// O$Hv0*dB2d*dgJ/CHoHj0Ho/*f?<?<BN$`O&rಀfB*d /fC2*dAdN1pఃfA"*f0<N%&pϰg Jg 3>`6RjAN2@5@nCApN1pjf ApN2jAjO$_&Nu/ $H#]f *fga` Ja$_NuH8&H(IE]f gF @"(ff> Pg8"@Cp4(dA dN1"K RAdN4J@f RXH"Lp "QB@`pLNuH8&H(IE]f g\ @"(fgT"@Cp4(dA dN1p Rhf"KAdN4J@g"K RAdN1J@f RA0"Lp "QB@`pLNu/ / $H&I2'j7j7j j j 'j 2* 0*"N"'@2*0*N"'@2*$0*&N"'@'j'j j)&&_$_NuH4O$H*ICXAN1J@g JN2@SA \fBN$&H/|ABCD,AN$BBm$;|Nf@ N@ B *:fHN9||;@` N%(;@C JaJ@gp JN%J@f ABCD,g"p?/ CXA[NN(\OpNr2/0/N"+@+@+@r/g4<@`4<:p/g2<m`2<U+o o&` JN2@rf@ *:f8 *\f0N$2?N$2N"+@+@+@:A|&`dB@ JN%&Jk@0N%JCj4;|: B-&N$2?N$2N"+@+@+@` KN$3>p` KN$B@O0L,NuHO&H(I8Ca6HJfJDf0||fC K0N&&Jg 3>p`9|$"LAa6B@O4LNu/ O(ICNR@fp`N09Xg>"LAB@av|f,A> Pg Pg Pf Pgr`BA3X``"LAa@O(_Nu/OJ@fJAfp`\tAB>4J|??B4v j|??Br@?A4J|SB?B6r k||P?C B@?@?@AN&rO&Nu/ EX Rf2AXNfBR g ` /fRR` rg .fRHRHf0$_Nu/ / $HpCXN2~J@fb JN2@rdT */f,|:*gCAN1`,|/B*` C JN1CX JN10`\p/ JN1x&H f&_$_Nua(U@fp/Nup\NuaJ@gp/Nup\Nu/ $HaJ@g Ja@ J$_Nu#]j#]nNA$y]n"y]jN#]r#]vNN$y]v"y]rNH瀠>NMPO @$_NuHR?<,NATO$_NuHR?<*NATO$_NuHRHP?< NA\O$_NuHRHP?<NA\O$_NuHR?</NATO @$_NuHR???<FNA\O$_NuHR??<>NAXO$_NuHR??<NAXO$_NuHR?<NATO$_NuHR?HP?<6NAPO$_NuHR?<NATO$_NuHR?<NATO$_NuHR??<NAXO$_NuHR/?<+NA\O$_NuHR?<ONATO$_NuHR?HP?<NNAPO$_NuHR?HP?<=NAPO$_NuHRHP?<;NA\O$_NuHR?HP?<GNAPO$_NuHR?HP?<$NAPO$_NuHR?HP?<(NAPO$_NuH>)NAO $_NuH>,NAO $_NuHRHP?<&NN\O$_NuA(p"@ "ByYA1B3Y3YO"Nu/ Hz?<&NN\O$_NuH0$HND&k2BAN"H&J&&&&609Yg 1|YJjp` L NuH $Hpj 2*`S@| JAk`R@| | lJ@jp`nt@B6mB8H؄AYpHjSCt@|f|mRC2H ЀЁ4*HЂ&"鉒8*H҄&$銔0HԀ LNuH &:JjvE]z rBA< <b;k`|<*f<`&<0< b ACp a$Wb<gt<.f6<*f4`$<0< b ACp a$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA aA pJWF@?@gA 2SAktaSb (Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`hH0$H&IB(v`H0$H&IvJWFCJBj4Cb6xJAkCc8Cf K0a0 JN` 0 JN0 Kap0DL Nu6x0/g f@ JaP0/g@AN0/g@ Ja,0/g@A N0/g g@ Ja0OLNuH0E6`H0E4&H6g8Kg SC JpNQ J0|gNL Nu00000000 H:$H&I(S&gfJg^+g`)ft,k x$ڹd SfRe`.&// Ka~$"J@k,f4(SSfRf& L\Nu3 >p`"`&x,A'J'JE8'J & KaJ@kfRf"`H&H(k6+"+g0DtaJk+fZ"S"L Ip gSj`*| // " 0a`"_"JkNgPAp SjH@" 0apNu3>NuH |bg??/?<BNAO JkjLNuJo6(?<?p/?<BNAO JkDHz <e/`/??<@NAO Jk b?<?p/?<BNAO Jja^3>p`0<`H 6?<?B?<BNAO (Bg?/<?<BNAO *Bg?/?<BNAO JWHL8NuD@| |"b;NupNu   JgJgJgJgJg JgJgJfSHggggg ggf @NugfSHNuJgNug fC`Jg INuSHNugFf8g>f0g6f(g.f g&fgfgfggepNupNuJfpNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNu"C*B@f ANuSeg gb pNuJfpNupNuH0$H|g|$bGrtgJ3kSJgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<Xfg.G 3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3">p` 3!>p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!>`0123456789abcdefghijklmnopqrstuvwxyz/ EB@BA2g2g!2ep` p`Jfp$_Nua V/aD" g p/aF _NuH &/?<HNA\OJf 9]g @ NJ@fp @LNuH0&gPR<e a g!CC[ "A`rG[&S f. < a gj&@Ap !|'H&[#[A"P` )d I"Q f`rd ` #@#C"nAL Nuk |`3 >`/ oLQ d nf@axJg*`6C[ g,g"@ f` "/?<INA\OJj`p$_Nugp`/ &y[ g/ &S?<INA\O`&y[ g/ &S?<INA\O`&_NuH8$<CG[ g" c &@ f`(@ ,gb*"Ҩeg ` )H`p"@")Ө )H`>"@ gb" ҩeg`N"(ө`" "H" ҩf @"(ө" l eb&/ ?<INA\OJfQLNuP`Jg/bg2 4gf!Sf`f`!Sg"gH?LxH?LxH?LxH?Lx`H?Lx8H?LxH?LxH?LxH?LxH?LxpH?LxHH?Lx H?LH?SfvLx2|HgS@!!Q|gSA!Q`2 4gfSf`f`S"gH?LxHxLxHx(LxHxPLxHxxLxHxLxHxLxHxLxHxLxHx@LxHxhLxHxLxHxLHSfxLx2|HgS@ Q|gSAQ _Nu/$gSe40HB4 gxH_>"&(*,."B$B&B(B*B,BH~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H`SfL||0HgS@!Q|gSAQ _Nu<0< SHNu|A(0|NuBAA0NuBAA0Nu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#$HBJBf$HBJBfNuHBЂNuHBЂNu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNu"@$jDJjD$HBJBf.$HBJBfB@H@$ jDNuB@H@HB0B@H@$ jDNu A"B@H@HABAtҁрdЈӁрQ$ jDNu???@AAKAhAAAAB C)CkCCDDD>E\aE`EeEmkEwPusage: %s [-akP] [files...] use --help for more information -a, --all Show informations about all drives -k, --kilobytes Display in kilobyte units -P, --portable-format Use portable POSIX format --help Show this help screen --version Display version string %s: can't get file system information for `%s' (device %u) drive %4d-blocks used avail capacity mounted on %s: cannot locate `%s' (%s) %s: cannot get information about file system `%s' %s: file system for `%s' unknown no labelGebrauch: %s [-akP] [Dateien...] Mehr Hilfe mit --help -a, --all Informationen ber alle Laufwerke anzeigen -k, --kilobytes Als Maeinheit Kilobyte verwenden -P, --portable-format Ausgabe im portablen POSIX-Format --help Diese Information anzeigen --version Versionsinformation anzeigen %s: keine Dateisysteminformationen fr `%s' (Gert %u) verfgbar Laufwerk %4d-Blcke benutzt frei Anteil installiert unter %s: kann `%s' nicht finden (%s) %s: kann Information ber Dateisystem `%s' nicht ermitteln %s: kann Dateisystem fr `%s' nicht lokalisieren kein Label@(#)Tools/df.ttp, Copyright (c) Julian F. Reschke, Oct 8 1994LC_MESSAGES%c:%cu:%cU:\*.*MetaDOS.%c%s: `%s': %s (%s)Filesystem %4d-blocks Used Available Capacity Mounted on %-17s %11ld %7ld %7ld %7ld%% %s %s ?%-17s %11ld %7ld %9ld %7ld%% %s ...allhelpversionkilobytesportable-formatdfakP%s %s%s: %s ACSI.%d.%d.%ldSCSI.%d.%d.%ldIDE.%d.%ldFD.%d.%ldXHDI.%d.%d.%ldIzIIIIIIJJ7JMJ^JtIJJJJJJKKK8KMKhKxKKKKKL L!L7LSL~LLLLMMM8MMMbMoMMM"MNNNN,N>NINZNfNtNNNNNNNOO#O:OLObOOOOOOOPP/PEPVPmP}PPPPPQQQ.Q<QOQ]QpQQ"P}QQQQRRRR%R3RDRQR]RhRvRRRRRRSSS+OS:SHSWSkSSSSSSSTTT;TKT[TnTTT`TQpTT"Serror code 0123455TUFehlernummer %dallgemeiner FehlerGert nicht bereitunbekanntes KommandoPrfsummenfehlerKommando kann nicht ausgefhrt werdenSpur kann nicht angesteuert werdenMedientyp nicht bekanntSektor nicht gefundenkein Papier mehrFehler beim SchreibenFehler beim LesenMedium ist schreibgeschtztMedium wurde gewechseltGert nicht bekanntdefekte Sektoren beim Formatierenanderes Medium einlegenGert reagiert nichtunbekannte FunktionsnummerDatei nicht gefundenVerzeichnis nicht gefundenzuviele DateienZugriff verweigertfalsche Dateinummerzuwenig Speicherfalsche SpeicherblockadresseLaufwerkskennung ungltignicht auf dem gleichen Dateisystemkeine weiteren DateienBereich ist blockiertkeine Blockierung vorhandenParameter auerhalb des mglichen Bereichsinterner Fehler im GEMDOSkeine ausfhrbare DateiSpeicherblock kann nicht vergrert werdenProgramm abgebrochenProgrammabsturzzu langer Verzeichnisnamezu viele symbolische VerweisePipeline abgebrochenungltiger ParameterName zu langgegenseitiger Aufruf von Scriptskein Programm zum Ausfhren des Scripts gefundenunerwartetes DateiendeSchreibfehler (Medium voll?)Bereichsfehlercode d'erreur %derreurunit non prtecommande inconnueCRC erreurmauvaise requteerreur seekmdia inconnusecteur introuvableplus de papiererreur d'critureerreur de lectureerreur gnralemedia protg en criturechangement de mdiaunit inconnuemauvais secteurs existantsinserz l'autre disqueinserz le disquel'unit ne rpond pasnumro de fonction incorrectfichier introuvablechemin introuvablehandle pool exhaustedaccs interdithandle incorrectmmoire insuffisanteadresse du bloc mmoire incorrecteunit spcifie incorrectelecteur non similaireplus de fichiersenregistrement protgcl inexistanteerreur de valeurerreur GEMDOS interneformat excutable incorrecterreur d'affectation mmoireprogramme interrompuprogramme plantchemin trop longtrop de liens symboliqueschaine briseargument incorrectnom trop longfonction rcursiveno program for executing the scriptfin inattendue de fichiererreur d'criture (disque plein?)error code %derrordrive not readyunknown commandCRC errorbad requestseek errorunknown mediasector not foundout of paperwrite faultread faultgeneral errorwrite on write-protected mediamedia change detectedunknown devicebad sectors on formatinsert other diskinsert diskdevice not respondinginvalid function numberfile not foundpath not foundaccess deniedinvalid handleinsufficient memoryinvalid memory block addressinvalid drive specificationnot the same driveno more filesrecord is lockedno such lockrange errorGEMDOS internal errorinvalid executable formatmemory block growth failureprogram abortedprogram crashedpath name too longtoo many symbolic linksbroken pipeinvalid argumentscript called recursivelyunexpected end of filewrite error (disk full?)LC_MESSAGESProze nicht gefundenprocess not found\U~UUUVV<V\VVVVW&WYWWWWX%s: option `%s' is ambiguous %s: option `%c%s' doesn't allow an argument %s: option `--%s' doesn't allow an argument %s: option `%s' requires an argument %s: unrecognized option `%c%s' %s: unrecognized option `--%s' %s: unrecognized option, character code 0%o %s: unrecognized option `-%c' %s: option `-%c' requires an argument %s: die Option `%s' ist mehrdeutig %s: die Option `%c%s' darf keinen Parameter haben %s: die Option `--%s' darf keinen Parameter haben %s: die Option `%s' mu einen Parameter haben %s: Option `%c%s' nicht erkannt %s: Option `--%s' nicht erkannt %s: Option nicht erkannt (Zeichencode 0%o) %s: Option `-%c' nicht erkannt %s: die Option `-%c' mu einen Parameter haben LC_MESSAGESPOSIXLY_CORRECT--LC_ALLLANGCPOSIXGERMANFRENCHENGLISHARGV=STDERRCON:NULL:x:\...*.*\:\Memory destroyed by Fsfirst (%s, %d) UNIXMODE/dev/:YYZZZ ZZZZZ$Z,Z6Z?ZF ZOZSZWZ[Z_ZcZgZkZoZsZwZ{ZZZZZ_ZZZZZZZ ;Zx0NSunMonTueWedThuFriSatSundayMondayTuesdayWednesdayThursdayFridaySaturdayJanFebMarAprMayJunJulAugSepOctNovDecJanuaryFebruaryMarchAprilJuneJulyAugustSeptemberOctoberNovemberDecemberZZZ[8r  *HN J>XN "` T>04.V\*ؒ4   @  H"8   &lPT&B8,$ @T((B2" " 08L          (  $,  ",   J($&, \.   L "  D .$ : ,J@\npX&  ~D.R,<* DF(1) Benutzerkommandos DF(1) NAME df - Freien Speicherplatz auf Medium anzeigen SYNOPSIS df [-akP][Laufwerk:...][Datei...] BESCHREIBUNG df (disk free) zeigt an, wieviele Kbytes auf einem GEMDOS-Laufwerk belegt und frei sind, wieviele Kbytes insgesamt zur Verfgung stehen und mit welchem Volume-Namen das Medium versehen ist. Wenn mglich (AHDI-kompatibler oder XHDI-kompatibler Festplattentreiber) wird auch ausgegeben, welches logische Laufwerk auf welcher Fest- platte liegt. Ohne Argumente erfolgt diese Anzeige fr alle angeschlossenen Laufwerke mit Kennung ungleich A: oder B:, bei denen die Blockzahl ungleich Null ist. Ansonsten drfen als Parameter sowohl Lauf- werksnamen (zum Beispiel C:) wie auch beliebige Datei- oder Ord- nernamen angegeben werden (dann wird das dazugehrige Laufwerk ausgewhlt). Als Bezeichnung fr das Dateisystem wird ein String folgenden Formats benutzt: ? Ursprung des Dateisystems unbekannt oder ACSI.Major.Minor.Startblock SCSI.Major.Minor.Startblock FD.Minor.Startblock IDE.Major.Startblock XHDI.Major.Minor.Startblock oder MetaDOS.Gertebuchstabe (erfordert MetaDOS 2.30). Format: Major 'Major' Gertenummer. Normalerweise: Nummer des Bus- Targets (zur Zeit 0..7). Minor 'Minor' Gertenummer. Normalerweise die 'Logical Unit Number' des Laufwerks. Startblock Nummer des ersten Blocks des Dateisystems auf dem angegebenen Gert (bei passendem MetaDOS-CDROM- Treiber logische Blocknummer der letzten `Session' eines ISO-Dateisystems). OPTIONEN -a, --all Ausgabe geschieht fr alle dem GEMDOS bekannten Laufwerke. Dazu wird die GEMDOS-Funktion Dsetdrv(2) konsultiert. --help Gibt Hilfstext aus. -k, --kilobytes Ausgabe in Kilobytes statt in 512-Byte-Blcken. -P, --portable-format Ausgabe im Standardformat laut `POSIX 1003.2a' (Draft 8, 5.8.6.1). --version Gibt Programmversion aus. BEISPIELE Informationen ber das aktuelle Verzeichnis abfragen: $ df . Laufwerk 1024-Blcke benutzt frei Anteil install... SCSI.0.0.62200 35758 34874 884 97% D:\ Informationen ber alle Dateisysteme im portablen Format mit Kilo- byte-Blcken erfragen: $ df --all --portable-format --kilobytes Filesystem 1024-blocks Used Available Capacity Mounted on FD.0.0 713 343 370 48% A:\ FD.0.0 713 343 370 48% B:\ SCSI.0.0.2 31028 30228 800 97% C:\ SCSI.0.0.62200 35758 34874 884 97% D:\ SCSI.0.0.133880 35758 34822 936 97% E:\ SCSI.4.0.2 86664 83312 3352 96% F:\ Zur Erklrung: Das Dateisystem `F:\' liegt auf SCSI-Gert 4, Logical Unit 0 und beginnt auf Sektor 2. Wer immer das 1024-Byte-Format sehen will, sollte sich folgende Shellfunktion definieren: df() { command df -k $* } ENVIRONMENT LANG Legt die zu benutzende Landessprache fest, wenn weder LC_ALL noch LC_MESSAGES existiert. LC_ALL Wenn diese Environmentvariable auf `german' gesetzt ist, benutzt df deutschsprachige Meldungen. Bei `C' und `POSIX' werden englischsprachige Meldungen gewhlt. Fr andere Werte wird standardmig Englisch benutzt. Exi- stiert diese Variable nicht, wird stattdessen LC_MESSAGES berprft. LC_MESSAGES Siehe LC_ALL. Wenn auch diese Variable nicht existiert, wird stattdessen LANG benutzt. POSIXLY_CORRECT Normalerweise drfen Optionen an beliebiger Stelle in der Argumentliste auftauchen. Ist diese Variable gesetzt, werden sie nur noch am Beginn der Argumentliste erkannt (ganz wie POSIX 1003.2 es fordert). Wer in Shellscripts auf Nummer sich gehen will, sollte Optionen und Argumente immer durch -- voneinander trennen. STDERR Wenn diese Environment-Variable existiert, wird stderr (Kanal 2) unverndert benutzt. Ansonsten wird es auf stdout umgelenkt, sofern es auf ein zeichenorientiertes Gert zeigt. UNIXMODE Wenn diese Environmentvariable das Zeichen / enthlt, dann werden alle Schrgstriche in Parametern durch Pfadtrennzeichen ersetzt. Wenn / zweimal vorhanden ist, werden auch Ausgaben entsprechend gewandelt. EXIT STATUS 0 Alles in Ordnung. >0 Es ist ein Fehler aufgetreten. AUTOR Copyright (c) 28. April 1994 Julian F. Reschke (jr@ms.maus.de) FEHLER Aufgrund eines Fehlers in der Routine Dfree(2) lterer GEMDOS- Versionen sind auf TOS-Dateisystemen selbst auf einem leeren Medium immer mindestens zwei Blcke belegt (bis ausschlielich GEMDOS 0.30 bzwm. Mag!x). Die korrekte Erkennung von SCSI-Gerten klappt zur Zeit nur bei AHDI 4.00 (und dazu kompatiblen Treibern) sowie bei XHDI-1.0- kompatiblen Treibern. Die Zuordnung von GEMDOS-Dateisystemnamen zu BIOS-Gertennummern ist prinzipiell unsicher und knnte unter Umstnden zu falschen Ergebnissen fhren. SIEHE AUCH XHDI-Spezifikation, Version 1.20 AHDI 3.00 Release Notes, Atari Corporation, 18. April 1990, du(1), mupftool(1), version(1m), Dfree(2), Sversion(2)