diff --git a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp index f37bd8a53..251e5dddc 100644 --- a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp +++ b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.cpp @@ -17,6 +17,21 @@ #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 } +}; + CDebugSymbols::CDebugSymbols(CDebuggerUI * debugger) : CDebugDialog(debugger) { @@ -99,10 +114,41 @@ LRESULT CDebugSymbols::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl* LRESULT CDebugSymbols::OnListDblClicked(NMHDR* pNMHDR) { - // Open it in memory viewer/commands viewer + if (g_MMU == NULL) + { + return true; + } + + LONG iItem = m_SymbolsListView.GetNextItem(-1, LVNI_SELECTED); + if (iItem == -1) + { + return true; + } + + int nSelectedCol = -1; + + // 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 < 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; @@ -111,14 +157,89 @@ LRESULT CDebugSymbols::OnListDblClicked(NMHDR* pNMHDR) return 0; } - if (symbol.m_Type == SYM_CODE) // code + switch (nSelectedCol) { - m_Debugger->Debug_ShowCommandsLocation(symbol.m_Address, true); - } - else // data/number - { - m_Debugger->Debug_ShowMemoryLocation(symbol.m_Address, true); - } + 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 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; + } + } + 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(); return 0; } diff --git a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h index 6065ca697..f99b454d8 100644 --- a/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h +++ b/Source/Project64/UserInterface/Debugger/Debugger-Symbols.h @@ -20,7 +20,19 @@ class CDebugSymbols : public CDialogResize { private: + enum { + SymbolsListView_Col_Address, + SymbolsListView_Col_Type, + SymbolsListView_Col_Name, + SymbolsListView_Col_Value, + SymbolsListView_Col_Description, + SymbolsListView_Num_Columns + }; + + static const CSetValueDlg::ComboItem ModalChangeTypeItems[]; + CListViewCtrl m_SymbolsListView; + CSetValueDlg m_SetValueDlg; CAddSymbolDlg m_AddSymbolDlg; public: 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;