Listing 11


// Template versions of bitRead/Write - put them at global scope
// and you don't have to copy bitRead/Write into every device namespace
template <typename RegType>
inline uint32_t bitRead(RegType reg, uint32_t bits)

    uint32_t       regval = *regAddress(reg);
    const uint32_t width  = bits & 0xff;
    const uint32_t bitno  = bits >> 16;
    regval >>= bitno;
    regval  &= ((1<<width)-1);
    return regval;
}
template <typename RegType>
inline void bitWrite(RegType reg, uint32_t bits, uint32_t value)
{
    uint32_t           regval = *regAddress(reg);
    const uint32_t     width  = bits & 0xff;
    const uint32_t     bitno  = bits >> 16;
    regval &= ~(((1<<width)-1) << bitno);
    regval |=  value << bitno;
    *regAddress(reg) = regval;
}