use femtos::Instant; use emulator_hal::bus::{self, BusAccess}; use super::state::{M68k, M68kError}; use super::decode::M68kDecoder; use super::execute::M68kCycleExecutor; use super::memory::M68kAddress; #[derive(Clone, Default)] pub struct StackTracer { pub calls: Vec, } impl StackTracer { pub fn push_return(&mut self, addr: u32) { self.calls.push(addr); } pub fn pop_return(&mut self) { self.calls.pop(); } } #[derive(Clone, Default)] pub struct M68kDebugger { pub(crate) skip_breakpoint: usize, pub(crate) breakpoints: Vec, pub(crate) step_until_return: Option, pub(crate) stack_tracer: StackTracer, } impl<'a, Bus, BusError> M68kCycleExecutor<'a, Bus> where Bus: BusAccess, { pub fn check_breakpoints(&mut self) -> Result<(), M68kError> { for breakpoint in &self.debugger.breakpoints { if *breakpoint == self.state.pc { if self.debugger.skip_breakpoint > 0 { self.debugger.skip_breakpoint -= 1; return Ok(()); } else { self.debugger.skip_breakpoint = 1; return Err(M68kError::Breakpoint); } } } Ok(()) } }