1 /* Copyright 2012-2013 Theo Berkau <cwx@cyberwarriorx.com>
2
3 This file is part of Yabause.
4
5 Yabause is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 Yabause is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with Yabause; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 #include "UIDebugCPU.h"
21 #include "UIHexInput.h"
22 #include "UIMemoryEditor.h"
23 #include "UIMemoryTransfer.h"
24 #include "../CommonDialogs.h"
25
UIDebugCPU(PROCTYPE proc,YabauseThread * mYabauseThread,QWidget * p)26 UIDebugCPU::UIDebugCPU( PROCTYPE proc, YabauseThread *mYabauseThread, QWidget* p )
27 : QDialog( p )
28 {
29 // set up dialog
30 setupUi( this );
31 if ( p && !p->isFullScreen() )
32 setWindowFlags( Qt::Sheet );
33
34 // Disable unimplemented functions
35 gbBackTrace->setVisible( false );
36 pbStepOver->setVisible( false );
37 pbStepOut->setVisible( false );
38 pbReserved1->setVisible( false );
39 pbReserved2->setVisible( false );
40 pbReserved3->setVisible( false );
41 pbReserved4->setVisible( false );
42 pbReserved5->setVisible( false );
43
44 pbAddCodeBreakpoint->setEnabled( false );
45 pbDelCodeBreakpoint->setEnabled( false );
46 pbAddMemoryBreakpoint->setEnabled( false );
47 pbDelMemoryBreakpoint->setEnabled( false );
48
49 // Clear code/memory breakpoint text fields
50 leCodeBreakpoint->setValidator(new HexValidator(0x00000000, 0xFFFFFFFF, leCodeBreakpoint));
51 leMemoryBreakpoint->setValidator(new HexValidator(0x00000000, 0xFFFFFFFF, leMemoryBreakpoint));
52 leCodeBreakpoint->setText("");
53 leMemoryBreakpoint->setText("");
54
55 connect( lwDisassembledCode, SIGNAL( toggleCodeBreakpoint(u32) ), this, SLOT( toggleCodeBreakpoint(u32) ) );
56
57 this->context = proc;
58 this->mYabauseThread = mYabauseThread;
59
60 // retranslate widgets
61 QtYabause::retranslateWidget( this );
62 }
63
on_lwRegisters_itemDoubleClicked(QListWidgetItem * item)64 void UIDebugCPU::on_lwRegisters_itemDoubleClicked ( QListWidgetItem * item )
65 {
66 int size;
67
68 u32 value = getRegister(lwRegisters->row(item), &size);
69
70 UIHexInput hex(value, size, this);
71 if (hex.exec() == QDialog::Accepted)
72 {
73 value = hex.getValue();
74 setRegister(lwRegisters->row(item), value);
75 }
76
77 updateRegList();
78 }
79
on_lwBackTrace_itemDoubleClicked(QListWidgetItem * item)80 void UIDebugCPU::on_lwBackTrace_itemDoubleClicked ( QListWidgetItem * item )
81 {
82 updateCodeList(item->text().toUInt(NULL, 16));
83 }
84
on_twTrackInfLoop_itemDoubleClicked(QTableWidgetItem * item)85 void UIDebugCPU::on_twTrackInfLoop_itemDoubleClicked ( QTableWidgetItem * item )
86 {
87 if (item->column() == 0)
88 updateCodeList(item->text().toUInt(NULL, 16));
89 }
90
on_leCodeBreakpoint_textChanged(const QString & text)91 void UIDebugCPU::on_leCodeBreakpoint_textChanged( const QString & text )
92 {
93 pbAddCodeBreakpoint->setEnabled(text.length() > 0);
94 }
95
isReadWriteButtonAndTextOK()96 bool UIDebugCPU::isReadWriteButtonAndTextOK()
97 {
98 if (leMemoryBreakpoint->text().length() > 0)
99 {
100 if (cbRead->isChecked() &&
101 (cbReadByte->isChecked() || cbReadWord->isChecked() || cbReadLong->isChecked()))
102 return true;
103 else if (cbWrite->isChecked() &&
104 (cbWriteByte->isChecked() || cbWriteWord->isChecked() || cbWriteLong->isChecked()))
105 return true;
106 }
107 return false;
108 }
109
on_leMemoryBreakpoint_textChanged(const QString & text)110 void UIDebugCPU::on_leMemoryBreakpoint_textChanged( const QString & text )
111 {
112 // Only enable Memory breakpoint add button if address is valid and read/write and size is checked
113 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
114 }
115
on_lwCodeBreakpoints_itemSelectionChanged()116 void UIDebugCPU::on_lwCodeBreakpoints_itemSelectionChanged ()
117 {
118 pbDelCodeBreakpoint->setEnabled(true);
119 }
120
on_pbAddCodeBreakpoint_clicked()121 void UIDebugCPU::on_pbAddCodeBreakpoint_clicked()
122 {
123 // Only add breakpoint to list if all goes well with emulator
124 if (addCodeBreakpoint(leCodeBreakpoint->text().toInt(0, 16)))
125 lwCodeBreakpoints->addItem(leCodeBreakpoint->text());
126 }
127
on_pbDelCodeBreakpoint_clicked()128 void UIDebugCPU::on_pbDelCodeBreakpoint_clicked()
129 {
130 QList<QListWidgetItem *> list=lwCodeBreakpoints->selectedItems ();
131 for (int i = 0; i < list.count(); i++)
132 {
133 QListWidgetItem *item=list.value(i);
134 u32 addr = item->text().toUInt(0, 16);
135 delCodeBreakpoint(addr);
136 }
137 qDeleteAll(lwCodeBreakpoints->selectedItems ());
138 pbDelCodeBreakpoint->setEnabled(lwCodeBreakpoints->count() > 0);
139 }
140
on_lwMemoryBreakpoints_itemSelectionChanged()141 void UIDebugCPU::on_lwMemoryBreakpoints_itemSelectionChanged ()
142 {
143 pbDelMemoryBreakpoint->setEnabled(true);
144 }
145
on_pbAddMemoryBreakpoint_clicked()146 void UIDebugCPU::on_pbAddMemoryBreakpoint_clicked()
147 {
148 u32 flags=0;
149
150 // Get RW flags
151 if (cbRead->checkState() == Qt::Checked)
152 {
153 if (cbReadByte->checkState() == Qt::Checked)
154 flags |= BREAK_BYTEREAD;
155 if (cbReadWord->checkState() == Qt::Checked)
156 flags |= BREAK_WORDREAD;
157 if (cbReadLong->checkState() == Qt::Checked)
158 flags |= BREAK_LONGREAD;
159 }
160
161 if (cbWrite->checkState() == Qt::Checked)
162 {
163 if (cbWriteByte->checkState() == Qt::Checked)
164 flags |= BREAK_BYTEWRITE;
165 if (cbWriteWord->checkState() == Qt::Checked)
166 flags |= BREAK_WORDWRITE;
167 if (cbWriteLong->checkState() == Qt::Checked)
168 flags |= BREAK_LONGWRITE;
169 }
170
171 // Only add breakpoint to list if all goes well with emulator
172 if (addMemoryBreakpoint(leMemoryBreakpoint->text().toInt(0, 16), flags))
173 lwMemoryBreakpoints->addItem(leMemoryBreakpoint->text());
174 }
175
on_pbDelMemoryBreakpoint_clicked()176 void UIDebugCPU::on_pbDelMemoryBreakpoint_clicked()
177 {
178 QList<QListWidgetItem *> list=lwMemoryBreakpoints->selectedItems ();
179 for (int i = 0; i < list.count(); i++)
180 {
181 QListWidgetItem *item=list.value(i);
182 u32 addr = item->text().toUInt(0, 16);
183 delMemoryBreakpoint(addr);
184 }
185 qDeleteAll(lwMemoryBreakpoints->selectedItems ());
186 pbDelMemoryBreakpoint->setEnabled(lwMemoryBreakpoints->count() > 0);
187 }
188
on_cbRead_toggled(bool enable)189 void UIDebugCPU::on_cbRead_toggled(bool enable)
190 {
191 // Enable Byte/Word/Long if Read is checked
192 cbReadByte->setEnabled(enable);
193 cbReadWord->setEnabled(enable);
194 cbReadLong->setEnabled(enable);
195
196 // Enable Add button if address is valid and read/write and size is checked
197 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
198 }
199
on_cbWrite_toggled(bool enable)200 void UIDebugCPU::on_cbWrite_toggled(bool enable)
201 {
202 // Enable Byte/Word/Long if Write is checked
203 cbWriteByte->setEnabled(enable);
204 cbWriteWord->setEnabled(enable);
205 cbWriteLong->setEnabled(enable);
206
207 // Enable Add button if address is valid and read/write and size is checked
208 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
209 }
210
on_cbReadByte_toggled(bool enable)211 void UIDebugCPU::on_cbReadByte_toggled(bool enable)
212 {
213 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
214 }
215
on_cbReadWord_toggled(bool enable)216 void UIDebugCPU::on_cbReadWord_toggled(bool enable)
217 {
218 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
219 }
220
on_cbReadLong_toggled(bool enable)221 void UIDebugCPU::on_cbReadLong_toggled(bool enable)
222 {
223 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
224 }
225
on_cbWriteByte_toggled(bool enable)226 void UIDebugCPU::on_cbWriteByte_toggled(bool enable)
227 {
228 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
229 }
230
on_cbWriteWord_toggled(bool enable)231 void UIDebugCPU::on_cbWriteWord_toggled(bool enable)
232 {
233 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
234 }
235
on_cbWriteLong_toggled(bool enable)236 void UIDebugCPU::on_cbWriteLong_toggled(bool enable)
237 {
238 pbAddMemoryBreakpoint->setEnabled(isReadWriteButtonAndTextOK());
239 }
240
on_pbStepInto_clicked()241 void UIDebugCPU::on_pbStepInto_clicked()
242 {
243 stepInto();
244 }
245
on_pbStepOver_clicked()246 void UIDebugCPU::on_pbStepOver_clicked()
247 {
248 stepOver();
249 }
250
on_pbStepOut_clicked()251 void UIDebugCPU::on_pbStepOut_clicked()
252 {
253 stepOut();
254 }
255
on_pbMemoryTransfer_clicked()256 void UIDebugCPU::on_pbMemoryTransfer_clicked()
257 {
258 UIMemoryTransfer( NULL, this ).exec();
259 }
260
on_pbMemoryEditor_clicked()261 void UIDebugCPU::on_pbMemoryEditor_clicked()
262 {
263 UIMemoryEditor( context, mYabauseThread, this ).exec();
264 }
265
on_pbReserved1_clicked()266 void UIDebugCPU::on_pbReserved1_clicked()
267 {
268 reserved1();
269 }
270
on_pbReserved2_clicked()271 void UIDebugCPU::on_pbReserved2_clicked()
272 {
273 reserved2();
274 }
275
on_pbReserved3_clicked()276 void UIDebugCPU::on_pbReserved3_clicked()
277 {
278 reserved3();
279 }
280
on_pbReserved4_clicked()281 void UIDebugCPU::on_pbReserved4_clicked()
282 {
283 reserved4();
284 }
285
on_pbReserved5_clicked()286 void UIDebugCPU::on_pbReserved5_clicked()
287 {
288 reserved5();
289 }
290
updateRegList()291 void UIDebugCPU::updateRegList()
292 {
293 }
294
updateCodeList(u32 addr)295 void UIDebugCPU::updateCodeList(u32 addr)
296 {
297 }
298
getRegister(int index,int * size)299 u32 UIDebugCPU::getRegister(int index, int *size)
300 {
301 *size = 4;
302 return 0;
303 }
304
setRegister(int index,u32 value)305 void UIDebugCPU::setRegister(int index, u32 value)
306 {
307 }
308
addCodeBreakpoint(u32 addr)309 bool UIDebugCPU::addCodeBreakpoint(u32 addr)
310 {
311 return true;
312 }
313
toggleCodeBreakpoint(u32 addr)314 void UIDebugCPU::toggleCodeBreakpoint(u32 addr)
315 {
316 QString text;
317 text.sprintf("%08X", addr);
318 QList<QListWidgetItem *> list = lwCodeBreakpoints->findItems(text, Qt::MatchFixedString);
319
320 if (list.count() >= 1)
321 {
322 // Remove breakpoint
323 QListWidgetItem *item=list.value(0);
324 delete item;
325 delCodeBreakpoint(addr);
326 }
327 else
328 {
329 // Add breakpoint
330 if (addCodeBreakpoint(addr))
331 lwCodeBreakpoints->addItem(text);
332 }
333 }
334
delCodeBreakpoint(u32 addr)335 bool UIDebugCPU::delCodeBreakpoint(u32 addr)
336 {
337 return true;
338 }
339
addMemoryBreakpoint(u32 addr,u32 flags)340 bool UIDebugCPU::addMemoryBreakpoint(u32 addr, u32 flags)
341 {
342 return true;
343 }
344
delMemoryBreakpoint(u32 addr)345 bool UIDebugCPU::delMemoryBreakpoint(u32 addr)
346 {
347 return true;
348 }
349
stepInto()350 void UIDebugCPU::stepInto()
351 {
352 }
353
stepOver()354 void UIDebugCPU::stepOver()
355 {
356 }
357
stepOut()358 void UIDebugCPU::stepOut()
359 {
360 }
361
reserved1()362 void UIDebugCPU::reserved1()
363 {
364 }
365
reserved2()366 void UIDebugCPU::reserved2()
367 {
368 }
369
reserved3()370 void UIDebugCPU::reserved3()
371 {
372 }
373
reserved4()374 void UIDebugCPU::reserved4()
375 {
376 }
377
reserved5()378 void UIDebugCPU::reserved5()
379 {
380 }
381