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