Show DRAM size in the emulator status
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / m68kDasmWin.cpp
CommitLineData
9bf5c434
JPM
1//\r
2// m68kDasmWin.cpp - M68K disassembly window\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 06/27/2016 Created this file\r
11// JPM 12/04/2016 Suport ELF debug information\r
12// JPM Replacing the ELF support by the debugger information manager calls\r
13//\r
14\r
15// STILL TO DO:\r
16//\r
17\r
18#include <stdlib.h>\r
19#include "debugger/m68kDasmWin.h"\r
20//#include "memory.h"\r
21#include "m68000/m68kinterface.h"\r
22#include "dsp.h"\r
23#include "gpu.h"\r
24//#include "jaguar.h"\r
25//#include "ELFManager.h"\r
26#include "DBGManager.h"\r
27//extern jaguarRunAddress;\r
28#include "settings.h"\r
29\r
30\r
31// \r
32m68KDasmWindow::m68KDasmWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),\r
33 layout(new QVBoxLayout), text(new QTextBrowser),\r
34// layout(new QTabWidget), text(new QLabel),\r
35#if 0\r
36 refresh(new QPushButton(tr("Refresh"))),\r
37 address(new QLineEdit),\r
38 go(new QPushButton(tr("Go"))),\r
39#endif\r
40// memBase(0x4000)\r
41 //sb(new QScrollBar),\r
42 memBase(0)\r
43{\r
44// m68kDasmWindow *m68kDasmWin = new m68kDasmWindow();\r
45// setWindowTitle(tr("Jaguar Disassembly Window"));\r
46// layout->addTab(new m68KDasmWindow(), tr("M68K Disassembly"));\r
47 //layout = new QTabWidget;\r
48 //layout->QWidget();\r
49\r
50#if 0\r
51 address->setInputMask("hhhhhh");\r
52 QHBoxLayout * hbox1 = new QHBoxLayout;\r
53 hbox1->addWidget(refresh);\r
54 hbox1->addWidget(address);\r
55 hbox1->addWidget(go);\r
56#endif\r
57\r
58 // Need to set the size as well...\r
59// resize(560, 480);\r
60\r
61 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
62// QFont fixedFont("", 8, QFont::Normal);\r
63 fixedFont.setStyleHint(QFont::Monospace); //TypeWriter\r
64 fixedFont.setLetterSpacing(QFont::PercentageSpacing, 100);\r
65 text->setFont(fixedFont);\r
66// sb = layout->text->verticalScrollBar();\r
67// text->setStyleSheet("background-color: DeepSkyBlue;");\r
68//// layout->setSizeConstraint(QLayout::SetFixedSize);\r
69 setLayout(layout);\r
70\r
71 layout->addWidget(text);\r
72// layout->addWidget(refresh);\r
73#if 0\r
74 layout->addLayout(hbox1);\r
75#endif\r
76\r
77#if 0\r
78 connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));\r
79 connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress()));\r
80#endif\r
81}\r
82\r
83\r
84//\r
85void m68KDasmWindow::RefreshContents(void)\r
86{\r
87 //char ; //, buf[64];\r
88 QString s;\r
89 char buffer[1024], string[1024], adresse[16];\r
90 size_t pc = memBase, oldpc;\r
91 size_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);\r
92 size_t m68KPCNbrDisasmLines = 0;\r
93 char *Symbol = NULL, *LineSrc, *CurrentLineSrc = NULL;\r
94 bool m68kPCShow = false;\r
95 bool constant, adr, equal, Error;\r
96 size_t j, i;\r
97 size_t nbr = vjs.nbrdisasmlines;\r
98 char *PtrFullSource, *CurrentPtrFullSource = (char *)calloc(1, 1);\r
99 size_t NumLine; // , CurrentNumLine = 0;\r
100// size_t CurrentNumLine = DBGManager_GetNumLineFromAdr(pc, DBG_NO_TAG) - 1;\r
101 size_t CurrentNumLine;\r
102 char singleCharString[2] = { 0, 0 };\r
103\r
104 //text->clear();\r
105\r
106 for (i = 0; i < nbr; i++)\r
107 {\r
108 //sb->setValue(sb->maximum());\r
109 //j = text->verticalScrollBar()->maximum();\r
110 //text->verticalScrollBar()->setValue(text->verticalScrollBar()->maximum());\r
111 //if (text->verticalScrollBar()->value())\r
112 //{\r
113 // j = 1;\r
114 //}\r
115\r
116 oldpc = pc;\r
117// WriteLog("%06X: %s\n", oldpc, buffer);\r
118 adr = constant = equal = false;\r
119\r
120 // Display source filename based on the program address\r
121 if (vjs.displayFullSourceFilename && (PtrFullSource = DBGManager_GetFullSourceFilenameFromAdr(oldpc, &Error)) && strcmp(CurrentPtrFullSource, PtrFullSource))\r
122 {\r
123#if 0\r
124 if (strcmp(OldPtrFullSource, PtrFullSource))\r
125#endif\r
126 {\r
127#if 1\r
128 if (i)\r
129 {\r
130 nbr++;\r
131 s += QString("<br>");\r
132 }\r
133#endif\r
134 CurrentNumLine = DBGManager_GetNumLineFromAdr(pc, DBG_NO_TAG) - 1;\r
135 nbr++;\r
136 CurrentPtrFullSource = (char *)realloc(CurrentPtrFullSource, strlen(PtrFullSource) + 1);\r
137 strcpy(CurrentPtrFullSource, PtrFullSource);\r
138 if (!Error)\r
139 {\r
140 sprintf(string, "<font color='#ff0000'><b>%s</b></font><br>", PtrFullSource);\r
141 }\r
142 else\r
143 {\r
144 sprintf(string, "<font color='#00ff00'><b>%s</b></font><br>", PtrFullSource);\r
145 }\r
146 s += QString(string);\r
147 }\r
148 }\r
149\r
150 // Display line number based on the program address\r
151 if ((NumLine = DBGManager_GetNumLineFromAdr(oldpc, DBG_NO_TAG)) && ((signed)NumLine > (signed)CurrentNumLine))\r
152 {\r
153 if ((signed)CurrentNumLine < 0)\r
154 {\r
155 CurrentNumLine = NumLine - 1;\r
156 }\r
157 sprintf(string, "| <font color='#006400'>%5u</font> | ", (unsigned int)++CurrentNumLine); // (CurrentNumLine = NumLine));\r
158 }\r
159 else\r
160 {\r
161 sprintf(string, "| | ");\r
162 }\r
163 s += QString(string);\r
164\r
165 // Display line source based on the program address\r
166 if (((signed)CurrentNumLine > 0) && (LineSrc = DBGManager_GetLineSrcFromNumLineBaseAdr(oldpc, CurrentNumLine)) && (LineSrc != CurrentLineSrc))\r
167 {\r
168 sprintf(string, "<font color='#006400'>%s</font><br>", (CurrentLineSrc = LineSrc));\r
169 s += QString(string);\r
170 nbr++;\r
171 }\r
172 else\r
173 {\r
174 // Display symbol, or line source, based on the program address\r
0203b5fd 175 if (!CurrentLineSrc && !Symbol && (Symbol = DBGManager_GetSymbolNameFromAdr(oldpc)))\r
9bf5c434
JPM
176 {\r
177 sprintf(string, "%s:<br>", Symbol);\r
178 s += QString(string);\r
179 nbr++;\r
180 }\r
181 // Display the assembly line based on the current PC\r
182 else\r
183 {\r
184 pc += m68k_disassemble(buffer, (unsigned int)pc, 0, vjs.disasmopcodes);\r
185\r
186 if (m68kPC == oldpc)\r
187 {\r
a2dfb8e5 188 sprintf(string, "-> <u>%06X: %s</u><br>", (unsigned int)oldpc, buffer);\r
9bf5c434
JPM
189 m68kPCShow = true;\r
190 m68KPCNbrDisasmLines = i;\r
191 }\r
192 else\r
193 {\r
194 sprintf(string, " %06X: %s<br>", (unsigned int)oldpc, buffer);\r
195 }\r
196\r
197 buffer[0] = 0; // Clear string\r
198 //char singleCharString[2] = { 0, 0 };\r
199\r
200 for (j = 0; j < strlen(string); j++)\r
201 {\r
202 if (string[j] == ' ')\r
203 {\r
204 strcat(buffer, "&nbsp;");\r
205 adr = constant = false;\r
206 }\r
207 else\r
208 {\r
209 switch (string[j])\r
210 {\r
211 case '#':\r
212 constant = true;\r
213 break;\r
214\r
215 case '$':\r
216 adr = true;\r
217 break;\r
218\r
219 case ',':\r
220 constant = adr = equal = false;\r
221 break;\r
222\r
223 case '=':\r
224 equal = true;\r
225 break;\r
226 }\r
227\r
228 if (!constant && adr && !equal)\r
229 {\r
230 int l = 0;\r
231 char *p;\r
232 do\r
233 {\r
234 adresse[l++] = string[++j];\r
235 } while ((string[(j + 1)] >= '0') && (string[(j + 1)] <= '9') || (string[(j + 1)] >= 'A') && (string[(j + 1)] <= 'F'));\r
236 adresse[l] = 0;\r
237\r
0203b5fd 238 if (Symbol = DBGManager_GetSymbolNameFromAdr(strtoul(adresse, &p, 16)))\r
9bf5c434
JPM
239 {\r
240 strcat(buffer, Symbol);\r
241 }\r
242 else\r
243 {\r
244 strcat(buffer, "$");\r
245 strcat(buffer, adresse);\r
246 }\r
247\r
248 adr = false;\r
249 }\r
250 else\r
251 {\r
252 singleCharString[0] = string[j];\r
253 strcat(buffer, singleCharString);\r
254 }\r
255 }\r
256 }\r
257\r
258 Symbol = NULL;\r
259 // s += QString(string);\r
260 s += QString(buffer);\r
261 // text->setStyleSheet("QLabel { background-color : red; color : blue; }");\r
262 }\r
263 }\r
264 }\r
265\r
266 // Display generated text\r
267 text->clear();\r
268 if (m68kPCShow)\r
269 {\r
270 text->setText(s);\r
271 }\r
272 else\r
273 {\r
274 Use68KPCAddress();\r
275 RefreshContents();\r
276 }\r
277\r
278 // Set the scrollbar position in accordance of the M68K PC pointer \r
279 if (m68KPCNbrDisasmLines > (nbr / 2))\r
280 {\r
281 text->verticalScrollBar()->setValue(text->verticalScrollBar()->maximum());\r
282 }\r
283 else\r
284 {\r
285 text->verticalScrollBar()->setValue(text->verticalScrollBar()->minimum());\r
286 }\r
287\r
288 free(CurrentPtrFullSource);\r
289}\r
290\r
291\r
292#if 0\r
293// \r
294void m68KDasmWindow::keyPressEvent(QKeyEvent * e)\r
295{\r
296// if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Return)\r
297// hide();\r
298#if 0\r
299 else if (e->key() == Qt::Key_PageUp)\r
300 {\r
301 memBase -= 64;\r
302\r
303 if (memBase < 0)\r
304 memBase = 0;\r
305\r
306 RefreshContents();\r
307 }\r
308 else if (e->key() == Qt::Key_PageDown)\r
309 {\r
310 memBase += 64;\r
311\r
312 if (memBase > (0xF00000 - 64))\r
313 memBase = 0xF00000 - 64;\r
314\r
315 RefreshContents();\r
316 }\r
317 else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)\r
318 {\r
319 memBase -= 16;\r
320\r
321 if (memBase < 0)\r
322 memBase = 0;\r
323\r
324 RefreshContents();\r
325 }\r
326 else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal)\r
327 {\r
328 memBase += 16;\r
329\r
330 if (memBase > (0xF00000 - 64))\r
331 memBase = 0xF00000 - 64;\r
332\r
333 RefreshContents();\r
334 }\r
335#endif\r
336}\r
337#endif\r
338\r
339\r
340// Set mem base PC address using the 68K pc current address\r
341void m68KDasmWindow::Use68KPCAddress(void)\r
342{\r
343 memBase = m68k_get_reg(NULL, M68K_REG_PC);\r
344}\r
345\r
346\r
347// Set mem base PC address\r
348void m68KDasmWindow::SetAddress(int address)\r
349{\r
350 memBase = address;\r
351// RefreshContents();\r
352}\r
353\r
354\r
355#if 0\r
356// Set mem base PC address based on user interaction\r
357void m68KDasmWindow::GoToAddress(void)\r
358{\r
359 bool ok;\r
360\r
361 QString newAddress = address->text();\r
362 memBase = newAddress.toUInt(&ok, 16);\r
363 RefreshContents();\r
364}\r
365#endif\r