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 >
Pascal/Delphi Source File  |  1996-02-25  |  5KB  |  158 lines

  1. UNIT PortIO;
  2.  
  3. {**************************************************************************
  4.  *                 General Unit for Speed-Pascal/2                        *
  5.  *                                                                        *
  6.  *    PORT Input/Output Operations                                        *
  7.  *    (C) 1995..96 SpeedSoft                                              *
  8.  *                                                                        *
  9.  * Suggested by Ralf Brandt @ 2:2410/104.3 (28.10.94)                     *
  10.  *                                                                        *
  11.  **************************************************************************}
  12.  
  13. INTERFACE
  14.  
  15. USES Os2Def;
  16.  
  17. FUNCTION ReadBytePort(PortAdress:WORD;VAR value:BYTE):BOOLEAN;
  18. FUNCTION ReadWordPort(PortAdress:WORD;VAR value:WORD):BOOLEAN;
  19. FUNCTION WriteBytePort(PortAdress:WORD;value:BYTE):BOOLEAN;
  20. FUNCTION WriteWordPort(PortAdress:WORD;value:Word):BOOLEAN;
  21. FUNCTION ReadPhysMemory(Address:LONGWORD;VAR Buf;Count:LONGWORD):BOOLEAN;
  22.  
  23. IMPLEMENTATION
  24.  
  25. CONST
  26.      TSTCFG_CAT         =$80;
  27.      TSTCFG_FCN_PHYS    =$40;
  28.      TSTCFG_FCN_INPUT   =$41;
  29.      TSTCFG_FCN_OUTPUT  =$42;
  30.  
  31. CONST
  32.      IODriverName:STRING='TESTCFG$'; {Driver name for Port I/O}
  33.  
  34. VAR
  35.      IODriverHandle:LONGWORD;
  36.      IOAction:LONGWORD;
  37.      IOOldExit:POINTER;
  38.  
  39. TYPE
  40.     TPortAddr=RECORD
  41.                     ioaddr:WORD;
  42.                     iowidth:WORD;
  43.                     iovalue:WORD;
  44.               END;
  45.  
  46.     TPhysAddr=RECORD
  47.                     Command:LONGWORD;
  48.                     address:LONGWORD;
  49.                     Bytes:LONGWORD;
  50.               END;
  51.  
  52. IMPORTS
  53.   FUNCTION DosOpen(pszFileName:PSZ;VAR pHf:LONGWORD;VAR pulAction:ULONG;
  54.                    cbFile,ulAttribute,fsOpenFlags,fsOpenMode:ULONG;
  55.                    VAR apeaop2):APIRET;
  56.                      APIENTRY;             DOSCALLS index 273;
  57.   FUNCTION DosClose(aHFile:LONGWORD):APIRET;
  58.                     APIENTRY;             DOSCALLS index 257;
  59.   FUNCTION DosDevIOCtl(hDevice:LONGWORD;category,afunction:ULONG;
  60.                      VAR pParams;cbParmLenMax:ULONG;VAR pcbParmLen:ULONG;
  61.                      VAR pData;cbDataLenMax:ULONG;VAR pcbDataLen:ULONG):APIRET;
  62.                     APIENTRY;             DOSCALLS index 284;
  63. END;
  64.  
  65.  
  66. FUNCTION ReadBytePort(PortAdress:WORD;VAR value:BYTE):BOOLEAN;
  67. VAR
  68.    PortAddr:TPortAddr;
  69. BEGIN
  70.      PortAddr.IoAddr:=PortAdress;
  71.      PortAddr.IoWidth:=1;
  72.      IF DosDevIoCtl(IODriverHandle,TSTCFG_CAT,TSTCFG_FCN_INPUT,PortAddr,
  73.                      SizeOf(TPortAddr),NIL,Value,1,NIL)<>0 THEN
  74.      ReadBytePort:=FALSE
  75.      ELSE ReadBytePort:=TRUE;
  76. END;
  77.  
  78. FUNCTION ReadWordPort(PortAdress:WORD;VAR value:WORD):BOOLEAN;
  79. VAR
  80.    PortAddr:TPortAddr;
  81. BEGIN
  82.      PortAddr.IoAddr:=PortAdress;
  83.      PortAddr.IoWidth:=2;
  84.      IF DosDevIoCtl(IODriverHandle,TSTCFG_CAT,TSTCFG_FCN_INPUT,PortAddr,
  85.                      SizeOf(TPortAddr),NIL,Value,2,NIL)<>0 THEN
  86.      ReadWordPort:=FALSE
  87.      ELSE ReadWordPort:=TRUE;
  88. END;
  89.  
  90. FUNCTION WriteBytePort(PortAdress:WORD;value:BYTE):BOOLEAN;
  91. VAR
  92.    PortAddr:TPortAddr;
  93. BEGIN
  94.      PortAddr.IoAddr:=PortAdress;
  95.      PortAddr.IoWidth:=1;
  96.      PortAddr.IoValue:=value;
  97.      IF DosDevIoCtl(IoDriverHandle,TSTCFG_CAT,TSTCFG_FCN_OUTPUT,PortAddr,
  98.                  SizeOf(TPortAddr),NIL,Value,1,NIL)<>0 THEN
  99.      WriteBytePort:=FALSE
  100.      ELSE WriteBytePort:=TRUE;
  101. END;
  102.  
  103. FUNCTION WriteWordPort(PortAdress:WORD;value:Word):BOOLEAN;
  104. VAR
  105.    PortAddr:TPortAddr;
  106. BEGIN
  107.      PortAddr.IoAddr:=PortAdress;
  108.      PortAddr.IoWidth:=2;
  109.      PortAddr.IoValue:=value;
  110.      IF DosDevIoCtl(IoDriverHandle,TSTCFG_CAT,TSTCFG_FCN_OUTPUT,PortAddr,
  111.                  SizeOf(TPortAddr),NIL,Value,2,NIL)<>0 THEN
  112.      WriteWordPort:=FALSE
  113.      ELSE WriteWordPort:=TRUE;
  114. END;
  115.  
  116.  
  117. FUNCTION ReadPhysMemory(Address:LONGWORD;VAR Buf;Count:LONGWORD):BOOLEAN;
  118. VAR
  119.    PhysAddr:TPhysAddr;
  120. BEGIN
  121.      PhysAddr.Command:=0;
  122.      PhysAddr.Address:=Address;
  123.      PhysAddr.Bytes:=Count;
  124.      IF DosDevIoCtl(IODriverHandle,TSTCFG_CAT,TSTCFG_FCN_PHYS,PhysAddr,
  125.                  sizeof(TPhysAddr),NIL,Buf,Count,NIL)<>0 THEN
  126.      ReadPhysMemory:=FALSE
  127.      ELSE ReadPhysMemory:=TRUE;
  128. END;
  129.  
  130. FUNCTION GetBytePort(PortAddress : Word) : Byte; {Substitute for Port[]}
  131. VAR
  132.    PortValue:BYTE;
  133. BEGIN
  134.      ReadBytePort(PortAddress,PortValue);
  135.      GetBytePort:=PortValue;
  136. END;
  137.  
  138. FUNCTION GetWordPort(PortAddress : Word) : Word; {Substitute for PortW[]}
  139. VAR
  140.    PortValue:WORD;
  141. BEGIN
  142.      ReadWordPort(PortAddress,PortValue);
  143.      GetWordPort:=PortValue;
  144. END;
  145.  
  146.  
  147. PROCEDURE IOExit;
  148. BEGIN
  149.      ExitProc:=IOOldExit;
  150.      IF IoDriverHandle<>0 THEN DosClose(IoDriverHandle);
  151. END;
  152.  
  153. BEGIN
  154.      IOOldExit:=ExitProc;
  155.      ExitProc:=@IOExit;
  156.      DosOpen(IODriverName,IoDriverHandle,IoAction,0,0,1,$40,NIL);
  157. END.
  158.