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}