From 99eb0bbd648660ec659d8d2d3f18767863f96112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 7 Nov 2024 10:37:33 +0100 Subject: [PATCH] Improve register view, fix follow PC, some cleanup --- Core/Debugger/DebugInterface.h | 44 ++++++++++++------------ Core/MIPS/MIPSDebugInterface.h | 6 ++++ UI/ImDebugger/ImDebugger.cpp | 62 ++++++++++++++++++++++++---------- UI/ImDebugger/ImDebugger.h | 7 ---- UI/ImDebugger/ImDisasmView.cpp | 3 ++ UI/ImDebugger/ImDisasmView.h | 4 +++ 6 files changed, 80 insertions(+), 46 deletions(-) diff --git a/Core/Debugger/DebugInterface.h b/Core/Debugger/DebugInterface.h index c8c40f18f4..37f5bc7c12 100644 --- a/Core/Debugger/DebugInterface.h +++ b/Core/Debugger/DebugInterface.h @@ -28,14 +28,14 @@ class DebugInterface { public: virtual int getInstructionSize(int instruction) {return 1;} - virtual bool isAlive() {return true;} - virtual bool isBreakpoint(unsigned int address) {return false;} - virtual void setBreakpoint(unsigned int address){} - virtual void clearBreakpoint(unsigned int address){} - virtual void clearAllBreakpoints() {} - virtual void toggleBreakpoint(unsigned int address){} - virtual unsigned int readMemory(unsigned int address){return 0;} - virtual unsigned int getPC() {return 0;} + virtual bool isAlive() = 0; + virtual bool isBreakpoint(unsigned int address) = 0; + virtual void setBreakpoint(unsigned int address) = 0; + virtual void clearBreakpoint(unsigned int address) = 0; + virtual void clearAllBreakpoints() = 0; + virtual void toggleBreakpoint(unsigned int address) = 0; + virtual unsigned int readMemory(unsigned int address) {return 0;} + virtual unsigned int getPC() = 0; virtual void setPC(unsigned int address) {} virtual void step() {} virtual void runToBreakpoint() {} @@ -44,30 +44,32 @@ public: virtual bool initExpression(const char* exp, PostfixExpression& dest) { return false; }; virtual bool parseExpression(PostfixExpression& exp, u32& dest) { return false; }; - virtual u32 GetHi() { return 0; }; - virtual u32 GetLo() { return 0; }; + virtual u32 GetHi() = 0; + virtual u32 GetLo() = 0; + virtual u32 GetLLBit() = 0; + virtual void SetHi(u32 val) { }; virtual void SetLo(u32 val) { }; virtual const char *GetName() = 0; - virtual u32 GetGPR32Value(int reg) {return 0;} - virtual void SetGPR32Value(int reg) {} + virtual u32 GetGPR32Value(int reg) = 0; + virtual void SetGPR32Value(int reg, u32 value) = 0; virtual float GetFPR32Value(int reg) { return -1.0f; } virtual float GetVPR32Value(int reg) { return -1.0f; } virtual u32 GetPC() = 0; virtual void SetPC(u32 _pc) = 0; - virtual u32 GetLR() {return GetPC();} - virtual void DisAsm(u32 pc, char *out, size_t outSize) { - snprintf(out, outSize, "[%08x] UNKNOWN", pc); - } + virtual u32 GetLR() = 0; + + virtual void DisAsm(u32 pc, char *out, size_t outSize) = 0; + // More stuff for debugger - virtual int GetNumCategories() {return 0;} - virtual int GetNumRegsInCategory(int cat) {return 0;} - virtual const char *GetCategoryName(int cat) {return 0;} - virtual std::string GetRegName(int cat, int index) { return ""; } + virtual int GetNumCategories() = 0; + virtual int GetNumRegsInCategory(int cat) = 0; + virtual const char *GetCategoryName(int cat) = 0; + virtual std::string GetRegName(int cat, int index) = 0; virtual void PrintRegValue(int cat, int index, char *out, size_t outSize) { snprintf(out, outSize, "%08X", GetGPR32Value(index)); } - virtual u32 GetRegValue(int cat, int index) {return 0;} + virtual u32 GetRegValue(int cat, int index) = 0; virtual void SetRegValue(int cat, int index, u32 value) {} }; diff --git a/Core/MIPS/MIPSDebugInterface.h b/Core/MIPS/MIPSDebugInterface.h index 61144c5aba..50d180e3d3 100644 --- a/Core/MIPS/MIPSDebugInterface.h +++ b/Core/MIPS/MIPSDebugInterface.h @@ -49,6 +49,8 @@ public: const char *GetName() override; u32 GetGPR32Value(int reg) override { return cpu->r[reg]; } float GetFPR32Value(int reg) override { return cpu->f[reg]; } + void SetGPR32Value(int reg, u32 value) override { cpu->r[reg] = value; } + u32 GetPC() override { return cpu->pc; } u32 GetLR() override { return cpu->r[MIPS_REG_RA]; } void DisAsm(u32 pc, char *out, size_t outSize) override; @@ -77,6 +79,10 @@ public: return cpu->hi; } + u32 GetLLBit() override { + return cpu->llBit; + } + u32 GetLo() override { return cpu->lo; } diff --git a/UI/ImDebugger/ImDebugger.cpp b/UI/ImDebugger/ImDebugger.cpp index 9c4ae46077..4d88aecc7d 100644 --- a/UI/ImDebugger/ImDebugger.cpp +++ b/UI/ImDebugger/ImDebugger.cpp @@ -22,24 +22,54 @@ void DrawRegisterView(MIPSDebugInterface *mipsDebug, bool *open) { if (ImGui::BeginTabBar("RegisterGroups", ImGuiTabBarFlags_None)) { if (ImGui::BeginTabItem("GPR")) { - for (int i = 0; i < 32; i++) { - const int value = mipsDebug->GetGPR32Value(i); - if (value >= -1000000 && value <= 1000000) { - // Display small values in decimal. - ImGui::Text("%s: %08x (%d)", mipsDebug->GetRegName(0, i).c_str(), value, value); - } else { - // But not big ones to reduce clutter. - ImGui::Text("%s: %08x", mipsDebug->GetRegName(0, i).c_str(), value); + if (ImGui::BeginTable("gpr", 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersH)) { + ImGui::TableSetupColumn("regname", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("value", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("value_i", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableNextRow(); + + auto gprLine = [&](const char *regname, int value) { + ImGui::TableSetColumnIndex(0); + ImGui::Text("%s", regname); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%08x", value); + if (value >= -1000000 && value <= 1000000) { + ImGui::TableSetColumnIndex(2); + ImGui::Text("%d", value); + } + ImGui::TableNextRow(); + }; + for (int i = 0; i < 32; i++) { + gprLine(mipsDebug->GetRegName(0, i).c_str(), mipsDebug->GetGPR32Value(i)); } + gprLine("hi", mipsDebug->GetHi()); + gprLine("lo", mipsDebug->GetLo()); + gprLine("pc", mipsDebug->GetPC()); + gprLine("ll", mipsDebug->GetLLBit()); + ImGui::EndTable(); } + ImGui::EndTabItem(); } if (ImGui::BeginTabItem("FPR")) { - for (int i = 0; i < 32; i++) { - float fvalue = mipsDebug->GetFPR32Value(i); - u32 fivalue; - memcpy(&fivalue, &fvalue, sizeof(fivalue)); - ImGui::Text("%s: %0.6f (%08x)", mipsDebug->GetRegName(1, i).c_str(), fvalue, fivalue); + if (ImGui::BeginTable("fpr", 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersH)) { + ImGui::TableSetupColumn("regname", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("value", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("value_i", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableNextRow(); + for (int i = 0; i < 32; i++) { + float fvalue = mipsDebug->GetFPR32Value(i); + u32 fivalue; + memcpy(&fivalue, &fvalue, sizeof(fivalue)); + ImGui::TableSetColumnIndex(0); + ImGui::Text("%s", mipsDebug->GetRegName(1, i).c_str()); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%0.7f", fvalue); + ImGui::TableSetColumnIndex(2); + ImGui::Text("%08x", fivalue); + ImGui::TableNextRow(); + } + ImGui::EndTable(); } ImGui::EndTabItem(); } @@ -102,10 +132,6 @@ void ImDebugger::Frame(MIPSDebugInterface *mipsDebug) { if (regsOpen_) { DrawRegisterView(mipsDebug, ®sOpen_); } - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::End(); } void ImDisasmWindow::Draw(MIPSDebugInterface *mipsDebug, bool *open, CoreState coreState) { @@ -155,7 +181,7 @@ void ImDisasmWindow::Draw(MIPSDebugInterface *mipsDebug, bool *open, CoreState c } ImGui::SameLine(); - ImGui::Checkbox("Follow PC", &followPC_); + ImGui::Checkbox("Follow PC", &disasmView_.followPC_); ImGui::SetNextItemWidth(100); if (ImGui::InputScalar("Go to addr: ", ImGuiDataType_U32, &gotoAddr_, NULL, NULL, "%08X", ImGuiInputTextFlags_EnterReturnsTrue)) { diff --git a/UI/ImDebugger/ImDebugger.h b/UI/ImDebugger/ImDebugger.h index 5a1aef1f7e..b0f458a26b 100644 --- a/UI/ImDebugger/ImDebugger.h +++ b/UI/ImDebugger/ImDebugger.h @@ -28,10 +28,6 @@ class ImDisasmWindow { public: void Draw(MIPSDebugInterface *mipsDebug, bool *open, CoreState coreState); - void PCChanged() { - pcChanged_ = true; - } - private: // We just keep the state directly in the window. Can refactor later. @@ -41,9 +37,6 @@ private: u32 gotoAddr_ = 0x1000; - bool followPC_ = true; - bool pcChanged_ = false; - ImDisasmView disasmView_; }; diff --git a/UI/ImDebugger/ImDisasmView.cpp b/UI/ImDebugger/ImDisasmView.cpp index c248df47ae..a573c1e5e0 100644 --- a/UI/ImDebugger/ImDisasmView.cpp +++ b/UI/ImDebugger/ImDisasmView.cpp @@ -465,6 +465,9 @@ void ImDisasmView::Draw(ImDrawList *drawList) { int coreStep = Core_GetSteppingCounter(); if (coreStep != lastSteppingCount_) { // A step has happened since last time. This means that we should re-center the cursor. + if (followPC_) { + gotoPC(); + } lastSteppingCount_ = coreStep; } diff --git a/UI/ImDebugger/ImDisasmView.h b/UI/ImDebugger/ImDisasmView.h index 8c4f17d8a8..7cbc232129 100644 --- a/UI/ImDebugger/ImDisasmView.h +++ b/UI/ImDebugger/ImDisasmView.h @@ -18,6 +18,10 @@ public: ImDisasmView(); ~ImDisasmView(); + // Public variables bounds to imgui checkboxes + bool followPC_ = true; + + void Draw(ImDrawList *drawList); void PopupMenu();