mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #4668 from unknownbrackets/debugger
Add a dialog to enter a specific jit compare address
This commit is contained in:
commit
33023a34d7
3 changed files with 153 additions and 7 deletions
|
@ -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;
|
||||
|
|
|
@ -273,7 +273,91 @@ void SystemInfoScreen::CreateViews() {
|
|||
}
|
||||
}
|
||||
|
||||
void AddressPromptScreen::CreatePopupContents(UI::ViewGroup *parent) {
|
||||
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) {
|
||||
if (result == DR_OK) {
|
||||
UI::EventParams e;
|
||||
e.v = root_;
|
||||
e.a = addr_;
|
||||
OnChoice.Trigger(e);
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
AddDigit(key.keyCode - NKCODE_0);
|
||||
} else if (key.keyCode >= NKCODE_A && key.keyCode <= NKCODE_F) {
|
||||
AddDigit(10 + key.keyCode - NKCODE_A);
|
||||
// NKCODE_DEL is backspace.
|
||||
} else if (key.keyCode == NKCODE_DEL) {
|
||||
BackspaceDigit();
|
||||
} else if (key.keyCode == NKCODE_ENTER) {
|
||||
OnCompleted(DR_OK);
|
||||
screenManager()->finishDialog(this, DR_OK);
|
||||
return;
|
||||
} else {
|
||||
UIDialogScreen::key(key);
|
||||
}
|
||||
} else {
|
||||
UIDialogScreen::key(key);
|
||||
}
|
||||
}
|
||||
|
||||
// Three panes: Block chooser, MIPS view, ARM/x86 view
|
||||
void JitCompareScreen::CreateViews() {
|
||||
|
@ -297,6 +381,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<UIScreen>(this, &UIScreen::OnBack);
|
||||
|
@ -373,6 +458,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();
|
||||
|
|
|
@ -69,6 +69,32 @@ public:
|
|||
virtual void CreateViews();
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
UI::Event OnChoice;
|
||||
|
||||
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_;
|
||||
};
|
||||
|
||||
class JitCompareScreen : public UIDialogScreenWithBackground {
|
||||
public:
|
||||
JitCompareScreen() : currentBlock_(-1) {}
|
||||
|
@ -79,6 +105,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_;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue