61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
use crate::constants::constants_system::SIZE_32KB;
|
|
use crate::periph::hm62256::Hm62256;
|
|
|
|
impl Hm62256 {
|
|
fn max_address(&self) -> u16 {
|
|
self.offset + SIZE_32KB as u16
|
|
}
|
|
|
|
pub fn tick(&mut self, address_bus: u16, data_bus: u8, read_mode: bool, cs: bool) -> (u16, u8) {
|
|
println!("HM62256RAM TICK START -> 0x{address_bus:04x} 0x{data_bus:02x} {read_mode} {cs}");
|
|
if !(address_bus >= self.offset && address_bus < self.max_address()) {
|
|
return (address_bus, data_bus);
|
|
}
|
|
|
|
self.address_bus = address_bus;
|
|
self.data_bus = data_bus;
|
|
let addr = address_bus.wrapping_sub(self.offset) + self.offset;
|
|
|
|
// did we want to talk to the chip...
|
|
if !cs {
|
|
return (address_bus, data_bus);
|
|
}
|
|
|
|
// ...or are we outside the range?
|
|
if (addr - self.offset) > SIZE_32KB as u16 {
|
|
return (address_bus, data_bus);
|
|
}
|
|
|
|
|
|
// ok. lets see what we are dealing with
|
|
self.data_bus = if read_mode {
|
|
self.data[addr as usize]
|
|
} else {
|
|
// writing to ram
|
|
self.data[addr as usize] = data_bus.into();
|
|
data_bus
|
|
};
|
|
(self.address_bus, self.data_bus)
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn smoke() { assert!(true); }
|
|
|
|
#[test]
|
|
fn write_to_memory_read_back_works_at_0() {
|
|
let mut ram = Hm62256::default();
|
|
|
|
// load the data to ram
|
|
ram.tick(0x0000, 0xab, false, true);
|
|
// read the data back
|
|
let (_, new_data) = ram.tick(0x0000, 0x00, true, true);
|
|
|
|
assert_eq!(new_data, 0xab);
|
|
}
|
|
}
|