#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ReadWriteRegister<RS: RegisterSize>
{
pointer: NonNull<RS>,
}
impl<RS: RegisterSize> Register<RS> for ReadWriteRegister<RS>
{
#[inline(always)]
fn new_internal(pointer: NonNull<RS>) -> Self
{
Self
{
pointer
}
}
#[inline(always)]
fn read(&self) -> RS
{
unsafe { read(self.pointer.as_ptr()) }
}
#[inline(always)]
fn reset(&self)
{
}
}
impl<RS: RegisterSize> ReadWriteRegister<RS>
{
#[inline(always)]
pub fn write(&self, value: RS) -> RS
{
unsafe { write(self.pointer.as_ptr(), value) };
value
}
#[inline(always)]
pub fn write_bits(&self, start: RS, length: RS, bits: RS) -> RS
{
let tmp = self.read();
let offmask = !(RS::bitmask(length) << start);
let tmp = tmp & offmask;
let tmp = tmp | (bits << start);
self.write(tmp)
}
#[inline(always)]
pub fn write_byte(&self, start: RS, byte: RS) -> RS
{
self.write_bits(start * RS::Eight, RS::Eight, byte)
}
#[inline(always)]
pub fn set(&self, bitmask: RS) -> RS
{
self.write(self.read() | bitmask)
}
#[inline(always)]
pub fn clr(&self, bitmask: RS) -> RS
{
self.write(self.read() & !bitmask)
}
}