]> Shamusworld >> Repos - virtualjaguar/blob - src/gui/debug/cpubrowser.cpp
Minor update to debugger; added autoupdating to CPU/MEM windows.
[virtualjaguar] / src / gui / debug / cpubrowser.cpp
1 //
2 // cpubrowser.cpp - Jaguar CPU browser
3 //
4 // by James Hammons
5 // (C) 2012 Underground Software
6 //
7 // JLH = James Hammons <jlhamm@acm.org>
8 //
9 // Who  When        What
10 // ---  ----------  -----------------------------------------------------------
11 // JLH  08/14/2012  Created this file
12 //
13
14 // STILL TO DO:
15 //
16
17 #include "cpubrowser.h"
18 //#include "memory.h"
19 #include "m68000/m68kinterface.h"
20 #include "dsp.h"
21 #include "gpu.h"
22 #include "jaguar.h"
23
24
25 CPUBrowserWindow::CPUBrowserWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),
26         layout(new QVBoxLayout), text(new QLabel),
27         refresh(new QPushButton(tr("Refresh"))),
28         bpm(new QCheckBox(tr("BPM"))), bpmAddress(new QLineEdit),
29         bpmContinue(new QPushButton(tr("Resume")))
30 {
31         setWindowTitle(tr("CPU Browser"));
32
33         // Need to set the size as well...
34 //      resize(560, 480);
35
36         // Limit input to 6 hex digits
37         bpmAddress->setInputMask("hhhhhh");
38         QHBoxLayout * hbox1 = new QHBoxLayout;
39         hbox1->addWidget(bpm);
40         hbox1->addWidget(bpmAddress);
41         hbox1->addWidget(bpmContinue);
42
43         QFont fixedFont("Lucida Console", 8, QFont::Normal);
44 //      QFont fixedFont("", 8, QFont::Normal);
45         fixedFont.setStyleHint(QFont::TypeWriter);
46         text->setFont(fixedFont);
47 ////    layout->setSizeConstraint(QLayout::SetFixedSize);
48         setLayout(layout);
49
50         layout->addWidget(text);
51         layout->addLayout(hbox1);
52         layout->addWidget(refresh);
53
54         connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));
55         connect(bpm, SIGNAL(clicked(bool)), this, SLOT(HandleBPM(bool)));
56         connect(bpmAddress, SIGNAL(textChanged(const QString &)), this, SLOT(HandleBPMAddress(const QString &)));
57         connect(bpmContinue, SIGNAL(clicked()), this, SLOT(HandleBPMContinue()));
58 }
59
60
61 void CPUBrowserWindow::RefreshContents(void)
62 {
63         char string[2048];
64         QString s;
65
66         // 68K
67         uint32_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);
68         uint32_t m68kSR = m68k_get_reg(NULL, M68K_REG_SR);
69         sprintf(string, "PC: %06X&nbsp;&nbsp;SR: %04X<br><br>", m68kPC, m68kSR);
70         s += QString(string);
71 /*
72 SR format:
73 +--+--+--+--+ +--+--+--+--+ +--+--+--+--+ +--+--+--+--+
74 |T1|T0| S| M| |--|I2|I1|I0| |--|--|--| X| | N| Z| V| C|
75 +--+--+--+--+ +--+--+--+--+ +--+--+--+--+ +--+--+--+--+
76  T - Trace (T1 only in 68K, T0 = 0)
77  S - Supervisor flag
78  M - Master/Interrupt flag (= 0 in 68K)
79  I - Interrupt level mask
80  X - Extend flag
81  N - Negative flag
82  Z - Zero flag
83  V - Overflow flag
84  C - Carry flag
85 */
86
87         uint32_t m68kA0 = m68k_get_reg(NULL, M68K_REG_A0);
88         uint32_t m68kA1 = m68k_get_reg(NULL, M68K_REG_A1);
89         uint32_t m68kA2 = m68k_get_reg(NULL, M68K_REG_A2);
90         uint32_t m68kA3 = m68k_get_reg(NULL, M68K_REG_A3);
91         sprintf(string, "A0: %08X&nbsp;&nbsp;A1: %08X&nbsp;&nbsp;A2: %08X&nbsp;&nbsp;A3: %08X<br>", m68kA0, m68kA1, m68kA2, m68kA3);
92         s += QString(string);
93
94         uint32_t m68kA4 = m68k_get_reg(NULL, M68K_REG_A4);
95         uint32_t m68kA5 = m68k_get_reg(NULL, M68K_REG_A5);
96         uint32_t m68kA6 = m68k_get_reg(NULL, M68K_REG_A6);
97         uint32_t m68kA7 = m68k_get_reg(NULL, M68K_REG_A7);
98         sprintf(string, "A4: %08X&nbsp;&nbsp;A5: %08X&nbsp;&nbsp;A6: %08X&nbsp;&nbsp;A7: %08X<br><br>", m68kA4, m68kA5, m68kA6, m68kA7);
99         s += QString(string);
100
101         uint32_t m68kD0 = m68k_get_reg(NULL, M68K_REG_D0);
102         uint32_t m68kD1 = m68k_get_reg(NULL, M68K_REG_D1);
103         uint32_t m68kD2 = m68k_get_reg(NULL, M68K_REG_D2);
104         uint32_t m68kD3 = m68k_get_reg(NULL, M68K_REG_D3);
105         sprintf(string, "D0: %08X&nbsp;&nbsp;D1: %08X&nbsp;&nbsp;D2: %08X&nbsp;&nbsp;D3: %08X<br>", m68kD0, m68kD1, m68kD2, m68kD3);
106         s += QString(string);
107
108         uint32_t m68kD4 = m68k_get_reg(NULL, M68K_REG_D4);
109         uint32_t m68kD5 = m68k_get_reg(NULL, M68K_REG_D5);
110         uint32_t m68kD6 = m68k_get_reg(NULL, M68K_REG_D6);
111         uint32_t m68kD7 = m68k_get_reg(NULL, M68K_REG_D7);
112         sprintf(string, "D4: %08X&nbsp;&nbsp;D5: %08X&nbsp;&nbsp;D6: %08X&nbsp;&nbsp;D7: %08X<br><br>", m68kD4, m68kD5, m68kD6, m68kD7);
113         s += QString(string);
114
115         // GPU
116         sprintf(string, "GPU PC: %06X&nbsp;&nbsp;FLAGS: %04X&nbsp;&nbsp;SR: %04X<br><br>", GPUReadLong(0xF02110, DEBUG), GPUReadLong(0xF02100, DEBUG), GPUReadLong(0xF02114, DEBUG));
117         s += QString(string);
118 /*
119 GPU Flags:
120 0    - Zero flag
121 1    - Carry flag
122 2    - Negative flag
123 3    - IMASK (writing 0 clears, 1 has no effect)
124 4-8  - IRQ enable 0 - 4
125 9-13 - IRQ latch clear 0 - 4
126 14   - REGPAGE
127 15   - DMAEN
128
129 GPU Control:
130 0     - GPU Go
131 1     - CPUINT
132 2     - GPUINT0
133 3     - Single Step
134 4     - Single step go
135 5     - Unused
136 6-10  - IRQ Latch 0 - 4
137 11    - Bus Hog
138 12-15 - Version
139 */
140
141         sprintf(string, "Bank 0:<br>"
142                 "R00: %08X&nbsp;&nbsp;R01: %08X&nbsp;&nbsp;R02: %08X&nbsp;&nbsp;R03: %08X<br>"
143                 "R04: %08X&nbsp;&nbsp;R05: %08X&nbsp;&nbsp;R06: %08X&nbsp;&nbsp;R07: %08X<br>"
144                 "R08: %08X&nbsp;&nbsp;R09: %08X&nbsp;&nbsp;R10: %08X&nbsp;&nbsp;R11: %08X<br>"
145                 "R12: %08X&nbsp;&nbsp;R13: %08X&nbsp;&nbsp;R14: %08X&nbsp;&nbsp;R15: %08X<br>"
146                 "R16: %08X&nbsp;&nbsp;R17: %08X&nbsp;&nbsp;R18: %08X&nbsp;&nbsp;R19: %08X<br>"
147                 "R20: %08X&nbsp;&nbsp;R21: %08X&nbsp;&nbsp;R22: %08X&nbsp;&nbsp;R23: %08X<br>"
148                 "R24: %08X&nbsp;&nbsp;R25: %08X&nbsp;&nbsp;R26: %08X&nbsp;&nbsp;R27: %08X<br>"
149                 "R28: %08X&nbsp;&nbsp;R29: %08X&nbsp;&nbsp;R30: %08X&nbsp;&nbsp;R31: %08X<br><br>",
150                 gpu_reg_bank_0[0], gpu_reg_bank_0[1], gpu_reg_bank_0[2], gpu_reg_bank_0[3],
151                 gpu_reg_bank_0[4], gpu_reg_bank_0[5], gpu_reg_bank_0[6], gpu_reg_bank_0[7],
152                 gpu_reg_bank_0[8], gpu_reg_bank_0[9], gpu_reg_bank_0[10], gpu_reg_bank_0[11],
153                 gpu_reg_bank_0[12], gpu_reg_bank_0[13], gpu_reg_bank_0[14], gpu_reg_bank_0[15],
154                 gpu_reg_bank_0[16], gpu_reg_bank_0[17], gpu_reg_bank_0[18], gpu_reg_bank_0[19],
155                 gpu_reg_bank_0[20], gpu_reg_bank_0[21], gpu_reg_bank_0[22], gpu_reg_bank_0[23],
156                 gpu_reg_bank_0[24], gpu_reg_bank_0[25], gpu_reg_bank_0[26], gpu_reg_bank_0[27],
157                 gpu_reg_bank_0[28], gpu_reg_bank_0[29], gpu_reg_bank_0[30], gpu_reg_bank_0[31]);
158         s += QString(string);
159
160         sprintf(string, "Bank 1:<br>"
161                 "R00: %08X&nbsp;&nbsp;R01: %08X&nbsp;&nbsp;R02: %08X&nbsp;&nbsp;R03: %08X<br>"
162                 "R04: %08X&nbsp;&nbsp;R05: %08X&nbsp;&nbsp;R06: %08X&nbsp;&nbsp;R07: %08X<br>"
163                 "R08: %08X&nbsp;&nbsp;R09: %08X&nbsp;&nbsp;R10: %08X&nbsp;&nbsp;R11: %08X<br>"
164                 "R12: %08X&nbsp;&nbsp;R13: %08X&nbsp;&nbsp;R14: %08X&nbsp;&nbsp;R15: %08X<br>"
165                 "R16: %08X&nbsp;&nbsp;R17: %08X&nbsp;&nbsp;R18: %08X&nbsp;&nbsp;R19: %08X<br>"
166                 "R20: %08X&nbsp;&nbsp;R21: %08X&nbsp;&nbsp;R22: %08X&nbsp;&nbsp;R23: %08X<br>"
167                 "R24: %08X&nbsp;&nbsp;R25: %08X&nbsp;&nbsp;R26: %08X&nbsp;&nbsp;R27: %08X<br>"
168                 "R28: %08X&nbsp;&nbsp;R29: %08X&nbsp;&nbsp;R30: %08X&nbsp;&nbsp;R31: %08X<br><br>",
169                 gpu_reg_bank_1[0], gpu_reg_bank_1[1], gpu_reg_bank_1[2], gpu_reg_bank_1[3],
170                 gpu_reg_bank_1[4], gpu_reg_bank_1[5], gpu_reg_bank_1[6], gpu_reg_bank_1[7],
171                 gpu_reg_bank_1[8], gpu_reg_bank_1[9], gpu_reg_bank_1[10], gpu_reg_bank_1[11],
172                 gpu_reg_bank_1[12], gpu_reg_bank_1[13], gpu_reg_bank_1[14], gpu_reg_bank_1[15],
173                 gpu_reg_bank_1[16], gpu_reg_bank_1[17], gpu_reg_bank_1[18], gpu_reg_bank_1[19],
174                 gpu_reg_bank_1[20], gpu_reg_bank_1[21], gpu_reg_bank_1[22], gpu_reg_bank_1[23],
175                 gpu_reg_bank_1[24], gpu_reg_bank_1[25], gpu_reg_bank_1[26], gpu_reg_bank_1[27],
176                 gpu_reg_bank_1[28], gpu_reg_bank_1[29], gpu_reg_bank_1[30], gpu_reg_bank_1[31]);
177         s += QString(string);
178
179         // DSP
180         sprintf(string, "DSP PC: %06X&nbsp;&nbsp;FLAGS: %05X&nbsp;&nbsp;SR: %05X<br><br>", DSPReadLong(0xF1A110, DEBUG), DSPReadLong(0xF1A100, DEBUG), DSPReadLong(0xF1A114, DEBUG));
181         s += QString(string);
182 /*
183 DSP Flags:
184 0    - Zero flag
185 1    - Carry flag
186 2    - Negative flag
187 3    - IMASK (writing 0 clears, 1 has no effect)
188 4-8  - IRQ enable 0 - 4
189 9-13 - IRQ latch clear 0 - 4
190 14   - REGPAGE
191 15   - DMAEN
192 16   - IRQ enable 5
193 17   - IRQ latch clear 5
194
195 DSP Control:
196 0     - DSP Go
197 1     - CPUINT
198 2     - DSPINT0
199 3     - Single Step
200 4     - Single step go
201 5     - Unused
202 6-10  - IRQ Latch 0 - 4
203 11    - Bus Hog
204 12-15 - Version
205 16    - IRQ Latch 5
206 */
207
208         sprintf(string, "Bank 0:<br>"
209                 "R00: %08X&nbsp;&nbsp;R01: %08X&nbsp;&nbsp;R02: %08X&nbsp;&nbsp;R03: %08X<br>"
210                 "R04: %08X&nbsp;&nbsp;R05: %08X&nbsp;&nbsp;R06: %08X&nbsp;&nbsp;R07: %08X<br>"
211                 "R08: %08X&nbsp;&nbsp;R09: %08X&nbsp;&nbsp;R10: %08X&nbsp;&nbsp;R11: %08X<br>"
212                 "R12: %08X&nbsp;&nbsp;R13: %08X&nbsp;&nbsp;R14: %08X&nbsp;&nbsp;R15: %08X<br>"
213                 "R16: %08X&nbsp;&nbsp;R17: %08X&nbsp;&nbsp;R18: %08X&nbsp;&nbsp;R19: %08X<br>"
214                 "R20: %08X&nbsp;&nbsp;R21: %08X&nbsp;&nbsp;R22: %08X&nbsp;&nbsp;R23: %08X<br>"
215                 "R24: %08X&nbsp;&nbsp;R25: %08X&nbsp;&nbsp;R26: %08X&nbsp;&nbsp;R27: %08X<br>"
216                 "R28: %08X&nbsp;&nbsp;R29: %08X&nbsp;&nbsp;R30: %08X&nbsp;&nbsp;R31: %08X<br><br>",
217                 dsp_reg_bank_0[0], dsp_reg_bank_0[1], dsp_reg_bank_0[2], dsp_reg_bank_0[3],
218                 dsp_reg_bank_0[4], dsp_reg_bank_0[5], dsp_reg_bank_0[6], dsp_reg_bank_0[7],
219                 dsp_reg_bank_0[8], dsp_reg_bank_0[9], dsp_reg_bank_0[10], dsp_reg_bank_0[11],
220                 dsp_reg_bank_0[12], dsp_reg_bank_0[13], dsp_reg_bank_0[14], dsp_reg_bank_0[15],
221                 dsp_reg_bank_0[16], dsp_reg_bank_0[17], dsp_reg_bank_0[18], dsp_reg_bank_0[19],
222                 dsp_reg_bank_0[20], dsp_reg_bank_0[21], dsp_reg_bank_0[22], dsp_reg_bank_0[23],
223                 dsp_reg_bank_0[24], dsp_reg_bank_0[25], dsp_reg_bank_0[26], dsp_reg_bank_0[27],
224                 dsp_reg_bank_0[28], dsp_reg_bank_0[29], dsp_reg_bank_0[30], dsp_reg_bank_0[31]);
225         s += QString(string);
226
227         sprintf(string, "Bank 1:<br>"
228                 "R00: %08X&nbsp;&nbsp;R01: %08X&nbsp;&nbsp;R02: %08X&nbsp;&nbsp;R03: %08X<br>"
229                 "R04: %08X&nbsp;&nbsp;R05: %08X&nbsp;&nbsp;R06: %08X&nbsp;&nbsp;R07: %08X<br>"
230                 "R08: %08X&nbsp;&nbsp;R09: %08X&nbsp;&nbsp;R10: %08X&nbsp;&nbsp;R11: %08X<br>"
231                 "R12: %08X&nbsp;&nbsp;R13: %08X&nbsp;&nbsp;R14: %08X&nbsp;&nbsp;R15: %08X<br>"
232                 "R16: %08X&nbsp;&nbsp;R17: %08X&nbsp;&nbsp;R18: %08X&nbsp;&nbsp;R19: %08X<br>"
233                 "R20: %08X&nbsp;&nbsp;R21: %08X&nbsp;&nbsp;R22: %08X&nbsp;&nbsp;R23: %08X<br>"
234                 "R24: %08X&nbsp;&nbsp;R25: %08X&nbsp;&nbsp;R26: %08X&nbsp;&nbsp;R27: %08X<br>"
235                 "R28: %08X&nbsp;&nbsp;R29: %08X&nbsp;&nbsp;R30: %08X&nbsp;&nbsp;R31: %08X<br>",
236                 dsp_reg_bank_1[0], dsp_reg_bank_1[1], dsp_reg_bank_1[2], dsp_reg_bank_1[3],
237                 dsp_reg_bank_1[4], dsp_reg_bank_1[5], dsp_reg_bank_1[6], dsp_reg_bank_1[7],
238                 dsp_reg_bank_1[8], dsp_reg_bank_1[9], dsp_reg_bank_1[10], dsp_reg_bank_1[11],
239                 dsp_reg_bank_1[12], dsp_reg_bank_1[13], dsp_reg_bank_1[14], dsp_reg_bank_1[15],
240                 dsp_reg_bank_1[16], dsp_reg_bank_1[17], dsp_reg_bank_1[18], dsp_reg_bank_1[19],
241                 dsp_reg_bank_1[20], dsp_reg_bank_1[21], dsp_reg_bank_1[22], dsp_reg_bank_1[23],
242                 dsp_reg_bank_1[24], dsp_reg_bank_1[25], dsp_reg_bank_1[26], dsp_reg_bank_1[27],
243                 dsp_reg_bank_1[28], dsp_reg_bank_1[29], dsp_reg_bank_1[30], dsp_reg_bank_1[31]);
244         s += QString(string);
245
246         text->clear();
247         text->setText(s);
248 }
249
250
251 void CPUBrowserWindow::HandleBPM(bool state)
252 {
253         bpmActive = state;
254 if (bpmActive)
255         printf("BPM Set: $%06X\n", bpmAddress1);
256 }
257
258
259 void CPUBrowserWindow::HandleBPMAddress(const QString & newText)
260 {
261         bool ok;
262         bpmAddress1 = newText.toUInt(&ok, 16);
263 }
264
265
266 void CPUBrowserWindow::HandleBPMContinue(void)
267 {
268         M68KDebugResume();
269 }
270
271
272 void CPUBrowserWindow::keyPressEvent(QKeyEvent * e)
273 {
274         if (e->key() == Qt::Key_Escape)
275                 hide();
276 #if 0
277         else if (e->key() == Qt::Key_PageUp)
278         {
279                 memBase -= 480;
280
281                 if (memBase < 0)
282                         memBase = 0;
283
284                 RefreshContents();
285         }
286         else if (e->key() == Qt::Key_PageDown)
287         {
288                 memBase += 480;
289
290                 if (memBase > (0x200000 - 480))
291                         memBase = 0x200000 - 480;
292
293                 RefreshContents();
294         }
295         else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)
296         {
297                 memBase -= 16;
298
299                 if (memBase < 0)
300                         memBase = 0;
301
302                 RefreshContents();
303         }
304         else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal)
305         {
306                 memBase += 16;
307
308                 if (memBase > (0x200000 - 480))
309                         memBase = 0x200000 - 480;
310
311                 RefreshContents();
312         }
313 #endif
314 }