diff options
Diffstat (limited to 'Source/Core/DebuggerWX/Src/MemoryWindow.cpp')
| -rw-r--r-- | Source/Core/DebuggerWX/Src/MemoryWindow.cpp | 232 |
1 files changed, 124 insertions, 108 deletions
diff --git a/Source/Core/DebuggerWX/Src/MemoryWindow.cpp b/Source/Core/DebuggerWX/Src/MemoryWindow.cpp index 7d6b65fb30..713a3e7809 100644 --- a/Source/Core/DebuggerWX/Src/MemoryWindow.cpp +++ b/Source/Core/DebuggerWX/Src/MemoryWindow.cpp @@ -17,7 +17,6 @@ #include "Debugger.h" - #include <wx/button.h> #include <wx/textctrl.h> #include <wx/listctrl.h> @@ -38,7 +37,6 @@ #include "HW/Memmap.h" #include "HW/DSP.h" -// ugly that this lib included code from the main #include "../../DolphinWX/Src/Globals.h" enum @@ -48,7 +46,7 @@ enum IDM_SETVALBUTTON, IDM_DUMP_MEMORY, IDM_VALBOX, - IDM_U8,//Feel free to rename these + IDM_U8, IDM_U16, IDM_U32, IDM_SEARCH, @@ -57,33 +55,35 @@ enum }; BEGIN_EVENT_TABLE(CMemoryWindow, wxPanel) -EVT_TEXT(IDM_MEM_ADDRBOX, CMemoryWindow::OnAddrBoxChange) -EVT_LISTBOX(IDM_SYMBOLLIST, CMemoryWindow::OnSymbolListChange) -EVT_HOST_COMMAND(wxID_ANY, CMemoryWindow::OnHostMessage) -EVT_BUTTON(IDM_SETVALBUTTON, CMemoryWindow::SetMemoryValue) -EVT_BUTTON(IDM_DUMP_MEMORY, CMemoryWindow::OnDumpMemory) -EVT_CHECKBOX(IDM_U8 , CMemoryWindow::U8) -EVT_CHECKBOX(IDM_U16 , CMemoryWindow::U16) -EVT_CHECKBOX(IDM_U32 , CMemoryWindow::U32) -EVT_BUTTON(IDM_SEARCH , CMemoryWindow::onSearch) -EVT_CHECKBOX(IDM_ASCII , CMemoryWindow::onAscii) -EVT_CHECKBOX(IDM_HEX , CMemoryWindow::onHex) + EVT_TEXT(IDM_MEM_ADDRBOX, CMemoryWindow::OnAddrBoxChange) + EVT_LISTBOX(IDM_SYMBOLLIST, CMemoryWindow::OnSymbolListChange) + EVT_HOST_COMMAND(wxID_ANY, CMemoryWindow::OnHostMessage) + EVT_BUTTON(IDM_SETVALBUTTON, CMemoryWindow::SetMemoryValue) + EVT_BUTTON(IDM_DUMP_MEMORY, CMemoryWindow::OnDumpMemory) + EVT_CHECKBOX(IDM_U8, CMemoryWindow::U8) + EVT_CHECKBOX(IDM_U16, CMemoryWindow::U16) + EVT_CHECKBOX(IDM_U32, CMemoryWindow::U32) + EVT_BUTTON(IDM_SEARCH, CMemoryWindow::onSearch) + EVT_CHECKBOX(IDM_ASCII, CMemoryWindow::onAscii) + EVT_CHECKBOX(IDM_HEX, CMemoryWindow::onHex) END_EVENT_TABLE() CMemoryWindow::CMemoryWindow(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) : wxPanel(parent, id, pos, size, style, name) -{ +{ wxBoxSizer* sizerBig = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL); - // didn't see anything usefull in the left part + // Didn't see anything usefull in the left part //wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL); DebugInterface* di = &PowerPC::debug_interface; - //sizerLeft->Add(symbols = new wxListBox(this, IDM_SYMBOLLIST, wxDefaultPosition, wxSize(20, 100), 0, NULL, wxLB_SORT), 1, wxEXPAND); + //symbols = new wxListBox(this, IDM_SYMBOLLIST, wxDefaultPosition, + // wxSize(20, 100), 0, NULL, wxLB_SORT); + //sizerLeft->Add(symbols, 1, wxEXPAND); memview = new CMemoryView(di, this, wxID_ANY); - memview->dataType=0; + memview->dataType = 0; //sizerBig->Add(sizerLeft, 1, wxEXPAND); sizerBig->Add(memview, 20, wxEXPAND); sizerBig->Add(sizerRight, 0, wxEXPAND | wxALL, 3); @@ -96,18 +96,19 @@ CMemoryWindow::CMemoryWindow(wxWindow* parent, wxWindowID id, wxStaticBoxSizer* sizerSearchType = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Search")); - sizerSearchType->Add(btnSearch=new wxButton(this,IDM_SEARCH,_T("Search"))); - sizerSearchType->Add(chkAscii=new wxCheckBox(this,IDM_ASCII,_T("&Ascii "))); - sizerSearchType->Add(chkHex=new wxCheckBox(this,IDM_HEX,_T("&Hex"))); + sizerSearchType->Add(btnSearch = new wxButton(this, IDM_SEARCH, _T("Search"))); + sizerSearchType->Add(chkAscii = new wxCheckBox(this, IDM_ASCII, _T("&Ascii "))); + sizerSearchType->Add(chkHex = new wxCheckBox(this, IDM_HEX, _T("&Hex"))); sizerRight->Add(sizerSearchType); wxStaticBoxSizer* sizerDataTypes = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Data Type")); - sizerDataTypes->Add(chk8=new wxCheckBox(this,IDM_U8,_T("&U8 ")));//Excesss spaces are to get the DataType to show properly - sizerDataTypes->Add(chk16=new wxCheckBox(this,IDM_U16,_T("&U16 "))); - sizerDataTypes->Add(chk32=new wxCheckBox(this,IDM_U32,_T("&U32 "))); + sizerDataTypes->SetMinSize(74, 40); + sizerDataTypes->Add(chk8 = new wxCheckBox(this, IDM_U8, _T("&U8"))); + sizerDataTypes->Add(chk16 = new wxCheckBox(this, IDM_U16, _T("&U16"))); + sizerDataTypes->Add(chk32 = new wxCheckBox(this, IDM_U32, _T("&U32"))); sizerRight->Add(sizerDataTypes); SetSizer(sizerBig); - chkHex->SetValue(1);//Set defaults + chkHex->SetValue(1); //Set defaults chk8->SetValue(1); //sizerLeft->SetSizeHints(this); @@ -118,12 +119,10 @@ CMemoryWindow::CMemoryWindow(wxWindow* parent, wxWindowID id, sizerBig->Fit(this); } - CMemoryWindow::~CMemoryWindow() { } - void CMemoryWindow::Save(IniFile& _IniFile) const { // Prevent these bad values that can happen after a crash or hanging @@ -136,10 +135,9 @@ void CMemoryWindow::Save(IniFile& _IniFile) const } } - void CMemoryWindow::Load(IniFile& _IniFile) { - int x,y,w,h; + int x, y, w, h; _IniFile.Get("MemoryWindow", "x", &x, GetPosition().x); _IniFile.Get("MemoryWindow", "y", &y, GetPosition().y); _IniFile.Get("MemoryWindow", "w", &w, GetSize().GetWidth()); @@ -147,13 +145,11 @@ void CMemoryWindow::Load(IniFile& _IniFile) SetSize(x, y, w, h); } - void CMemoryWindow::JumpToAddress(u32 _Address) { memview->Center(_Address); } - void CMemoryWindow::SetMemoryValue(wxCommandEvent& event) { std::string str_addr = std::string(addrbox->GetValue().mb_str()); @@ -161,12 +157,14 @@ void CMemoryWindow::SetMemoryValue(wxCommandEvent& event) u32 addr; u32 val; - if (!TryParseUInt(std::string("0x") + str_addr, &addr)) { + if (!TryParseUInt(std::string("0x") + str_addr, &addr)) + { PanicAlert("Invalid Address: %s", str_addr.c_str()); return; } - if (!TryParseUInt(std::string("0x") + str_val, &val)) { + if (!TryParseUInt(std::string("0x") + str_val, &val)) + { PanicAlert("Invalid Value: %s", str_val.c_str()); return; } @@ -198,7 +196,7 @@ void CMemoryWindow::NotifyMapLoaded() { symbols->Show(false); // hide it for faster filling symbols->Clear(); - /* +#if 0 #ifdef _WIN32 const FunctionDB::XFuncMap &syms = g_symbolDB.Symbols(); for (FuntionDB::XFuncMap::iterator iter = syms.begin(); iter != syms.end(); ++iter) @@ -206,10 +204,8 @@ void CMemoryWindow::NotifyMapLoaded() int idx = symbols->Append(iter->second.name.c_str()); symbols->SetClientData(idx, (void*)&iter->second); } - - // #endif - */ +#endif symbols->Show(true); Update(); } @@ -217,7 +213,8 @@ void CMemoryWindow::NotifyMapLoaded() void CMemoryWindow::OnSymbolListChange(wxCommandEvent& event) { int index = symbols->GetSelection(); - if (index >= 0) { + if (index >= 0) + { Symbol* pSymbol = static_cast<Symbol *>(symbols->GetClientData(index)); if (pSymbol != NULL) { @@ -230,13 +227,13 @@ void CMemoryWindow::OnHostMessage(wxCommandEvent& event) { switch (event.GetId()) { - case IDM_NOTIFYMAPLOADED: - NotifyMapLoaded(); - break; + case IDM_NOTIFYMAPLOADED: + NotifyMapLoaded(); + break; } } -// so we can view memory in a tile/hex viewer for data analysis +// So we can view memory in a tile/hex viewer for data analysis void CMemoryWindow::OnDumpMemory( wxCommandEvent& event ) { switch (memview->GetMemoryType()) @@ -270,40 +267,45 @@ void CMemoryWindow::OnDumpMemory( wxCommandEvent& event ) } } break; - } + } } - -void CMemoryWindow::U8(wxCommandEvent& event) { +void CMemoryWindow::U8(wxCommandEvent& event) +{ chk16->SetValue(0); chk32->SetValue(0); memview->dataType = 0; memview->Refresh(); } -void CMemoryWindow::U16(wxCommandEvent& event) { + +void CMemoryWindow::U16(wxCommandEvent& event) +{ chk8->SetValue(0); chk32->SetValue(0); memview->dataType = 1; - memview->Refresh(); + memview->Refresh(); } -void CMemoryWindow::U32(wxCommandEvent& event) { + +void CMemoryWindow::U32(wxCommandEvent& event) +{ chk16->SetValue(0); chk8->SetValue(0); memview->dataType = 2; memview->Refresh(); } -void CMemoryWindow::onSearch(wxCommandEvent& event) { - u8* TheRAM=0; - u32 szRAM=0; +void CMemoryWindow::onSearch(wxCommandEvent& event) +{ + u8* TheRAM = 0; + u32 szRAM = 0; switch (memview->GetMemoryType()) { case 0: default: if (Memory::m_pRAM) { - TheRAM=Memory::m_pRAM; - szRAM=Memory::REALRAM_SIZE; + TheRAM = Memory::m_pRAM; + szRAM = Memory::REALRAM_SIZE; } break; case 1: @@ -311,8 +313,8 @@ void CMemoryWindow::onSearch(wxCommandEvent& event) { u8* aram = DSP::GetARAMPtr(); if (aram) { - TheRAM=aram; - szRAM=DSP::ARAM_SIZE; + TheRAM = aram; + szRAM = DSP::ARAM_SIZE; } } break; @@ -320,91 +322,103 @@ void CMemoryWindow::onSearch(wxCommandEvent& event) { //Now we have memory to look in //Are we looking for ASCII string, or hex? //memview->cu - wxString rawData=valbox->GetValue(); - std::vector<u8> Dest;//May need a better name - u32 size=0; - int pad=rawData.size()%2;//If it's uneven - unsigned int i=0; - long count=0; - char copy[3]={0}; - long newsize=0; - unsigned char *tmp2=0; - char* tmpstr=0; - switch (chkHex->GetValue()){ + wxString rawData = valbox->GetValue(); + std::vector<u8> Dest; //May need a better name + u32 size = 0; + int pad = rawData.size()%2; //If it's uneven + unsigned int i = 0; + long count = 0; + char copy[3] = {0}; + long newsize = 0; + unsigned char *tmp2 = 0; + char* tmpstr = 0; + switch (chkHex->GetValue()) + { case 1://We are looking for hex //If it's uneven - size=(rawData.size()/2) + pad; + size = (rawData.size()/2) + pad; Dest.resize(size+32); - newsize=rawData.size(); + newsize = rawData.size(); - if (pad) { + if (pad) + { tmpstr = new char[newsize + 2]; memset(tmpstr, 0, newsize + 2); - tmpstr[0]='0'; - } else { + tmpstr[0] = '0'; + } + else + { tmpstr = new char[newsize + 1]; memset(tmpstr, 0, newsize + 1); } - //sprintf(tmpstr,"%s%s",tmpstr,rawData.c_str()); - //strcpy(&tmpstr[1],rawData.ToAscii()); - //memcpy(&tmpstr[1],&rawData.c_str()[0],rawData.size()); - sprintf(tmpstr,"%s%s",tmpstr,(const char *)rawData.mb_str()); - tmp2=&Dest.front(); - count=0; - for(i=0;i<strlen(tmpstr);i++){ - copy[0]=tmpstr[i]; - copy[1]=tmpstr[i+1]; - copy[2]=0; + //sprintf(tmpstr, "%s%s", tmpstr, rawData.c_str()); + //strcpy(&tmpstr[1], rawData.ToAscii()); + //memcpy(&tmpstr[1], &rawData.c_str()[0], rawData.size()); + sprintf(tmpstr, "%s%s", tmpstr, (const char *)rawData.mb_str()); + tmp2 = &Dest.front(); + count = 0; + for(i = 0; i < strlen(tmpstr); i++) + { + copy[0] = tmpstr[i]; + copy[1] = tmpstr[i+1]; + copy[2] = 0; int tmpint; sscanf(copy, "%02x", &tmpint); tmp2[count++] = tmpint; - //sscanf(copy,"%02x",&tmp2[count++]);//Dest[count] should now be the hex of what the two chars were! Also should add a check to make sure it's A-F only - i+=1;// + // Dest[count] should now be the hex of what the two chars were! + // Also should add a check to make sure it's A-F only + //sscanf(copy, "%02x", &tmp2[count++]); + i += 1; } delete[] tmpstr; break; case 0://Looking for an ascii string - size=rawData.size(); + size = rawData.size(); Dest.resize(size+1); - tmpstr=new char[size+1]; + tmpstr = new char[size+1]; + tmp2 = &Dest.front(); + sprintf(tmpstr, "%s", (const char *)rawData.mb_str()); + + for(i = 0; i < size; i++) + tmp2[i] = tmpstr[i]; - tmp2=&Dest.front(); - sprintf(tmpstr,"%s",(const char *)rawData.mb_str()); - for(i=0;i<size;i++){ - tmp2[i]=tmpstr[i]; - } delete[] tmpstr; break; } - if(size){ - unsigned char* pnt=&Dest.front(); - unsigned int k=0; - //grab + if(size) + { + unsigned char* pnt = &Dest.front(); + unsigned int k = 0; + //grab wxString txt = addrbox->GetValue(); - u32 addr=0; + u32 addr = 0; if (txt.size()) { sscanf(txt.mb_str(), "%08x", &addr); } - i=addr+4; - for(;i<szRAM;i++){ - for(k=0;k<size;k++){ - if(i+k>szRAM) break; - if(k>size) break; - if(pnt[k]!=TheRAM[i+k]){ - k=0; + i = addr+4; + for( ; i < szRAM; i++) + { + for(k = 0; k < size; k++) + { + if(i + k > szRAM) break; + if(k > size) break; + if(pnt[k] != TheRAM[i+k]) + { + k = 0; break; } } - if(k==size){ + if(k == size) + { //Match was found wxMessageBox(_T("A match was found. Placing viewer at the offset.")); - wxChar tmpwxstr[128]={0}; - wxSprintf(tmpwxstr,_T("%08x"),i); + wxChar tmpwxstr[128] = {0}; + wxSprintf(tmpwxstr, _T("%08x"), i); wxString tmpwx(tmpwxstr); addrbox->SetValue(tmpwx); - //memview->curAddress=i; + //memview->curAddress = i; //memview->Refresh(); OnAddrBoxChange(event); return; @@ -414,10 +428,12 @@ void CMemoryWindow::onSearch(wxCommandEvent& event) { } } -void CMemoryWindow::onAscii(wxCommandEvent& event) { +void CMemoryWindow::onAscii(wxCommandEvent& event) +{ chkHex->SetValue(0); } -void CMemoryWindow::onHex(wxCommandEvent& event) { +void CMemoryWindow::onHex(wxCommandEvent& event) +{ chkAscii->SetValue(0); } |
