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