Local variables window detects now if a variable is used or not by the code
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / localbrowser.cpp
... / ...
CommitLineData
1//\r
2// localbrowser.cpp - Local variables\r
3//\r
4// by Jean-Paul Mari\r
5//\r
6// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
7//\r
8// Who When What\r
9// --- ---------- -----------------------------------------------------------\r
10// JPM 11/03/2017 Created this file\r
11//\r
12\r
13\r
14#include "debugger/localbrowser.h"\r
15#include "memory.h"\r
16#include "debugger/DBGManager.h"\r
17#include "settings.h"\r
18#include "m68000/m68kinterface.h"\r
19\r
20\r
21// \r
22LocalBrowserWindow::LocalBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog),\r
23 layout(new QVBoxLayout), text(new QTextBrowser),\r
24// layout(new QVBoxLayout), text(new QLabel),\r
25// refresh(new QPushButton(tr("Refresh"))),\r
26// address(new QLineEdit),\r
27// go(new QPushButton(tr("Go"))),\r
28// memBase(0),\r
29 NbLocal(0),\r
30 FuncName((char *)calloc(1, 1)),\r
31 LocalInfo(NULL)\r
32{\r
33 setWindowTitle(tr("Local"));\r
34\r
35// address->setInputMask("hhhhhh");\r
36// QHBoxLayout * hbox1 = new QHBoxLayout;\r
37// hbox1->addWidget(refresh);\r
38// hbox1->addWidget(address);\r
39// hbox1->addWidget(go);\r
40\r
41 // Need to set the size as well...\r
42// resize(560, 480);\r
43\r
44 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
45// QFont fixedFont("", 8, QFont::Normal);\r
46 fixedFont.setStyleHint(QFont::TypeWriter);\r
47 text->setFont(fixedFont);\r
48//// layout->setSizeConstraint(QLayout::SetFixedSize);\r
49 setLayout(layout);\r
50\r
51 layout->addWidget(text);\r
52// layout->addWidget(refresh);\r
53// layout->addLayout(hbox1);\r
54\r
55// connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));\r
56// connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress()));\r
57}\r
58\r
59\r
60//\r
61LocalBrowserWindow::~LocalBrowserWindow(void)\r
62{\r
63 free(LocalInfo);\r
64 free(FuncName);\r
65// NbLocal = 0;\r
66}\r
67\r
68\r
69//\r
70bool LocalBrowserWindow::UpdateInfos(void)\r
71{\r
72 size_t Adr;\r
73 char *Ptr;\r
74\r
75 if (NbLocal = DBGManager_GetNbLocalVariables(Adr = m68k_get_reg(NULL, M68K_REG_PC)))\r
76 {\r
77 if (Ptr = DBGManager_GetFunctionName(Adr))\r
78 {\r
79 if (strcmp(FuncName, Ptr))\r
80 {\r
81 if (FuncName = (char *)realloc(FuncName, strlen(Ptr) + 1))\r
82 {\r
83 strcpy(FuncName, Ptr);\r
84\r
85 if (LocalInfo = (WatchInfo *)realloc(LocalInfo, (sizeof(WatchInfo) * NbLocal)))\r
86 {\r
87 for (size_t i = 0; i < NbLocal; i++)\r
88 {\r
89 // Get local variable name and his information\r
90 if (LocalInfo[i].PtrVariableName = DBGManager_GetLocalVariableName(Adr, i + 1))\r
91 {\r
92 LocalInfo[i].Op = DBGManager_GetLocalVariableOp(Adr, i + 1);\r
93 LocalInfo[i].Adr = NULL;\r
94 LocalInfo[i].PtrCPURegisterName = NULL;\r
95 LocalInfo[i].TypeTag = DBGManager_GetLocalVariableTypeTag(Adr, i + 1);\r
96 LocalInfo[i].PtrVariableBaseTypeName = DBGManager_GetLocalVariableTypeName(Adr, i + 1);\r
97 LocalInfo[i].TypeEncoding = DBGManager_GetLocalVariableTypeEncoding(Adr, i + 1);\r
98 LocalInfo[i].TypeByteSize = DBGManager_GetLocalVariableTypeByteSize(Adr, i + 1);\r
99 LocalInfo[i].Offset = DBGManager_GetLocalVariableOffset(Adr, i + 1);\r
100 }\r
101 }\r
102 }\r
103 }\r
104 }\r
105\r
106 return true;\r
107 }\r
108 }\r
109\r
110 *FuncName = 0;\r
111\r
112 return false;\r
113}\r
114\r
115\r
116//\r
117void LocalBrowserWindow::RefreshContents(void)\r
118{\r
119 char string[1024];\r
120// char buf[64];\r
121 QString Local;\r
122 char Value[100];\r
123 char *PtrValue;\r
124// size_t NbWatch, Adr;\r
125// WatchInfo PtrLocalInfo;\r
126\r
127 const char *CPURegName[] = { "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" };\r
128\r
129 if (isVisible())\r
130 {\r
131 if (UpdateInfos())\r
132 {\r
133//#ifdef _MSC_VER\r
134 //#pragma message("Warning: !!! Need to check the memory desalocation for LocalInfo !!!")\r
135//#else\r
136 //#warning "!!! Need to do the memory desalocation for LocalInfo !!!"\r
137//#endif // _MSC_VER\r
138//#ifdef _MSC_VER\r
139 //#pragma message("Warning: !!! Need to check the memory desalocation for FuncName !!!")\r
140//#else\r
141 //#warning "!!! Need to do the memory desalocation for FuncName !!!"\r
142//#endif // _MSC_VER\r
143\r
144 for (size_t i = 0; i < NbLocal; i++)\r
145 {\r
146 if (LocalInfo[i].PtrVariableName)\r
147 {\r
148 // Local or parameters variables\r
149 if (((LocalInfo[i].Op >= DBG_OP_breg0) && (LocalInfo[i].Op <= DBG_OP_breg31)) || (LocalInfo[i].Op == DBG_OP_fbreg))\r
150 {\r
151 LocalInfo[i].Adr = m68k_get_reg(NULL, M68K_REG_A6) + LocalInfo[i].Offset;\r
152\r
153 if ((LocalInfo[i].Op == DBG_OP_fbreg))\r
154 {\r
155 LocalInfo[i].Adr += 8;\r
156 }\r
157\r
158 if ((LocalInfo[i].Adr >= 0) && (LocalInfo[i].Adr < vjs.DRAM_size))\r
159 {\r
160 PtrValue = DBGManager_GetVariableValueFromAdr(LocalInfo[i].Adr, LocalInfo[i].TypeEncoding, LocalInfo[i].TypeByteSize);\r
161 }\r
162 else\r
163 {\r
164 PtrValue = NULL;\r
165 }\r
166 }\r
167 else\r
168 {\r
169 // Value from CPU register\r
170 if ((LocalInfo[i].Op >= DBG_OP_reg0) && (LocalInfo[i].Op <= DBG_OP_reg31))\r
171 {\r
172 LocalInfo[i].PtrCPURegisterName = (char *)CPURegName[(LocalInfo[i].Op - DBG_OP_reg0)];\r
173 PtrValue = itoa(m68k_get_reg(NULL, (m68k_register_t)((size_t)M68K_REG_D0 + (LocalInfo[i].Op - DBG_OP_reg0))), Value, 10);\r
174 }\r
175 else\r
176 {\r
177 PtrValue = NULL;\r
178 }\r
179 }\r
180\r
181 if (!LocalInfo[i].Op)\r
182 {\r
183 sprintf(string, "<font color='#A52A2A'>%i : %s | %s | [Not used]</font>", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"), LocalInfo[i].PtrVariableName);\r
184 }\r
185 else\r
186 {\r
187 sprintf(string, "%i : %s | %s | ", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"), LocalInfo[i].PtrVariableName);\r
188 Local += QString(string);\r
189 if ((unsigned int)LocalInfo[i].Adr)\r
190 {\r
191 sprintf(string, "0x%06X", (unsigned int)LocalInfo[i].Adr);\r
192 }\r
193 else\r
194 {\r
195 if (LocalInfo[i].PtrCPURegisterName)\r
196 {\r
197 sprintf(string, "<font color='#0000FF'>%s</font>", LocalInfo[i].PtrCPURegisterName);\r
198 }\r
199 else\r
200 {\r
201 sprintf(string, "%s", (char *)"<font color='#ff0000'>N/A</font>");\r
202 }\r
203 }\r
204 Local += QString(string);\r
205 sprintf(string, " | %s", (!PtrValue ? (char *)"<font color='#ff0000'>N/A</font>" : PtrValue));\r
206 }\r
207 Local += QString(string);\r
208 sprintf(string, "<br>");\r
209 Local += QString(string);\r
210 }\r
211 }\r
212\r
213 text->clear();\r
214 text->setText(Local);\r
215 }\r
216 else\r
217 {\r
218 text->clear();\r
219 }\r
220 }\r
221}\r
222\r
223\r
224#if 0\r
225void LocalBrowserWindow::keyPressEvent(QKeyEvent * e)\r
226{\r
227 if (e->key() == Qt::Key_Escape)\r
228 hide();\r
229 else if (e->key() == Qt::Key_PageUp)\r
230 {\r
231 memBase -= 480;\r
232\r
233 if (memBase < 0)\r
234 memBase = 0;\r
235\r
236 RefreshContents();\r
237 }\r
238 else if (e->key() == Qt::Key_PageDown)\r
239 {\r
240 memBase += 480;\r
241\r
242 if (memBase > (0x200000 - 480))\r
243 memBase = 0x200000 - 480;\r
244\r
245 RefreshContents();\r
246 }\r
247 else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)\r
248 {\r
249 memBase -= 16;\r
250\r
251 if (memBase < 0)\r
252 memBase = 0;\r
253\r
254 RefreshContents();\r
255 }\r
256 else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal)\r
257 {\r
258 memBase += 16;\r
259\r
260 if (memBase > (0x200000 - 480))\r
261 memBase = 0x200000 - 480;\r
262\r
263 RefreshContents();\r
264 }\r
265}\r
266#endif\r
267\r
268\r
269#if 0\r
270void LocalBrowserWindow::GoToAddress(void)\r
271{\r
272 bool ok;\r
273 QString newAddress = address->text();\r
274 memBase = newAddress.toUInt(&ok, 16);\r
275 RefreshContents();\r
276}\r
277#endif\r
278\r