Add run to address to debugger
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user