add breakpoints

This commit is contained in:
Alex Janka 2023-04-20 18:01:45 +10:00
parent 7d90d516ed
commit 37be5599d2
2 changed files with 25 additions and 0 deletions

View file

@ -18,6 +18,7 @@ pub enum CommandErr {
pub enum Commands { pub enum Commands {
Watch(u16), Watch(u16),
Break(u16),
Step, Step,
Continue, Continue,
} }
@ -38,6 +39,13 @@ impl FromStr for Commands {
Err(CommandErr::InvalidArgument) Err(CommandErr::InvalidArgument)
} }
} }
_ if let Some(addr) = lower.strip_prefix("break") => {
if let Ok(addr) = u16::from_str_radix(addr.trim().trim_start_matches("0x"), 16) {
Ok(Self::Break(addr))
} else {
Err(CommandErr::InvalidArgument)
}
}
_ => Err(CommandErr::InvalidCommand), _ => Err(CommandErr::InvalidCommand),
} }
} }
@ -49,6 +57,7 @@ pub struct Debugger {
stepping: bool, stepping: bool,
last_command: String, last_command: String,
watches: HashMap<u16, u8>, watches: HashMap<u16, u8>,
breakpoints: Vec<u16>,
} }
impl Debugger { impl Debugger {
@ -62,6 +71,7 @@ impl Debugger {
stepping: true, stepping: true,
last_command: String::from(""), last_command: String::from(""),
watches: HashMap::new(), watches: HashMap::new(),
breakpoints: Vec::new(),
} }
} }
@ -95,6 +105,11 @@ impl Debugger {
} }
Commands::Step => self.stepping = true, Commands::Step => self.stepping = true,
Commands::Continue => self.stepping = false, Commands::Continue => self.stepping = false,
Commands::Break(address) => {
if !self.breakpoints.contains(&address) {
self.breakpoints.push(address)
}
}
} }
} else { } else {
println!("Invalid command"); println!("Invalid command");
@ -117,6 +132,12 @@ impl Debugger {
*data = new_data; *data = new_data;
} }
} }
for address in &self.breakpoints {
if self.core.pc() == *address {
println!("Breakpoint at 0x{address:0>4X} reached");
should_pause = true;
}
}
should_pause should_pause
} }
} }

View file

@ -134,6 +134,10 @@ where
self.cpu.cycle_count self.cpu.cycle_count
} }
pub fn pc(&self) -> u16 {
self.cpu.reg.pc
}
pub fn print_reg(&self) -> String { pub fn print_reg(&self) -> String {
format!( format!(
"A:{:0>2X}, F:{}, BC:{:0>4X}, DE:{:0>4X}, HL:{:0>4X}, SP:{:0>4X}, PC:{:0>4X}\nLast instruction: {:0>2X} from 0x{:0>4X}", "A:{:0>2X}, F:{}, BC:{:0>4X}, DE:{:0>4X}, HL:{:0>4X}, SP:{:0>4X}, PC:{:0>4X}\nLast instruction: {:0>2X} from 0x{:0>4X}",