use crate::size_const::*;
use crate::Device;
pub struct Adjacent<T1, T2> {
first: T1,
second: T2,
}
impl<T1, T2> Default for Adjacent<T1, T2>
where
T1: Device + Default,
T2: Device + Default,
{
fn default() -> Self {
assert!((Self::addr_space_size() as usize) < SIZE_64K);
assert_eq!(T1::addr_space_size(), T2::addr_space_size());
Self {
first: Default::default(),
second: Default::default(),
}
}
}
impl<T1, T2> Device for Adjacent<T1, T2>
where
T1: Device + Default,
T2: Device + Default,
{
fn with_data(data: &[u8]) -> Self
where
Self: Sized,
{
let second_start = T1::addr_space_size() as usize;
Self {
first: Device::with_data(&data[..second_start]),
second: Device::with_data(&data[second_start..]),
}
}
fn init_data(&mut self, data: &[u8]) {
let second_start = T1::addr_space_size() as usize;
self.first.init_data(&data[..second_start]);
self.second.init_data(&data[second_start..]);
}
fn cache_current_read_data(&self, destination: &mut [u8]) {
let second_start = T1::addr_space_size() as usize;
self.first
.cache_current_read_data(&mut destination[..second_start]);
self.second
.cache_current_read_data(&mut destination[second_start..]);
}
fn read(&self, addr: u16) -> u8 {
let addr = Self::wrap_addr(addr);
if (addr as u32) < T1::addr_space_size() {
self.first.read(addr)
} else {
self.second.read(addr - T1::addr_space_size() as u16)
}
}
fn write(&mut self, data: u8, addr: u16) {
if (addr as u32) < T1::addr_space_size() {
self.first.write(data, addr)
} else {
self.second.write(data, addr - T1::addr_space_size() as u16)
}
}
fn addr_space_size() -> u32
where
Self: Sized,
{
T1::addr_space_size() * 2 }
fn addr_bits_count() -> u8
where
Self: Sized,
{
T1::addr_bits_count() + 1
}
fn addr_space_size_dyn(&self) -> u32 {
Self::addr_space_size()
}
fn addr_bits_count_dyn(&self) -> u8 {
Self::addr_bits_count()
}
fn is_connected(&self) -> bool {
self.first.is_connected() && self.second.is_connected()
}
}