pub trait Device {
fn with_data(data: &[u8]) -> Self
where
Self: Sized;
fn init_data(&mut self, data: &[u8]);
fn cache_current_read_data(&self, destination: &mut [u8]) {
debug_assert_eq!(destination.len(), self.addr_space_size_dyn() as usize);
for i in 0u32..self.addr_space_size_dyn() {
destination[i as usize] = self.read(i as u16);
}
}
fn read(&self, addr: u16) -> u8;
fn write(&mut self, data: u8, addr: u16);
fn addr_space_size() -> u32
where
Self: Sized;
fn addr_bits_count() -> u8
where
Self: Sized,
{
let addr_space_size = Self::addr_space_size();
addr_space_size.ilog2() as u8
}
fn addr_space_size_dyn(&self) -> u32;
fn addr_bits_count_dyn(&self) -> u8 {
let addr_space_size = self.addr_space_size_dyn();
addr_space_size.ilog2() as u8
}
fn wrap_addr(addr: u16) -> u16
where
Self: Sized,
{
if Self::addr_bits_count() < 16 {
let mask = !(0xFFFFu16 << Self::addr_bits_count());
addr & mask
} else {
addr
}
}
fn is_connected(&self) -> bool {
true
}
}
#[allow(missing_docs)]
pub mod size_const {
pub const SIZE_256K: usize = 256 * 1024;
pub const SIZE_128K: usize = 128 * 1024;
pub const SIZE_64K: usize = 64 * 1024;
pub const SIZE_32K: usize = 32 * 1024;
pub const SIZE_16K: usize = 16 * 1024;
pub const SIZE_8K: usize = 8 * 1024;
pub const SIZE_4K: usize = 4 * 1024;
pub const SIZE_2K: usize = 2 * 1024;
pub const SIZE_1K: usize = 1024;
}