home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
sp15demo.zip
/
libsrc.zip
/
LIBSRC
/
PORTIO.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-02-25
|
5KB
|
158 lines
UNIT PortIO;
{**************************************************************************
* General Unit for Speed-Pascal/2 *
* *
* PORT Input/Output Operations *
* (C) 1995..96 SpeedSoft *
* *
* Suggested by Ralf Brandt @ 2:2410/104.3 (28.10.94) *
* *
**************************************************************************}
INTERFACE
USES Os2Def;
FUNCTION ReadBytePort(PortAdress:WORD;VAR value:BYTE):BOOLEAN;
FUNCTION ReadWordPort(PortAdress:WORD;VAR value:WORD):BOOLEAN;
FUNCTION WriteBytePort(PortAdress:WORD;value:BYTE):BOOLEAN;
FUNCTION WriteWordPort(PortAdress:WORD;value:Word):BOOLEAN;
FUNCTION ReadPhysMemory(Address:LONGWORD;VAR Buf;Count:LONGWORD):BOOLEAN;
IMPLEMENTATION
CONST
TSTCFG_CAT =$80;
TSTCFG_FCN_PHYS =$40;
TSTCFG_FCN_INPUT =$41;
TSTCFG_FCN_OUTPUT =$42;
CONST
IODriverName:STRING='TESTCFG$'; {Driver name for Port I/O}
VAR
IODriverHandle:LONGWORD;
IOAction:LONGWORD;
IOOldExit:POINTER;
TYPE
TPortAddr=RECORD
ioaddr:WORD;
iowidth:WORD;
iovalue:WORD;
END;
TPhysAddr=RECORD
Command:LONGWORD;
address:LONGWORD;
Bytes:LONGWORD;
END;
IMPORTS
FUNCTION DosOpen(pszFileName:PSZ;VAR pHf:LONGWORD;VAR pulAction:ULONG;
cbFile,ulAttribute,fsOpenFlags,fsOpenMode:ULONG;
VAR apeaop2):APIRET;
APIENTRY; DOSCALLS index 273;
FUNCTION DosClose(aHFile:LONGWORD):APIRET;
APIENTRY; DOSCALLS index 257;
FUNCTION DosDevIOCtl(hDevice:LONGWORD;category,afunction:ULONG;
VAR pParams;cbParmLenMax:ULONG;VAR pcbParmLen:ULONG;
VAR pData;cbDataLenMax:ULONG;VAR pcbDataLen:ULONG):APIRET;
APIENTRY; DOSCALLS index 284;
END;
FUNCTION ReadBytePort(PortAdress:WORD;VAR value:BYTE):BOOLEAN;
VAR
PortAddr:TPortAddr;
BEGIN
PortAddr.IoAddr:=PortAdress;
PortAddr.IoWidth:=1;
IF DosDevIoCtl(IODriverHandle,TSTCFG_CAT,TSTCFG_FCN_INPUT,PortAddr,
SizeOf(TPortAddr),NIL,Value,1,NIL)<>0 THEN
ReadBytePort:=FALSE
ELSE ReadBytePort:=TRUE;
END;
FUNCTION ReadWordPort(PortAdress:WORD;VAR value:WORD):BOOLEAN;
VAR
PortAddr:TPortAddr;
BEGIN
PortAddr.IoAddr:=PortAdress;
PortAddr.IoWidth:=2;
IF DosDevIoCtl(IODriverHandle,TSTCFG_CAT,TSTCFG_FCN_INPUT,PortAddr,
SizeOf(TPortAddr),NIL,Value,2,NIL)<>0 THEN
ReadWordPort:=FALSE
ELSE ReadWordPort:=TRUE;
END;
FUNCTION WriteBytePort(PortAdress:WORD;value:BYTE):BOOLEAN;
VAR
PortAddr:TPortAddr;
BEGIN
PortAddr.IoAddr:=PortAdress;
PortAddr.IoWidth:=1;
PortAddr.IoValue:=value;
IF DosDevIoCtl(IoDriverHandle,TSTCFG_CAT,TSTCFG_FCN_OUTPUT,PortAddr,
SizeOf(TPortAddr),NIL,Value,1,NIL)<>0 THEN
WriteBytePort:=FALSE
ELSE WriteBytePort:=TRUE;
END;
FUNCTION WriteWordPort(PortAdress:WORD;value:Word):BOOLEAN;
VAR
PortAddr:TPortAddr;
BEGIN
PortAddr.IoAddr:=PortAdress;
PortAddr.IoWidth:=2;
PortAddr.IoValue:=value;
IF DosDevIoCtl(IoDriverHandle,TSTCFG_CAT,TSTCFG_FCN_OUTPUT,PortAddr,
SizeOf(TPortAddr),NIL,Value,2,NIL)<>0 THEN
WriteWordPort:=FALSE
ELSE WriteWordPort:=TRUE;
END;
FUNCTION ReadPhysMemory(Address:LONGWORD;VAR Buf;Count:LONGWORD):BOOLEAN;
VAR
PhysAddr:TPhysAddr;
BEGIN
PhysAddr.Command:=0;
PhysAddr.Address:=Address;
PhysAddr.Bytes:=Count;
IF DosDevIoCtl(IODriverHandle,TSTCFG_CAT,TSTCFG_FCN_PHYS,PhysAddr,
sizeof(TPhysAddr),NIL,Buf,Count,NIL)<>0 THEN
ReadPhysMemory:=FALSE
ELSE ReadPhysMemory:=TRUE;
END;
FUNCTION GetBytePort(PortAddress : Word) : Byte; {Substitute for Port[]}
VAR
PortValue:BYTE;
BEGIN
ReadBytePort(PortAddress,PortValue);
GetBytePort:=PortValue;
END;
FUNCTION GetWordPort(PortAddress : Word) : Word; {Substitute for PortW[]}
VAR
PortValue:WORD;
BEGIN
ReadWordPort(PortAddress,PortValue);
GetWordPort:=PortValue;
END;
PROCEDURE IOExit;
BEGIN
ExitProc:=IOOldExit;
IF IoDriverHandle<>0 THEN DosClose(IoDriverHandle);
END;
BEGIN
IOOldExit:=ExitProc;
ExitProc:=@IOExit;
DosOpen(IODriverName,IoDriverHandle,IoAction,0,0,1,$40,NIL);
END.