diff --git a/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp b/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp index 598af0ecd1..b024dff533 100644 --- a/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp +++ b/pcsx2/gui/Debugger/CtrlDisassemblyView.cpp @@ -889,11 +889,17 @@ void CtrlDisassemblyView::keydownEvent(wxKeyEvent& evt) } scanFunctions(); break; + case WXK_F8: + postEvent(debEVT_STEPOUT,0); + break; case WXK_F10: postEvent(debEVT_STEPOVER,0); return; case WXK_F11: - postEvent(debEVT_STEPINTO,0); + if (evt.ShiftDown()) + postEvent(debEVT_STEPOUT,0); + else + postEvent(debEVT_STEPINTO,0); return; default: evt.Skip(); diff --git a/pcsx2/gui/Debugger/DebugEvents.cpp b/pcsx2/gui/Debugger/DebugEvents.cpp index 8688f8f0f1..eabb3c0e3f 100644 --- a/pcsx2/gui/Debugger/DebugEvents.cpp +++ b/pcsx2/gui/Debugger/DebugEvents.cpp @@ -24,6 +24,7 @@ DEFINE_LOCAL_EVENT_TYPE( debEVT_RUNTOPOS ) DEFINE_LOCAL_EVENT_TYPE( debEVT_MAPLOADED ) DEFINE_LOCAL_EVENT_TYPE( debEVT_STEPOVER ) DEFINE_LOCAL_EVENT_TYPE( debEVT_STEPINTO ) +DEFINE_LOCAL_EVENT_TYPE( debEVT_STEPOUT ) DEFINE_LOCAL_EVENT_TYPE( debEVT_UPDATE ) DEFINE_LOCAL_EVENT_TYPE( debEVT_BREAKPOINTWINDOW ) diff --git a/pcsx2/gui/Debugger/DebugEvents.h b/pcsx2/gui/Debugger/DebugEvents.h index 15cd6ab583..876836c519 100644 --- a/pcsx2/gui/Debugger/DebugEvents.h +++ b/pcsx2/gui/Debugger/DebugEvents.h @@ -25,6 +25,7 @@ DECLARE_LOCAL_EVENT_TYPE( debEVT_RUNTOPOS, wxNewEventType() ) DECLARE_LOCAL_EVENT_TYPE( debEVT_MAPLOADED, wxNewEventType() ) DECLARE_LOCAL_EVENT_TYPE( debEVT_STEPOVER, wxNewEventType() ) DECLARE_LOCAL_EVENT_TYPE( debEVT_STEPINTO, wxNewEventType() ) +DECLARE_LOCAL_EVENT_TYPE( debEVT_STEPOUT, wxNewEventType() ) DECLARE_LOCAL_EVENT_TYPE( debEVT_UPDATE, wxNewEventType() ) DECLARE_LOCAL_EVENT_TYPE( debEVT_BREAKPOINTWINDOW, wxNewEventType() ) diff --git a/pcsx2/gui/Debugger/DisassemblyDialog.cpp b/pcsx2/gui/Debugger/DisassemblyDialog.cpp index 9317947c8d..1f642918e2 100644 --- a/pcsx2/gui/Debugger/DisassemblyDialog.cpp +++ b/pcsx2/gui/Debugger/DisassemblyDialog.cpp @@ -35,6 +35,7 @@ BEGIN_EVENT_TABLE(DisassemblyDialog, wxFrame) EVT_COMMAND( wxID_ANY, debEVT_GOTOINDISASM, DisassemblyDialog::onDebuggerEvent ) EVT_COMMAND( wxID_ANY, debEVT_STEPOVER, DisassemblyDialog::onDebuggerEvent ) EVT_COMMAND( wxID_ANY, debEVT_STEPINTO, DisassemblyDialog::onDebuggerEvent ) + EVT_COMMAND( wxID_ANY, debEVT_STEPOUT, DisassemblyDialog::onDebuggerEvent ) EVT_COMMAND( wxID_ANY, debEVT_UPDATE, DisassemblyDialog::onDebuggerEvent ) EVT_COMMAND( wxID_ANY, debEVT_BREAKPOINTWINDOW, DisassemblyDialog::onDebuggerEvent ) EVT_COMMAND( wxID_ANY, debEVT_MAPLOADED, DisassemblyDialog::onDebuggerEvent ) @@ -196,6 +197,22 @@ void CpuTabPage::loadCycles() lastCycles = cycles; } +u32 CpuTabPage::getStepOutAddress() +{ + if (threadList == NULL) + return (u32)-1; + + EEThread currentThread = threadList->getRunningThread(); + std::vector frames = + MipsStackWalk::Walk(cpu,cpu->getPC(),cpu->getRegister(0,31),cpu->getRegister(0,29), + currentThread.data.entry_init,currentThread.data.stack); + + if (frames.size() < 2) + return (u32)-1; + + return frames[1].pc; +} + DisassemblyDialog::DisassemblyDialog(wxWindow* parent): wxFrame( parent, wxID_ANY, L"Debugger", wxDefaultPosition,wxDefaultSize,wxRESIZE_BORDER|wxCLOSE_BOX|wxCAPTION|wxSYSTEM_MENU ), currentCpu(NULL) @@ -225,6 +242,7 @@ DisassemblyDialog::DisassemblyDialog(wxWindow* parent): stepOutButton = new wxButton( panel, wxID_ANY, L"Step Out" ); stepOutButton->Enable(false); + Connect( stepOutButton->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DisassemblyDialog::onStepOutClicked ) ); topRowSizer->Add(stepOutButton,0,wxRIGHT,8); breakpointButton = new wxButton( panel, wxID_ANY, L"Breakpoint" ); @@ -307,6 +325,11 @@ void DisassemblyDialog::onStepIntoClicked(wxCommandEvent& evt) stepInto(); } +void DisassemblyDialog::onStepOutClicked(wxCommandEvent& evt) +{ + stepOut(); +} + void DisassemblyDialog::onPageChanging(wxCommandEvent& evt) { wxNotebook* notebook = (wxNotebook*)wxWindow::FindWindowById(evt.GetId()); @@ -414,6 +437,18 @@ void DisassemblyDialog::stepInto() r5900Debug.resumeCpu(); } +void DisassemblyDialog::stepOut() +{ + if (!r5900Debug.isAlive() || !r5900Debug.isCpuPaused() || currentCpu == NULL) + return; + + u32 addr = currentCpu->getStepOutAddress(); + if (addr == (u32)-1) + return; + + CBreakPoints::AddBreakPoint(addr,true); + r5900Debug.resumeCpu(); +} void DisassemblyDialog::onBreakpointClick(wxCommandEvent& evt) { @@ -485,6 +520,10 @@ void DisassemblyDialog::onDebuggerEvent(wxCommandEvent& evt) { eeTab->reloadSymbolMap(); iopTab->reloadSymbolMap(); + } else if (type == debEVT_STEPOUT) + { + if (currentCpu != NULL) + stepOut(); } } @@ -536,6 +575,7 @@ void DisassemblyDialog::setDebugMode(bool debugMode, bool switchPC) stepOverButton->Enable(true); stepIntoButton->Enable(true); + stepOutButton->Enable(currentCpu == eeTab); if (switchPC || CBreakPoints::GetBreakpointTriggered()) gotoPc(); diff --git a/pcsx2/gui/Debugger/DisassemblyDialog.h b/pcsx2/gui/Debugger/DisassemblyDialog.h index 94ab959160..ab2d0cb62a 100644 --- a/pcsx2/gui/Debugger/DisassemblyDialog.h +++ b/pcsx2/gui/Debugger/DisassemblyDialog.h @@ -43,6 +43,7 @@ public: void showMemoryView() { setBottomTabPage(memory); }; void loadCycles(); void reloadSymbolMap(); + u32 getStepOutAddress(); void listBoxHandler(wxCommandEvent& event); DECLARE_EVENT_TABLE() @@ -86,12 +87,14 @@ protected: void onBreakRunClicked(wxCommandEvent& evt); void onStepOverClicked(wxCommandEvent& evt); void onStepIntoClicked(wxCommandEvent& evt); + void onStepOutClicked(wxCommandEvent& evt); void onDebuggerEvent(wxCommandEvent& evt); void onPageChanging(wxCommandEvent& evt); void onBreakpointClick(wxCommandEvent& evt); void onClose(wxCloseEvent& evt); void stepOver(); void stepInto(); + void stepOut(); void gotoPc(); private: CpuTabPage* eeTab;