From f3085844f53fccfb5262c4161c0f28fb90c693d7 Mon Sep 17 00:00:00 2001 From: Drahsid Date: Mon, 10 Feb 2020 21:36:30 -0500 Subject: [PATCH 1/3] Added type, name, value, desc editing in the symbols window I'm not sure if this is written how it should be, but the lack of this feature had been bugging me for a bit and I would like to see it to be standard. --- .../Debugger/Debugger-Symbols.cpp | 177 ++++++++++++++++-- .../UserInterface/Debugger/Debugger-Symbols.h | 15 ++ 2 files changed, 175 insertions(+), 17 deletions(-) diff --git a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp index f37bd8a53..bfd794b71 100644 --- a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp +++ b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp @@ -17,6 +17,43 @@ #include "Symbols.h" +const CSetValueDlg::ComboItem CDebugSymbols::ModalChangeTypeItems[] = { + { "code", SYM_CODE}, + { "uint8", SYM_U8 }, + { "int8", SYM_S8 }, + { "uint16", SYM_U16 }, + { "int16", SYM_S16 }, + { "uint32", SYM_U32 }, + { "int32", SYM_S32 }, + { "uint64", SYM_U64 }, + { "int64", SYM_S64 }, + { "float", SYM_FLOAT }, + { "double", SYM_DOUBLE }, + { NULL, 0 } +}; + +const char* CDebugSymbols::GetTypeName(int m_Type) +{ + switch (m_Type) + { + case SYM_CODE: return "code"; + case SYM_DATA: return "data"; + case SYM_U8: return "uint8"; + case SYM_U16: return "uint16"; + case SYM_U32: return "uint32"; + case SYM_U64: return "uint64"; + case SYM_S8: return "int8"; + case SYM_S16: return "int16"; + case SYM_S32: return "int32"; + case SYM_S64: return "int64"; + case SYM_FLOAT: return "float"; + case SYM_DOUBLE: return "double"; + case SYM_INVALID: return "invalid"; + } + + return NULL; +} + CDebugSymbols::CDebugSymbols(CDebuggerUI * debugger) : CDebugDialog(debugger) { @@ -99,26 +136,132 @@ LRESULT CDebugSymbols::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl* LRESULT CDebugSymbols::OnListDblClicked(NMHDR* pNMHDR) { - // Open it in memory viewer/commands viewer - NMITEMACTIVATE* pIA = reinterpret_cast(pNMHDR); - int nItem = pIA->iItem; + if (g_MMU == NULL) + { + return true; + } - int id = m_SymbolsListView.GetItemData(nItem); + LONG iItem = m_SymbolsListView.GetNextItem(-1, LVNI_SELECTED); + if (iItem == -1) + { + return true; + } - CSymbol symbol; - if (!m_Debugger->SymbolTable()->GetSymbolById(id, &symbol)) - { - return 0; - } + int nSelectedCol = -1; - if (symbol.m_Type == SYM_CODE) // code - { - m_Debugger->Debug_ShowCommandsLocation(symbol.m_Address, true); - } - else // data/number - { - m_Debugger->Debug_ShowMemoryLocation(symbol.m_Address, true); - } + // hit test for column + + POINT mousePt; + RECT listRect; + GetCursorPos(&mousePt); + m_SymbolsListView.GetWindowRect(&listRect); + + int mouseX = mousePt.x - listRect.left; + + for (int nCol = 0, colX = 0; nCol < m_SymbolsListView_Num_Columns; nCol++) + { + int colWidth = m_SymbolsListView.GetColumnWidth(nCol); + if (mouseX >= colX && mouseX <= colX + colWidth) + { + nSelectedCol = nCol; + break; + } + colX += colWidth; + } + + NMITEMACTIVATE* pIA = reinterpret_cast(pNMHDR); + int nItem = pIA->iItem; + int id = m_SymbolsListView.GetItemData(nItem); + + CSymbol symbol; + if (!m_Debugger->SymbolTable()->GetSymbolById(id, &symbol)) + { + return 0; + } + + switch (nSelectedCol) + { + case m_SymbolsListView_Col_Address: + // Open it in memory viewer/commands viewer + if (symbol.m_Type == SYM_CODE) // code + { + m_Debugger->Debug_ShowCommandsLocation(symbol.m_Address, true); + } + else // data/number + { + m_Debugger->Debug_ShowMemoryLocation(symbol.m_Address, true); + } + break; + case m_SymbolsListView_Col_Type: + if (m_SetValueDlg.DoModal("Change type", "New type:", symbol.m_Type, ModalChangeTypeItems)) + { + ValueType t = (ValueType)m_SetValueDlg.GetEnteredData(); + + //Is there a better way? + m_Debugger->SymbolTable()->RemoveSymbolById(id); + m_Debugger->SymbolTable()->AddSymbol(t, symbol.m_Address, symbol.m_Name, symbol.m_Description); + } + break; + case m_SymbolsListView_Col_Name: + if (m_SetValueDlg.DoModal("Set name", "New name:", symbol.m_Name)) + { + char* szEnteredString = m_SetValueDlg.GetEnteredString(); + m_Debugger->SymbolTable()->RemoveSymbolById(id); + m_Debugger->SymbolTable()->AddSymbol(symbol.m_Type, symbol.m_Address, szEnteredString, symbol.m_Description); + } + break; + case m_SymbolsListView_Col_Value: + char szValue[64]; + m_Debugger->SymbolTable()->GetValueString(szValue, &symbol); + if (m_SetValueDlg.DoModal("Change value", "New value:", szValue)) + { + switch (symbol.m_Type) + { + case SYM_U8: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_U16: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_U32: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_U64: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoll(m_SetValueDlg.GetEnteredString())); + break; + case SYM_S8: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_S16: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_S32: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_S64: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoll(m_SetValueDlg.GetEnteredString())); + break; + case SYM_FLOAT: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atof(m_SetValueDlg.GetEnteredString())); + break; + case SYM_DOUBLE: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atof(m_SetValueDlg.GetEnteredString())); + break; + } + } + break; + case m_SymbolsListView_Col_Description: + if (m_SetValueDlg.DoModal("Set description", "New description:", symbol.m_Description)) + { + char* szEnteredString = m_SetValueDlg.GetEnteredString(); + m_Debugger->SymbolTable()->RemoveSymbolById(id); + m_Debugger->SymbolTable()->AddSymbol(symbol.m_Type, symbol.m_Address, symbol.m_Name, szEnteredString); + } + break; + } + + m_Debugger->SymbolTable()->Save(); + Refresh(); return 0; } diff --git a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h index 6065ca697..c205ae698 100644 --- a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h +++ b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h @@ -20,7 +20,22 @@ class CDebugSymbols : public CDialogResize { private: + enum { + m_SymbolsListView_Col_Address, + m_SymbolsListView_Col_Type, + m_SymbolsListView_Col_Name, + m_SymbolsListView_Col_Value, + m_SymbolsListView_Col_Description, + m_SymbolsListView_Num_Columns + }; + + //Probably shouldn't be here? + const char* GetTypeName(int m_Type); + + static const CSetValueDlg::ComboItem ModalChangeTypeItems[]; + CListViewCtrl m_SymbolsListView; + CSetValueDlg m_SetValueDlg; CAddSymbolDlg m_AddSymbolDlg; public: From e049c48b2bd2b9e9c9c864429a0803ea7833b320 Mon Sep 17 00:00:00 2001 From: Drahsid Date: Mon, 10 Feb 2020 22:42:25 -0500 Subject: [PATCH 2/3] Fix issues --- .../Debugger/Debugger-Symbols.cpp | 270 ++++++++---------- .../UserInterface/Debugger/Debugger-Symbols.h | 23 +- 2 files changed, 134 insertions(+), 159 deletions(-) diff --git a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp index bfd794b71..251e5dddc 100644 --- a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp +++ b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp @@ -18,42 +18,20 @@ #include "Symbols.h" const CSetValueDlg::ComboItem CDebugSymbols::ModalChangeTypeItems[] = { - { "code", SYM_CODE}, - { "uint8", SYM_U8 }, - { "int8", SYM_S8 }, - { "uint16", SYM_U16 }, - { "int16", SYM_S16 }, - { "uint32", SYM_U32 }, - { "int32", SYM_S32 }, - { "uint64", SYM_U64 }, - { "int64", SYM_S64 }, - { "float", SYM_FLOAT }, - { "double", SYM_DOUBLE }, - { NULL, 0 } + { "code", SYM_CODE}, + { "uint8", SYM_U8 }, + { "int8", SYM_S8 }, + { "uint16", SYM_U16 }, + { "int16", SYM_S16 }, + { "uint32", SYM_U32 }, + { "int32", SYM_S32 }, + { "uint64", SYM_U64 }, + { "int64", SYM_S64 }, + { "float", SYM_FLOAT }, + { "double", SYM_DOUBLE }, + { NULL, 0 } }; -const char* CDebugSymbols::GetTypeName(int m_Type) -{ - switch (m_Type) - { - case SYM_CODE: return "code"; - case SYM_DATA: return "data"; - case SYM_U8: return "uint8"; - case SYM_U16: return "uint16"; - case SYM_U32: return "uint32"; - case SYM_U64: return "uint64"; - case SYM_S8: return "int8"; - case SYM_S16: return "int16"; - case SYM_S32: return "int32"; - case SYM_S64: return "int64"; - case SYM_FLOAT: return "float"; - case SYM_DOUBLE: return "double"; - case SYM_INVALID: return "invalid"; - } - - return NULL; -} - CDebugSymbols::CDebugSymbols(CDebuggerUI * debugger) : CDebugDialog(debugger) { @@ -136,132 +114,132 @@ LRESULT CDebugSymbols::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl* LRESULT CDebugSymbols::OnListDblClicked(NMHDR* pNMHDR) { - if (g_MMU == NULL) - { - return true; - } + if (g_MMU == NULL) + { + return true; + } - LONG iItem = m_SymbolsListView.GetNextItem(-1, LVNI_SELECTED); - if (iItem == -1) - { - return true; - } + LONG iItem = m_SymbolsListView.GetNextItem(-1, LVNI_SELECTED); + if (iItem == -1) + { + return true; + } - int nSelectedCol = -1; + int nSelectedCol = -1; - // hit test for column + // hit test for column - POINT mousePt; - RECT listRect; - GetCursorPos(&mousePt); - m_SymbolsListView.GetWindowRect(&listRect); + POINT mousePt; + RECT listRect; + GetCursorPos(&mousePt); + m_SymbolsListView.GetWindowRect(&listRect); - int mouseX = mousePt.x - listRect.left; + int mouseX = mousePt.x - listRect.left; - for (int nCol = 0, colX = 0; nCol < m_SymbolsListView_Num_Columns; nCol++) - { - int colWidth = m_SymbolsListView.GetColumnWidth(nCol); - if (mouseX >= colX && mouseX <= colX + colWidth) - { - nSelectedCol = nCol; - break; - } - colX += colWidth; - } + for (int nCol = 0, colX = 0; nCol < SymbolsListView_Num_Columns; nCol++) + { + int colWidth = m_SymbolsListView.GetColumnWidth(nCol); + if (mouseX >= colX && mouseX <= colX + colWidth) + { + nSelectedCol = nCol; + break; + } + colX += colWidth; + } - NMITEMACTIVATE* pIA = reinterpret_cast(pNMHDR); - int nItem = pIA->iItem; - int id = m_SymbolsListView.GetItemData(nItem); + NMITEMACTIVATE* pIA = reinterpret_cast(pNMHDR); + int nItem = pIA->iItem; + int id = m_SymbolsListView.GetItemData(nItem); - CSymbol symbol; - if (!m_Debugger->SymbolTable()->GetSymbolById(id, &symbol)) - { - return 0; - } + CSymbol symbol; + if (!m_Debugger->SymbolTable()->GetSymbolById(id, &symbol)) + { + return 0; + } - switch (nSelectedCol) - { - case m_SymbolsListView_Col_Address: - // Open it in memory viewer/commands viewer - if (symbol.m_Type == SYM_CODE) // code - { - m_Debugger->Debug_ShowCommandsLocation(symbol.m_Address, true); - } - else // data/number - { - m_Debugger->Debug_ShowMemoryLocation(symbol.m_Address, true); - } - break; - case m_SymbolsListView_Col_Type: - if (m_SetValueDlg.DoModal("Change type", "New type:", symbol.m_Type, ModalChangeTypeItems)) - { - ValueType t = (ValueType)m_SetValueDlg.GetEnteredData(); + switch (nSelectedCol) + { + case SymbolsListView_Col_Address: + // Open it in memory viewer/commands viewer + if (symbol.m_Type == SYM_CODE) // code + { + m_Debugger->Debug_ShowCommandsLocation(symbol.m_Address, true); + } + else // data/number + { + m_Debugger->Debug_ShowMemoryLocation(symbol.m_Address, true); + } + break; + case SymbolsListView_Col_Type: + if (m_SetValueDlg.DoModal("Change type", "New type:", symbol.m_Type, ModalChangeTypeItems)) + { + ValueType t = (ValueType)m_SetValueDlg.GetEnteredData(); - //Is there a better way? - m_Debugger->SymbolTable()->RemoveSymbolById(id); - m_Debugger->SymbolTable()->AddSymbol(t, symbol.m_Address, symbol.m_Name, symbol.m_Description); - } - break; - case m_SymbolsListView_Col_Name: - if (m_SetValueDlg.DoModal("Set name", "New name:", symbol.m_Name)) - { - char* szEnteredString = m_SetValueDlg.GetEnteredString(); - m_Debugger->SymbolTable()->RemoveSymbolById(id); - m_Debugger->SymbolTable()->AddSymbol(symbol.m_Type, symbol.m_Address, szEnteredString, symbol.m_Description); - } - break; - case m_SymbolsListView_Col_Value: - char szValue[64]; - m_Debugger->SymbolTable()->GetValueString(szValue, &symbol); + //Is there a better way? + m_Debugger->SymbolTable()->RemoveSymbolById(id); + m_Debugger->SymbolTable()->AddSymbol(t, symbol.m_Address, symbol.m_Name, symbol.m_Description); + } + break; + case SymbolsListView_Col_Name: + if (m_SetValueDlg.DoModal("Set name", "New name:", symbol.m_Name)) + { + char* szEnteredString = m_SetValueDlg.GetEnteredString(); + m_Debugger->SymbolTable()->RemoveSymbolById(id); + m_Debugger->SymbolTable()->AddSymbol(symbol.m_Type, symbol.m_Address, szEnteredString, symbol.m_Description); + } + break; + case SymbolsListView_Col_Value: + char szValue[64]; + m_Debugger->SymbolTable()->GetValueString(szValue, &symbol); if (m_SetValueDlg.DoModal("Change value", "New value:", szValue)) { - switch (symbol.m_Type) - { - case SYM_U8: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); - break; - case SYM_U16: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); - break; - case SYM_U32: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); - break; - case SYM_U64: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atoll(m_SetValueDlg.GetEnteredString())); - break; - case SYM_S8: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); - break; - case SYM_S16: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); - break; - case SYM_S32: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); - break; - case SYM_S64: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atoll(m_SetValueDlg.GetEnteredString())); - break; - case SYM_FLOAT: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atof(m_SetValueDlg.GetEnteredString())); - break; - case SYM_DOUBLE: - m_Debugger->DebugStore_VAddr(symbol.m_Address, atof(m_SetValueDlg.GetEnteredString())); - break; - } + switch (symbol.m_Type) + { + case SYM_U8: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_U16: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_U32: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_U64: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoll(m_SetValueDlg.GetEnteredString())); + break; + case SYM_S8: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_S16: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_S32: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoi(m_SetValueDlg.GetEnteredString())); + break; + case SYM_S64: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atoll(m_SetValueDlg.GetEnteredString())); + break; + case SYM_FLOAT: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atof(m_SetValueDlg.GetEnteredString())); + break; + case SYM_DOUBLE: + m_Debugger->DebugStore_VAddr(symbol.m_Address, atof(m_SetValueDlg.GetEnteredString())); + break; + } } - break; - case m_SymbolsListView_Col_Description: - if (m_SetValueDlg.DoModal("Set description", "New description:", symbol.m_Description)) - { - char* szEnteredString = m_SetValueDlg.GetEnteredString(); - m_Debugger->SymbolTable()->RemoveSymbolById(id); - m_Debugger->SymbolTable()->AddSymbol(symbol.m_Type, symbol.m_Address, symbol.m_Name, szEnteredString); - } - break; - } + break; + case SymbolsListView_Col_Description: + if (m_SetValueDlg.DoModal("Set description", "New description:", symbol.m_Description)) + { + char* szEnteredString = m_SetValueDlg.GetEnteredString(); + m_Debugger->SymbolTable()->RemoveSymbolById(id); + m_Debugger->SymbolTable()->AddSymbol(symbol.m_Type, symbol.m_Address, symbol.m_Name, szEnteredString); + } + break; + } - m_Debugger->SymbolTable()->Save(); - Refresh(); + m_Debugger->SymbolTable()->Save(); + Refresh(); return 0; } diff --git a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h index c205ae698..f99b454d8 100644 --- a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h +++ b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h @@ -20,22 +20,19 @@ class CDebugSymbols : public CDialogResize { private: - enum { - m_SymbolsListView_Col_Address, - m_SymbolsListView_Col_Type, - m_SymbolsListView_Col_Name, - m_SymbolsListView_Col_Value, - m_SymbolsListView_Col_Description, - m_SymbolsListView_Num_Columns - }; + enum { + SymbolsListView_Col_Address, + SymbolsListView_Col_Type, + SymbolsListView_Col_Name, + SymbolsListView_Col_Value, + SymbolsListView_Col_Description, + SymbolsListView_Num_Columns + }; - //Probably shouldn't be here? - const char* GetTypeName(int m_Type); - - static const CSetValueDlg::ComboItem ModalChangeTypeItems[]; + static const CSetValueDlg::ComboItem ModalChangeTypeItems[]; CListViewCtrl m_SymbolsListView; - CSetValueDlg m_SetValueDlg; + CSetValueDlg m_SetValueDlg; CAddSymbolDlg m_AddSymbolDlg; public: From 95468ef91aa9f7a0722bc0b8f244ff3eb9e6eb5a Mon Sep 17 00:00:00 2001 From: Drahsid Date: Fri, 14 Feb 2020 08:48:51 -0500 Subject: [PATCH 3/3] Add ctrl+n 'new tab' shortcut to memory viewer Sometimes you just want a new tab that is not a duplicate. --- .../Project64/UserInterface/Debugger/Debugger-ViewMemory.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/Project64/UserInterface/Debugger/Debugger-ViewMemory.cpp b/Source/Project64/UserInterface/Debugger/Debugger-ViewMemory.cpp index 185828edd..f106d347a 100644 --- a/Source/Project64/UserInterface/Debugger/Debugger-ViewMemory.cpp +++ b/Source/Project64/UserInterface/Debugger/Debugger-ViewMemory.cpp @@ -562,6 +562,9 @@ LRESULT CDebugMemoryView::OnHxCtrlKeyPressed(LPNMHDR lpNMHDR) case 'W': m_Breakpoints->WBPToggle(address); break; + case 'N': + AddTab(0x80000000, true, 4); + break; case 'R': m_Breakpoints->RBPToggle(address); break;