#ifndef _PRVDRV_H
#define _PRVDRV_H

// =============================================
// prvdrv.h - headers for use with generic drive
// =============================================
// (c) Copyright 2000
// The Parvus Corporation
// 396 Ironwood Drive
// Salt Lake City, UT 84115
// Tel:      (801) 483-1533
// Fax:      (801) 483-1523
// Web:      www.parvus.com
// Email:    parvus@parvus.com
// ---------------------------------------------
//   Revision History:
// ---------------------------------------------
//
//   10/15/2000 CG - V1.00.00 release
//	 10/22/2000 CG - Add RemoveAllShadow() function
//
// ---------------------------------------------

#ifdef __cplusplus
extern "C" {
#endif

// -----------
// Definitions
// -----------

#define MAX_IO	8								// max num of I/O ranges in driver
#define MAX_MEM	8								// max num of Memory ranges in driver
#define MAX_STRING 80							// max num of characters in an I/O string


typedef enum
{
    PRVDRV_OK	= 0,							// function executed OK
    PRVDRV_FAIL	= 1,							// function failed
	PRVDRV_CLOSED = 2							// been closed by user
}
PRVDRV_RESULT;


typedef enum
{
    PRVDRV_IO   = 0,
    PRVDRV_MEM   = 1
}
PRVDRV_ACCESSTYPE;


typedef enum
{
    PRVDRV_BYTE   = 0,
    PRVDRV_WORD   = 1,
    PRVDRV_DWORD  = 2
}
PRVDRV_WORDSIZE;

#define	prvdrv_BIT		0						// bit access
#define prvdrv_STRING	4						// string access


typedef struct PRVDRV_RANGE
{
	unsigned int	base;						// base address of the range
	unsigned int	bytes;						// number of bytes in the range
	unsigned int	offset;						// orginal WinDriver offset
}
PRVDRV_RANGE;


typedef struct PRVDRV_RANGES
{
	unsigned int	nRanges;					// Total number of ranges
	unsigned int	nIo;						// Number of IO ranges
	unsigned int	nMem;						// Number of Memory ranges
    PRVDRV_RANGE	io[MAX_IO];					// IO range values
    PRVDRV_RANGE	mem[MAX_MEM];				// MEM range values
}
PRVDRV_RANGES;


// ====================================
// DLL callable functions - Prototypes
// ===================================

PRVDRV_RANGES* prvdrv_CardRanges(void);			// Return the I/O and Memory Ranges

void prvdrv_ClearBit(							// Clear bit in the Range
				PRVDRV_ACCESSTYPE	mde,
				PRVDRV_WORDSIZE		sze,
				unsigned int		rnge,
				unsigned int		offset,
				unsigned int		bit);

void prvdrv_Close(void);						// Terminate the DLL

char* prvdrv_ErrorString(void);					// Return the DLL ErrorString

unsigned int prvdrv_GetBit(						// Get bit in the Range
				PRVDRV_ACCESSTYPE	mde,
				PRVDRV_WORDSIZE		sze,
				unsigned int		rnge,
				unsigned int		offset,
				unsigned int		bit);

PRVDRV_RESULT prvdrv_Open(void);				// Initialize the DLL

unsigned int prvdrv_Read(						// Read an item from a Range
				PRVDRV_ACCESSTYPE mde,			// mode PRVDRV_IO, PRVDRV_MEM
				PRVDRV_WORDSIZE   sze,			// size PRVDRV_BYTE, etc
				unsigned int	  rnge,			// range index for I/O or MEM, 0,1,2 etc
				unsigned int	  offset);		// offset from base for read

void prvdrv_ReadBlock(							// Write an item to a Range
				PRVDRV_ACCESSTYPE mde,			// mode PRVDRV_IO, PRVDRV_MEM
				PRVDRV_WORDSIZE   sze,			// size PRVDRV_BYTE, etc
				unsigned int	  rnge,			// range index for I/O or MEM, 0,1,2 etc
				unsigned int	  offset,		// offset from base for read
				void*			  pblk,			// pointer to block to write back to
				unsigned int	  len);			// number of items to write

unsigned int prvdrv_ReadShadow(					// Read an item from a Range first from Shadow, else Real
				PRVDRV_ACCESSTYPE mde,			// mode PRVDRV_IO, PRVDRV_MEM
				PRVDRV_WORDSIZE   sze,			// size PRVDRV_BYTE, etc
				unsigned int	  rnge,			// range index for I/O or MEM, 0,1,2 etc
				unsigned int	  offset);		// offset from base for read

void prvdrv_RemoveAllShadow(void);				// Reset the Shadow

void prvdrv_SetBit(								// Set a bit in the Range
				PRVDRV_ACCESSTYPE	mde,
				PRVDRV_WORDSIZE		sze,
				unsigned int		rnge,
				unsigned int		offset,
				unsigned int		bit);

void prvdrv_SetShadow(							// Set up Shadow items
				PRVDRV_ACCESSTYPE mde,			// mode PRVDRV_IO, PRVDRV_MEM
				PRVDRV_WORDSIZE   sze,			// size PRVDRV_BYTE, etc
				unsigned int	  rnge,			// range index for I/O or MEM, 0,1,2 etc
				unsigned int	  offset,		// offset from base for read
				unsigned int	  items);		// number of items to shadow

void prvdrv_ToggleBit(							// Toggle a bit in the Range
				PRVDRV_ACCESSTYPE	mde,
				PRVDRV_WORDSIZE		sze,
				unsigned int		rnge,
				unsigned int		offset,
				unsigned int		bit);

void prvdrv_Write(								// Write an item to a Range
				PRVDRV_ACCESSTYPE mde,			// mode PRVDRV_IO, PRVDRV_MEM
				PRVDRV_WORDSIZE   sze,			// size PRVDRV_BYTE, etc
				unsigned int	  rnge,			// range index for I/O or MEM, 0,1,2 etc
				unsigned int	  offset,		// offset from base for read
				unsigned int	  val);			// value to be written

void prvdrv_WriteBlock(							// Write an item to a Range
				PRVDRV_ACCESSTYPE mde,			// mode PRVDRV_IO, PRVDRV_MEM
				PRVDRV_WORDSIZE   sze,			// size PRVDRV_BYTE, etc
				unsigned int	  rnge,			// range index for I/O or MEM, 0,1,2 etc
				unsigned int	  offset,		// offset from base for read
				void*			  pblk,			// pointer to block to write
				unsigned int	  len);			// number of items to write

#ifdef __cplusplus
}
#endif

#endif // _PRVDRV_H
