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