add breakpoints
This commit is contained in:
parent
7d90d516ed
commit
37be5599d2
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}",
|
||||||
|
|
Loading…
Reference in a new issue