Add run to address to debugger

This commit is contained in:
2026-01-19 17:28:52 -06:00
parent ac745f60e9
commit 42c3af28b4

View File

@@ -1,13 +1,28 @@
use std::rc::Rc; use std::rc::Rc;
use iced::{ use iced::{
Element,
Length::{self, Fill},
Point, Renderer, Size, Theme,
advanced::{ advanced::{
layout::Node, widget::{ Widget,
tree::{State, Tag}, Tree layout::Node,
}, Widget widget::{
}, mouse, widget::{ Tree,
self, button, canvas::{Frame, Program}, checkbox, column, container::bordered_box, image, number_input, row, rule::horizontal, scrollable, text, Canvas, Text tree::{State, Tag},
}, window::Event, Element, Length::{self, Fill}, Point, Renderer, Size, Theme },
},
mouse,
widget::{
self, Canvas, Text, button,
canvas::{Frame, Program},
checkbox, column,
container::bordered_box,
image, number_input, hex_input, row,
rule::horizontal,
scrollable, text,
},
window::Event,
}; };
use crate::{CycleResult, NES, PPU}; use crate::{CycleResult, NES, PPU};
@@ -20,6 +35,7 @@ pub struct DebuggerState {
scan_lines: usize, scan_lines: usize,
to_scan_line: usize, to_scan_line: usize,
frames: usize, frames: usize,
breakpoint: usize,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@@ -38,6 +54,8 @@ pub enum DebuggerMessage {
RunToScanLine, RunToScanLine,
SetFrames(usize), SetFrames(usize),
RunFrames, RunFrames,
SetBreakpoint(usize),
RunBreakpoint,
} }
pub fn hex16<'a, Theme, Renderer>(val: u16) -> Text<'a, Theme, Renderer> pub fn hex16<'a, Theme, Renderer>(val: u16) -> Text<'a, Theme, Renderer>
@@ -78,6 +96,7 @@ impl DebuggerState {
scan_lines: 1, scan_lines: 1,
to_scan_line: 1, to_scan_line: 1,
frames: 1, frames: 1,
breakpoint: 0xEA5A,
// cpu_cycles: 1, // cpu_cycles: 1,
} }
} }
@@ -126,6 +145,7 @@ impl DebuggerState {
labelled("Cycle", text(nes.ppu().pixel)), labelled("Cycle", text(nes.ppu().pixel)),
labelled("Scanline", text(nes.ppu().scanline)), labelled("Scanline", text(nes.ppu().scanline)),
labelled("PPU Cycle", text(nes.ppu().cycle)), labelled("PPU Cycle", text(nes.ppu().cycle)),
labelled("Frame", text(nes.ppu().frame_count)),
labelled("V:", hex16(nes.ppu().background.v)), labelled("V:", hex16(nes.ppu().background.v)),
labelled("T:", hex16(nes.ppu().background.t)), labelled("T:", hex16(nes.ppu().background.t)),
labelled("X:", hex8(nes.ppu().background.x)), labelled("X:", hex8(nes.ppu().background.x)),
@@ -205,6 +225,12 @@ impl DebuggerState {
DebuggerMessage::SetFrames, DebuggerMessage::SetFrames,
DebuggerMessage::RunFrames DebuggerMessage::RunFrames
), ),
run_type_hex(
"To Address:",
self.breakpoint,
DebuggerMessage::SetBreakpoint,
DebuggerMessage::RunBreakpoint
),
], ],
] ]
.spacing(5.), .spacing(5.),
@@ -257,6 +283,7 @@ impl DebuggerState {
DebuggerMessage::SetScanLines(n) => self.scan_lines = n, DebuggerMessage::SetScanLines(n) => self.scan_lines = n,
DebuggerMessage::SetToScanLine(n) => self.to_scan_line = n, DebuggerMessage::SetToScanLine(n) => self.to_scan_line = n,
DebuggerMessage::SetFrames(n) => self.frames = n, DebuggerMessage::SetFrames(n) => self.frames = n,
DebuggerMessage::SetBreakpoint(n) => self.breakpoint = n,
DebuggerMessage::RunPPUCycles => Self::run_n_clock_cycles(nes, self.ppu_cycles), DebuggerMessage::RunPPUCycles => Self::run_n_clock_cycles(nes, self.ppu_cycles),
DebuggerMessage::RunCPUCycles => Self::run_n_clock_cycles(nes, self.cpu_cycles * 3), DebuggerMessage::RunCPUCycles => Self::run_n_clock_cycles(nes, self.cpu_cycles * 3),
DebuggerMessage::RunInstructions => { DebuggerMessage::RunInstructions => {
@@ -267,6 +294,7 @@ impl DebuggerState {
Self::run_until(nes, |_, n| n.ppu.scanline == self.to_scan_line, 1) Self::run_until(nes, |_, n| n.ppu.scanline == self.to_scan_line, 1)
} }
DebuggerMessage::RunFrames => Self::run_n_clock_cycles(nes, self.frames * 341 * 262), DebuggerMessage::RunFrames => Self::run_n_clock_cycles(nes, self.frames * 341 * 262),
DebuggerMessage::RunBreakpoint => Self::run_until(nes, |_, nes| nes.cpu.pc as usize == self.breakpoint, 1),
DebuggerMessage::Run => Self::run_until(nes, |_, nes| nes.halted, 1), DebuggerMessage::Run => Self::run_until(nes, |_, nes| nes.halted, 1),
DebuggerMessage::Pause => todo!(), DebuggerMessage::Pause => todo!(),
} }
@@ -288,6 +316,21 @@ fn run_type<'a, Message: Clone + 'a>(
.spacing(1.) .spacing(1.)
.into() .into()
} }
fn run_type_hex<'a, Message: Clone + 'a>(
label: &'a str,
val: usize,
update: impl Fn(usize) -> Message + 'a,
run: Message,
) -> Element<'a, Message> {
row![
widget::container(text(label)).padding(2.),
widget::container(hex_input(val).on_input(update).on_submit(run.clone())).padding(2.),
widget::container(button(image("./images/ic_fluent_play_24_filled.png")).on_press(run))
.padding(2.),
]
.spacing(1.)
.into()
}
pub fn labelled<'a, Message: 'a>( pub fn labelled<'a, Message: 'a>(
label: &'a str, label: &'a str,