Debugger sources code clean-up
[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 NbLocal(0),\r
25 FuncName((char *)calloc(1, 1)),\r
26 LocalInfo(NULL)\r
27{\r
28 setWindowTitle(tr("Local"));\r
29\r
30 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
31 fixedFont.setStyleHint(QFont::TypeWriter);\r
32 text->setFont(fixedFont);\r
33 setLayout(layout);\r
34\r
35 layout->addWidget(text);\r
36}\r
37\r
38\r
39//\r
40LocalBrowserWindow::~LocalBrowserWindow(void)\r
41{\r
42 free(LocalInfo);\r
43 free(FuncName);\r
44}\r
45\r
46\r
47//\r
48bool LocalBrowserWindow::UpdateInfos(void)\r
49{\r
50 size_t Adr;\r
51 char *Ptr;\r
52\r
53 if (NbLocal = DBGManager_GetNbLocalVariables(Adr = m68k_get_reg(NULL, M68K_REG_PC)))\r
54 {\r
55 if (Ptr = DBGManager_GetFunctionName(Adr))\r
56 {\r
57 if (strcmp(FuncName, Ptr))\r
58 {\r
59 if (FuncName = (char *)realloc(FuncName, strlen(Ptr) + 1))\r
60 {\r
61 strcpy(FuncName, Ptr);\r
62\r
63 if (LocalInfo = (WatchInfo *)realloc(LocalInfo, (sizeof(WatchInfo) * NbLocal)))\r
64 {\r
65 for (size_t i = 0; i < NbLocal; i++)\r
66 {\r
67 // Get local variable name and his information\r
68 if (LocalInfo[i].PtrVariableName = DBGManager_GetLocalVariableName(Adr, i + 1))\r
69 {\r
70 LocalInfo[i].Op = DBGManager_GetLocalVariableOp(Adr, i + 1);\r
71 LocalInfo[i].Adr = NULL;\r
72 LocalInfo[i].PtrCPURegisterName = NULL;\r
73 LocalInfo[i].TypeTag = DBGManager_GetLocalVariableTypeTag(Adr, i + 1);\r
74 LocalInfo[i].PtrVariableBaseTypeName = DBGManager_GetLocalVariableTypeName(Adr, i + 1);\r
75 LocalInfo[i].TypeEncoding = DBGManager_GetLocalVariableTypeEncoding(Adr, i + 1);\r
76 LocalInfo[i].TypeByteSize = DBGManager_GetLocalVariableTypeByteSize(Adr, i + 1);\r
77 LocalInfo[i].Offset = DBGManager_GetLocalVariableOffset(Adr, i + 1);\r
78 }\r
79 }\r
80 }\r
81 }\r
82 }\r
83\r
84 return true;\r
85 }\r
86 }\r
87\r
88 *FuncName = 0;\r
89\r
90 return false;\r
91}\r
92\r
93\r
94//\r
95void LocalBrowserWindow::RefreshContents(void)\r
96{\r
97 char string[1024];\r
98 QString Local;\r
99 char Value[100];\r
100 char *PtrValue;\r
101\r
102 const char *CPURegName[] = { "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" };\r
103\r
104 if (isVisible())\r
105 {\r
106 if (UpdateInfos())\r
107 {\r
108 for (size_t i = 0; i < NbLocal; i++)\r
109 {\r
110 if (LocalInfo[i].PtrVariableName)\r
111 {\r
112 // Local or parameters variables\r
113 if (((LocalInfo[i].Op >= DBG_OP_breg0) && (LocalInfo[i].Op <= DBG_OP_breg31)) || (LocalInfo[i].Op == DBG_OP_fbreg))\r
114 {\r
115 LocalInfo[i].Adr = m68k_get_reg(NULL, M68K_REG_A6) + LocalInfo[i].Offset;\r
116\r
117 if ((LocalInfo[i].Op == DBG_OP_fbreg))\r
118 {\r
119 LocalInfo[i].Adr += 8;\r
120 }\r
121\r
122 if ((LocalInfo[i].Adr >= 0) && (LocalInfo[i].Adr < vjs.DRAM_size))\r
123 {\r
124 PtrValue = DBGManager_GetVariableValueFromAdr(LocalInfo[i].Adr, LocalInfo[i].TypeEncoding, LocalInfo[i].TypeByteSize);\r
125 }\r
126 else\r
127 {\r
128 PtrValue = NULL;\r
129 }\r
130 }\r
131 else\r
132 {\r
133 // Value from CPU register\r
134 if ((LocalInfo[i].Op >= DBG_OP_reg0) && (LocalInfo[i].Op <= DBG_OP_reg31))\r
135 {\r
136 LocalInfo[i].PtrCPURegisterName = (char *)CPURegName[(LocalInfo[i].Op - DBG_OP_reg0)];\r
137 PtrValue = itoa(m68k_get_reg(NULL, (m68k_register_t)((size_t)M68K_REG_D0 + (LocalInfo[i].Op - DBG_OP_reg0))), Value, 10);\r
138 }\r
139 else\r
140 {\r
141 PtrValue = NULL;\r
142 }\r
143 }\r
144\r
145 if (!LocalInfo[i].Op)\r
146 {\r
147 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
148 }\r
149 else\r
150 {\r
151 sprintf(string, "%i : %s | %s | ", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"), LocalInfo[i].PtrVariableName);\r
152 Local += QString(string);\r
153 if ((unsigned int)LocalInfo[i].Adr)\r
154 {\r
155 sprintf(string, "0x%06X", (unsigned int)LocalInfo[i].Adr);\r
156 }\r
157 else\r
158 {\r
159 if (LocalInfo[i].PtrCPURegisterName)\r
160 {\r
161 sprintf(string, "<font color='#0000FF'>%s</font>", LocalInfo[i].PtrCPURegisterName);\r
162 }\r
163 else\r
164 {\r
165 sprintf(string, "%s", (char *)"<font color='#ff0000'>N/A</font>");\r
166 }\r
167 }\r
168 Local += QString(string);\r
169 sprintf(string, " | %s", (!PtrValue ? (char *)"<font color='#ff0000'>N/A</font>" : PtrValue));\r
170 }\r
171 Local += QString(string);\r
172 sprintf(string, "<br>");\r
173 Local += QString(string);\r
174 }\r
175 }\r
176\r
177 text->clear();\r
178 text->setText(Local);\r
179 }\r
180 else\r
181 {\r
182 text->clear();\r
183 }\r
184 }\r
185}\r
186\r
187\r
188// \r
189void LocalBrowserWindow::keyPressEvent(QKeyEvent * e)\r
190{\r
191 if (e->key() == Qt::Key_Escape)\r
192 {\r
193 hide();\r
194 }\r
195}\r