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