diff --git a/src/debugger.rs b/src/debugger.rs index a703702..01990f8 100644 --- a/src/debugger.rs +++ b/src/debugger.rs @@ -1,13 +1,28 @@ use std::rc::Rc; use iced::{ + Element, + Length::{self, Fill}, + Point, Renderer, Size, Theme, advanced::{ - layout::Node, widget::{ - tree::{State, Tag}, Tree - }, Widget - }, mouse, widget::{ - self, button, canvas::{Frame, Program}, checkbox, column, container::bordered_box, image, number_input, row, rule::horizontal, scrollable, text, Canvas, Text - }, window::Event, Element, Length::{self, Fill}, Point, Renderer, Size, Theme + Widget, + layout::Node, + widget::{ + Tree, + tree::{State, Tag}, + }, + }, + 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}; @@ -20,6 +35,7 @@ pub struct DebuggerState { scan_lines: usize, to_scan_line: usize, frames: usize, + breakpoint: usize, } #[derive(Debug, Clone)] @@ -38,6 +54,8 @@ pub enum DebuggerMessage { RunToScanLine, SetFrames(usize), RunFrames, + SetBreakpoint(usize), + RunBreakpoint, } pub fn hex16<'a, Theme, Renderer>(val: u16) -> Text<'a, Theme, Renderer> @@ -78,6 +96,7 @@ impl DebuggerState { scan_lines: 1, to_scan_line: 1, frames: 1, + breakpoint: 0xEA5A, // cpu_cycles: 1, } } @@ -126,6 +145,7 @@ impl DebuggerState { labelled("Cycle", text(nes.ppu().pixel)), labelled("Scanline", text(nes.ppu().scanline)), labelled("PPU Cycle", text(nes.ppu().cycle)), + labelled("Frame", text(nes.ppu().frame_count)), labelled("V:", hex16(nes.ppu().background.v)), labelled("T:", hex16(nes.ppu().background.t)), labelled("X:", hex8(nes.ppu().background.x)), @@ -205,6 +225,12 @@ impl DebuggerState { DebuggerMessage::SetFrames, DebuggerMessage::RunFrames ), + run_type_hex( + "To Address:", + self.breakpoint, + DebuggerMessage::SetBreakpoint, + DebuggerMessage::RunBreakpoint + ), ], ] .spacing(5.), @@ -257,6 +283,7 @@ impl DebuggerState { DebuggerMessage::SetScanLines(n) => self.scan_lines = n, DebuggerMessage::SetToScanLine(n) => self.to_scan_line = 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::RunCPUCycles => Self::run_n_clock_cycles(nes, self.cpu_cycles * 3), DebuggerMessage::RunInstructions => { @@ -267,6 +294,7 @@ impl DebuggerState { 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::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::Pause => todo!(), } @@ -288,6 +316,21 @@ fn run_type<'a, Message: Clone + 'a>( .spacing(1.) .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>( label: &'a str,