Added multiple breakpoints feature and their key bindings
[clinton/Virtual-Jaguar-Rx.git] / src / gui / debug / stackbrowser.cpp
CommitLineData
49a6ac1c
JPM
1//\r
2// stackbrowser.cpp - Jaguar stack browser\r
3//\r
4// by James Hammons\r
5// (C) 2012 Underground Software\r
6//\r
7// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
8//\r
9// Who When What\r
10// --- ---------- -----------------------------------------------------------\r
11// JPM 01/11/2017 Created this file\r
12//\r
13\r
14// STILL TO DO:\r
15//\r
16\r
17#include "stackbrowser.h"\r
18#include "memory.h"\r
19#include "m68000/m68kinterface.h"\r
20#include "settings.h"\r
21\r
22\r
a2dfb8e5 23//#define DEBUG_SPDISPLAY 1000 // To fill up to 256 bytes with values from 0 to $FF below the SP pointer any above are random values\r
49a6ac1c
JPM
24\r
25\r
26//\r
27StackBrowserWindow::StackBrowserWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),\r
28// layout(new QVBoxLayout), text(new QTextBrowser),\r
29 layout(new QVBoxLayout),\r
30 text(new QLabel),\r
31 //refresh(new QPushButton(tr("Refresh"))),\r
32 //address(new QLineEdit),\r
33 //go(new QPushButton(tr("Go"))),\r
a2dfb8e5 34 stackBase(m68k_get_reg(NULL, M68K_REG_SP))\r
49a6ac1c 35{\r
49a6ac1c
JPM
36/*\r
37 address->setInputMask("hhhhhh");\r
38 QHBoxLayout * hbox1 = new QHBoxLayout;\r
39 hbox1->addWidget(refresh);\r
40 hbox1->addWidget(address);\r
41 hbox1->addWidget(go);\r
42*/\r
43\r
44 // Need to set the size as well...\r
45// resize(560, 480);\r
46\r
47 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
48// QFont fixedFont("", 8, QFont::Normal);\r
49 fixedFont.setStyleHint(QFont::TypeWriter);\r
50 text->setFont(fixedFont);\r
51//// layout->setSizeConstraint(QLayout::SetFixedSize);\r
52 setLayout(layout);\r
53\r
54 layout->addWidget(text);\r
55// layout->addWidget(refresh);\r
56/*\r
57 layout->addLayout(hbox1);\r
58*/\r
59\r
60/*\r
61 connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));\r
62 connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress()));\r
63*/\r
64}\r
65\r
66\r
67// \r
68void StackBrowserWindow::RefreshContents(void)\r
69{\r
a2dfb8e5 70 char string[1024];\r
49a6ac1c
JPM
71\r
72 if (isVisible())\r
73 {\r
a2dfb8e5
JPM
74#ifdef DEBUG_SPDISPLAY\r
75 m68k_set_reg(M68K_REG_SP, (vjs.DRAM_size - DEBUG_SPDISPLAY));\r
76#endif\r
77 if ((stackBase = m68k_get_reg(NULL, M68K_REG_SP)) && (stackBase < vjs.DRAM_size))\r
78 {\r
49a6ac1c
JPM
79\r
80#ifdef DEBUG_SPDISPLAY\r
a2dfb8e5
JPM
81 for (int i = 0; i < DEBUG_SPDISPLAY; i++)\r
82 {\r
49a6ac1c 83#if DEBUG_SPDISPLAY < 257\r
a2dfb8e5
JPM
84 jaguarMainRAM[stackBase + i] = (uint8_t)i;\r
85#else\r
86 jaguarMainRAM[stackBase + i] = (uint8_t)rand();\r
49a6ac1c 87#endif\r
a2dfb8e5 88 }\r
49a6ac1c 89#endif\r
a2dfb8e5
JPM
90 sprintf(string, "Stack Browser - 0x%06X", (unsigned int)(stackBase, (unsigned int)stackBase));\r
91 }\r
92 else\r
93 {\r
94 sprintf(string, "Stack Browser");\r
95 }\r
96\r
97 setWindowTitle(tr(string));\r
98 RefreshContentsWindow();\r
99 }\r
100}\r
101\r
49a6ac1c 102\r
a2dfb8e5
JPM
103// Refresh / Display the window contents\r
104void StackBrowserWindow::RefreshContentsWindow(void)\r
105{\r
106 char string[2048], buf[64];\r
107 QString memDump;\r
108 size_t i, j;\r
109 uint8_t c;\r
110\r
111 if (stackBase < vjs.DRAM_size)\r
112 {\r
49a6ac1c
JPM
113 for (i = 0; i < 480; i += 16)\r
114 {\r
a2dfb8e5 115 if ((stackBase + i) < vjs.DRAM_size)\r
49a6ac1c 116 {\r
a2dfb8e5 117 sprintf(string, "%s%06X: ", (i ? "<br>" : ""), (unsigned int)(stackBase + i));\r
49a6ac1c
JPM
118\r
119 for (j = 0; j < 16; j++)\r
120 {\r
a2dfb8e5 121 if ((stackBase + i + j) < vjs.DRAM_size)\r
49a6ac1c 122 {\r
a2dfb8e5 123 sprintf(buf, "%02X ", jaguarMainRAM[stackBase + i + j]);\r
49a6ac1c
JPM
124 }\r
125 else\r
126 {\r
127 if (i)\r
128 {\r
129 sprintf(buf, "&nbsp;&nbsp;&nbsp;");\r
130 }\r
131 else\r
132 {\r
133 sprintf(buf, " ");\r
134 }\r
135#ifdef _MSC_VER\r
136#pragma message("Warning: !!! Need to dig the reason(s) why the 2nd line needs to use the &nbsp; instead of space !!!")\r
137#else\r
a2dfb8e5 138 #warning "!!! Need to dig the reason(s) why the 2nd line needs to use the &nbsp; instead of space !!!"\r
49a6ac1c
JPM
139#endif // _MSC_VER\r
140 }\r
141 strcat(string, buf);\r
142 }\r
143\r
144 //sprintf(buf, "| ");\r
145 //strcat(string, buf);\r
146 strcat(string, "| ");\r
147\r
148 for (j = 0; j < 16; j++)\r
149 {\r
a2dfb8e5 150 if ((stackBase + i + j) < vjs.DRAM_size)\r
49a6ac1c 151 {\r
a2dfb8e5 152 c = jaguarMainRAM[stackBase + i + j];\r
49a6ac1c
JPM
153 //sprintf(buf, "&#%i;", c);\r
154\r
155 //if (c == 0x20)\r
156 //{\r
157 // sprintf(buf, "&nbsp;");\r
158 //}\r
159 //else\r
160 {\r
161 //if (c < 0x20)\r
162 if ((c < 0x20) || (c > 0x7E))\r
163 {\r
164 sprintf(buf, ".");\r
165 //buf[0] = '.';\r
166 }\r
167 else\r
168 {\r
169 sprintf(buf, "&#%i;", c);\r
170 //buf[0] = c;\r
171 }\r
172 //buf[1] = 0;\r
173 }\r
174\r
175 strcat(string, buf);\r
176 }\r
177 }\r
178\r
179 memDump += QString(string);\r
180 }\r
181 }\r
49a6ac1c 182 }\r
a2dfb8e5
JPM
183 else\r
184 {\r
185 memDump += QString("");\r
186 }\r
187\r
188 text->clear();\r
189 text->setText(memDump);\r
49a6ac1c
JPM
190}\r
191\r
192\r
a2dfb8e5 193// \r
49a6ac1c
JPM
194void StackBrowserWindow::keyPressEvent(QKeyEvent * e)\r
195{\r
a2dfb8e5 196 size_t offset;\r
49a6ac1c 197\r
a2dfb8e5
JPM
198 // Escape key to hide the window\r
199 if (e->key() == Qt::Key_Escape)\r
49a6ac1c 200 {\r
a2dfb8e5 201 hide();\r
49a6ac1c 202 }\r
a2dfb8e5 203 else\r
49a6ac1c 204 {\r
a2dfb8e5
JPM
205 if (stackBase < vjs.DRAM_size)\r
206 {\r
207 if (e->key() == Qt::Key_PageUp)\r
208 {\r
209 offset = -480;\r
210 }\r
211 else\r
212 {\r
213 if (e->key() == Qt::Key_PageDown)\r
214 {\r
215 offset = 480;\r
216 }\r
217 else\r
218 {\r
219 if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)\r
220 {\r
221 offset = -16;\r
222 }\r
223 else\r
224 {\r
225 if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Plus)\r
226 {\r
227 offset = 16;\r
228 }\r
229 else\r
230 {\r
231 offset = 0;\r
232 }\r
233 }\r
234 }\r
235 }\r
49a6ac1c 236\r
a2dfb8e5
JPM
237 if (offset)\r
238 {\r
239 if (offset < 0)\r
240 {\r
241 if ((stackBase += offset) < m68k_get_reg(NULL, M68K_REG_SP))\r
242 {\r
243 stackBase = m68k_get_reg(NULL, M68K_REG_SP);\r
244 }\r
245 }\r
246 else\r
247 {\r
248 if ((stackBase += offset) > (vjs.DRAM_size - 480))\r
249 {\r
250 stackBase = vjs.DRAM_size - 480;\r
251 }\r
49a6ac1c 252\r
a2dfb8e5
JPM
253 if (stackBase < m68k_get_reg(NULL, M68K_REG_SP))\r
254 {\r
255 stackBase = m68k_get_reg(NULL, M68K_REG_SP);\r
256 }\r
257 }\r
49a6ac1c 258\r
a2dfb8e5
JPM
259 RefreshContentsWindow();\r
260 }\r
261 }\r
49a6ac1c
JPM
262 }\r
263}\r
49a6ac1c
JPM
264\r
265\r
266/*\r
267void StackBrowserWindow::GoToAddress(void)\r
268{\r
269 bool ok;\r
270 QString newAddress = address->text();\r
a2dfb8e5 271 stackBase = newAddress.toUInt(&ok, 16);\r
49a6ac1c
JPM
272 RefreshContents();\r
273}\r
274*/\r