From 9b2cc62393c3bdfb3d5fd57f8608110b7df3f12a Mon Sep 17 00:00:00 2001 From: Sepalani Date: Thu, 4 May 2017 00:08:24 +0100 Subject: [PATCH] CodeView: Assemble menu item added --- Source/Core/DolphinWX/CMakeLists.txt | 1 + .../Debugger/AssemblerEntryDialog.cpp | 90 +++++++++++++++++++ .../DolphinWX/Debugger/AssemblerEntryDialog.h | 32 +++++++ Source/Core/DolphinWX/Debugger/CodeView.cpp | 27 ++++++ Source/Core/DolphinWX/DolphinWX.vcxproj | 2 + .../Core/DolphinWX/DolphinWX.vcxproj.filters | 6 ++ 6 files changed, 158 insertions(+) create mode 100644 Source/Core/DolphinWX/Debugger/AssemblerEntryDialog.cpp create mode 100644 Source/Core/DolphinWX/Debugger/AssemblerEntryDialog.h diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index ded1172b12..843ef69258 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -21,6 +21,7 @@ set(SRCS Config/InterfaceConfigPane.cpp Config/PathConfigPane.cpp Config/WiiConfigPane.cpp + Debugger/AssemblerEntryDialog.cpp Debugger/BreakpointDlg.cpp Debugger/BreakpointView.cpp Debugger/BreakpointWindow.cpp diff --git a/Source/Core/DolphinWX/Debugger/AssemblerEntryDialog.cpp b/Source/Core/DolphinWX/Debugger/AssemblerEntryDialog.cpp new file mode 100644 index 0000000000..079a3ab222 --- /dev/null +++ b/Source/Core/DolphinWX/Debugger/AssemblerEntryDialog.cpp @@ -0,0 +1,90 @@ +// Copyright 2017 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "DolphinWX/Debugger/AssemblerEntryDialog.h" + +#include + +#include +#include +#include + +#include "Common/GekkoDisassembler.h" +#include "Common/StringUtil.h" + +AssemblerEntryDialog::AssemblerEntryDialog(u32 address, wxWindow* parent, const wxString& message, + const wxString& caption, const wxString& value, + long style, const wxPoint& pos) + : m_address(address) +{ + Create(parent, message, caption, value, style, pos); +} + +bool AssemblerEntryDialog::Create(wxWindow* parent, const wxString& message, + const wxString& caption, const wxString& value, long style, + const wxPoint& pos) +{ + // Do not pass style to GetParentForModalDialog() as wxDIALOG_NO_PARENT + // has the same numeric value as wxTE_MULTILINE and so attempting to create + // a dialog for editing multiline text would also prevent it from having a + // parent which is undesirable. As it is, we can't create a text entry + // dialog without a parent which is not ideal neither but is a much less + // important problem. + if (!wxDialog::Create(GetParentForModalDialog(parent, 0), wxID_ANY, caption, pos, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)) + { + return false; + } + + m_dialogStyle = style; + m_value = value; + + wxBeginBusyCursor(); + + wxBoxSizer* top_sizer = new wxBoxSizer(wxVERTICAL); + + // 1) text message + top_sizer->Add(CreateTextSizer(message), wxSizerFlags().DoubleBorder()); + + // 2) text ctrl + m_textctrl = new wxTextCtrl(this, 3000, value, wxDefaultPosition, wxSize(300, wxDefaultCoord), + style & ~wxTextEntryDialogStyle); + m_textctrl->Bind(wxEVT_TEXT, &AssemblerEntryDialog::OnTextChanged, this); + + top_sizer->Add( + m_textctrl, + wxSizerFlags(style & wxTE_MULTILINE ? 1 : 0).Expand().TripleBorder(wxLEFT | wxRIGHT)); + + m_preview = new wxStaticText(this, wxID_ANY, ""); + top_sizer->Add(m_preview, wxSizerFlags().DoubleBorder(wxUP | wxLEFT | wxRIGHT)); + + wxSizer* button_sizer = CreateSeparatedButtonSizer(style & (wxOK | wxCANCEL)); + if (button_sizer) + top_sizer->Add(button_sizer, wxSizerFlags().DoubleBorder().Expand()); + + SetAutoLayout(true); + SetSizer(top_sizer); + + top_sizer->SetSizeHints(this); + top_sizer->Fit(this); + + if (style & wxCENTRE) + Centre(wxBOTH); + + m_textctrl->SelectAll(); + m_textctrl->SetFocus(); + + wxEndBusyCursor(); + + return true; +} + +void AssemblerEntryDialog::OnTextChanged(wxCommandEvent& evt) +{ + unsigned long code; + std::string result = "Input text is invalid"; + if (evt.GetString().ToULong(&code, 0) && code <= std::numeric_limits::max()) + result = TabsToSpaces(1, GekkoDisassembler::Disassemble(code, m_address)); + m_preview->SetLabel(wxString::Format(_("Preview: %s"), result.c_str())); +} diff --git a/Source/Core/DolphinWX/Debugger/AssemblerEntryDialog.h b/Source/Core/DolphinWX/Debugger/AssemblerEntryDialog.h new file mode 100644 index 0000000000..4f9c449325 --- /dev/null +++ b/Source/Core/DolphinWX/Debugger/AssemblerEntryDialog.h @@ -0,0 +1,32 @@ +// Copyright 2017 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include + +#include "Common/CommonTypes.h" + +class wxStaticText; + +class AssemblerEntryDialog : public wxTextEntryDialog +{ +public: + AssemblerEntryDialog(u32 address, wxWindow* parent, const wxString& message, + const wxString& caption = wxGetTextFromUserPromptStr, + const wxString& value = wxEmptyString, long style = wxTextEntryDialogStyle, + const wxPoint& pos = wxDefaultPosition); + + bool Create(wxWindow* parent, const wxString& message, + const wxString& caption = wxGetTextFromUserPromptStr, + const wxString& value = wxEmptyString, long style = wxTextEntryDialogStyle, + const wxPoint& pos = wxDefaultPosition); + +protected: + u32 m_address; + wxStaticText* m_preview; + +private: + void OnTextChanged(wxCommandEvent& evt); +}; diff --git a/Source/Core/DolphinWX/Debugger/CodeView.cpp b/Source/Core/DolphinWX/Debugger/CodeView.cpp index eb85cfa8b5..337e0e2972 100644 --- a/Source/Core/DolphinWX/Debugger/CodeView.cpp +++ b/Source/Core/DolphinWX/Debugger/CodeView.cpp @@ -9,6 +9,7 @@ #include #include #include + #include #include #include @@ -26,6 +27,8 @@ #include "Core/Core.h" #include "Core/Host.h" #include "Core/PowerPC/PPCAnalyst.h" +#include "Core/PowerPC/PowerPC.h" +#include "DolphinWX/Debugger/AssemblerEntryDialog.h" #include "DolphinWX/Debugger/CodeView.h" #include "DolphinWX/Debugger/DebuggerUIUtil.h" #include "DolphinWX/Globals.h" @@ -41,6 +44,7 @@ enum IDM_COPYCODE, IDM_INSERTBLR, IDM_INSERTNOP, + IDM_ASSEMBLE, IDM_RUNTOHERE, IDM_JITRESULTS, IDM_FOLLOWBRANCH, @@ -301,6 +305,28 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) Refresh(); break; + case IDM_ASSEMBLE: + { + if (!PowerPC::HostIsInstructionRAMAddress(m_selection)) + break; + const PowerPC::TryReadInstResult read_result = PowerPC::TryReadInstruction(m_selection); + if (!read_result.valid) + break; + AssemblerEntryDialog dialog(m_selection, this, _("Enter instruction code:"), + wxGetTextFromUserPromptStr, + wxString::Format(wxT("%#08x"), read_result.hex)); + if (dialog.ShowModal() == wxID_OK) + { + unsigned long code; + if (dialog.GetValue().ToULong(&code, 0) && code <= std::numeric_limits::max()) + { + m_debugger->InsertBLR(m_selection, code); + Refresh(); + } + } + break; + } + case IDM_JITRESULTS: { // Propagate back to the parent window and tell it @@ -424,6 +450,7 @@ void CCodeView::OnMouseUpR(wxMouseEvent& event) menu.Append(IDM_JITRESULTS, _("PPC vs x86"))->Enable(Core::IsRunning()); menu.Append(IDM_INSERTBLR, _("&Insert blr"))->Enable(Core::IsRunning()); menu.Append(IDM_INSERTNOP, _("Insert &nop"))->Enable(Core::IsRunning()); + menu.Append(IDM_ASSEMBLE, _("Re&place Instruction"))->Enable(Core::IsRunning()); // menu.Append(IDM_PATCHALERT, _("Patch alert"))->Enable(Core::IsRunning()); PopupMenu(&menu); event.Skip(); diff --git a/Source/Core/DolphinWX/DolphinWX.vcxproj b/Source/Core/DolphinWX/DolphinWX.vcxproj index d3545feb19..d9da1a68f0 100644 --- a/Source/Core/DolphinWX/DolphinWX.vcxproj +++ b/Source/Core/DolphinWX/DolphinWX.vcxproj @@ -71,6 +71,7 @@ + @@ -163,6 +164,7 @@ + diff --git a/Source/Core/DolphinWX/DolphinWX.vcxproj.filters b/Source/Core/DolphinWX/DolphinWX.vcxproj.filters index a230a9db4d..fc87d3fbb3 100644 --- a/Source/Core/DolphinWX/DolphinWX.vcxproj.filters +++ b/Source/Core/DolphinWX/DolphinWX.vcxproj.filters @@ -52,6 +52,9 @@ GUI\Cheats + + GUI\Debugger + GUI\Debugger @@ -279,6 +282,9 @@ GUI\Cheats + + GUI\Debugger + GUI\Debugger