diff --git a/Windows/GEDebugger/CtrlDisplayListView.cpp b/Windows/GEDebugger/CtrlDisplayListView.cpp index 3a6c38c96e..ac25a2b2f4 100644 --- a/Windows/GEDebugger/CtrlDisplayListView.cpp +++ b/Windows/GEDebugger/CtrlDisplayListView.cpp @@ -1,10 +1,14 @@ #include "Windows/GEDebugger/CtrlDisplayListView.h" #include "Core/Config.h" #include "Windows/GEDebugger/GEDebugger.h" +#include "Windows/Main.h" #include const PTCHAR CtrlDisplayListView::windowClass = _T("CtrlDisplayListView"); +const int POPUP_SUBMENU_ID_DISPLAYLISTVIEW = 8; +extern HMENU g_hPopupMenus; + void CtrlDisplayListView::registerClass() { WNDCLASSEX wndClass; @@ -99,6 +103,15 @@ LRESULT CALLBACK CtrlDisplayListView::wndProc(HWND hwnd, UINT msg, WPARAM wParam case WM_LBUTTONDOWN: win->onMouseDown(wParam,lParam,1); break; + case WM_RBUTTONDOWN: + win->onMouseDown(wParam,lParam,2); + break; + case WM_LBUTTONUP: + win->onMouseUp(wParam,lParam,1); + break; + case WM_RBUTTONUP: + win->onMouseUp(wParam,lParam,2); + break; case WM_KEYDOWN: case WM_SYSKEYDOWN: win->onKeyDown(wParam,lParam); @@ -261,6 +274,71 @@ void CtrlDisplayListView::onMouseDown(WPARAM wParam, LPARAM lParam, int button) redraw(); } +void CtrlDisplayListView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) +{ + if (button == 2) + { + //popup menu? + POINT pt; + GetCursorPos(&pt); + switch(TrackPopupMenuEx(GetSubMenu(g_hPopupMenus,POPUP_SUBMENU_ID_DISPLAYLISTVIEW),TPM_RIGHTBUTTON|TPM_RETURNCMD,pt.x,pt.y,wnd,0)) + { + case ID_DISASM_GOTOINMEMORYVIEW: + for (int i=0; iGoto(curAddress); + break; + case ID_DISASM_TOGGLEBREAKPOINT: + toggleBreakpoint(); + redraw(); + break; + case ID_DISASM_COPYINSTRUCTIONDISASM: + { + GPUDebugOp op = gpuDebug->DissassembleOp(curAddress); + W32Util::CopyTextToClipboard(wnd, op.desc.c_str()); + } + break; + case ID_DISASM_COPYADDRESS: + { + char temp[16]; + sprintf(temp,"%08X",curAddress); + W32Util::CopyTextToClipboard(wnd, temp); + } + break; + case ID_DISASM_SETPCTOHERE: + { + gpuDebug->ResetListPC(list.id,curAddress); + list.pc = curAddress; + redraw(); + } + break; + case IDC_DEBUG_LIST_SETSTALL: + { + gpuDebug->ResetListStall(list.id,curAddress); + list.stall = curAddress; + redraw(); + } + break; + case ID_DISASM_COPYINSTRUCTIONHEX: + { + char temp[16]; + sprintf(temp,"%08X",Memory::ReadUnchecked_U32(curAddress)); + W32Util::CopyTextToClipboard(wnd, temp); + } + break; + case ID_DISASM_RUNTOHERE: + { + SendMessage(GetParent(wnd),WM_GEDBG_RUNTOWPARAM,curAddress,0); + redraw(); + } + break; + } + return; + } + + redraw(); +} + void CtrlDisplayListView::onVScroll(WPARAM wParam, LPARAM lParam) { switch (wParam & 0xFFFF) @@ -329,7 +407,6 @@ void CtrlDisplayListView::onKeyDown(WPARAM wParam, LPARAM lParam) redraw(); } - void CtrlDisplayListView::scrollAddressIntoView() { u32 windowEnd = windowStart + visibleRows * instructionSize; diff --git a/Windows/GEDebugger/CtrlDisplayListView.h b/Windows/GEDebugger/CtrlDisplayListView.h index c8293f346a..1e9c5fa865 100644 --- a/Windows/GEDebugger/CtrlDisplayListView.h +++ b/Windows/GEDebugger/CtrlDisplayListView.h @@ -38,6 +38,7 @@ public: void onPaint(WPARAM wParam, LPARAM lParam); void onKeyDown(WPARAM wParam, LPARAM lParam); void onMouseDown(WPARAM wParam, LPARAM lParam, int button); + void onMouseUp(WPARAM wParam, LPARAM lParam, int button); void onVScroll(WPARAM wParam, LPARAM lParam); void redraw(); diff --git a/Windows/GEDebugger/GEDebugger.cpp b/Windows/GEDebugger/GEDebugger.cpp index 349a11fc8f..247ccc4cbd 100644 --- a/Windows/GEDebugger/GEDebugger.cpp +++ b/Windows/GEDebugger/GEDebugger.cpp @@ -53,6 +53,7 @@ static condition_variable actionWait; static recursive_mutex breaksLock; static std::vector breakCmds; static std::set breakPCs; +static u32 tempBreakpoint = -1; static std::set breakTextures; static bool breakNextOp = false; static bool breakNextDraw = false; @@ -355,6 +356,7 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { case WM_GEDBG_BREAK_CMD: { u32 pc = (u32)wParam; + tempBreakpoint = -1; auto info = gpuDebug->DissassembleOp(pc); NOTICE_LOG(COMMON, "Waiting at %08x, %s", pc, info.desc.c_str()); UpdatePreviews(); @@ -389,6 +391,14 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { } break; + case WM_GEDBG_RUNTOWPARAM: + { + lock_guard guard(breaksLock); + u32 pc = (u32)wParam; + tempBreakpoint = pc; + SendMessage(m_hDlg,WM_COMMAND,IDC_GEDBG_RESUME,0); + } + break; } return FALSE; @@ -418,7 +428,7 @@ void WindowsHost::GPUNotifyCommand(u32 pc) { u32 op = Memory::ReadUnchecked_U32(pc); u8 cmd = op >> 24; - if (breakNextOp || CGEDebugger::IsOpOrTextureBreakPoint(op) || CGEDebugger::IsAddressBreakPoint(pc)) { + if (breakNextOp || CGEDebugger::IsOpOrTextureBreakPoint(op) || CGEDebugger::IsAddressBreakPoint(pc) || pc == tempBreakpoint) { PauseWithMessage(WM_GEDBG_BREAK_CMD, (WPARAM) pc); } } diff --git a/Windows/GEDebugger/GEDebugger.h b/Windows/GEDebugger/GEDebugger.h index 241739e464..d51da9fa7a 100644 --- a/Windows/GEDebugger/GEDebugger.h +++ b/Windows/GEDebugger/GEDebugger.h @@ -28,7 +28,8 @@ enum { WM_GEDBG_BREAK_CMD = WM_USER + 200, WM_GEDBG_BREAK_DRAW, WM_GEDBG_STEPDISPLAYLIST, - WM_GEDBG_TOGGLEPCBREAKPOINT + WM_GEDBG_TOGGLEPCBREAKPOINT, + WM_GEDBG_RUNTOWPARAM }; class CtrlDisplayListView; diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index 265a88be83..a8eaf24643 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -550,6 +550,19 @@ BEGIN BEGIN MENUITEM "Add New", ID_DISASM_ADDNEWBREAKPOINT END + POPUP "displaylistview" + BEGIN + MENUITEM "Copy Address", ID_DISASM_COPYADDRESS + MENUITEM "Copy Instruction (Hex)", ID_DISASM_COPYINSTRUCTIONHEX + MENUITEM "Copy Instruction (Disasm)", ID_DISASM_COPYINSTRUCTIONDISASM + MENUITEM SEPARATOR + MENUITEM "Run to Cursor", ID_DISASM_RUNTOHERE + MENUITEM "Jump to Cursor", ID_DISASM_SETPCTOHERE + MENUITEM "Set Stall" IDC_DEBUG_LIST_SETSTALL + MENUITEM "Toggle Breakpoint", ID_DISASM_TOGGLEBREAKPOINT + MENUITEM SEPARATOR + MENUITEM "Go to in Memory View", ID_DISASM_GOTOINMEMORYVIEW + END END #endif // English (United States) resources diff --git a/Windows/resource.h b/Windows/resource.h index 18ecd558cd..603b7c8161 100644 --- a/Windows/resource.h +++ b/Windows/resource.h @@ -284,6 +284,7 @@ #define IDC_DEBUG_BOTTOMTABS 40127 #define ID_DEBUG_HIDEBOTTOMTABS 40128 #define ID_DEBUG_TOGGLEBOTTOMTABTITLES 40129 +#define IDC_DEBUG_LIST_SETSTALL 40130 // Dummy option to let the buffered rendering hotkey cycle through all the options. #define ID_OPTIONS_BUFFEREDRENDERINGDUMMY 40500 @@ -296,7 +297,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 254 -#define _APS_NEXT_COMMAND_VALUE 40130 +#define _APS_NEXT_COMMAND_VALUE 40131 #define _APS_NEXT_CONTROL_VALUE 1191 #define _APS_NEXT_SYMED_VALUE 101 #endif