Skip to main content

k580_core/
memory.rs

1#[derive(Clone, PartialEq, Eq)]
2pub struct Memory64K {
3    bytes: Box<[u8; Self::SIZE]>,
4}
5
6impl Default for Memory64K {
7    fn default() -> Self {
8        Self {
9            bytes: Box::new([0; Self::SIZE]),
10        }
11    }
12}
13
14impl core::fmt::Debug for Memory64K {
15    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16        f.debug_struct("Memory64K")
17            .field("size", &Self::SIZE)
18            .finish()
19    }
20}
21
22impl Memory64K {
23    pub const SIZE: usize = 65_536;
24
25    pub fn read(&self, address: u16) -> u8 {
26        self.bytes[address as usize]
27    }
28
29    pub fn write(&mut self, address: u16, value: u8) {
30        self.bytes[address as usize] = value;
31    }
32
33    pub fn read_word(&self, address: u16) -> u16 {
34        let lo = self.read(address) as u16;
35        let hi = self.read(address.wrapping_add(1)) as u16;
36        lo | (hi << 8)
37    }
38
39    pub fn as_slice(&self) -> &[u8] {
40        self.bytes.as_slice()
41    }
42
43    pub fn as_mut_slice(&mut self) -> &mut [u8] {
44        self.bytes.as_mut_slice()
45    }
46
47    pub fn clear(&mut self) {
48        self.bytes.fill(0);
49    }
50}