From 19b9d56ba737c71cc96a03be9656f6d52e1a2306 Mon Sep 17 00:00:00 2001 From: irisz64 Date: Mon, 15 Dec 2025 15:25:45 +0100 Subject: [PATCH] Slight improvements to debugger, still wonky --- src/backend/Core.cpp | 17 +++++++++++++++-- src/backend/Core.hpp | 2 +- src/backend/core/mmio/PIF.cpp | 2 +- src/frontend/Debugger.cpp | 34 +++++++++++++++++++++------------- src/frontend/Debugger.hpp | 8 ++++---- src/frontend/KaizenGui.cpp | 1 + src/utils/ErrorData.hpp | 10 +++++----- src/utils/log.hpp | 2 +- 8 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/backend/Core.cpp b/src/backend/Core.cpp index f1369229..641e642c 100644 --- a/src/backend/Core.cpp +++ b/src/backend/Core.cpp @@ -91,6 +91,7 @@ void Core::StepRSP(int cpuCycles) { void Core::Run(float volumeL, float volumeR) { MMIO &mmio = mem->mmio; + bool broken = false; for (int field = 0; field < mmio.vi.numFields; field++) { u32 frameCycles = 0; for (int i = 0; i < mmio.vi.numHalflines; i++) { @@ -102,16 +103,25 @@ void Core::Run(float volumeL, float volumeR) { while(cycles < mem->mmio.vi.cyclesPerHalfline) { u32 taken = StepCPU(); - StepRSP(taken); - cycles += taken; + + if((broken = breakpoints.contains(regs.nextPC))) + break; + + StepRSP(taken); frameCycles += taken; Scheduler::GetInstance().Tick(taken); } + if(broken) + break; + cycles -= mmio.vi.cyclesPerHalfline; } + if(broken) + break; + if ((mmio.vi.current & 0x3FE) == mmio.vi.intr) { mmio.mi.InterruptRaise(MI::Interrupt::VI); } @@ -119,5 +129,8 @@ void Core::Run(float volumeL, float volumeR) { mmio.ai.Step(frameCycles, volumeL, volumeR); Scheduler::GetInstance().Tick(frameCycles); } + + if(broken) + pause = true; } } // namespace n64 diff --git a/src/backend/Core.hpp b/src/backend/Core.hpp index 38e4cb48..af082567 100644 --- a/src/backend/Core.hpp +++ b/src/backend/Core.hpp @@ -38,7 +38,7 @@ struct Core { void Run(float volumeL, float volumeR); void TogglePause() { pause = !pause; } inline void ToggleBreakpoint(s64 addr) { - if(breakpoints.contains(addr)){ + if(breakpoints.contains(addr)) { breakpoints.erase(addr); return; } diff --git a/src/backend/core/mmio/PIF.cpp b/src/backend/core/mmio/PIF.cpp index aa39457b..fa86095b 100644 --- a/src/backend/core/mmio/PIF.cpp +++ b/src/backend/core/mmio/PIF.cpp @@ -118,7 +118,7 @@ void PIF::LoadEeprom(const SaveType saveType, const std::string &path) { eeprom = mio::make_mmap_sink(eepromPath, 0, mio::map_entire_file, error); if (error) { - panic("Could not open {}", eepromPath); + panic("Could not open {}. Reason {}", eepromPath, error.message()); } } } diff --git a/src/frontend/Debugger.cpp b/src/frontend/Debugger.cpp index 208f6e78..36f30c4b 100644 --- a/src/frontend/Debugger.cpp +++ b/src/frontend/Debugger.cpp @@ -13,16 +13,16 @@ char const* regNames[] = { "gp", "sp", "s8", "ra", }; -void BreakpointFunc(s64 addr, s64 startAddr, Disassembler::DisassemblyResult&) { +void BreakpointFunc(s64 addr, Disassembler::DisassemblyResult&) { n64::Core& core = n64::Core::GetInstance(); - bool isBroken = core.breakpoints.contains(addr + 4); + bool isBroken = core.breakpoints.contains(addr); ImGui::PushStyleColor(ImGuiCol_CheckMark, 0xff0000ff); ImGui::PushStyleColor(ImGuiCol_FrameBg, 0); ImGui::PushStyleColor(ImGuiCol_FrameBgActive, 0); ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, 0x800000ff); ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 0.5f); - if(ImGui::Checkbox(std::format("##toggleBreakpoint{}", (addr - startAddr) / 4).c_str(), &isBroken)) { - core.ToggleBreakpoint(addr + 4); + if(ImGui::Checkbox(std::format("##toggleBreakpoint{}", addr).c_str(), &isBroken)) { + core.ToggleBreakpoint(addr); } ImGui::PopStyleVar(); ImGui::PopStyleColor(); @@ -31,7 +31,7 @@ void BreakpointFunc(s64 addr, s64 startAddr, Disassembler::DisassemblyResult&) { ImGui::PopStyleColor(); } -void AddressFunc(s64, s64, Disassembler::DisassemblyResult& disasm) { +void AddressFunc(s64, Disassembler::DisassemblyResult& disasm) { if(!disasm.success) { ImGui::TextColored(ImColor(0xffeaefb6), "????????????????"); return; @@ -40,7 +40,7 @@ void AddressFunc(s64, s64, Disassembler::DisassemblyResult& disasm) { ImGui::TextColored(ImColor(0xffeaefb6), "%s", std::format("{:016X}:", disasm.address).c_str()); } -void InstructionFunc(s64, s64, Disassembler::DisassemblyResult& disasm) { +void InstructionFunc(s64, Disassembler::DisassemblyResult& disasm) { if(!disasm.success) { ImGui::TextColored(ImColor(0xffcbf1ae), "Disassembly unsuccessful..."); return; @@ -146,6 +146,7 @@ void Debugger::RegisterView() { bool Debugger::render() { n64::Core& core = n64::Core::GetInstance(); n64::Registers& regs = core.GetRegs(); + bool ret = true; if(!enabled) return false; @@ -153,8 +154,10 @@ bool Debugger::render() { static s64 startAddr = 0xFFFF'FFFF'8000'0000; int step = 4, stepFast = 256; - if(!ImGui::Begin("Debugger", &enabled)) - return false; + if(!ImGui::Begin("Debugger", &enabled)) { + ret = false; + goto EXIT; + } ImGui::BeginDisabled(followPC); ImGui::InputScalar("Address", ImGuiDataType_S64, (void*)&startAddr, (void*)&step, (void*)&stepFast, "%016lX", ImGuiInputTextFlags_CharsHexadecimal); @@ -176,8 +179,13 @@ bool Debugger::render() { core.ToggleBreakpoint(startAddr); } - if(!ImGui::BeginTable("Disassembly", columns.size(), ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody)) - return false; + auto disasmTableFlags = ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | + ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; + + if(!ImGui::BeginTable("Disassembly", columns.size(), disasmTableFlags)) { + ret = false; + goto EXIT; + } for(int i = 0; i < columns.size(); i++) ImGui::TableSetupColumn(columns[i].name); @@ -206,7 +214,7 @@ bool Debugger::render() { ImGui::TableNextRow(); for(int i = 0; i < columns.size(); i++) { ImGui::TableSetColumnIndex(i); - columns[i].func(addr, startAddr, disasm); + columns[i].func(addr, disasm); } ImGui::PopStyleColor(); @@ -217,7 +225,7 @@ bool Debugger::render() { RegisterView(); +EXIT: ImGui::End(); - - return true; + return ret; } diff --git a/src/frontend/Debugger.hpp b/src/frontend/Debugger.hpp index fd7bf284..17f44fe0 100644 --- a/src/frontend/Debugger.hpp +++ b/src/frontend/Debugger.hpp @@ -1,9 +1,9 @@ #pragma once #include -void BreakpointFunc(s64, s64, Disassembler::DisassemblyResult&); -void AddressFunc(s64, s64, Disassembler::DisassemblyResult&); -void InstructionFunc(s64, s64, Disassembler::DisassemblyResult&); +void BreakpointFunc(s64, Disassembler::DisassemblyResult&); +void AddressFunc(s64, Disassembler::DisassemblyResult&); +void InstructionFunc(s64, Disassembler::DisassemblyResult&); class Debugger final { bool enabled = false; @@ -11,7 +11,7 @@ class Debugger final { struct Column { const char* name; - void (*func)(s64, s64, Disassembler::DisassemblyResult&) = nullptr; + void (*func)(s64, Disassembler::DisassemblyResult&) = nullptr; }; std::array columns = { diff --git a/src/frontend/KaizenGui.cpp b/src/frontend/KaizenGui.cpp index bc1b5ad5..52ece1a8 100644 --- a/src/frontend/KaizenGui.cpp +++ b/src/frontend/KaizenGui.cpp @@ -332,6 +332,7 @@ void KaizenGui::RenderUI() { n64::Core::GetInstance().ToggleBreakpoint(lastPC.value()); debugger.Open(); + emuThread.Reset(); } } break; default: break; diff --git a/src/utils/ErrorData.hpp b/src/utils/ErrorData.hpp index f968237e..54529b39 100644 --- a/src/utils/ErrorData.hpp +++ b/src/utils/ErrorData.hpp @@ -125,11 +125,11 @@ struct Error { return instance; } - static std::string GetError() { return GetInstance().err; } - static Severity GetSeverity() { return GetInstance().severity; } - static Type GetType() { return GetInstance().type; } - static std::optional GetLastPC() { return GetInstance().lastPC; } - static std::optional GetMemoryAccess() { return GetInstance().memoryAccess; } + static std::string& GetError() { return GetInstance().err; } + static Severity& GetSeverity() { return GetInstance().severity; } + static Type& GetType() { return GetInstance().type; } + static std::optional& GetLastPC() { return GetInstance().lastPC; } + static std::optional& GetMemoryAccess() { return GetInstance().memoryAccess; } static bool IsHandled() { return GetSeverity().as_enum == Severity::NONE; } diff --git a/src/utils/log.hpp b/src/utils/log.hpp index 44849486..966fd6f5 100644 --- a/src/utils/log.hpp +++ b/src/utils/log.hpp @@ -10,7 +10,7 @@ namespace Util { enum LogLevel : u8 { Trace, Debug, Warn, Info, Error, Always }; #ifndef NDEBUG -static constexpr auto globalLogLevel = Trace; +static constexpr auto globalLogLevel = Debug; #else static constexpr auto globalLogLevel = Info; #endif