void CtrlDisAsmView::onMouseDown(WPARAM wParam, LPARAM lParam, int button) { dontRedraw = false; int x = LOWORD(lParam); int y = HIWORD(lParam); u32 newAddress = yToAddress(y); bool extend = KeyDownAsync(VK_SHIFT); if (button == 1) { if (newAddress == curAddress && hasFocus) { toggleBreakpoint(); } } else if (button == 2) { // Maintain the current selection if right clicking into it. if (newAddress >= selectRangeStart && newAddress < selectRangeEnd) extend = true; } setCurAddress(newAddress, extend); SetFocus(wnd); redraw(); }
void CtrlDisplayListView::onMouseDown(WPARAM wParam, LPARAM lParam, int button) { int x = LOWORD(lParam); int y = HIWORD(lParam); int line = y/rowHeight; u32 newAddress = windowStart + line*instructionSize; bool extend = KeyDownAsync(VK_SHIFT); if (button == 1) { if (newAddress == curAddress && hasFocus) { toggleBreakpoint(); } } else if (button == 2) { // Maintain the current selection if right clicking into it. if (newAddress >= selectRangeStart && newAddress < selectRangeEnd) extend = true; } setCurAddress(newAddress,extend); SetFocus(wnd); redraw(); }
void CtrlDisAsmView::onMouseMove(WPARAM wParam, LPARAM lParam, int button) { if ((button & 1) != 0) { int x = LOWORD(lParam); int y = HIWORD(lParam); setCurAddress(yToAddress(y), KeyDownAsync(VK_SHIFT)); // TODO: Perhaps don't do this every time, but on a timer? redraw(); } }
void CtrlDisplayListView::onMouseDown(WPARAM wParam, LPARAM lParam, int button) { int x = LOWORD(lParam); int y = HIWORD(lParam); int line = y/rowHeight; u32 newAddress = windowStart + line*instructionSize; setCurAddress(newAddress); SetFocus(wnd); redraw(); }
void CtrlDisplayListView::onKeyDown(WPARAM wParam, LPARAM lParam) { u32 windowEnd = windowStart+visibleRows*instructionSize; switch (wParam & 0xFFFF) { case VK_DOWN: setCurAddress(curAddress + instructionSize, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); break; case VK_UP: setCurAddress(curAddress - instructionSize, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); break; case VK_NEXT: if (curAddress != windowEnd - instructionSize && curAddressIsVisible()) { setCurAddress(windowEnd - instructionSize, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } else { setCurAddress(curAddress + visibleRows * instructionSize, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } break; case VK_PRIOR: if (curAddress != windowStart && curAddressIsVisible()) { setCurAddress(windowStart, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } else { setCurAddress(curAddress - visibleRows * instructionSize, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } break; case VK_LEFT: gotoAddr(list.pc); return; case VK_SPACE: toggleBreakpoint(); break; case VK_F10: case VK_F11: SendMessage(GetParent(wnd),WM_GEDBG_STEPDISPLAYLIST,0,0); break; } redraw(); }
void CtrlDisplayListView::onKeyDown(WPARAM wParam, LPARAM lParam) { u32 windowEnd = windowStart+visibleRows*instructionSize; switch (wParam & 0xFFFF) { case VK_DOWN: setCurAddress(curAddress + instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); break; case VK_UP: setCurAddress(curAddress - instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); break; case VK_NEXT: if (curAddress != windowEnd - instructionSize && curAddressIsVisible()) { setCurAddress(windowEnd - instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } else { setCurAddress(curAddress + visibleRows * instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } break; case VK_PRIOR: if (curAddress != windowStart && curAddressIsVisible()) { setCurAddress(windowStart, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } else { setCurAddress(curAddress - visibleRows * instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } break; case VK_LEFT: gotoAddr(list.pc); return; } redraw(); }
void CtrlDisAsmView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) { if (button == 1) { int x = LOWORD(lParam); int y = HIWORD(lParam); setCurAddress(yToAddress(y), KeyDownAsync(VK_SHIFT)); redraw(); } else if (button == 2) { //popup menu? POINT pt; GetCursorPos(&pt); switch(TrackPopupMenuEx(GetSubMenu(g_hPopupMenus,1),TPM_RIGHTBUTTON|TPM_RETURNCMD,pt.x,pt.y,wnd,0)) { case ID_DISASM_GOTOINMEMORYVIEW: SendMessage(GetParent(wnd),WM_DEB_GOTOHEXEDIT,curAddress,0); break; case ID_DISASM_ADDHLE: break; case ID_DISASM_TOGGLEBREAKPOINT: toggleBreakpoint(); redraw(); break; case ID_DISASM_ASSEMBLE: assembleOpcode(curAddress,""); break; case ID_DISASM_COPYINSTRUCTIONDISASM: copyInstructions(selectRangeStart, selectRangeEnd, true); break; case ID_DISASM_COPYADDRESS: { char temp[16]; sprintf(temp,"%08X",curAddress); W32Util::CopyTextToClipboard(wnd, temp); } break; case ID_DISASM_SETPCTOHERE: debugger->setPC(curAddress); redraw(); break; case ID_DISASM_FOLLOWBRANCH: followBranch(); break; case ID_DISASM_COPYINSTRUCTIONHEX: copyInstructions(selectRangeStart, selectRangeEnd, false); break; case ID_DISASM_RUNTOHERE: { SendMessage(GetParent(wnd), WM_COMMAND, ID_DEBUG_RUNTOLINE, 0); redraw(); } break; case ID_DISASM_RENAMEFUNCTION: { u32 funcBegin = symbolMap.GetFunctionStart(curAddress); if (funcBegin != -1) { char name[256]; std::string newname; strncpy_s(name, symbolMap.GetLabelString(funcBegin).c_str(),_TRUNCATE); if (InputBox_GetString(MainWindow::GetHInstance(), MainWindow::GetHWND(), L"New function name", name, newname)) { symbolMap.SetLabelName(newname.c_str(),funcBegin); u32 funcSize = symbolMap.GetFunctionSize(curAddress); MIPSAnalyst::RegisterFunction(funcBegin, funcSize, newname.c_str()); MIPSAnalyst::UpdateHashMap(); MIPSAnalyst::ApplyHashMap(); SendMessage(GetParent(wnd),WM_DEB_MAPLOADED,0,0); redraw(); } } else { MessageBox(MainWindow::GetHWND(), L"No symbol selected",0,0); } } break; case ID_DISASM_REMOVEFUNCTION: { char statusBarTextBuff[256]; u32 funcBegin = symbolMap.GetFunctionStart(curAddress); if (funcBegin != -1) { u32 prevBegin = symbolMap.GetFunctionStart(funcBegin-1); if (prevBegin != -1) { u32 expandedSize = symbolMap.GetFunctionSize(prevBegin)+symbolMap.GetFunctionSize(funcBegin); symbolMap.SetFunctionSize(prevBegin,expandedSize); } symbolMap.RemoveFunction(funcBegin,true); symbolMap.SortSymbols(); manager.clear(); SendMessage(GetParent(wnd), WM_DEB_MAPLOADED, 0, 0); } else { snprintf(statusBarTextBuff,256, "WARNING: unable to find function symbol here"); SendMessage(GetParent(wnd), WM_DEB_SETSTATUSBARTEXT, 0, (LPARAM) statusBarTextBuff); } redraw(); } break; case ID_DISASM_ADDFUNCTION: { char statusBarTextBuff[256]; u32 prevBegin = symbolMap.GetFunctionStart(curAddress); if (prevBegin != -1) { if (prevBegin == curAddress) { snprintf(statusBarTextBuff,256, "WARNING: There's already a function entry point at this adress"); SendMessage(GetParent(wnd), WM_DEB_SETSTATUSBARTEXT, 0, (LPARAM) statusBarTextBuff); } else { char symname[128]; u32 prevSize = symbolMap.GetFunctionSize(prevBegin); u32 newSize = curAddress-prevBegin; symbolMap.SetFunctionSize(prevBegin,newSize); newSize = prevSize-newSize; snprintf(symname,128,"u_un_%08X",curAddress); symbolMap.AddFunction(symname,curAddress,newSize); symbolMap.SortSymbols(); manager.clear(); SendMessage(GetParent(wnd), WM_DEB_MAPLOADED, 0, 0); } } else { char symname[128]; int newSize = selectRangeEnd - selectRangeStart; snprintf(symname, 128, "u_un_%08X", selectRangeStart); symbolMap.AddFunction(symname, selectRangeStart, newSize); symbolMap.SortSymbols(); SendMessage(GetParent(wnd), WM_DEB_MAPLOADED, 0, 0); } redraw(); } break; case ID_DISASM_DISASSEMBLETOFILE: disassembleToFile(); break; } return; } redraw(); }
void CtrlDisAsmView::onKeyDown(WPARAM wParam, LPARAM lParam) { dontRedraw = false; u32 windowEnd = manager.getNthNextAddress(windowStart,visibleRows); keyTaken = true; if (KeyDownAsync(VK_CONTROL)) { switch (tolower(wParam & 0xFFFF)) { case 'f': case 's': search(false); break; case 'c': case VK_INSERT: copyInstructions(selectRangeStart, selectRangeEnd, true); break; case 'x': disassembleToFile(); break; case 'a': assembleOpcode(curAddress,""); break; case 'g': { u32 addr; if (executeExpressionWindow(wnd,debugger,addr) == false) return; gotoAddr(addr); } break; case 'e': // edit breakpoint editBreakpoint(); break; case 'd': // toogle breakpoint enabled toggleBreakpoint(true); break; case VK_UP: scrollWindow(-1); scanFunctions(); break; case VK_DOWN: scrollWindow(1); scanFunctions(); break; case VK_NEXT: setCurAddress(manager.getNthPreviousAddress(windowEnd,1),KeyDownAsync(VK_SHIFT)); break; case VK_PRIOR: setCurAddress(windowStart,KeyDownAsync(VK_SHIFT)); break; } } else { switch (wParam & 0xFFFF) { case VK_DOWN: setCurAddress(manager.getNthNextAddress(curAddress,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); break; case VK_UP: setCurAddress(manager.getNthPreviousAddress(curAddress,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); break; case VK_NEXT: if (manager.getNthNextAddress(curAddress,1) != windowEnd && curAddressIsVisible()) { setCurAddress(manager.getNthPreviousAddress(windowEnd,1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } else { setCurAddress(manager.getNthNextAddress(windowEnd,visibleRows-1), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } break; case VK_PRIOR: if (curAddress != windowStart && curAddressIsVisible()) { setCurAddress(windowStart, KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } else { setCurAddress(manager.getNthPreviousAddress(windowStart,visibleRows), KeyDownAsync(VK_SHIFT)); scrollAddressIntoView(); } break; case VK_LEFT: if (jumpStack.empty()) { gotoPC(); } else { u32 addr = jumpStack[jumpStack.size()-1]; jumpStack.pop_back(); gotoAddr(addr); } return; case VK_RIGHT: followBranch(); return; case VK_TAB: displaySymbols = !displaySymbols; break; case VK_SPACE: debugger->toggleBreakpoint(curAddress); break; case VK_F3: search(true); break; default: keyTaken = false; return; } } 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; i<numCPUs; i++) if (memoryWindow[i]) memoryWindow[i]->Goto(curAddress); break; case ID_DISASM_TOGGLEBREAKPOINT: toggleBreakpoint(); redraw(); break; case ID_DISASM_COPYINSTRUCTIONDISASM: { int space = 256 * (selectRangeEnd - selectRangeStart) / instructionSize; char *temp = new char[space]; char *p = temp, *end = temp + space; for (u32 pos = selectRangeStart; pos < selectRangeEnd && p < end; pos += instructionSize) { GPUDebugOp op = gpuDebug->DissassembleOp(pos); p += snprintf(p, end - p, "%s\r\n", op.desc.c_str()); } W32Util::CopyTextToClipboard(wnd, temp); delete [] temp; } 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 ID_GEDBG_SETSTALLADDR: { gpuDebug->ResetListStall(list.id,curAddress); list.stall = curAddress; redraw(); } break; case ID_DISASM_COPYINSTRUCTIONHEX: { int space = 24 * (selectRangeEnd - selectRangeStart) / instructionSize; char *temp = new char[space]; char *p = temp, *end = temp + space; for (u32 pos = selectRangeStart; pos < selectRangeEnd && p < end; pos += instructionSize) p += snprintf(p, end - p, "%08X\r\n", Memory::ReadUnchecked_U32(pos)); W32Util::CopyTextToClipboard(wnd, temp); delete [] temp; } break; case ID_DISASM_RUNTOHERE: { SendMessage(GetParent(wnd),WM_GEDBG_RUNTOWPARAM,curAddress,0); redraw(); } break; case ID_GEDBG_GOTOPC: setCurAddress(list.pc); scrollAddressIntoView(); redraw(); break; case ID_GEDBG_GOTOADDR: { u32 newAddress = curAddress; if (!InputBox_GetHex(GetModuleHandle(NULL), wnd, L"Address", curAddress, newAddress)) { break; } if (Memory::IsValidAddress(newAddress)) { setCurAddress(newAddress); scrollAddressIntoView(); redraw(); } } break; } return; } redraw(); }
void CtrlDisAsmView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) { if (button == 1) { int x = LOWORD(lParam); int y = HIWORD(lParam); setCurAddress(yToAddress(y), GetAsyncKeyState(VK_SHIFT) != 0); redraw(); } else if (button == 2) { //popup menu? POINT pt; GetCursorPos(&pt); switch(TrackPopupMenuEx(GetSubMenu(g_hPopupMenus,1),TPM_RIGHTBUTTON|TPM_RETURNCMD,pt.x,pt.y,wnd,0)) { case ID_DISASM_GOTOINMEMORYVIEW: for (int i=0; i<numCPUs; i++) if (memoryWindow[i]) memoryWindow[i]->Goto(curAddress); break; case ID_DISASM_ADDHLE: break; case ID_DISASM_TOGGLEBREAKPOINT: toggleBreakpoint(); redraw(); break; case ID_DISASM_ASSEMBLE: assembleOpcode(curAddress,""); break; case ID_DISASM_COPYINSTRUCTIONDISASM: { int space = 256 * (selectRangeEnd - selectRangeStart) / instructionSize; char opcode[64], arguments[256]; char *temp = new char[space]; char *p = temp, *end = temp + space; for (u32 pos = selectRangeStart; pos < selectRangeEnd; pos += instructionSize) { const char *dizz = debugger->disasm(pos, instructionSize); parseDisasm(dizz, opcode, arguments); p += snprintf(p, end - p, "%s\t%s\r\n", opcode, arguments); } W32Util::CopyTextToClipboard(wnd, temp); delete [] temp; } break; case ID_DISASM_COPYADDRESS: { char temp[16]; sprintf(temp,"%08X",curAddress); W32Util::CopyTextToClipboard(wnd, temp); } break; case ID_DISASM_SETPCTOHERE: debugger->setPC(curAddress); redraw(); break; case ID_DISASM_FOLLOWBRANCH: followBranch(); break; case ID_DISASM_COPYINSTRUCTIONHEX: { int space = 24 * (selectRangeEnd - selectRangeStart) / instructionSize; char *temp = new char[space]; char *p = temp, *end = temp + space; for (u32 pos = selectRangeStart; pos < selectRangeEnd; pos += instructionSize) p += snprintf(p, end - p, "%08X\r\n", debugger->readMemory(pos)); W32Util::CopyTextToClipboard(wnd, temp); delete [] temp; } break; case ID_DISASM_RUNTOHERE: { debugger->setBreakpoint(curAddress); debugger->runToBreakpoint(); redraw(); } break; case ID_DISASM_RENAMEFUNCTION: { int sym = symbolMap.GetSymbolNum(curAddress); if (sym != -1) { char name[256]; std::string newname; strncpy_s(name, symbolMap.GetSymbolName(sym),_TRUNCATE); if (InputBox_GetString(MainWindow::GetHInstance(), MainWindow::GetHWND(), L"New function name", name, newname)) { symbolMap.SetSymbolName(sym, newname.c_str()); redraw(); SendMessage(GetParent(wnd),WM_DEB_MAPLOADED,0,0); } } else { MessageBox(MainWindow::GetHWND(), L"No symbol selected",0,0); } } break; case ID_DISASM_DISASSEMBLETOFILE: disassembleToFile(); break; } return; } redraw(); }
void CtrlDisAsmView::onKeyDown(WPARAM wParam, LPARAM lParam) { dontRedraw = false; u32 windowEnd = windowStart+visibleRows*instructionSize; keyTaken = true; if (controlHeld) { switch (tolower(wParam & 0xFFFF)) { case 's': search(false); break; case 'c': search(true); break; case 'x': disassembleToFile(); break; case 'a': controlHeld = false; assembleOpcode(curAddress,""); break; case 'g': { u32 addr; controlHeld = false; if (executeExpressionWindow(wnd,debugger,addr) == false) return; gotoAddr(addr); } break; } } else { switch (wParam & 0xFFFF) { case VK_DOWN: setCurAddress(curAddress + instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); break; case VK_UP: setCurAddress(curAddress - instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); break; case VK_NEXT: if (curAddress != windowEnd - instructionSize && curAddressIsVisible()) { setCurAddress(windowEnd - instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } else { setCurAddress(curAddress + visibleRows * instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } break; case VK_PRIOR: if (curAddress != windowStart && curAddressIsVisible()) { setCurAddress(windowStart, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } else { setCurAddress(curAddress - visibleRows * instructionSize, GetAsyncKeyState(VK_SHIFT) != 0); scrollAddressIntoView(); } break; case VK_LEFT: if (jumpStack.empty()) { gotoPC(); } else { u32 addr = jumpStack[jumpStack.size()-1]; jumpStack.pop_back(); gotoAddr(addr); } return; case VK_RIGHT: followBranch(); return; case VK_TAB: displaySymbols = !displaySymbols; break; case VK_CONTROL: controlHeld = true; break; case VK_SPACE: debugger->toggleBreakpoint(curAddress); break; default: keyTaken = false; return; } } redraw(); }