#ifndef _PRVDRV_DYNAMIC_H_
#define _PRVDRV_DYNAMIC_H_

// =============================================
// prvdrv_dynamic.h - headers for generic driver
// =============================================
// (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_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 - Dynamic Prototypes
// ===========================================

void prvdrv_DllLoad(void);
void prvdrv_DllClose(void);

PRVDRV_RANGES*	(*prvdrv_CardRanges)(void);
void			(*prvdrv_Close)(void);
char*			(*prvdrv_ErrorString)(void);
PRVDRV_RESULT	(*prvdrv_Open)(void);
unsigned int	(*prvdrv_Read)(PRVDRV_ACCESSTYPE mde, PRVDRV_WORDSIZE sze, unsigned int rnge, unsigned int offset);
unsigned int	(*prvdrv_ReadShadow)(PRVDRV_ACCESSTYPE mde, PRVDRV_WORDSIZE sze, unsigned int rnge, unsigned int offset);
void			(*prvdrv_Write)(PRVDRV_ACCESSTYPE mde, PRVDRV_WORDSIZE sze, unsigned int rnge, unsigned int offset, unsigned int val);

void			(*prvdrv_ClearBit)(PRVDRV_ACCESSTYPE mde, PRVDRV_WORDSIZE sze, unsigned int rnge, unsigned int offset, unsigned int bit);
void			(*prvdrv_GetBit)(PRVDRV_ACCESSTYPE mde, PRVDRV_WORDSIZE sze, unsigned int rnge, unsigned int offset, unsigned int bit);
void			(*prvdrv_RemoveAllShadow)(void);
void			(*prvdrv_SetBit)(PRVDRV_ACCESSTYPE mde, PRVDRV_WORDSIZE sze, unsigned int rnge, unsigned int offset, unsigned int bit);
void			(*prvdrv_SetShadow)(PRVDRV_ACCESSTYPE mde, PRVDRV_WORDSIZE sze, unsigned int rnge, unsigned int offset, unsigned int items);
void			(*prvdrv_ToggleBit)(PRVDRV_ACCESSTYPE mde, PRVDRV_WORDSIZE sze, unsigned int rnge, unsigned int offset, unsigned int bit);

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


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_DYNAMIC_H_
