home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Vectronix 2
/
VECTRONIX2.iso
/
FILES_01
/
HDPSTACK.LZH
/
HDPSTACK.MSA
/
HDPSTACK
/
SOURCE
/
XHDI.D
< prev
next >
Wrap
Text File
|
1995-03-06
|
18KB
|
447 lines
DEFINITION MODULE XHDI;
(* XHDI-Bindings für Megamax-Modula2,
* angepasst von Frank Storm @ AC2. Die Beschreibungen sind dem
* Text XHDISPEC.TXT entnommen und leicht modifiziert.
*
* letzte Änderung: 12.11.1994
*)
FROM BIOS IMPORT RW, BPB, DriveSet;
FROM SYSTEM IMPORT ADDRESS;
CONST
(* siehe XHInqTarget *)
XHTargetStoppable = 0;
XHTargetRemovable = 1;
XHTargetLockable = 2;
XHTargetEjectable = 3;
XHTargetLocked = 29;
XHTargetStopped = 30;
XHTargetReserved = 31;
XHMiSetKerInfo = 0;
XHMiGetKerInfo = 1;
XHDLsecsiz = 0;
XHDLminfat = 1;
XHDLmaxfat = 2;
XHDLminspc = 3;
XHDLmaxspc = 4;
XHDLclustc = 5;
XHDLmaxsec = 6;
XHDLdrives = 7;
TYPE DeviceFlagSet = SET OF [0..31];
(* Diese Variable enthält den Return-Code eines XHDI-Aufrufs.
*)
VAR XHDIResult: LONGINT;
PROCEDURE XHGetVersion (): CARDINAL;
(* Liefert die Protokollversion zurück. 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.
*)
PROCEDURE XHInqTarget (major, minor: CARDINAL;
VAR blockSize: LONGCARD;
VAR deviceFlags: DeviceFlagSet;
VAR productName: ARRAY OF CHAR);
(* Liefert Informationen über das durch `major' und `minor' spezifizierte
* Gerät (in `deviceFlags': ein Attributvektor, in `productName':
* optional die Produktbezeichnung des Geräts). Mit `XHReserve ()'
* vorgenommene Reservierungen werden dabei berücksichtigt.
*
* blockSize: Blockgrö₧e auf dem Gerät (für `XHReadWrite()' sehr wichtig).
* Normalerweise 512.
*
* deviceFlags: (Bit gesetzt -> Fähigkeit verfügbar):
*
* Bit 0: Gerät kann gestoppt werden (XHTargetStoppable)
* Bit 1: Gerät hat wechselbare Medien (XHTargetRemovable)
* Bit 2: Auswurf des Geräts kann verriegelt werden
* (XHTargetLockable)
* Bit 3: Medium kann per Kommando ausgeworfen werden
* (XHTargetEjectable)
* Bit 29: Auswurf des Geräts ist vom Treiber blockiert worden
* (XHTargetLocked, ab XHDI 1.25).
* Bit 30: Gerät ist vom Treiber gestoppt worden (XHTargetStopped,
* ab XHDI 1.25).
* Bit 31: Gerät ist zur Zeit blockiert (XHTargetReserved).
*
* Alle weiteren Bits sind reserviert und sollten vom Treiber
* auf Null gesetzt werden.
*
* productName: Produktbezeichnung des Geräts (max. 33 Zeichen inkl.
* eine Zeichenkette der Länge Null zurückgeliefert.
*
* Anmerkung: für IDE-Geräte wird bei `productName' gegebenenfalls auf 32
* Zeichen gekürzt. Siehe auch die neue Funktion `XHInqTarget2'.
*)
PROCEDURE XHReserve (major, minor: CARDINAL; doReserve: BOOLEAN;
VAR key: CARDINAL);
(* Reserviert ein Gerät bzw. gibt es wieder frei. Auf reservierte Geräte
* kann nur bei Angabe des korrekten Schlüssels 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-Schlüssel
* zurückgeliefert. Dieser Schlüssel mu₧ bei allen weiteren Zugriffen auf
* das Gerät angegeben sowie beim Wieder-Freigeben angegeben werden.
*
* doReserve: TRUE Reservieren oder FALSE wieder freigeben.
* key: (nur beim Freigeben benutzt).
*)
PROCEDURE XHLock (major, minor: CARDINAL; doLock: BOOLEAN;
key: CARDINAL);
(* Verriegelt bzw. entriegelt den Auswurfknopf eines Geräts. Der Treiber
* hat sich darum zu kümmern, ob dieser Befehl an das Gerät weitergeleitet
* wird oder nicht (falls das Medium nicht verriegelbar ist).
*
* Welchen Code man im Fehlerfall zurückerhält, ist undefiniert. Mehr
* Informationen werden allerdings auch nicht benötigt, da man ja mit
* `XHInqTarget()' vorher gezielt auf diese Fähigkeit abtesten kann.
*
* doLock: TRUE Verriegeln oder FALSE Entriegeln.
* key: Falls Gerät reserviert, sonst Null übergeben.
*)
PROCEDURE XHStop (major, minor: CARDINAL; doStop: BOOLEAN;
key: CARDINAL);
(* Gerät wird gestoppt (geparkt) bzw. gestartet (entparkt).
*
* Welchen Code man im Fehlerfall zurückerhält, ist undefiniert. Mehr
* Informationen werden allerdings auch nicht benötigt, da man ja mit
* `XHInqTarget()' vorher gezielt auf diese Fähigkeit abtesten kann.
*
* doStop: TRUE Stoppen oder FALSE Starten.
* key: Falls Gerät reserviert, sonst Null übergeben.
*
* Anmerkung: Bei etwaigen Zugriffen auf das gestoppte Gerät sollte der
* Treiber selbst für das Wiederhochfahren sorgen.
*)
PROCEDURE XHEject (major, minor: CARDINAL; doEject: BOOLEAN;
key: CARDINAL);
(* Medium wird ausgeworfen oder eingezogen.
*
* Welchen Code man im Fehlerfall zurückerhält, ist undefiniert. Mehr
* Informationen werden allerdings auch nicht benötigt, da man ja mit
* `XHInqTarget()' vorher gezielt auf diese Fähigkeit abtesten kann.
*
* doEject: Medium auswerfen (TRUE) oder einziehen (FALSE).
* key: Falls Gerät reserviert, sonst Null übergeben.
*)
PROCEDURE XHDrvMap (): DriveSet;
(* Liefert einen Bitvektor mit den über das XHDI-Protokoll unterstützten
* BIOS-Gerätenummern (wie etwa bei `Drvmap()').
*)
PROCEDURE XHInqDev (dev: CARDINAL; VAR major, minor: CARDINAL;
VAR startSector: LONGCARD; VAR 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 zurückgesetzt).
*
* Anmerkung: es wird ein Zeiger auf eine vom Aufrufer bereitgestellte BPB-
* Struktur übergeben, die vom XHDI-Treiber gefüllt 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 zurückgeliefert 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 zurückgelieferte BPB ist ungültig, 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: für `major', `minor', `start_sector' und `bpb' dürfen auch
* Nullzeiger übergeben werden.
*)
PROCEDURE XHInqDriver (dev: CARDINAL; VAR name, version, company: ARRAY OF CHAR;
VAR AHDIVersion, maxIPL: CARDINAL);
(* 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).
* AHDIVersion: AHDI-Versionslevel (wie PUN_INFO-Struktur).
* maxIPL: Höchster IPL, unter dem der Treiber für das angegebene Gerät
* arbeitsfähig ist (Normalwert für Treiber, die ihr Timing per
* _hz_200 erledigen: 5).
*)
PROCEDURE XHNewCookie (newCookie: ADDRESS);
(* - 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
* unterstützt 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 führt.
*
* 2. Anderenfalls den Cookie `per Hand' versetzen.
*)
PROCEDURE XHReadWrite (major, minor: CARDINAL; rw: RW;
recno: LONGCARD; count: CARDINAL; buf: ADDRESS);
(* Äquivalent zur BIOS-Funktion `RWAbs()' zum Lesen bzw. Schreiben
* physikalischer Blocknummern.
*
* rw: Art der Lese-/Schreiboperation
* recno: Sektornummer
* count: Anzahl der Blöcke
* buf: Zeiger auf Puffer.
*)
PROCEDURE XHInqTarget2 (major, minor: CARDINAL;
VAR blockSize: LONGCARD;
VAR deviceFlags: DeviceFlagSet;
VAR productName: ARRAY OF CHAR);
(* - 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 berücksichtigt.
*
* block_size: Blockgrö₧e auf dem Gerät (für `XHReadWrite()' sehr wichtig).
* Normalerweise 512.
*
* device_flags: (Bit gesetzt -> Fähigkeit verfügbar):
*
* Bit 0: Gerät kann gestoppt werden (XHTargetStoppable)
* Bit 1: Gerät hat wechselbare Medien (XHTargetRemovable)
* Bit 2: Auswurf des Geräts kann verriegelt werden
* (XHTargetLockable)
* Bit 3: Medium kann per Kommando ausgeworfen werden
* (XHTargetEjectable)
* Bit 29: Auswurf des Geräts ist vom Treiber blockiert worden
* (XHTargetLocked, ab XHDI 1.25)
* Bit 30: Gerät ist vom Treiber gestoppt worden (XHTargetStopped,
* ab XHDI 1.25)
* Bit 31: Geräte ist zur Zeit blockiert (XHTargetReserved)
*
* 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 verfügbar ist, wird
* eine Zeichenkette der Länge Null zurückgeliefert.
*
* Anmerkung: für `blocksize', `device_flags' und `product_name' dürfen
* auch Nullzeiger übergeben werden. Produktbezeichnungen von IDE-Geräten
* können bis zu 40 Zeichen lang sein.
*)
PROCEDURE XHInqDev2 (dev: CARDINAL; VAR major, minor: CARDINAL;
VAR startSector: LONGCARD; VAR bpb: BPB;
VAR blocks: LONGCARD; VAR partid: ARRAY OF CHAR);
(* - 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 zurückgesetzt), 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 gefüllt 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 zurückgeliefert 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 zurückgelieferte BPB ist ungültig, wenn das Element `recsiz' Null ist.
*
* Wenn die Partitionkennung nicht verfügbar ist (keine Atari-Partitionierung
* oder überhaupt keine Partitionierung, beispielsweise bei normal
* formatierten Disketten in SCSI-Diskettenlaufwerken), wird als
* Partitionkennung eine leere Zeichenkette zurückgegeben.
*
* 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' (für 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: für `major', `minor', `start_sector', `bpb', `blocks' und
* `partid' dürfen auch Nullzeiger übergeben werden.
*)
PROCEDURE XHDriverSpecial (key1, key2: LONGCARD; subOpcode: CARDINAL;
data: ADDRESS);
(* - OPTIONALE Funktion, darf also mit EINVFN beantwortet werden -
*
* Dieser Opcode kann für 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 willkürlich gewählten Long-Wert (etwa dem Datum der
* Definition im BCD-Format).
*)
PROCEDURE XHGetCapacity (major, minor: CARDINAL; VAR blocks: LONGCARD;
VAR blockSize: LONGCARD);
(* - 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 zurück (Vorsicht: je nach
* verwendeter Hardware kann die Ausführung dieser Funktion mehrere Sekunden
* dauern!).
*)
PROCEDURE XHMediumChanged (major, minor: CARDINAL): BOOLEAN;
(* - OPTIONALE Funktion, darf also mit EINVFN beantwortet werden -
*
* Informiert den Treiber darüber, 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
* zurückgeliefert, wenn die Information richtig verarbeitet wurde (also alle
* logischen Laufwerke auf dem Gerät entweder deaktiviert sind oder benutzt
* werden können).
*)
PROCEDURE XHMiNTInfo (opcode: CARDINAL; data: ADDRESS);
(* - 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 zurückgeliefert, wenn die verlangte
* Funktion korrekt ausgeführt werden konnte):
*
* XHMiSetKerInfo (0)
*
* Übermittelt in `data' dem Treiber einen Zeiger auf die
* MiNT-Kernel-Info-Struktur. Der Treiber kann diese benutzen, um
* beispielsweise direkt Kernelfunktionen aufzurufen.
*
* XHMiGetKerInfo (1)
*
* 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 zurückgeliefert).
*)
PROCEDURE XHDOSLimits (which: CARDINAL; limit: LONGCARD);
(* - 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 für: nicht ändern). Ergebnis
* ist der bisherige Wert für das Limit.
*
* Konstanten für `which':
*
* XHDLsecsiz (0): maximale Sektorgrö₧e auf BIOS-Ebene
* XHDLminfat (1): minimale Anzahl von FATs
* XHDLmaxfat (2): maximale Anzahl von FATs
* XHDLminspc (3): Sektoren/Cluster minimal
* XHDLmaxspc (4): Sektoren/Cluster maximal
* XHDLclustc (5): maximale Clusterzahl
* XHDLmaxsec (6): maximale Zahl von Sektoren
* XHDLdrives (7): maximale Zahl der vom DOS unterstützen BIOS-Laufwerke
*)
PROCEDURE XHLastAccess (major, minor: CARDINAL; VAR ms: LONGCARD);
(* - AB XHDI-Version 1.25 -
*
* Liefert in `ms' zurück, wieviele Millisekunden seit dem letzten
* erfolgreichen Lese- oder Schreibzugriff auf das Gerät vergangen sind.
*)
PROCEDURE XHReaccess (major, minor: CARDINAL);
(* - AB XHDI-Version 1.25 -
*
* Ein Aufruf dieser Funktion veranla₧t den Treiber, das angegebene Gerät auf
* einen Mediachange zu überprüfen und gegebenenfalls die
* Partitioninformationen entsprechend zu aktualisieren (wie
* `XHMediumChanged()', nur da₧ der Treiber selbst das Gerät befragt, ob ein
* Medienwechsel stattgefunden hat).
*)
PROCEDURE XHMakeName (major, minor: CARDINAL; startSector: LONGCARD;
VAR name: ARRAY OF CHAR);
END XHDI.