Added detection for the unsigned/signed short type
[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
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
28m68KDasmWindow::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
43void 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, "&nbsp;");\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
234void 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
241void m68KDasmWindow::SetAddress(int address)\r
242{\r
243 memBase = address;\r
9bf5c434 244}\r