From 2808c288ea56481d27de43345f66a0ec1a32c583 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Nov 2013 22:35:03 -0800 Subject: [PATCH 1/3] Add a dialog to enter a jit compare address. For now, requires buttons. --- UI/DevScreens.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++ UI/DevScreens.h | 19 ++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index ea23cacbb3..c5ba834f5b 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -273,7 +273,53 @@ void SystemInfoScreen::CreateViews() { } } +void AddressPromptScreen::CreatePopupContents(UI::ViewGroup *parent) { + addrView_ = new UI::TextView("Enter address", ALIGN_HCENTER, false); + parent->Add(addrView_); +} +void AddressPromptScreen::OnCompleted(DialogResult result) { + if (result == DR_OK) { + UI::EventParams e; + e.v = root_; + e.a = addr_; + OnChoice.Trigger(e); + } +} + +void AddressPromptScreen::key(const KeyInput &key) { + int nextDigit = -1; + if (key.flags & KEY_DOWN) { + if (key.keyCode >= NKCODE_0 && key.keyCode <= NKCODE_9) { + nextDigit = key.keyCode - NKCODE_0; + } else if (key.keyCode >= NKCODE_A && key.keyCode <= NKCODE_F) { + nextDigit = 10 + key.keyCode - NKCODE_A; + // NKCODE_DEL is backspace. + } else if (key.keyCode == NKCODE_DEL) { + addr_ /= 16; + } else if (key.keyCode == NKCODE_ENTER) { + OnCompleted(DR_OK); + screenManager()->finishDialog(this, DR_OK); + return; + } else { + UIDialogScreen::key(key); + } + } else { + UIDialogScreen::key(key); + } + + if (nextDigit != -1 && (addr_ & 0xF0000000) == 0) { + addr_ = addr_ * 16 + nextDigit; + } + + if (addr_ != 0) { + char temp[32]; + snprintf(temp, 32, "%8X", addr_); + addrView_->SetText(temp); + } else { + addrView_->SetText("Enter address"); + } +} // Three panes: Block chooser, MIPS view, ARM/x86 view void JitCompareScreen::CreateViews() { @@ -297,6 +343,7 @@ void JitCompareScreen::CreateViews() { rightDisasm_->SetSpacing(0.0f); leftColumn->Add(new Choice("Current"))->OnClick.Handle(this, &JitCompareScreen::OnCurrentBlock); + leftColumn->Add(new Choice("By Address"))->OnClick.Handle(this, &JitCompareScreen::OnSelectBlock); leftColumn->Add(new Choice("Random"))->OnClick.Handle(this, &JitCompareScreen::OnRandomBlock); leftColumn->Add(new Choice("Random VFPU"))->OnClick.Handle(this, &JitCompareScreen::OnRandomVFPUBlock); leftColumn->Add(new Choice(d->T("Back")))->OnClick.Handle(this, &UIScreen::OnBack); @@ -373,6 +420,24 @@ void JitCompareScreen::UpdateDisasm() { #endif } +UI::EventReturn JitCompareScreen::OnSelectBlock(UI::EventParams &e) { + auto addressPrompt = new AddressPromptScreen("Block address"); + addressPrompt->OnChoice.Handle(this, &JitCompareScreen::OnBlockAddress); + screenManager()->push(addressPrompt); + return UI::EVENT_DONE; +} + +UI::EventReturn JitCompareScreen::OnBlockAddress(UI::EventParams &e) { + JitBlockCache *blockCache = MIPSComp::jit->GetBlockCache(); + if (Memory::IsValidAddress(e.a)) { + currentBlock_ = blockCache->GetBlockNumberFromStartAddress(e.a); + } else { + currentBlock_ = -1; + } + UpdateDisasm(); + return UI::EVENT_DONE; +} + UI::EventReturn JitCompareScreen::OnRandomBlock(UI::EventParams &e) { JitBlockCache *blockCache = MIPSComp::jit->GetBlockCache(); int numBlocks = blockCache->GetNumBlocks(); diff --git a/UI/DevScreens.h b/UI/DevScreens.h index 225b2efc4c..51a09780fc 100644 --- a/UI/DevScreens.h +++ b/UI/DevScreens.h @@ -69,6 +69,23 @@ public: virtual void CreateViews(); }; +class AddressPromptScreen : public PopupScreen { +public: + AddressPromptScreen(const std::string &title) : PopupScreen(title, "OK", "Cancel"), addrView_(NULL), addr_(0) { + } + + virtual void key(const KeyInput &key); + + UI::Event OnChoice; + +protected: + void CreatePopupContents(UI::ViewGroup *parent); + virtual void OnCompleted(DialogResult result); + + UI::TextView *addrView_; + unsigned int addr_; +}; + class JitCompareScreen : public UIDialogScreenWithBackground { public: JitCompareScreen() : currentBlock_(-1) {} @@ -79,6 +96,8 @@ private: UI::EventReturn OnRandomBlock(UI::EventParams &e); UI::EventReturn OnRandomVFPUBlock(UI::EventParams &e); UI::EventReturn OnCurrentBlock(UI::EventParams &e); + UI::EventReturn OnSelectBlock(UI::EventParams &e); + UI::EventReturn OnBlockAddress(UI::EventParams &e); int currentBlock_; From cd39b74629bcc25740959c373883f50c227d6307 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Nov 2013 23:02:04 -0800 Subject: [PATCH 2/3] Add virtual buttons for address input. --- UI/DevScreens.cpp | 70 ++++++++++++++++++++++++++++++++++++----------- UI/DevScreens.h | 9 ++++++ 2 files changed, 63 insertions(+), 16 deletions(-) diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index c5ba834f5b..3ae81e172a 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -274,8 +274,22 @@ void SystemInfoScreen::CreateViews() { } void AddressPromptScreen::CreatePopupContents(UI::ViewGroup *parent) { - addrView_ = new UI::TextView("Enter address", ALIGN_HCENTER, false); + using namespace UI; + + addrView_ = new TextView("Enter address", ALIGN_HCENTER, false); parent->Add(addrView_); + + ViewGroup *grid = new GridLayout(GridLayoutSettings(60, 40)); + parent->Add(grid); + + for (int i = 0; i < 16; ++i) { + char temp[16]; + snprintf(temp, 16, " %X ", i); + buttons_[i] = new Button(temp); + grid->Add(buttons_[i])->OnClick.Handle(this, &AddressPromptScreen::OnDigitButton); + } + + parent->Add(new Button("Backspace"))->OnClick.Handle(this, &AddressPromptScreen::OnBackspace); } void AddressPromptScreen::OnCompleted(DialogResult result) { @@ -287,16 +301,52 @@ void AddressPromptScreen::OnCompleted(DialogResult result) { } } +UI::EventReturn AddressPromptScreen::OnDigitButton(UI::EventParams &e) { + for (int i = 0; i < 16; ++i) { + if (buttons_[i] == e.v) { + AddDigit(i); + } + } + return UI::EVENT_DONE; +} + +UI::EventReturn AddressPromptScreen::OnBackspace(UI::EventParams &e) { + BackspaceDigit(); + return UI::EVENT_DONE; +} + +void AddressPromptScreen::AddDigit(int n) { + if ((addr_ & 0xF0000000) == 0) { + addr_ = addr_ * 16 + n; + } + UpdatePreviewDigits(); +} + +void AddressPromptScreen::BackspaceDigit() { + addr_ /= 16; + UpdatePreviewDigits(); +} + +void AddressPromptScreen::UpdatePreviewDigits() { + if (addr_ != 0) { + char temp[32]; + snprintf(temp, 32, "%8X", addr_); + addrView_->SetText(temp); + } else { + addrView_->SetText("Enter address"); + } +} + void AddressPromptScreen::key(const KeyInput &key) { int nextDigit = -1; if (key.flags & KEY_DOWN) { if (key.keyCode >= NKCODE_0 && key.keyCode <= NKCODE_9) { - nextDigit = key.keyCode - NKCODE_0; + AddDigit(key.keyCode - NKCODE_0); } else if (key.keyCode >= NKCODE_A && key.keyCode <= NKCODE_F) { - nextDigit = 10 + key.keyCode - NKCODE_A; + AddDigit(10 + key.keyCode - NKCODE_A); // NKCODE_DEL is backspace. } else if (key.keyCode == NKCODE_DEL) { - addr_ /= 16; + BackspaceDigit(); } else if (key.keyCode == NKCODE_ENTER) { OnCompleted(DR_OK); screenManager()->finishDialog(this, DR_OK); @@ -307,18 +357,6 @@ void AddressPromptScreen::key(const KeyInput &key) { } else { UIDialogScreen::key(key); } - - if (nextDigit != -1 && (addr_ & 0xF0000000) == 0) { - addr_ = addr_ * 16 + nextDigit; - } - - if (addr_ != 0) { - char temp[32]; - snprintf(temp, 32, "%8X", addr_); - addrView_->SetText(temp); - } else { - addrView_->SetText("Enter address"); - } } // Three panes: Block chooser, MIPS view, ARM/x86 view diff --git a/UI/DevScreens.h b/UI/DevScreens.h index 51a09780fc..9a9d9ee61d 100644 --- a/UI/DevScreens.h +++ b/UI/DevScreens.h @@ -72,6 +72,7 @@ public: class AddressPromptScreen : public PopupScreen { public: AddressPromptScreen(const std::string &title) : PopupScreen(title, "OK", "Cancel"), addrView_(NULL), addr_(0) { + memset(buttons_, 0, sizeof(buttons_)); } virtual void key(const KeyInput &key); @@ -81,8 +82,16 @@ public: protected: void CreatePopupContents(UI::ViewGroup *parent); virtual void OnCompleted(DialogResult result); + UI::EventReturn OnDigitButton(UI::EventParams &e); + UI::EventReturn OnBackspace(UI::EventParams &e); + +private: + void AddDigit(int n); + void BackspaceDigit(); + void UpdatePreviewDigits(); UI::TextView *addrView_; + UI::Button *buttons_[16]; unsigned int addr_; }; From 79322103f2cdeeff680030c1fc8828b9cc512cbe Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Nov 2013 23:48:12 -0800 Subject: [PATCH 3/3] Optimize DisassemblyFunction::getLineNum() a bit. Improves scrolling performance in some cases in the debugger. --- Core/Debugger/DisassemblyManager.cpp | 29 +++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/Core/Debugger/DisassemblyManager.cpp b/Core/Debugger/DisassemblyManager.cpp index 882239bbc8..7f1d030175 100644 --- a/Core/Debugger/DisassemblyManager.cpp +++ b/Core/Debugger/DisassemblyManager.cpp @@ -348,14 +348,29 @@ int DisassemblyFunction::getNumLines() int DisassemblyFunction::getLineNum(u32 address, bool findStart) { - for (int i = 0; i < lineAddresses.size(); i++) + if (findStart) { - u32 next = (i == lineAddresses.size()-1) ? this->address+this->size : lineAddresses[i+1]; - - if (lineAddresses[i] == address) - return i; - if (findStart && lineAddresses[i] <= address && next > address) - return i; + int last = (int)lineAddresses.size() - 1; + for (int i = 0; i < last; i++) + { + u32 next = lineAddresses[i + 1]; + if (lineAddresses[i] <= address && next > address) + return i; + } + if (lineAddresses[last] <= address && this->address + this->size > address) + return last; + } + else + { + int last = (int)lineAddresses.size() - 1; + for (int i = 0; i < last; i++) + { + u32 next = lineAddresses[i + 1]; + if (lineAddresses[i] == address) + return i; + } + if (lineAddresses[last] == address) + return last; } return 0;