Added detection for the unsigned/signed short type
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / localbrowser.cpp
CommitLineData
0203b5fd
JPM
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
6642f781 11// JPM Sept./2018 Added a status bar and better status report, and set information values in a tab\r
2b91c435
JPM
12//\r
13\r
14// STILL TO DO:\r
15// Feature to list the pointer(s) in the code using the allocation\r
16// To set the information display at the right\r
17// To support the array\r
6642f781
JPM
18// To support the static variables\r
19// To add a filter\r
0203b5fd
JPM
20//\r
21\r
22\r
23#include "debugger/localbrowser.h"\r
24#include "memory.h"\r
25#include "debugger/DBGManager.h"\r
26#include "settings.h"\r
27#include "m68000/m68kinterface.h"\r
28\r
29\r
30// \r
31LocalBrowserWindow::LocalBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog),\r
2b91c435
JPM
32layout(new QVBoxLayout),\r
33#ifdef LOCAL_LAYOUTTEXTS\r
34text(new QTextBrowser),\r
35#else\r
36TableView(new QTableView),\r
37model(new QStandardItemModel),\r
38#endif\r
39NbLocal(0),\r
40FuncName((char *)calloc(1, 1)),\r
41LocalInfo(NULL),\r
42statusbar(new QStatusBar)\r
0203b5fd 43{\r
2b91c435 44 setWindowTitle(tr("Locals"));\r
0203b5fd 45\r
2b91c435 46 // Set the font\r
0203b5fd 47 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
0203b5fd 48 fixedFont.setStyleHint(QFont::TypeWriter);\r
0203b5fd 49\r
2b91c435
JPM
50#ifdef LOCAL_LAYOUTTEXTS\r
51 // Set original layout\r
52 text->setFont(fixedFont);\r
0203b5fd 53 layout->addWidget(text);\r
2b91c435
JPM
54#else\r
55 // Set the new layout with proper identation and readibility\r
56 model->setColumnCount(3);\r
57 model->setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));\r
58 model->setHeaderData(1, Qt::Horizontal, QObject::tr("Value"));\r
59 model->setHeaderData(2, Qt::Horizontal, QObject::tr("Type"));\r
60 // Information table\r
61 TableView->setModel(model);\r
62 TableView->setEditTriggers(QAbstractItemView::NoEditTriggers);\r
63 TableView->setShowGrid(0);\r
64 TableView->setFont(fixedFont);\r
65 TableView->verticalHeader()->setDefaultSectionSize(TableView->verticalHeader()->minimumSectionSize());\r
66 TableView->verticalHeader()->setDefaultAlignment(Qt::AlignRight);\r
67 layout->addWidget(TableView);\r
68#endif\r
69\r
70 // Status bar\r
71 layout->addWidget(statusbar);\r
72 setLayout(layout);\r
0203b5fd
JPM
73}\r
74\r
75\r
76//\r
77LocalBrowserWindow::~LocalBrowserWindow(void)\r
78{\r
79 free(LocalInfo);\r
80 free(FuncName);\r
0203b5fd
JPM
81}\r
82\r
83\r
84//\r
85bool LocalBrowserWindow::UpdateInfos(void)\r
86{\r
87 size_t Adr;\r
88 char *Ptr;\r
89\r
90 if (NbLocal = DBGManager_GetNbLocalVariables(Adr = m68k_get_reg(NULL, M68K_REG_PC)))\r
91 {\r
92 if (Ptr = DBGManager_GetFunctionName(Adr))\r
93 {\r
94 if (strcmp(FuncName, Ptr))\r
95 {\r
47b6ecae 96 if (FuncName = (char *)realloc(FuncName, strlen(Ptr) + 1))\r
0203b5fd 97 {\r
47b6ecae
JPM
98 strcpy(FuncName, Ptr);\r
99\r
100 if (LocalInfo = (WatchInfo *)realloc(LocalInfo, (sizeof(WatchInfo) * NbLocal)))\r
0203b5fd 101 {\r
47b6ecae
JPM
102 for (size_t i = 0; i < NbLocal; i++)\r
103 {\r
104 // Get local variable name and his information\r
105 if (LocalInfo[i].PtrVariableName = DBGManager_GetLocalVariableName(Adr, i + 1))\r
106 {\r
107 LocalInfo[i].Op = DBGManager_GetLocalVariableOp(Adr, i + 1);\r
108 LocalInfo[i].Adr = NULL;\r
109 LocalInfo[i].PtrCPURegisterName = NULL;\r
110 LocalInfo[i].TypeTag = DBGManager_GetLocalVariableTypeTag(Adr, i + 1);\r
111 LocalInfo[i].PtrVariableBaseTypeName = DBGManager_GetLocalVariableTypeName(Adr, i + 1);\r
112 LocalInfo[i].TypeEncoding = DBGManager_GetLocalVariableTypeEncoding(Adr, i + 1);\r
113 LocalInfo[i].TypeByteSize = DBGManager_GetLocalVariableTypeByteSize(Adr, i + 1);\r
114 LocalInfo[i].Offset = DBGManager_GetLocalVariableOffset(Adr, i + 1);\r
115 }\r
116 }\r
0203b5fd
JPM
117 }\r
118 }\r
119 }\r
120\r
121 return true;\r
122 }\r
123 }\r
124\r
125 *FuncName = 0;\r
126\r
127 return false;\r
128}\r
129\r
130\r
131//\r
132void LocalBrowserWindow::RefreshContents(void)\r
133{\r
2b91c435 134#ifdef LOCAL_LAYOUTTEXTS\r
0203b5fd 135 char string[1024];\r
2b91c435
JPM
136#endif\r
137 size_t Error = LOCAL_NOERROR;\r
0203b5fd 138 QString Local;\r
2b91c435
JPM
139 QString MSG;\r
140 char Value1[100];\r
141#ifdef LOCAL_SUPPORTARRAY\r
0203b5fd 142 char Value[100];\r
2b91c435 143#endif\r
0203b5fd 144 char *PtrValue;\r
0203b5fd 145\r
e857856a
JPM
146 const char *CPURegName[] = { "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" };\r
147\r
0203b5fd
JPM
148 if (isVisible())\r
149 {\r
2b91c435
JPM
150#ifndef LOCAL_LAYOUTTEXTS\r
151 model->setRowCount(0);\r
152#endif\r
0203b5fd
JPM
153 if (UpdateInfos())\r
154 {\r
0203b5fd
JPM
155 for (size_t i = 0; i < NbLocal; i++)\r
156 {\r
157 if (LocalInfo[i].PtrVariableName)\r
158 {\r
2b91c435
JPM
159 memset(Value1, 0, sizeof(Value1));\r
160#ifdef LOCAL_LAYOUTTEXTS\r
161 if (i)\r
162 {\r
163 Local += QString("<br>");\r
164 }\r
165#else\r
166 model->insertRow(i);\r
167#endif\r
169c1409
JPM
168 // Local or parameters variables\r
169 if (((LocalInfo[i].Op >= DBG_OP_breg0) && (LocalInfo[i].Op <= DBG_OP_breg31)) || (LocalInfo[i].Op == DBG_OP_fbreg))\r
0203b5fd
JPM
170 {\r
171 LocalInfo[i].Adr = m68k_get_reg(NULL, M68K_REG_A6) + LocalInfo[i].Offset;\r
172\r
169c1409
JPM
173 if ((LocalInfo[i].Op == DBG_OP_fbreg))\r
174 {\r
175 LocalInfo[i].Adr += 8;\r
176 }\r
177\r
0203b5fd
JPM
178 if ((LocalInfo[i].Adr >= 0) && (LocalInfo[i].Adr < vjs.DRAM_size))\r
179 {\r
2b91c435
JPM
180 if ((LocalInfo[i].TypeTag & (DBG_TAG_TYPE_array | DBG_TAG_TYPE_structure)))\r
181 {\r
182#if defined(LOCAL_SUPPORTARRAY) || defined(LOCAL_SUPPORTSTRUCTURE)\r
183 //memcpy(Value1, &jaguarMainRAM[LocalInfo[i].Adr], 20);\r
184#ifdef LOCAL_LAYOUTTEXTS\r
185 //sprintf(Value, "\"%s\"", Value1);\r
186#else\r
187 //sprintf(Value, "0x%06X, \"%s\"", LocalInfo[i].Adr, Value1);\r
188#endif\r
189 //PtrValue = Value;\r
190 PtrValue = NULL;\r
191#else\r
192 PtrValue = NULL;\r
193#endif\r
194 }\r
195 else\r
196 {\r
197 PtrValue = DBGManager_GetVariableValueFromAdr(LocalInfo[i].Adr, LocalInfo[i].TypeEncoding, LocalInfo[i].TypeByteSize);\r
198 }\r
0203b5fd
JPM
199 }\r
200 else\r
201 {\r
202 PtrValue = NULL;\r
203 }\r
204 }\r
205 else\r
206 {\r
e857856a 207 // Value from CPU register\r
0203b5fd
JPM
208 if ((LocalInfo[i].Op >= DBG_OP_reg0) && (LocalInfo[i].Op <= DBG_OP_reg31))\r
209 {\r
e857856a 210 LocalInfo[i].PtrCPURegisterName = (char *)CPURegName[(LocalInfo[i].Op - DBG_OP_reg0)];\r
2b91c435 211 PtrValue = itoa(m68k_get_reg(NULL, (m68k_register_t)((size_t)M68K_REG_D0 + (LocalInfo[i].Op - DBG_OP_reg0))), Value1, 10);\r
0203b5fd
JPM
212 }\r
213 else\r
214 {\r
215 PtrValue = NULL;\r
216 }\r
217 }\r
218\r
2b91c435
JPM
219#ifndef LOCAL_LAYOUTTEXTS\r
220 model->setItem(i, 0, new QStandardItem(QString("%1").arg(LocalInfo[i].PtrVariableName)));\r
221#endif\r
222 // Check if the local variable is use by the code\r
47b6ecae 223 if (!LocalInfo[i].Op)\r
0203b5fd 224 {\r
2b91c435 225#ifdef LOCAL_LAYOUTTEXTS\r
47b6ecae 226 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
2b91c435
JPM
227#else\r
228#endif\r
0203b5fd
JPM
229 }\r
230 else\r
231 {\r
2b91c435
JPM
232#ifndef LOCAL_LAYOUTTEXTS\r
233 model->setItem(i, 1, new QStandardItem(QString("%1").arg(PtrValue)));\r
234#else\r
47b6ecae
JPM
235 sprintf(string, "%i : %s | %s | ", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"), LocalInfo[i].PtrVariableName);\r
236 Local += QString(string);\r
2b91c435 237\r
47b6ecae 238 if ((unsigned int)LocalInfo[i].Adr)\r
e857856a 239 {\r
47b6ecae 240 sprintf(string, "0x%06X", (unsigned int)LocalInfo[i].Adr);\r
e857856a
JPM
241 }\r
242 else\r
243 {\r
47b6ecae
JPM
244 if (LocalInfo[i].PtrCPURegisterName)\r
245 {\r
246 sprintf(string, "<font color='#0000FF'>%s</font>", LocalInfo[i].PtrCPURegisterName);\r
247 }\r
248 else\r
249 {\r
250 sprintf(string, "%s", (char *)"<font color='#ff0000'>N/A</font>");\r
251 }\r
252 }\r
2b91c435 253\r
47b6ecae
JPM
254 Local += QString(string);\r
255 sprintf(string, " | %s", (!PtrValue ? (char *)"<font color='#ff0000'>N/A</font>" : PtrValue));\r
2b91c435 256#endif\r
0203b5fd 257 }\r
2b91c435
JPM
258#ifndef LOCAL_LAYOUTTEXTS\r
259 model->setItem(i, 2, new QStandardItem(QString("%1").arg((LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"))));\r
260#else\r
0203b5fd 261 Local += QString(string);\r
2b91c435 262#endif\r
0203b5fd
JPM
263 }\r
264 }\r
265\r
2b91c435
JPM
266 MSG += QString("Ready");\r
267#ifdef LOCAL_LAYOUTTEXTS\r
0203b5fd
JPM
268 text->clear();\r
269 text->setText(Local);\r
2b91c435 270#endif\r
0203b5fd
JPM
271 }\r
272 else\r
273 {\r
2b91c435
JPM
274 // No locals\r
275 MSG += QString("No locals");\r
276 Error = LOCAL_NOLOCALS;\r
277#ifdef LOCAL_LAYOUTTEXTS\r
0203b5fd 278 text->clear();\r
2b91c435
JPM
279#endif\r
280 }\r
281\r
282 // Display status bar\r
283 if (Error)\r
284 {\r
285 if ((Error & LOCAL_WARNING))\r
286 {\r
287 statusbar->setStyleSheet("background-color: lightyellow; font: bold");\r
288 }\r
289 else\r
290 {\r
291 statusbar->setStyleSheet("background-color: tomato; font: bold");\r
292 }\r
293 }\r
294 else\r
295 {\r
296 statusbar->setStyleSheet("background-color: lightgreen; font: bold");\r
0203b5fd 297 }\r
2b91c435 298 statusbar->showMessage(MSG);\r
0203b5fd
JPM
299 }\r
300}\r
301\r
302\r
a2dfb8e5 303// \r
0203b5fd
JPM
304void LocalBrowserWindow::keyPressEvent(QKeyEvent * e)\r
305{\r
306 if (e->key() == Qt::Key_Escape)\r
a2dfb8e5 307 {\r
0203b5fd 308 hide();\r
a2dfb8e5 309 }\r
0203b5fd 310}\r