mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-05 06:26:49 +00:00
Debugger improved: Instruction editor added
How to use the instruction editor: 1. Load an .ELF file 2. Select an instruction from any valid memory address inside any thread. 3. Press 'E' key and have fun. :P Note1: I suggest to remove the function InterpreterDisAsmFrame::DClick and use InterpreterDisAsmFrame::InstrKey to do all debugging-related actions (Add breakpoint, Edit, Step, Run, etc.) using the same keyboard layout as debuggers like OllyDbg. Note2: The final binary is 200 KB larger due to this feature. This issue should be fixed in the future. This has probably something to do with the #include's.
This commit is contained in:
parent
a11de0f607
commit
bf293ebbfc
6 changed files with 136 additions and 0 deletions
88
rpcs3/Gui/InstructionEditor.cpp
Normal file
88
rpcs3/Gui/InstructionEditor.cpp
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
#include "stdafx.h"
|
||||
#include "InstructionEditor.h"
|
||||
|
||||
InstructionEditorDialog::InstructionEditorDialog(wxPanel *parent, u64 _pc, PPCThread* _CPU, PPC_Decoder* _decoder, PPC_DisAsm* _disasm)
|
||||
: wxDialog(parent, wxID_ANY, "Edit instruction", wxDefaultPosition)
|
||||
, pc(_pc)
|
||||
, CPU(_CPU)
|
||||
, decoder(_decoder)
|
||||
, disasm(_disasm)
|
||||
{
|
||||
wxBoxSizer* s_panel_margin_x(new wxBoxSizer(wxHORIZONTAL));
|
||||
wxBoxSizer* s_panel_margin_y(new wxBoxSizer(wxVERTICAL));
|
||||
|
||||
wxBoxSizer* s_panel(new wxBoxSizer(wxVERTICAL));
|
||||
wxBoxSizer* s_t1_panel(new wxBoxSizer(wxHORIZONTAL));
|
||||
wxBoxSizer* s_t2_panel(new wxBoxSizer(wxHORIZONTAL));
|
||||
wxBoxSizer* s_t3_panel(new wxBoxSizer(wxHORIZONTAL));
|
||||
wxBoxSizer* s_b_panel(new wxBoxSizer(wxHORIZONTAL));
|
||||
|
||||
wxStaticText* t1_text = new wxStaticText(this, wxID_ANY, "Address: ");
|
||||
wxStaticText* t1_addr = new wxStaticText(this, wxID_ANY, wxString::Format("%08x",pc));
|
||||
wxStaticText* t2_text = new wxStaticText(this, wxID_ANY, "Instruction:");
|
||||
t2_instr = new wxTextCtrl(this, wxID_ANY);
|
||||
wxStaticText* t3_text = new wxStaticText(this, wxID_ANY, "Preview: ");
|
||||
t3_preview = new wxStaticText(this, wxID_ANY, "");
|
||||
|
||||
s_t1_panel->Add(t1_text);
|
||||
s_t1_panel->AddSpacer(8);
|
||||
s_t1_panel->Add(t1_addr);
|
||||
|
||||
s_t2_panel->Add(t2_text);
|
||||
s_t2_panel->AddSpacer(8);
|
||||
s_t2_panel->Add(t2_instr);
|
||||
|
||||
s_t3_panel->Add(t3_text);
|
||||
s_t3_panel->AddSpacer(8);
|
||||
s_t3_panel->Add(t3_preview);
|
||||
|
||||
s_b_panel->Add(new wxButton(this, wxID_OK), wxLEFT, 0, 5);
|
||||
s_b_panel->AddSpacer(5);
|
||||
s_b_panel->Add(new wxButton(this, wxID_CANCEL), wxRIGHT, 0, 5);
|
||||
|
||||
s_panel->Add(s_t1_panel);
|
||||
s_panel->AddSpacer(8);
|
||||
s_panel->Add(s_t3_panel);
|
||||
s_panel->AddSpacer(8);
|
||||
s_panel->Add(s_t2_panel);
|
||||
s_panel->AddSpacer(16);
|
||||
s_panel->Add(s_b_panel);
|
||||
|
||||
s_panel_margin_y->AddSpacer(12);
|
||||
s_panel_margin_y->Add(s_panel);
|
||||
s_panel_margin_y->AddSpacer(12);
|
||||
s_panel_margin_x->AddSpacer(12);
|
||||
s_panel_margin_x->Add(s_panel_margin_y);
|
||||
s_panel_margin_x->AddSpacer(12);
|
||||
|
||||
this->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(InstructionEditorDialog::updatePreview));
|
||||
t2_instr->SetValue(wxString::Format("%08x", Memory.Read32(pc)));
|
||||
|
||||
this->SetSizerAndFit(s_panel_margin_x);
|
||||
|
||||
if(this->ShowModal() == wxID_OK)
|
||||
{
|
||||
unsigned long opcode;
|
||||
if (!t2_instr->GetValue().ToULong(&opcode, 16))
|
||||
wxMessageBox("This instruction could not be parsed.\nNo changes were made.","Error");
|
||||
else
|
||||
Memory.Write32(CPU->GetOffset() + pc, (u32)opcode);
|
||||
}
|
||||
}
|
||||
|
||||
void InstructionEditorDialog::updatePreview(wxCommandEvent& event)
|
||||
{
|
||||
unsigned long opcode;
|
||||
if (t2_instr->GetValue().ToULong(&opcode, 16))
|
||||
{
|
||||
decoder->Decode((u32)opcode);
|
||||
wxString preview = disasm->last_opcode;
|
||||
while (preview[0] != ':') preview.Remove(0,1);
|
||||
preview.Remove(0,1);
|
||||
t3_preview->SetLabel(preview);
|
||||
}
|
||||
else
|
||||
{
|
||||
t3_preview->SetLabel("Could not parse instruction.");
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue