Listing 9


// New enums for each register width
enum Registers8
{
    STATUS = 0x00, // UART status register
    ... and so on ...
};
enum Registers32
{
    TXBUF = 0x04,  // Transmit buffer
    ... and so on ...
};
// Two overloads of regAddress
inline volatile uint8_t *regAddress(Registers8 reg)
{
    return reinterpret_cast<volatile uint8_t*>(baseAddress + reg);
}
inline volatile uint32_t *regAddress(Registers32 reg)
{
    return reinterpret_cast<volatile uint32_t*>(baseAddress + reg);
}
// Two overloads of regRead
inline uint8_t regRead(Registers8 reg)
{
    return *regAddress(reg);
} 
inline uint32_t regRead(Registers32 reg)
{
    return *regAddress(reg);
}
 ... similarly for regWrite ...