60 lines
1.2 KiB
Rust
60 lines
1.2 KiB
Rust
use std::fmt;
|
|
|
|
use super::Peripheral;
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
pub struct Ram<const SIZE: usize> {
|
|
pub buffer: [u8; SIZE],
|
|
}
|
|
|
|
impl<const SIZE: usize> fmt::Debug for Ram<SIZE> {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
for i in 0x100..=0x1FF {
|
|
if i%0x10 == 0 {
|
|
f.write_fmt(format_args!("\n {:0>4X}", i))?;
|
|
}
|
|
f.write_fmt(format_args!(" {:0>2X}", self.buffer[i]))?
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
impl<const SIZE: usize> Peripheral for Ram<SIZE> {
|
|
|
|
fn read_addr(&self, addr: u16) -> u8 {
|
|
self.buffer[addr as usize]
|
|
}
|
|
|
|
fn write_addr(&mut self, addr: u16, data: u8) {
|
|
self.buffer[addr as usize] = data;
|
|
}
|
|
}
|
|
|
|
impl<const SIZE: usize> Ram<SIZE> {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
Ram {
|
|
buffer: [0u8; SIZE],
|
|
}
|
|
}
|
|
|
|
pub fn from_file(file: &str) -> Self {
|
|
use std::{
|
|
fs::File,
|
|
io::Read,
|
|
};
|
|
|
|
let mut f = File::open(file).unwrap();
|
|
let mut buffer = [0u8; SIZE];
|
|
f.read_exact(&mut buffer).unwrap();
|
|
|
|
Ram {
|
|
buffer,
|
|
}
|
|
}
|
|
}
|
|
|