1use crate::debug::M68000Debugger;
2
3pub trait BusInterface {
4    // Addresses are 32-bit internally but the 68000 only has a 24-bit address bus
5    const ADDRESS_MASK: u32 = 0x00FF_FFFF;
6
7    type DebugView<'a>: M68000Debugger
8    where
9        Self: 'a;
10
11    fn read_byte(&mut self, address: u32) -> u8;
12
13    fn read_word(&mut self, address: u32) -> u16;
14
15    fn write_byte(&mut self, address: u32, value: u8);
16
17    fn write_word(&mut self, address: u32, value: u16);
18
19    fn read_long_word(&mut self, address: u32) -> u32 {
20        let high_word = self.read_word(address);
21        let low_word = self.read_word(address.wrapping_add(2));
22
23        (u32::from(high_word) << 16) | u32::from(low_word)
24    }
25
26    fn write_long_word(&mut self, address: u32, value: u32) {
27        let high_word = (value >> 16) as u16;
28        let low_word = value as u16;
29
30        self.write_word(address, high_word);
31        self.write_word(address.wrapping_add(2), low_word);
32    }
33
34    // Auto-vectored interrupt level; should be between 0 and 7, with 0 indicating no interrupt
35    fn interrupt_level(&self) -> u8;
36
37    fn acknowledge_interrupt(&mut self, interrupt_level: u8);
38
39    fn halt(&self) -> bool;
40
41    fn reset(&self) -> bool;
42
43    fn debug_view(&mut self) -> Option<Self::DebugView<'_>> {
44        None
45    }
46}