Commit | Line | Data |
---|---|---|
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 | |
27 | StackBrowserWindow::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 | |
68 | void 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 |
104 | void 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, " ");\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 instead of space !!!")\r | |
137 | #else\r | |
a2dfb8e5 | 138 | #warning "!!! Need to dig the reason(s) why the 2nd line needs to use the 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, " ");\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 |
194 | void 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 | |
267 | void 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 |