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}