windows-nt/Source/XPSP1/NT/drivers/wdm/capture/mini/bt848/regbase.h
2020-09-26 16:20:57 +08:00

96 lines
2.9 KiB
C++

// $Header: G:/SwDev/WDM/Video/bt848/rcs/Regbase.h 1.5 1998/05/08 00:11:02 tomz Exp $
#ifndef __REGBASE_H
#define __REGBASE_H
#include "mytypes.h"
/* Type: AllFs
* Purpose: To be used as an error return value from register accessing
* functions. All bits are set to 1.
*/
const DWORD AllFs = (DWORD) ~0L;
/* Function: ReturnAllFs
* Purpose: This function is used in the register access methods to indicate
* that some sort of error has occured. Used for easing the debugging, as
* it contains a macro to print the error if DEBUG is #defined
*/
inline DWORD ReturnAllFs()
{
// OUTPUT_MESS( ALLFS );
return AllFs;
}
/*
* Type: RegisterType
* Purpose: A type to differentiate between diferent kinds of registers.
* Depending on the type register may not peforms certain operations
* RW - read/write, RO - read-only, WO - write-only
*/
typedef enum { RW, RO, WO, RR } RegisterType;
/* Class: RegBase
* Purpose:
* Defines the interface and encapsulates the register access.
* Attributes:
* pBaseAddress_: DWORD, static. Holds the base address of the registers. On the
* PCI bus it is a 32 bit memory address. On the ISA bus it is a 16 bit I/O address.
* type_: RegisterType - defines the access permission for the register.
* dwShadow_: DWORD - a local copy of the register. Used for returning a value
* of write-only registers
* Operations:
* operator DWORD(): data access method. Pure virtual
* DWORD operator=( DWORD ): assignment operator. Pure virtual. This assignment
* operator does not return a reference to the class because of the performance reasons
* void SetBaseAddress( DWORD )
* DWORD GetBaseAddress()
* RegisterType GetRegisterType()
* void SetShadow( DWORD ): assigns a value of a register to a shadow
* DWORD GetShadow( void ): retrieves a value from a shadow
*/
class RegBase
{
private:
RegisterType type_;
DWORD dwShadow_;
RegBase();
protected:
void SetShadow( DWORD dwValue );
DWORD GetShadow();
public:
RegBase( RegisterType aType ) :
type_( aType ), dwShadow_( 0 )
{}
static LPBYTE GetBaseAddress() {
extern BYTE *GetBase();
return GetBase();
}
RegisterType GetRegisterType() { return type_; }
virtual operator DWORD() = 0;
virtual DWORD operator=( DWORD dwValue ) = 0;
virtual ~RegBase() {}
};
/* Method: RegBase::SetShadow
* Purpose: Used to store the value of a register in the shadow
* Input: dwValue: DWORD - new value of a register
* Output: None
* Note: inline
*/
inline void RegBase::SetShadow( DWORD dwValue ) { dwShadow_ = dwValue; }
/* Method: RegBase::GetShadow
* Purpose: Used to obtain the last value written to a write-only register
* from the shadow
* Input: None
* Output: DWORD
* Note: inline
*/
inline DWORD RegBase::GetShadow() { return dwShadow_; }
#endif __REGBASE_H