bus.rsannotatedbus.rssource61 lines · 1.4 KB · raw
1use crate::debug::DummyM68000Debugger;
2use crate::traits::BusInterface;
3
4pub struct InMemoryBus {
5    memory: Vec<u8>,
6}
7
8impl InMemoryBus {
9    #[must_use]
10    pub fn new() -> Self {
11        Self { memory: vec![0; 0x0100_0000] }
12    }
13}
14
15impl BusInterface for InMemoryBus {
16    type DebugView<'a>
17        = DummyM68000Debugger
18    where
19        Self: 'a;
20
21    fn read_byte(&mut self, address: u32) -> u8 {
22        self.memory[(address & Self::ADDRESS_MASK) as usize]
23    }
24
25    fn read_word(&mut self, address: u32) -> u16 {
26        let address = (address & Self::ADDRESS_MASK) as usize;
27        u16::from_be_bytes([self.memory[address], self.memory[address.wrapping_add(1)]])
28    }
29
30    fn write_byte(&mut self, address: u32, value: u8) {
31        self.memory[(address & Self::ADDRESS_MASK) as usize] = value;
32    }
33
34    fn write_word(&mut self, address: u32, value: u16) {
35        let [msb, lsb] = value.to_be_bytes();
36        let address = (address & Self::ADDRESS_MASK) as usize;
37
38        self.memory[address] = msb;
39        self.memory[address.wrapping_add(1)] = lsb;
40    }
41
42    fn interrupt_level(&self) -> u8 {
43        0
44    }
45
46    fn acknowledge_interrupt(&mut self, _interrupt_level: u8) {}
47
48    fn halt(&self) -> bool {
49        false
50    }
51
52    fn reset(&self) -> bool {
53        false
54    }
55}
56
57impl Default for InMemoryBus {
58    fn default() -> Self {
59        Self::new()
60    }
61}