From 865fc88e7c2cae684888dea99f907389fa4c3a82 Mon Sep 17 00:00:00 2001 From: stephena Date: Wed, 14 May 2008 18:04:58 +0000 Subject: [PATCH] Added timer registers to the debugger RIOT tab, and enabled the changes to be sent to the debugger core. SWCHA and SWACNT can be changed, SWCHB cannot. The latter will be addressed by a series of labelled checkboxes that more clearly illustrate the function. Also, INTIM/TIMINT/TimClks cannot be changed, as it doesn't make sense to do so (their results depend on other registers; more specifically, they're calculated, not stored). You can however change the TIMxxT, which will consequently change the read-only timer registers. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1506 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- stella/src/debugger/Debugger.hxx | 8 +- stella/src/debugger/gui/RiotWidget.cxx | 101 ++++++++++++++++++++++- stella/src/debugger/gui/RiotWidget.hxx | 11 ++- stella/src/debugger/gui/ToggleWidget.cxx | 10 ++- stella/src/debugger/gui/ToggleWidget.hxx | 6 +- 5 files changed, 118 insertions(+), 18 deletions(-) diff --git a/stella/src/debugger/Debugger.hxx b/stella/src/debugger/Debugger.hxx index 40e6cc2db..523d7b679 100644 --- a/stella/src/debugger/Debugger.hxx +++ b/stella/src/debugger/Debugger.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Debugger.hxx,v 1.93 2008-04-19 21:11:52 stephena Exp $ +// $Id: Debugger.hxx,v 1.94 2008-05-14 18:04:57 stephena Exp $ //============================================================================ #ifndef DEBUGGER_HXX @@ -70,7 +70,7 @@ typedef uInt16 (Debugger::*DEBUGGER_WORD_METHOD)(); for all debugging operations in Stella (parser, 6502 debugger, etc). @author Stephen Anthony - @version $Id: Debugger.hxx,v 1.93 2008-04-19 21:11:52 stephena Exp $ + @version $Id: Debugger.hxx,v 1.94 2008-05-14 18:04:57 stephena Exp $ */ class Debugger : public DialogContainer { @@ -267,12 +267,8 @@ class Debugger : public DialogContainer { uInt8 result = 0x0; for(int i = 0; i < 8; ++i) - { if(bits[i]) result |= (1<<(7-i)); - else - return result &= ~(1<<(7-i)); - } return result; } diff --git a/stella/src/debugger/gui/RiotWidget.cxx b/stella/src/debugger/gui/RiotWidget.cxx index f5f6af909..a403aca64 100644 --- a/stella/src/debugger/gui/RiotWidget.cxx +++ b/stella/src/debugger/gui/RiotWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: RiotWidget.cxx,v 1.2 2008-05-13 15:13:17 stephena Exp $ +// $Id: RiotWidget.cxx,v 1.3 2008-05-14 18:04:57 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -74,10 +74,41 @@ RiotWidget::RiotWidget(GuiObject* boss, const GUI::Font& font, // SWCHA bits in 'peek' mode xpos = 10; ypos += lineHeight + 5; CREATE_IO_REGS("SWCHA(R):", mySWCHAReadBits, 0); + mySWCHAReadBits->setEditable(false); // SWCHB bits in 'peek' mode xpos = 10; ypos += 2 * lineHeight; CREATE_IO_REGS("SWCHB:", mySWCHBBits, 0); + mySWCHBBits->setEditable(false); + + // Timer registers (R/W) + const char* writeNames[] = { "TIM1T:", "TIM8T:", "TIM64T:", "TIM1024T:" }; + xpos = 10; ypos += 2*lineHeight; + for(int row = 0; row < 4; ++row) + { + t = new StaticTextWidget(boss, font, xpos, ypos + row*lineHeight + 2, + 9*fontWidth, fontHeight, writeNames[row], kTextAlignLeft); + } + xpos += 9*fontWidth + 5; + myTimWrite = new DataGridWidget(boss, font, xpos, ypos, 1, 4, 2, 8, kBASE_16); + myTimWrite->setTarget(this); + myTimWrite->setID(kTimWriteID); + addFocusWidget(myTimWrite); + + // Timer registers (RO) + const char* readNames[] = { "INTIM:", "TIMINT:", "Tim Clks:" }; + xpos = 10; ypos += myTimWrite->getHeight() + lineHeight; + for(int row = 0; row < 3; ++row) + { + t = new StaticTextWidget(boss, font, xpos, ypos + row*lineHeight + 2, + 9*fontWidth, fontHeight, readNames[row], kTextAlignLeft); + } + xpos += 9*fontWidth + 5; + myTimRead = new DataGridWidget(boss, font, xpos, ypos, 1, 3, 8, 32, kBASE_16); + myTimRead->setTarget(this); + myTimRead->setEditable(false); + addFocusWidget(myTimRead); + } @@ -118,9 +149,77 @@ void RiotWidget::loadConfig() // Update the SWCHB register booleans IO_REGS_UPDATE(mySWCHBBits, swchbBits); + // Update timer write registers + alist.clear(); vlist.clear(); changed.clear(); + alist.push_back(kTim1TID); vlist.push_back(state.TIM1T); + changed.push_back(state.TIM1T != oldstate.TIM1T); + alist.push_back(kTim8TID); vlist.push_back(state.TIM8T); + changed.push_back(state.TIM8T != oldstate.TIM8T); + alist.push_back(kTim64TID); vlist.push_back(state.TIM64T); + changed.push_back(state.TIM64T != oldstate.TIM64T); + alist.push_back(kTim1024TID); vlist.push_back(state.TIM1024T); + changed.push_back(state.TIM1024T != oldstate.TIM1024T); + myTimWrite->setList(alist, vlist, changed); + + // Update timer read registers + alist.clear(); vlist.clear(); changed.clear(); + alist.push_back(0); vlist.push_back(state.INTIM); + changed.push_back(state.INTIM != oldstate.INTIM); + alist.push_back(0); vlist.push_back(state.TIMINT); + changed.push_back(state.TIMINT != oldstate.TIMINT); + alist.push_back(0); vlist.push_back(state.TIMCLKS); + changed.push_back(state.TIMCLKS != oldstate.TIMCLKS); + myTimRead->setList(alist, vlist, changed); + + } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void RiotWidget::handleCommand(CommandSender* sender, int cmd, int data, int id) { + int addr = -1, value = -1; + RiotDebug& riot = instance()->debugger().riotDebug(); + + switch(cmd) + { + case kDGItemDataChangedCmd: + switch(id) + { + case kTimWriteID: + { + addr = myTimWrite->getSelectedAddr(); + value = myTimWrite->getSelectedValue(); + switch(addr) + { + case kTim1TID: + riot.tim1T(value); + break; + case kTim8TID: + riot.tim8T(value); + break; + case kTim64TID: + riot.tim64T(value); + break; + case kTim1024TID: + riot.tim1024T(value); + break; + } + } + } + break; + + case kTWItemDataChangedCmd: + switch(id) + { + case kSWCHABitsID: + value = Debugger::get_bits((BoolArray&)mySWCHAWriteBits->getState()); + riot.swcha(value & 0xff); + break; + case kSWACNTBitsID: + value = Debugger::get_bits((BoolArray&)mySWACNTBits->getState()); + riot.swacnt(value & 0xff); + break; + } + break; + } } diff --git a/stella/src/debugger/gui/RiotWidget.hxx b/stella/src/debugger/gui/RiotWidget.hxx index c22faedb5..37e88d4a7 100644 --- a/stella/src/debugger/gui/RiotWidget.hxx +++ b/stella/src/debugger/gui/RiotWidget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: RiotWidget.hxx,v 1.2 2008-05-13 15:13:17 stephena Exp $ +// $Id: RiotWidget.hxx,v 1.3 2008-05-14 18:04:58 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -49,8 +49,8 @@ class RiotWidget : public Widget, public CommandSender ToggleBitWidget* mySWACNTBits; ToggleBitWidget* mySWCHBBits; - DataGridWidget* myTim[4]; - DataGridWidget* myTimResults[4]; + DataGridWidget* myTimWrite; + DataGridWidget* myTimRead; CheckboxWidget* myP0Dir, *myP1Dir; CheckboxWidget* myP0Diff, *myP1Diff; @@ -65,9 +65,8 @@ class RiotWidget : public Widget, public CommandSender // ID's for the various widgets // We need ID's, since there are more than one of several types of widgets enum { - kSWCHABitsID, kSWCHBBitsID, kSWACNTBitsID, kSWBCNTBitsID, - kTim1TID, kTim8TID, kTim64TID, kTim1024TID, - kIntimID, kTimintID, kTimclksID + kTim1TID = 0, kTim8TID = 1, kTim64TID = 2, kTim1024TID = 3, + kSWCHABitsID, kSWACNTBitsID, kSWCHBBitsID, kTimWriteID }; }; diff --git a/stella/src/debugger/gui/ToggleWidget.cxx b/stella/src/debugger/gui/ToggleWidget.cxx index 9ab3641c5..a66a0dc35 100644 --- a/stella/src/debugger/gui/ToggleWidget.cxx +++ b/stella/src/debugger/gui/ToggleWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: ToggleWidget.cxx,v 1.7 2008-02-06 13:45:20 stephena Exp $ +// $Id: ToggleWidget.cxx,v 1.8 2008-05-14 18:04:58 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -32,7 +32,8 @@ ToggleWidget::ToggleWidget(GuiObject* boss, const GUI::Font& font, _cols(cols), _currentRow(0), _currentCol(0), - _selectedItem(0) + _selectedItem(0), + _editable(true) { _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | WIDGET_WANTS_RAWDATA; @@ -68,6 +69,9 @@ void ToggleWidget::handleMouseDown(int x, int y, int button, int clickCount) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void ToggleWidget::handleMouseUp(int x, int y, int button, int clickCount) { + if (!isEnabled() || !_editable) + return; + // If this was a double click and the mouse is still over the selected item, // send the double click command if (clickCount == 2 && (_selectedItem == findItem(x, y))) @@ -185,7 +189,7 @@ bool ToggleWidget::handleKeyDown(int ascii, int keycode, int modifiers) { _selectedItem = _currentRow*_cols + _currentCol; - if(toggle) + if(toggle && _editable) { _stateList[_selectedItem] = !_stateList[_selectedItem]; _changedList[_selectedItem] = !_changedList[_selectedItem]; diff --git a/stella/src/debugger/gui/ToggleWidget.hxx b/stella/src/debugger/gui/ToggleWidget.hxx index 8cc591261..803766a21 100644 --- a/stella/src/debugger/gui/ToggleWidget.hxx +++ b/stella/src/debugger/gui/ToggleWidget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: ToggleWidget.hxx,v 1.5 2008-02-06 13:45:20 stephena Exp $ +// $Id: ToggleWidget.hxx,v 1.6 2008-05-14 18:04:58 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -51,7 +51,8 @@ class ToggleWidget : public Widget, public CommandSender virtual bool wantsFocus() { return true; } - int colWidth() { return _colWidth; } + int colWidth() const { return _colWidth; } + void setEditable(bool editable) { _editable = editable; } protected: void drawWidget(bool hilite) = 0; @@ -65,6 +66,7 @@ class ToggleWidget : public Widget, public CommandSender int _rowHeight; int _colWidth; int _selectedItem; + bool _editable; BoolArray _stateList; BoolArray _changedList;