2 // cpubrowser.cpp - Jaguar CPU browser
5 // (C) 2012 Underground Software
7 // JLH = James Hammons <jlhamm@acm.org>
10 // --- ---------- -----------------------------------------------------------
11 // JLH 08/14/2012 Created this file
17 #include "cpubrowser.h"
19 #include "m68000/m68kinterface.h"
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")))
31 setWindowTitle(tr("CPU Browser"));
33 // Need to set the size as well...
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);
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);
50 layout->addWidget(text);
51 layout->addLayout(hbox1);
52 layout->addWidget(refresh);
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()));
61 void CPUBrowserWindow::RefreshContents(void)
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 SR: %04X<br><br>", m68kPC, m68kSR);
73 +--+--+--+--+ +--+--+--+--+ +--+--+--+--+ +--+--+--+--+
74 |T1|T0| S| M| |--|I2|I1|I0| |--|--|--| X| | N| Z| V| C|
75 +--+--+--+--+ +--+--+--+--+ +--+--+--+--+ +--+--+--+--+
76 T - Trace (T1 only in 68K, T0 = 0)
78 M - Master/Interrupt flag (= 0 in 68K)
79 I - Interrupt level mask
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 A1: %08X A2: %08X A3: %08X<br>", m68kA0, m68kA1, m68kA2, m68kA3);
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 A5: %08X A6: %08X A7: %08X<br><br>", m68kA4, m68kA5, m68kA6, m68kA7);
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 D1: %08X D2: %08X D3: %08X<br>", m68kD0, m68kD1, m68kD2, m68kD3);
106 s += QString(string);
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 D5: %08X D6: %08X D7: %08X<br><br>", m68kD4, m68kD5, m68kD6, m68kD7);
113 s += QString(string);
116 sprintf(string, "GPU PC: %06X FLAGS: %04X SR: %04X<br><br>", GPUReadLong(0xF02110, DEBUG), GPUReadLong(0xF02100, DEBUG), GPUReadLong(0xF02114, DEBUG));
117 s += QString(string);
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
136 6-10 - IRQ Latch 0 - 4
141 sprintf(string, "Bank 0:<br>"
142 "R00: %08X R01: %08X R02: %08X R03: %08X<br>"
143 "R04: %08X R05: %08X R06: %08X R07: %08X<br>"
144 "R08: %08X R09: %08X R10: %08X R11: %08X<br>"
145 "R12: %08X R13: %08X R14: %08X R15: %08X<br>"
146 "R16: %08X R17: %08X R18: %08X R19: %08X<br>"
147 "R20: %08X R21: %08X R22: %08X R23: %08X<br>"
148 "R24: %08X R25: %08X R26: %08X R27: %08X<br>"
149 "R28: %08X R29: %08X R30: %08X 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);
160 sprintf(string, "Bank 1:<br>"
161 "R00: %08X R01: %08X R02: %08X R03: %08X<br>"
162 "R04: %08X R05: %08X R06: %08X R07: %08X<br>"
163 "R08: %08X R09: %08X R10: %08X R11: %08X<br>"
164 "R12: %08X R13: %08X R14: %08X R15: %08X<br>"
165 "R16: %08X R17: %08X R18: %08X R19: %08X<br>"
166 "R20: %08X R21: %08X R22: %08X R23: %08X<br>"
167 "R24: %08X R25: %08X R26: %08X R27: %08X<br>"
168 "R28: %08X R29: %08X R30: %08X 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);
180 sprintf(string, "DSP PC: %06X FLAGS: %05X SR: %05X<br><br>", DSPReadLong(0xF1A110, DEBUG), DSPReadLong(0xF1A100, DEBUG), DSPReadLong(0xF1A114, DEBUG));
181 s += QString(string);
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
193 17 - IRQ latch clear 5
202 6-10 - IRQ Latch 0 - 4
208 sprintf(string, "Bank 0:<br>"
209 "R00: %08X R01: %08X R02: %08X R03: %08X<br>"
210 "R04: %08X R05: %08X R06: %08X R07: %08X<br>"
211 "R08: %08X R09: %08X R10: %08X R11: %08X<br>"
212 "R12: %08X R13: %08X R14: %08X R15: %08X<br>"
213 "R16: %08X R17: %08X R18: %08X R19: %08X<br>"
214 "R20: %08X R21: %08X R22: %08X R23: %08X<br>"
215 "R24: %08X R25: %08X R26: %08X R27: %08X<br>"
216 "R28: %08X R29: %08X R30: %08X 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);
227 sprintf(string, "Bank 1:<br>"
228 "R00: %08X R01: %08X R02: %08X R03: %08X<br>"
229 "R04: %08X R05: %08X R06: %08X R07: %08X<br>"
230 "R08: %08X R09: %08X R10: %08X R11: %08X<br>"
231 "R12: %08X R13: %08X R14: %08X R15: %08X<br>"
232 "R16: %08X R17: %08X R18: %08X R19: %08X<br>"
233 "R20: %08X R21: %08X R22: %08X R23: %08X<br>"
234 "R24: %08X R25: %08X R26: %08X R27: %08X<br>"
235 "R28: %08X R29: %08X R30: %08X 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);
251 void CPUBrowserWindow::HandleBPM(bool state)
255 printf("BPM Set: $%06X\n", bpmAddress1);
259 void CPUBrowserWindow::HandleBPMAddress(const QString & newText)
262 bpmAddress1 = newText.toUInt(&ok, 16);
266 void CPUBrowserWindow::HandleBPMContinue(void)
272 void CPUBrowserWindow::keyPressEvent(QKeyEvent * e)
274 if (e->key() == Qt::Key_Escape)
277 else if (e->key() == Qt::Key_PageUp)
286 else if (e->key() == Qt::Key_PageDown)
290 if (memBase > (0x200000 - 480))
291 memBase = 0x200000 - 480;
295 else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)
304 else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal)
308 if (memBase > (0x200000 - 480))
309 memBase = 0x200000 - 480;