Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// $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; }
|