Add the source level tracing
[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
aae93d86 13// JPM Aug./2020 Display only the code related to the traced function, added different layouts, Qt/HTML text format support\r
9bf5c434
JPM
14//\r
15\r
16// STILL TO DO:\r
17//\r
18\r
aae93d86 19#include <stdlib.h>\r
9bf5c434 20#include "debugger/m68kDasmWin.h"\r
9bf5c434
JPM
21#include "m68000/m68kinterface.h"\r
22#include "dsp.h"\r
23#include "gpu.h"\r
9bf5c434 24#include "DBGManager.h"\r
9bf5c434
JPM
25#include "settings.h"\r
26\r
27\r
28// \r
29m68KDasmWindow::m68KDasmWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),\r
aae93d86
JPM
30layout(new QVBoxLayout),\r
31#ifdef MD_LAYOUTTEXTS\r
32text(new QTextBrowser),\r
33#endif\r
34memBase(0)\r
9bf5c434 35{\r
aae93d86 36 // Set font\r
9bf5c434 37 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
9bf5c434
JPM
38 fixedFont.setStyleHint(QFont::Monospace); //TypeWriter\r
39 fixedFont.setLetterSpacing(QFont::PercentageSpacing, 100);\r
9bf5c434 40\r
aae93d86
JPM
41 // Set text in layout\r
42#ifdef MD_LAYOUTTEXTS\r
43 text->setFont(fixedFont);\r
9bf5c434 44 layout->addWidget(text);\r
aae93d86
JPM
45#endif\r
46\r
47 // Set layout\r
48 setLayout(layout);\r
9bf5c434
JPM
49}\r
50\r
51\r
52//\r
53void m68KDasmWindow::RefreshContents(void)\r
54{\r
9bf5c434
JPM
55 QString s;\r
56 char buffer[1024], string[1024], adresse[16];\r
57 size_t pc = memBase, oldpc;\r
58 size_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);\r
59 size_t m68KPCNbrDisasmLines = 0;\r
60 char *Symbol = NULL, *LineSrc, *CurrentLineSrc = NULL;\r
61 bool m68kPCShow = false;\r
62 bool constant, adr, equal, Error;\r
63 size_t j, i;\r
64 size_t nbr = vjs.nbrdisasmlines;\r
65 char *PtrFullSource, *CurrentPtrFullSource = (char *)calloc(1, 1);\r
66 size_t NumLine; // , CurrentNumLine = 0;\r
9bf5c434
JPM
67 size_t CurrentNumLine;\r
68 char singleCharString[2] = { 0, 0 };\r
aae93d86
JPM
69#if MD_LAYOUTFILE == 1\r
70 bool In = true;\r
71#else\r
72#define In true\r
73#endif\r
9bf5c434 74\r
aae93d86 75 for (i = 0; (i < nbr) && In; i++)\r
9bf5c434 76 {\r
9bf5c434 77 oldpc = pc;\r
9bf5c434
JPM
78 adr = constant = equal = false;\r
79\r
80 // Display source filename based on the program address\r
81 if (vjs.displayFullSourceFilename && (PtrFullSource = DBGManager_GetFullSourceFilenameFromAdr(oldpc, &Error)) && strcmp(CurrentPtrFullSource, PtrFullSource))\r
82 {\r
aae93d86
JPM
83#if defined(MD_LAYOUTFILE)\r
84 if (i)\r
85#if MD_LAYOUTFILE != 1\r
86 {\r
87 // add an empty line for the display of the new filename\r
88 nbr++;\r
89 s += QString("<br>");\r
90 }\r
91#else\r
92 {\r
93 In = false;\r
94 }\r
95 else\r
96#endif\r
9bf5c434
JPM
97#endif\r
98 {\r
9bf5c434 99 CurrentNumLine = DBGManager_GetNumLineFromAdr(pc, DBG_NO_TAG) - 1;\r
9bf5c434
JPM
100 CurrentPtrFullSource = (char *)realloc(CurrentPtrFullSource, strlen(PtrFullSource) + 1);\r
101 strcpy(CurrentPtrFullSource, PtrFullSource);\r
aae93d86 102#if defined(MD_LAYOUTFILE)\r
9bf5c434
JPM
103 if (!Error)\r
104 {\r
aae93d86 105 // Referenced filename does exist\r
9bf5c434
JPM
106 sprintf(string, "<font color='#ff0000'><b>%s</b></font><br>", PtrFullSource);\r
107 }\r
108 else\r
109 {\r
aae93d86 110 // Referenced filename doesn't exist\r
9bf5c434
JPM
111 sprintf(string, "<font color='#00ff00'><b>%s</b></font><br>", PtrFullSource);\r
112 }\r
aae93d86 113 nbr++;\r
9bf5c434 114 s += QString(string);\r
aae93d86 115#endif\r
9bf5c434
JPM
116 }\r
117 }\r
aae93d86 118 else\r
9bf5c434 119 {\r
aae93d86
JPM
120 // Display line number based on the program address\r
121 if ((NumLine = DBGManager_GetNumLineFromAdr(oldpc, DBG_NO_TAG)) && ((signed)NumLine > (signed)CurrentNumLine))\r
9bf5c434 122 {\r
aae93d86
JPM
123#if MD_LAYOUTFILE != 1\r
124 if ((signed)CurrentNumLine < 0)\r
125 {\r
126 CurrentNumLine = NumLine - 1;\r
127 }\r
128#endif\r
129 sprintf(string, "| <font color='#006400'>%5u</font> | ", (unsigned int)++CurrentNumLine); // (CurrentNumLine = NumLine));\r
130 }\r
131 else\r
132 {\r
133 sprintf(string, "| | ");\r
9bf5c434 134 }\r
9bf5c434 135 s += QString(string);\r
aae93d86
JPM
136\r
137 // Display line source based on the program address\r
138 if (((signed)CurrentNumLine > 0) && (LineSrc = DBGManager_GetLineSrcFromNumLineBaseAdr(oldpc, CurrentNumLine)) && (LineSrc != CurrentLineSrc))\r
9bf5c434 139 {\r
aae93d86
JPM
140#if 0\r
141 // add a color on the line text\r
142 sprintf(string, "<font color='#006400'>%s</font><br>", (CurrentLineSrc = LineSrc));\r
9bf5c434 143 s += QString(string);\r
aae93d86
JPM
144#else\r
145 // add a color on the line text with HTML encoding\r
146 s += QString("<font color='#006400'>");\r
147 s += QString(QString((CurrentLineSrc = LineSrc)).toHtmlEscaped());\r
148 s += QString("</font><br>");\r
149#endif\r
9bf5c434
JPM
150 nbr++;\r
151 }\r
9bf5c434
JPM
152 else\r
153 {\r
aae93d86
JPM
154 // Display symbol, or line source, based on the program address\r
155 if (!CurrentLineSrc && !Symbol && (Symbol = DBGManager_GetSymbolNameFromAdr(oldpc)))\r
9bf5c434 156 {\r
aae93d86
JPM
157 sprintf(string, "%s:<br>", Symbol);\r
158 s += QString(string);\r
159 nbr++;\r
9bf5c434 160 }\r
aae93d86 161 // Display the assembly line based on the current PC\r
9bf5c434
JPM
162 else\r
163 {\r
aae93d86 164 pc += m68k_disassemble(buffer, (unsigned int)pc, 0, vjs.disasmopcodes);\r
9bf5c434 165\r
aae93d86 166 if (m68kPC == oldpc)\r
9bf5c434 167 {\r
aae93d86
JPM
168 sprintf(string, "-> <u>%06X: %s</u><br>", (unsigned int)oldpc, buffer);\r
169 m68kPCShow = true;\r
170 m68KPCNbrDisasmLines = i;\r
9bf5c434
JPM
171 }\r
172 else\r
173 {\r
aae93d86
JPM
174 sprintf(string, " %06X: %s<br>", (unsigned int)oldpc, buffer);\r
175 }\r
9bf5c434 176\r
aae93d86 177 buffer[0] = 0; // Clear string\r
9bf5c434 178\r
aae93d86
JPM
179 for (j = 0; j < strlen(string); j++)\r
180 {\r
181 if (string[j] == ' ')\r
182 {\r
183 strcat(buffer, "&nbsp;");\r
184 adr = constant = false;\r
9bf5c434 185 }\r
aae93d86 186 else\r
9bf5c434 187 {\r
aae93d86 188 switch (string[j])\r
9bf5c434 189 {\r
aae93d86
JPM
190 case '#':\r
191 constant = true;\r
192 break;\r
193\r
194 case '$':\r
195 adr = true;\r
196 break;\r
197\r
198 case ',':\r
199 constant = adr = equal = false;\r
200 break;\r
201\r
202 case '=':\r
203 equal = true;\r
204 break;\r
205 }\r
9bf5c434 206\r
aae93d86 207 if (!constant && adr && !equal)\r
9bf5c434 208 {\r
aae93d86
JPM
209 int l = 0;\r
210 char *p;\r
211 do\r
212 {\r
213 adresse[l++] = string[++j];\r
214 } while ((string[(j + 1)] >= '0') && (string[(j + 1)] <= '9') || (string[(j + 1)] >= 'A') && (string[(j + 1)] <= 'F'));\r
215 adresse[l] = 0;\r
216\r
217 if (Symbol = DBGManager_GetSymbolNameFromAdr(strtoul(adresse, &p, 16)))\r
218 {\r
219 strcat(buffer, Symbol);\r
220 }\r
221 else\r
222 {\r
223 strcat(buffer, "$");\r
224 strcat(buffer, adresse);\r
225 }\r
226\r
227 adr = false;\r
9bf5c434
JPM
228 }\r
229 else\r
230 {\r
aae93d86
JPM
231 singleCharString[0] = string[j];\r
232 strcat(buffer, singleCharString);\r
9bf5c434 233 }\r
9bf5c434
JPM
234 }\r
235 }\r
9bf5c434 236\r
aae93d86
JPM
237 Symbol = NULL;\r
238 s += QString(buffer);\r
239 }\r
9bf5c434
JPM
240 }\r
241 }\r
242 }\r
243\r
244 // Display generated text\r
245 text->clear();\r
246 if (m68kPCShow)\r
247 {\r
248 text->setText(s);\r
249 }\r
250 else\r
251 {\r
252 Use68KPCAddress();\r
253 RefreshContents();\r
254 }\r
255\r
256 // Set the scrollbar position in accordance of the M68K PC pointer \r
257 if (m68KPCNbrDisasmLines > (nbr / 2))\r
258 {\r
259 text->verticalScrollBar()->setValue(text->verticalScrollBar()->maximum());\r
260 }\r
261 else\r
262 {\r
263 text->verticalScrollBar()->setValue(text->verticalScrollBar()->minimum());\r
264 }\r
265\r
266 free(CurrentPtrFullSource);\r
267}\r
268\r
269\r
9bf5c434 270// Set mem base PC address using the 68K pc current address\r
aae93d86 271void m68KDasmWindow::Use68KPCAddress(void)\r
9bf5c434
JPM
272{\r
273 memBase = m68k_get_reg(NULL, M68K_REG_PC);\r
274}\r
275\r
276\r
277// Set mem base PC address\r
278void m68KDasmWindow::SetAddress(int address)\r
279{\r
280 memBase = address;\r
9bf5c434 281}\r