diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2026-06-28 16:31:46 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-06-28 16:31:46 +0200 |
| commit | be33a68335e9ede4d8a54b9449ddda5329531d5a (patch) | |
| tree | 7240ed15fc2add6a2480024e65f9b4fc7761e71c /Source/Core | |
| parent | d034d41fcc94431f8871b29090142b6e797c4233 (diff) | |
| parent | 7ce4db1c7d9e41cee78954c758fcad3c419baee3 (diff) | |
Merge pull request #14658 from VampireFlower/patch-instruction-assemble
[Debugger]: Assemble instructions in the patch instruction dialog
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/DolphinQt/Debugger/PatchInstructionDialog.cpp | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/Source/Core/DolphinQt/Debugger/PatchInstructionDialog.cpp b/Source/Core/DolphinQt/Debugger/PatchInstructionDialog.cpp index 9a54567d3e..e001659439 100644 --- a/Source/Core/DolphinQt/Debugger/PatchInstructionDialog.cpp +++ b/Source/Core/DolphinQt/Debugger/PatchInstructionDialog.cpp @@ -9,7 +9,9 @@ #include <QPushButton> #include <QVBoxLayout> +#include "Common/Assembler/GekkoAssembler.h" #include "Common/GekkoDisassembler.h" +#include "Common/Swap.h" PatchInstructionDialog::PatchInstructionDialog(QWidget* parent, u32 address, u32 value) : QDialog(parent), m_address(address) @@ -49,14 +51,43 @@ void PatchInstructionDialog::ConnectWidgets() void PatchInstructionDialog::OnEditChanged() { - bool good; - m_code = m_input_edit->text().toUInt(&good, 16); + const QString input = m_input_edit->text(); - m_button_box->button(QDialogButtonBox::Ok)->setEnabled(good); + bool legal = false; + bool is_hex = false; - m_preview_label->setText( - tr("Instruction: %1") - .arg(QString::fromStdString(Common::GekkoDisassembler::Disassemble(m_code, m_address)))); + QString preview = QStringLiteral("(ill)\t---"); + + const u32 hex_code = input.toUInt(&is_hex, 16); + + if (is_hex) + { + legal = true; + m_code = hex_code; + preview = QString::fromStdString(Common::GekkoDisassembler::Disassemble(hex_code, m_address)); + } + else // Try to parse as a single instruction + { + const auto asm_result = Common::GekkoAssembler::Assemble(input.toStdString(), m_address); + + if (!Common::GekkoAssembler::IsFailure(asm_result)) + { + const auto& blocks = Common::GekkoAssembler::GetT(asm_result); + + if (!blocks.empty()) + { + legal = true; + + m_code = Common::swap32(blocks[0].instructions.data()); + + preview = QStringLiteral("%1").arg(m_code, 8, 16, QLatin1Char('0')); + } + } + } + + m_button_box->button(QDialogButtonBox::Ok)->setEnabled(legal); + + m_preview_label->setText(tr("Instruction: %1").arg(preview)); } u32 PatchInstructionDialog::GetCode() const |
