Commit | Line | Data |
---|---|---|
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 | |
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 | |
22 | LocalBrowserWindow::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 | |
61 | LocalBrowserWindow::~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 | |
70 | bool 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 | |
47b6ecae | 81 | if (FuncName = (char *)realloc(FuncName, strlen(Ptr) + 1))\r |
0203b5fd | 82 | {\r |
47b6ecae JPM |
83 | strcpy(FuncName, Ptr);\r |
84 | \r | |
85 | if (LocalInfo = (WatchInfo *)realloc(LocalInfo, (sizeof(WatchInfo) * NbLocal)))\r | |
0203b5fd | 86 | {\r |
47b6ecae JPM |
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 | |
0203b5fd JPM |
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 | |
117 | void 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 | |
e857856a JPM |
127 | const char *CPURegName[] = { "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" };\r |
128 | \r | |
0203b5fd JPM |
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 | |
169c1409 JPM |
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 | |
0203b5fd JPM |
150 | {\r |
151 | LocalInfo[i].Adr = m68k_get_reg(NULL, M68K_REG_A6) + LocalInfo[i].Offset;\r | |
152 | \r | |
169c1409 JPM |
153 | if ((LocalInfo[i].Op == DBG_OP_fbreg))\r |
154 | {\r | |
155 | LocalInfo[i].Adr += 8;\r | |
156 | }\r | |
157 | \r | |
0203b5fd JPM |
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 | |
e857856a | 169 | // Value from CPU register\r |
0203b5fd JPM |
170 | if ((LocalInfo[i].Op >= DBG_OP_reg0) && (LocalInfo[i].Op <= DBG_OP_reg31))\r |
171 | {\r | |
e857856a | 172 | LocalInfo[i].PtrCPURegisterName = (char *)CPURegName[(LocalInfo[i].Op - DBG_OP_reg0)];\r |
0203b5fd JPM |
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 | |
47b6ecae | 181 | if (!LocalInfo[i].Op)\r |
0203b5fd | 182 | {\r |
47b6ecae | 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 |
0203b5fd JPM |
184 | }\r |
185 | else\r | |
186 | {\r | |
47b6ecae JPM |
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 | |
e857856a | 190 | {\r |
47b6ecae | 191 | sprintf(string, "0x%06X", (unsigned int)LocalInfo[i].Adr);\r |
e857856a JPM |
192 | }\r |
193 | else\r | |
194 | {\r | |
47b6ecae JPM |
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 | |
0203b5fd JPM |
206 | }\r |
207 | Local += QString(string);\r | |
0203b5fd JPM |
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 | |
225 | void 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 | |
270 | void 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 |