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

78 lines
2.2 KiB
C++

// $Header: G:/SwDev/WDM/Video/bt848/rcs/Regfield.cpp 1.3 1998/04/29 22:43:36 tomz Exp $
#include "regfield.h"
/* Method: RegField::MakeAMask
* Purpose: Computes a mask used to isolate a field withing a register based
* on the width of a field
*/
inline DWORD RegField::MakeAMask()
{
// compute the mask to apply to the owner register to reset
// all bits that are part of a field. Mask is based on the size of a field
return ::MakeAMask( FieldWidth_ );
}
/* Method: RegField::operator DWORD()
* Purpose: Performs the read from a field of register
*/
RegField::operator DWORD()
{
// if write-only, get the shadow
if ( GetRegisterType() == WO )
return GetShadow();
// for RO and RW do the actual read
// get the register data and move it to the right position
DWORD dwValue = ( Owner_ >> StartBit_ );
DWORD dwMask = MakeAMask();
return dwValue & dwMask;
}
/* Method: RegField::operator=
* Purpose: performs the assignment to a field of register
* Note:
This function computes the mask to apply to the owner register to reset
all bits that are part of a field. Mask is based on the start position and size
Then it calculates the proper value from the passed argument ( moves the size
number of bits to the starting position ) and ORs these bits in the owner register.
*/
DWORD RegField::operator=( DWORD dwValue )
{
// if a register is read-only nothing is done. This is an error
if ( GetRegisterType() == RO )
return ReturnAllFs();
SetShadow( dwValue );
// get a mask
DWORD dwMask = MakeAMask();
// move mask to a proper position
dwMask = dwMask << StartBit_;
// calculate the proper value from the passed argument ( move the size
// number of bits to the starting position )
DWORD dwFieldValue = dwValue << StartBit_;
dwFieldValue &= dwMask;
// do not perform intermediate steps on the owner; rather use a temp and update
// the owner at once
DWORD dwRegContent = Owner_;
// reset the relevant bits
if ( GetRegisterType() == RR )
dwRegContent = 0;
else
dwRegContent &= ~dwMask;
// OR these bits in the owner register.
dwRegContent |= dwFieldValue;
Owner_ = dwRegContent;
return dwValue;
}