diff options
| author | hrydgard <hrydgard@gmail.com> | 2009-06-17 19:50:59 +0000 |
|---|---|---|
| committer | hrydgard <hrydgard@gmail.com> | 2009-06-17 19:50:59 +0000 |
| commit | 51cbdea782705f22053f6b15b2bcc4e99be305fb (patch) | |
| tree | bdfb4e6095bf2cb97c78b75c7f4a6406755db154 /Source/Core | |
| parent | 9d9ce4274b571170b66dee06c583f896cd165c4e (diff) | |
MemoryView can now view ARAM (rightclick -> toggle memory). Add "search for instruction" capability to debugger. Code cleanup, log zelda pb type (9 all the time in Zelda Four Swords)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3479 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/Src/Debugger/DebugInterface.h | 3 | ||||
| -rw-r--r-- | Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp | 25 | ||||
| -rw-r--r-- | Source/Core/Core/Src/Debugger/PPCDebugInterface.h | 7 | ||||
| -rw-r--r-- | Source/Core/Core/Src/HW/DSP.cpp | 1 | ||||
| -rw-r--r-- | Source/Core/Core/Src/HW/StreamADPCM.cpp | 7 | ||||
| -rw-r--r-- | Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp | 5 | ||||
| -rw-r--r-- | Source/Core/Core/Src/PowerPC/PPCTables.cpp | 12 | ||||
| -rw-r--r-- | Source/Core/Core/Src/PowerPC/PPCTables.h | 3 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/Src/CodeView.cpp | 2 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/Src/CodeWindow.cpp | 14 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/Src/CodeWindow.h | 1 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/Src/CodeWindowSJP.cpp | 1 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/Src/MemoryView.cpp | 20 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/Src/MemoryView.h | 88 | ||||
| -rw-r--r-- | Source/Core/DebuggerWX/Src/MemoryWindow.cpp | 25 |
15 files changed, 124 insertions, 90 deletions
diff --git a/Source/Core/Core/Src/Debugger/DebugInterface.h b/Source/Core/Core/Src/Debugger/DebugInterface.h index 0cf8ca746e..574d41ffbe 100644 --- a/Source/Core/Core/Src/Debugger/DebugInterface.h +++ b/Source/Core/Core/Src/Debugger/DebugInterface.h @@ -11,7 +11,7 @@ protected: public: virtual void disasm(unsigned int /*address*/, char *dest, int /*max_size*/) {strcpy(dest, "NODEBUGGER");} - virtual void getRawMemoryString(unsigned int /*address*/, char *dest, int /*max_size*/) {strcpy(dest, "NODEBUGGER");} + virtual void getRawMemoryString(int memory, unsigned int /*address*/, char *dest, int /*max_size*/) {strcpy(dest, "NODEBUGGER");} virtual int getInstructionSize(int /*instruction*/) {return 1;} virtual bool isAlive() {return true;} virtual bool isBreakpoint(unsigned int /*address*/) {return false;} @@ -20,6 +20,7 @@ public: virtual void clearAllBreakpoints() {} virtual void toggleBreakpoint(unsigned int /*address*/){} virtual unsigned int readMemory(unsigned int /*address*/){return 0;} + virtual unsigned int readExtraMemory(int memory, unsigned int address){return 0;} virtual unsigned int readInstruction(unsigned int /*address*/){return 0;} virtual unsigned int getPC() {return 0;} virtual void setPC(unsigned int /*address*/) {} diff --git a/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp b/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp index 934da93158..9919a1307a 100644 --- a/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp +++ b/Source/Core/Core/Src/Debugger/PPCDebugInterface.cpp @@ -21,6 +21,7 @@ #include "PPCDebugInterface.h" #include "PowerPCDisasm.h" #include "../Core.h" +#include "../HW/DSP.h" #include "../HW/Memmap.h" #include "../PowerPC/PowerPC.h" #include "../PowerPC/Jit64/Jit.h" @@ -51,17 +52,17 @@ void PPCDebugInterface::disasm(unsigned int address, char *dest, int max_size) } } -void PPCDebugInterface::getRawMemoryString(unsigned int address, char *dest, int max_size) +void PPCDebugInterface::getRawMemoryString(int memory, unsigned int address, char *dest, int max_size) { if (Core::GetState() != Core::CORE_UNINITIALIZED) { - if (Memory::IsRAMAddress(address, true)) + if (memory || Memory::IsRAMAddress(address, true)) { - snprintf(dest, max_size, "%08X", readMemory(address)); + snprintf(dest, max_size, "%08X%s", readExtraMemory(memory, address), memory ? " (ARAM)" : ""); } else { - strcpy(dest, "--------"); + strcpy(dest, memory ? "--ARAM--" : "--------"); } } else @@ -75,6 +76,22 @@ unsigned int PPCDebugInterface::readMemory(unsigned int address) return Memory::ReadUnchecked_U32(address); } +unsigned int PPCDebugInterface::readExtraMemory(int memory, unsigned int address) +{ + switch (memory) + { + case 0: + return Memory::ReadUnchecked_U32(address); + case 1: + return (DSP::ReadARAM(address) << 24) | + (DSP::ReadARAM(address + 1) << 16) | + (DSP::ReadARAM(address + 2) << 8) | + (DSP::ReadARAM(address + 3)); + default: + return 0; + } +} + unsigned int PPCDebugInterface::readInstruction(unsigned int address) { return Memory::Read_Instruction(address); diff --git a/Source/Core/Core/Src/Debugger/PPCDebugInterface.h b/Source/Core/Core/Src/Debugger/PPCDebugInterface.h index 70da7a703e..8e0ab21957 100644 --- a/Source/Core/Core/Src/Debugger/PPCDebugInterface.h +++ b/Source/Core/Core/Src/Debugger/PPCDebugInterface.h @@ -12,7 +12,7 @@ class PPCDebugInterface : public DebugInterface public: PPCDebugInterface(){} virtual void disasm(unsigned int address, char *dest, int max_size); - virtual void getRawMemoryString(unsigned int address, char *dest, int max_size); + virtual void getRawMemoryString(int memory, unsigned int address, char *dest, int max_size); virtual int getInstructionSize(int instruction) {return 4;} virtual bool isAlive(); virtual bool isBreakpoint(unsigned int address); @@ -21,6 +21,11 @@ public: virtual void clearAllBreakpoints(); virtual void toggleBreakpoint(unsigned int address); virtual unsigned int readMemory(unsigned int address); + + enum { + EXTRAMEM_ARAM = 1, + }; + virtual unsigned int readExtraMemory(int memory, unsigned int address); virtual unsigned int readInstruction(unsigned int address); virtual unsigned int getPC(); virtual void setPC(unsigned int address); diff --git a/Source/Core/Core/Src/HW/DSP.cpp b/Source/Core/Core/Src/HW/DSP.cpp index acd13dd662..de0c6db11a 100644 --- a/Source/Core/Core/Src/HW/DSP.cpp +++ b/Source/Core/Core/Src/HW/DSP.cpp @@ -474,6 +474,7 @@ void UpdateAudioDMA() // Latch new parameters g_audioDMA.BlocksLeft = g_audioDMA.AudioDMAControl.NumBlocks; g_audioDMA.ReadAddress = g_audioDMA.SourceAddress; + DEBUG_LOG(DSPLLE, "ADMA read addresses: %08x", g_audioDMA.ReadAddress); GenerateDSPInterrupt(DSP::INT_AID); } } else { diff --git a/Source/Core/Core/Src/HW/StreamADPCM.cpp b/Source/Core/Core/Src/HW/StreamADPCM.cpp index b5f0c1f0cd..57526905a3 100644 --- a/Source/Core/Core/Src/HW/StreamADPCM.cpp +++ b/Source/Core/Core/Src/HW/StreamADPCM.cpp @@ -11,11 +11,12 @@ static int histl2; static int histr1; static int histr2; -short ADPDecodeSample(int bits, int q, int *hist1p, int *hist2p) { - int hist, cur; +short ADPDecodeSample(int bits, int q, int *hist1p, int *hist2p) +{ const int hist1 = *hist1p; const int hist2 = *hist2p; + int hist; switch (q >> 4) { case 0: @@ -35,7 +36,7 @@ short ADPDecodeSample(int bits, int q, int *hist1p, int *hist2p) { if (hist > 0x1fffff) hist = 0x1fffff; if (hist < -0x200000) hist = -0x200000; - cur = (((short)(bits << 12) >> (q & 0xf)) << 6) + hist; + int cur = (((short)(bits << 12) >> (q & 0xf)) << 6) + hist; *hist2p = *hist1p; *hist1p = cur; diff --git a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp index fdcb2bb1d7..d74088193a 100644 --- a/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp +++ b/Source/Core/Core/Src/PowerPC/Interpreter/Interpreter_Paired.cpp @@ -108,7 +108,6 @@ void ps_div(UGeckoInstruction _inst) { rPS0(_inst.FD) = static_cast<float>(rPS0(_inst.FA) / rPS0(_inst.FB)); rPS1(_inst.FD) = static_cast<float>(rPS1(_inst.FA) / rPS1(_inst.FB)); - FPSCR.FI = 0; if (fabs(rPS0(_inst.FB)) == 0.0) { FPSCR.ZX = 1; } @@ -119,12 +118,14 @@ void ps_res(UGeckoInstruction _inst) { rPS0(_inst.FD) = 1.0f / static_cast<float>(rPS0(_inst.FB)); rPS1(_inst.FD) = 1.0f / static_cast<float>(rPS1(_inst.FB)); + if (fabs(rPS0(_inst.FB)) == 0.0) { + FPSCR.ZX = 1; + } if (_inst.Rc) Helper_UpdateCR1(rPS0(_inst.FD)); } void ps_rsqrte(UGeckoInstruction _inst) { - // PanicAlert("ps_rsqrte"); rPS0(_inst.FD) = static_cast<double>(1.0f / sqrtf((float)rPS0(_inst.FB))); rPS1(_inst.FD) = static_cast<double>(1.0f / sqrtf((float)rPS1(_inst.FB))); if (fabs(rPS0(_inst.FB)) == 0.0) { diff --git a/Source/Core/Core/Src/PowerPC/PPCTables.cpp b/Source/Core/Core/Src/PowerPC/PPCTables.cpp index 76690f783f..798cc35147 100644 --- a/Source/Core/Core/Src/PowerPC/PPCTables.cpp +++ b/Source/Core/Core/Src/PowerPC/PPCTables.cpp @@ -687,7 +687,7 @@ void InitTables() } #define OPLOG -#define OP_TO_LOG "mffs" +#define OP_TO_LOG "mtfsb0x" #ifdef OPLOG namespace { @@ -695,6 +695,12 @@ namespace { } #endif +const char *GetInstructionName(UGeckoInstruction _inst) +{ + const GekkoOPInfo *info = GetOpInfo(_inst); + return info ? info->opname : 0; +} + void CompileInstruction(UGeckoInstruction _inst) { (jit.*dynaOpTable[_inst.OPCD])(_inst); @@ -712,9 +718,9 @@ void CompileInstruction(UGeckoInstruction _inst) } } -bool IsValidInstruction(UGeckoInstruction _instCode) +bool IsValidInstruction(UGeckoInstruction _inst) { - const GekkoOPInfo *info = GetOpInfo(_instCode); + const GekkoOPInfo *info = GetOpInfo(_inst); return info != 0; } diff --git a/Source/Core/Core/Src/PowerPC/PPCTables.h b/Source/Core/Core/Src/PowerPC/PPCTables.h index c9df44c8b0..1c71d44575 100644 --- a/Source/Core/Core/Src/PowerPC/PPCTables.h +++ b/Source/Core/Core/Src/PowerPC/PPCTables.h @@ -102,8 +102,6 @@ class Jit64; namespace PPCTables { - - typedef void (Jit64::*_recompilerInstruction) (UGeckoInstruction instCode); typedef void (*_interpreterInstruction)(UGeckoInstruction instCode); @@ -115,6 +113,7 @@ void CountInstruction(UGeckoInstruction _inst); void PrintInstructionRunCounts(); void LogCompiledInstructions(); void CompileInstruction(UGeckoInstruction _inst); +const char *GetInstructionName(UGeckoInstruction _inst); } // namespace diff --git a/Source/Core/DebuggerWX/Src/CodeView.cpp b/Source/Core/DebuggerWX/Src/CodeView.cpp index c958e30f56..bcd953102d 100644 --- a/Source/Core/DebuggerWX/Src/CodeView.cpp +++ b/Source/Core/DebuggerWX/Src/CodeView.cpp @@ -283,9 +283,11 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event) // Insert blr or restore old value case IDM_INSERTBLR: InsertBlrNop(0); + redraw(); break; case IDM_INSERTNOP: InsertBlrNop(1); + redraw(); break; case IDM_JITRESULTS: diff --git a/Source/Core/DebuggerWX/Src/CodeWindow.cpp b/Source/Core/DebuggerWX/Src/CodeWindow.cpp index 60b46928c7..aef91973d4 100644 --- a/Source/Core/DebuggerWX/Src/CodeWindow.cpp +++ b/Source/Core/DebuggerWX/Src/CodeWindow.cpp @@ -46,6 +46,7 @@ #include "FileUtil.h" #include "Core.h" +#include "HW/Memmap.h" #include "HLE/HLE.h" #include "Boot/Boot.h" #include "LogManager.h" @@ -140,6 +141,7 @@ BEGIN_EVENT_TABLE(CCodeWindow, wxFrame) EVT_MENU(IDM_CLEARCODECACHE, CCodeWindow::OnJitMenu) EVT_MENU(IDM_LOGINSTRUCTIONS, CCodeWindow::OnJitMenu) + EVT_MENU(IDM_SEARCHINSTRUCTION, CCodeWindow::OnJitMenu) EVT_MENU(IDM_PROFILEBLOCKS, CCodeWindow::OnProfilerMenu) EVT_MENU(IDM_WRITEPROFILE, CCodeWindow::OnProfilerMenu) @@ -656,6 +658,18 @@ void CCodeWindow::OnJitMenu(wxCommandEvent& event) case IDM_CLEARCODECACHE: jit.ClearCache(); break; + + case IDM_SEARCHINSTRUCTION: + { + wxString str; + str = wxGetTextFromUser("", "Op?", wxEmptyString, this); + for (u32 addr = 0x80000000; addr < 0x80100000; addr += 4) { + const char *name = PPCTables::GetInstructionName(Memory::ReadUnchecked_U32(addr)); + if (name && !strcmp(str.c_str(), name)) + NOTICE_LOG(POWERPC, "Found %s at %08x", str.c_str(), addr); + } + break; + } } } // ===================================== diff --git a/Source/Core/DebuggerWX/Src/CodeWindow.h b/Source/Core/DebuggerWX/Src/CodeWindow.h index 2ab3436855..469c45cab4 100644 --- a/Source/Core/DebuggerWX/Src/CodeWindow.h +++ b/Source/Core/DebuggerWX/Src/CodeWindow.h @@ -106,6 +106,7 @@ class CCodeWindow // JIT IDM_CLEARCODECACHE, IDM_LOGINSTRUCTIONS, + IDM_SEARCHINSTRUCTION, // Profiler IDM_PROFILEBLOCKS, diff --git a/Source/Core/DebuggerWX/Src/CodeWindowSJP.cpp b/Source/Core/DebuggerWX/Src/CodeWindowSJP.cpp index 30b07268f6..f8bd2274a1 100644 --- a/Source/Core/DebuggerWX/Src/CodeWindowSJP.cpp +++ b/Source/Core/DebuggerWX/Src/CodeWindowSJP.cpp @@ -110,6 +110,7 @@ void CCodeWindow::CreateSymbolsMenu() wxMenu *pJitMenu = new wxMenu; pJitMenu->Append(IDM_CLEARCODECACHE, _T("&Clear code cache")); pJitMenu->Append(IDM_LOGINSTRUCTIONS, _T("&Log JIT instruction coverage")); + pJitMenu->Append(IDM_SEARCHINSTRUCTION, _T("&Search for an op")); pMenuBar->Append(pJitMenu, _T("&JIT")); wxMenu *pProfilerMenu = new wxMenu; diff --git a/Source/Core/DebuggerWX/Src/MemoryView.cpp b/Source/Core/DebuggerWX/Src/MemoryView.cpp index 2509e3a836..0a3d2193cd 100644 --- a/Source/Core/DebuggerWX/Src/MemoryView.cpp +++ b/Source/Core/DebuggerWX/Src/MemoryView.cpp @@ -31,6 +31,7 @@ enum IDM_COPYCODE, IDM_RUNTOHERE, IDM_DYNARECRESULTS, + IDM_TOGGLEMEMORY, }; @@ -54,7 +55,8 @@ CMemoryView::CMemoryView(DebugInterface* debuginterface, wxWindow* parent, wxWin selectionChanged(false), selecting(false), hasFocus(false), - showHex(false) + showHex(false), + memory(0) { rowHeight = 13; align = debuginterface->getInstructionSize(0); @@ -169,10 +171,15 @@ void CMemoryView::OnPopupMenu(wxCommandEvent& event) case IDM_COPYHEX: { char temp[24]; - sprintf(temp, "%08x", debugger->readMemory(selection)); + sprintf(temp, "%08x", debugger->readExtraMemory(memory, selection)); wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(temp))); } - break; + break; + + case IDM_TOGGLEMEMORY: + memory ^= 1; + redraw(); + break; #endif } @@ -192,6 +199,7 @@ void CMemoryView::OnMouseUpR(wxMouseEvent& event) menu.Append(IDM_COPYADDRESS, wxString::FromAscii("Copy &address")); menu.Append(IDM_COPYHEX, wxString::FromAscii("Copy &hex")); #endif + menu.Append(IDM_TOGGLEMEMORY, wxString::FromAscii("Toggle &memory (RAM/ARAM)")); PopupMenu(&menu); event.Skip(true); } @@ -276,7 +284,7 @@ void CMemoryView::OnPaint(wxPaintEvent& event) dc.SetTextForeground(_T("#600000")); dc.DrawText(temp, 17, rowY1); char mem[256]; - debugger->getRawMemoryString(address, mem, 256); + debugger->getRawMemoryString(memory, address, mem, 256); dc.SetTextForeground(_T("#000080")); dc.DrawText(wxString::FromAscii(mem), 17+fontSize*(8), rowY1); dc.SetTextForeground(_T("#000000")); @@ -284,12 +292,12 @@ void CMemoryView::OnPaint(wxPaintEvent& event) if (debugger->isAlive()) { char dis[256] = {0}; - u32 mem = debugger->readMemory(address); + u32 mem = debugger->readExtraMemory(memory, address); float flt = *(float *)(&mem); sprintf(dis, "f: %f", flt); char desc[256] = ""; - dc.DrawText(wxString::FromAscii(dis), 17 + fontSize*(8 + 8), rowY1); + dc.DrawText(wxString::FromAscii(dis), 77 + fontSize*(8 + 8), rowY1); if (desc[0] == 0) { diff --git a/Source/Core/DebuggerWX/Src/MemoryView.h b/Source/Core/DebuggerWX/Src/MemoryView.h index 6463f9b1af..1d42c821c9 100644 --- a/Source/Core/DebuggerWX/Src/MemoryView.h +++ b/Source/Core/DebuggerWX/Src/MemoryView.h @@ -22,55 +22,47 @@ #include "Common.h" #include "Debugger/DebugInterface.h" - -class CMemoryView - : public wxControl +class CMemoryView : public wxControl { - public: - - CMemoryView(DebugInterface* debuginterface, wxWindow* parent, wxWindowID Id = -1, const wxSize& Size = wxDefaultSize); - wxSize DoGetBestSize() const; - void OnPaint(wxPaintEvent& event); - void OnErase(wxEraseEvent& event); - void OnMouseDown(wxMouseEvent& event); - void OnMouseMove(wxMouseEvent& event); - void OnMouseUpL(wxMouseEvent& event); - void OnMouseUpR(wxMouseEvent& event); - void OnPopupMenu(wxCommandEvent& event); - - - u32 GetSelection() {return(selection);} - - - void Center(u32 addr) - { - curAddress = addr; - redraw(); - } - - - private: - - int YToAddress(int y); - - - void redraw() {Refresh();} - - - DebugInterface* debugger; - - int curAddress; - int align; - int rowHeight; - - u32 selection; - u32 oldSelection; - bool selectionChanged; - bool selecting; - bool hasFocus; - bool showHex; - - DECLARE_EVENT_TABLE() +public: + CMemoryView(DebugInterface* debuginterface, wxWindow* parent, wxWindowID Id = -1, const wxSize& Size = wxDefaultSize); + wxSize DoGetBestSize() const; + void OnPaint(wxPaintEvent& event); + void OnErase(wxEraseEvent& event); + void OnMouseDown(wxMouseEvent& event); + void OnMouseMove(wxMouseEvent& event); + void OnMouseUpL(wxMouseEvent& event); + void OnMouseUpR(wxMouseEvent& event); + void OnPopupMenu(wxCommandEvent& event); + + u32 GetSelection() {return(selection);} + + void Center(u32 addr) + { + curAddress = addr; + redraw(); + } + +private: + int YToAddress(int y); + void redraw() {Refresh();} + + DebugInterface* debugger; + + int curAddress; + int align; + int rowHeight; + + u32 selection; + u32 oldSelection; + bool selectionChanged; + bool selecting; + bool hasFocus; + bool showHex; + + int memory; + + DECLARE_EVENT_TABLE() }; #endif /*MEMORYVIEW_H_*/ diff --git a/Source/Core/DebuggerWX/Src/MemoryWindow.cpp b/Source/Core/DebuggerWX/Src/MemoryWindow.cpp index 0f9375fb6f..fd9711137d 100644 --- a/Source/Core/DebuggerWX/Src/MemoryWindow.cpp +++ b/Source/Core/DebuggerWX/Src/MemoryWindow.cpp @@ -42,24 +42,11 @@ enum { - IDM_DEBUG_GO = 350, - IDM_STEP, - IDM_STEPOVER, - IDM_SKIP, - IDM_SETPC, - IDM_GOTOPC, - IDM_ADDRBOX, - IDM_CALLSTACKLIST, + IDM_ADDRBOX = 350, IDM_SYMBOLLIST, - IDM_INTERPRETER, - IDM_DUALCORE, - IDM_LOGWINDOW, - IDM_REGISTERWINDOW, - IDM_BREAKPOINTWINDOW, - IDM_VALBOX, IDM_SETVALBUTTON, IDM_DUMP_MEMORY, - + IDM_VALBOX, }; BEGIN_EVENT_TABLE(CMemoryWindow, wxFrame) @@ -70,7 +57,6 @@ BEGIN_EVENT_TABLE(CMemoryWindow, wxFrame) EVT_BUTTON(IDM_DUMP_MEMORY, CMemoryWindow::OnDumpMemory) END_EVENT_TABLE() - CMemoryWindow::CMemoryWindow(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxFrame(parent, id, title, pos, size, style) @@ -87,9 +73,7 @@ CMemoryWindow::CMemoryWindow(wxWindow* parent, wxWindowID id, //sizerBig->Add(sizerLeft, 1, wxEXPAND); sizerBig->Add(memview, 20, wxEXPAND); sizerBig->Add(sizerRight, 0, wxEXPAND | wxALL, 3); - sizerRight->Add(buttonGo = new wxButton(this, IDM_DEBUG_GO, _T("&Go"))); sizerRight->Add(addrbox = new wxTextCtrl(this, IDM_ADDRBOX, _T(""))); - sizerRight->Add(new wxButton(this, IDM_SETPC, _T("S&et PC"))); sizerRight->Add(valbox = new wxTextCtrl(this, IDM_VALBOX, _T(""))); sizerRight->Add(new wxButton(this, IDM_SETVALBUTTON, _T("Set &Value"))); @@ -162,14 +146,15 @@ void CMemoryWindow::SetMemoryValue(wxCommandEvent& event) Memory::Write_U32(val, addr); memview->Refresh(); } + void CMemoryWindow::OnAddrBoxChange(wxCommandEvent& event) { wxString txt = addrbox->GetValue(); - if (txt.size() == 8) + if (txt.size()) { u32 addr; sscanf(txt.mb_str(), "%08x", &addr); - memview->Center(addr); + memview->Center(addr & ~3); } event.Skip(1); |
