home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Vectronix 2
/
VECTRONIX2.iso
/
FILES_01
/
HDPSTACK.LZH
/
HDPSTACK.MSA
/
HDPSTACK
/
SOURCE
/
XHDI.I
< prev
Wrap
Text File
|
1995-03-06
|
9KB
|
333 lines
IMPLEMENTATION MODULE XHDI;
FROM BIOS IMPORT RW, BPB, DriveSet;
FROM CookieJar IMPORT GetCookie;
FROM SYSTEM IMPORT ADDRESS, CAST, ADR, CALLEXT;
FROM SysUtil2 IMPORT ModeBuf, EnterSupervisorMode,
LeaveSupervisorMode;
CONST XHDICookie = 'XHDI';
XHDIMagic = $27011992;
PROCEDURE GetXHDI (VAR adr: ADDRESS): BOOLEAN;
VAR helpPtr: POINTER TO LONGCARD;
BEGIN
IF GetCookie (XHDICookie, adr)
THEN
helpPtr:= adr;
DEC (helpPtr, SIZE (LONGCARD));
RETURN (helpPtr^ = XHDIMagic);
ELSE
RETURN FALSE;
END;
END GetXHDI;
PROCEDURE XHGetVersion (): CARDINAL;
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 0));
LeaveSupervisorMode (hdl);
RETURN VAL (CARDINAL, XHDIResult);
ELSE
RETURN 0;
END;
END XHGetVersion;
PROCEDURE XHInqTarget (major, minor: CARDINAL;
VAR blockSize: LONGCARD;
VAR deviceFlags: DeviceFlagSet;
VAR productName: ARRAY OF CHAR);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 1, major, minor, ADR (blockSize),
ADR (deviceFlags), ADR (productName)));
LeaveSupervisorMode (hdl);
END;
END XHInqTarget;
PROCEDURE XHReserve (major, minor: CARDINAL; doReserve: BOOLEAN;
VAR key: CARDINAL);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 2, major, minor, doReserve, key));
LeaveSupervisorMode (hdl);
key:= CAST (CARDINAL, XHDIResult);
IF doReserve AND (XHDIResult > 0)
THEN
XHDIResult:= 0;
END;
END;
END XHReserve;
PROCEDURE XHLock (major, minor: CARDINAL; doLock: BOOLEAN;
key: CARDINAL);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 3, major, minor, doLock, key));
LeaveSupervisorMode (hdl);
END;
END XHLock;
PROCEDURE XHStop (major, minor: CARDINAL; doStop: BOOLEAN;
key: CARDINAL);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 4, major, minor, doStop, key));
LeaveSupervisorMode (hdl);
END;
END XHStop;
PROCEDURE XHEject (major, minor: CARDINAL; doEject: BOOLEAN;
key: CARDINAL);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 5, major, minor, doEject, key));
LeaveSupervisorMode (hdl);
END;
END XHEject;
PROCEDURE XHDrvMap (): DriveSet;
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 6));
LeaveSupervisorMode (hdl);
RETURN CAST (DriveSet, XHDIResult);
ELSE
RETURN DriveSet{};
END;
END XHDrvMap;
PROCEDURE XHInqDev (dev: CARDINAL; VAR major, minor: CARDINAL;
VAR startSector: LONGCARD; VAR bpb: BPB);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 7, dev, ADR (major), ADR (minor),
ADR (startSector), ADR (bpb)));
LeaveSupervisorMode (hdl);
END;
END XHInqDev;
PROCEDURE XHInqDriver (dev: CARDINAL; VAR name, version, company: ARRAY OF CHAR;
VAR AHDIVersion, maxIPL: CARDINAL);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 8, dev, ADR (name), ADR (version),
ADR (company), ADR (AHDIVersion), ADR (maxIPL)));
LeaveSupervisorMode (hdl);
END;
END XHInqDriver;
PROCEDURE XHNewCookie (newCookie: ADDRESS);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 9, newCookie));
LeaveSupervisorMode (hdl);
END;
END XHNewCookie;
PROCEDURE XHReadWrite (major, minor: CARDINAL; rw: RW;
recno: LONGCARD; count: CARDINAL; buf: ADDRESS);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 10, major, minor, rw,
recno, count, buf));
LeaveSupervisorMode (hdl);
END;
END XHReadWrite;
PROCEDURE XHInqTarget2 (major, minor: CARDINAL;
VAR blockSize: LONGCARD;
VAR deviceFlags: DeviceFlagSet;
VAR productName: ARRAY OF CHAR);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 11, major, minor, ADR (blockSize),
ADR (deviceFlags), ADR (productName), HIGH (productName)));
LeaveSupervisorMode (hdl);
END;
END XHInqTarget2;
PROCEDURE XHInqDev2 (dev: CARDINAL; VAR major, minor: CARDINAL;
VAR startSector: LONGCARD; VAR bpb: BPB;
VAR blocks: LONGCARD; VAR partid: ARRAY OF CHAR);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 12, dev, ADR (major), ADR (minor),
ADR (startSector), ADR (bpb), ADR (blocks), ADR (partid)));
LeaveSupervisorMode (hdl);
END;
END XHInqDev2;
PROCEDURE XHDriverSpecial (key1, key2: LONGCARD; subOpcode: CARDINAL;
data: ADDRESS);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 13, key1, key2, subOpcode, data));
LeaveSupervisorMode (hdl);
END;
END XHDriverSpecial;
PROCEDURE XHGetCapacity (major, minor: CARDINAL; VAR blocks: LONGCARD;
VAR blockSize: LONGCARD);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 14, major, minor, ADR (blocks),
ADR (blockSize)));
LeaveSupervisorMode (hdl);
END;
END XHGetCapacity;
PROCEDURE XHMediumChanged (major, minor: CARDINAL): BOOLEAN;
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 15, major, minor));
LeaveSupervisorMode (hdl);
RETURN (XHDIResult = 0);
ELSE RETURN FALSE;
END;
END XHMediumChanged;
PROCEDURE XHMiNTInfo (opcode: CARDINAL; data: ADDRESS);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 16, opcode, data));
LeaveSupervisorMode (hdl);
END;
END XHMiNTInfo;
PROCEDURE XHDOSLimits (which: CARDINAL; limit: LONGCARD);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 17, which, limit));
LeaveSupervisorMode (hdl);
END;
END XHDOSLimits;
PROCEDURE XHLastAccess (major, minor: CARDINAL; VAR ms: LONGCARD);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 18, major, minor, ADR (ms)));
LeaveSupervisorMode (hdl);
END;
END XHLastAccess;
PROCEDURE XHReaccess (major, minor: CARDINAL);
VAR adr: ADDRESS;
hdl: ModeBuf;
BEGIN
IF GetXHDI (adr)
THEN
EnterSupervisorMode (hdl);
XHDIResult:= CAST (LONGINT, CALLEXT (adr, 19, major, minor));
LeaveSupervisorMode (hdl);
END;
END XHReaccess;
PROCEDURE XHMakeName (major, minor: CARDINAL; startSector: LONGCARD;
VAR name: ARRAY OF CHAR);
BEGIN
END XHMakeName;
END XHDI.