From 7fd1a9089b4f15679b91c2bf7901eb536fe1a6c3 Mon Sep 17 00:00:00 2001 From: stephena Date: Tue, 20 Sep 2005 19:09:10 +0000 Subject: [PATCH] Added mini message box to debugger, which will be used to inform the user of debugger-related state information. Reworked breakpoint/trap support to display a message in debugger messagebox indicating what condition caused the debugger to start. This is much better than before, when no feedback was given as to why the debugger started. Some usability fixes to ListWidget/RomWidget. There are still a few more tweaks to do before the final release. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@788 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- stella/src/debugger/Debugger.cxx | 19 +++++++-- stella/src/debugger/Debugger.hxx | 11 ++++-- stella/src/debugger/gui/DebuggerDialog.cxx | 12 +++++- stella/src/debugger/gui/DebuggerDialog.hxx | 15 +++++--- stella/src/emucore/m6502/src/M6502.cxx | 35 +++++++++-------- stella/src/emucore/m6502/src/M6502.hxx | 19 +++++---- stella/src/emucore/m6502/src/M6502Hi.cxx | 45 +++++++++++++--------- stella/src/gui/ListWidget.cxx | 11 ++++-- 8 files changed, 108 insertions(+), 59 deletions(-) diff --git a/stella/src/debugger/Debugger.cxx b/stella/src/debugger/Debugger.cxx index 12ba273fe..f12eef95f 100644 --- a/stella/src/debugger/Debugger.cxx +++ b/stella/src/debugger/Debugger.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: Debugger.cxx,v 1.92 2005-09-15 19:43:36 stephena Exp $ +// $Id: Debugger.cxx,v 1.93 2005-09-20 19:09:10 stephena Exp $ //============================================================================ #include "bspf.hxx" @@ -41,6 +41,7 @@ #include "TiaInfoWidget.hxx" #include "TiaOutputWidget.hxx" #include "TiaZoomWidget.hxx" +#include "EditTextWidget.hxx" #include "RomWidget.hxx" #include "Expression.hxx" @@ -146,6 +147,7 @@ void Debugger::initialize() myTiaOutput = dd->tiaOutput(); myTiaZoom = dd->tiaZoom(); myRom = dd->rom(); + myMessage = dd->message(); // set up any breakpoint that was on the command line // (and remove the key from the settings, so they won't get set again) @@ -195,9 +197,20 @@ void Debugger::setConsole(Console* console) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool Debugger::start() +bool Debugger::start(const string& message, int address) { - return myOSystem->eventHandler().enterDebugMode(); + bool result = myOSystem->eventHandler().enterDebugMode(); + + // This must be done *after* we enter debug mode, + // so the message isn't erased + ostringstream buf; + buf << message; + if(address > -1) + buf << valueToString(address); + + myMessage->setEditString(buf.str()); + + return result; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/debugger/Debugger.hxx b/stella/src/debugger/Debugger.hxx index 57ca534b5..86e3f7e7d 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.75 2005-09-15 19:43:36 stephena Exp $ +// $Id: Debugger.hxx,v 1.76 2005-09-20 19:09:10 stephena Exp $ //============================================================================ #ifndef DEBUGGER_HXX @@ -28,6 +28,7 @@ class TIADebug; class TiaInfoWidget; class TiaOutputWidget; class TiaZoomWidget; +class EditTextWidget; class RomWidget; class Expression; @@ -78,7 +79,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.75 2005-09-15 19:43:36 stephena Exp $ + @version $Id: Debugger.hxx,v 1.76 2005-09-20 19:09:10 stephena Exp $ */ class Debugger : public DialogContainer { @@ -116,8 +117,11 @@ class Debugger : public DialogContainer /** Wrapper method for EventHandler::enterDebugMode() for those classes that don't have access to EventHandler. + + @param message Message to display when entering debugger + @param data An address associated with the message */ - bool start(); + bool start(const string& message = "", int address = -1); /** Wrapper method for EventHandler::leaveDebugMode() for those classes @@ -358,6 +362,7 @@ class Debugger : public DialogContainer TiaOutputWidget* myTiaOutput; TiaZoomWidget* myTiaZoom; RomWidget* myRom; + EditTextWidget* myMessage; EquateList *equateList; PackedBitArray *breakPoints; diff --git a/stella/src/debugger/gui/DebuggerDialog.cxx b/stella/src/debugger/gui/DebuggerDialog.cxx index 6f5e5a7d3..6db16ad08 100644 --- a/stella/src/debugger/gui/DebuggerDialog.cxx +++ b/stella/src/debugger/gui/DebuggerDialog.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: DebuggerDialog.cxx,v 1.5 2005-09-15 19:43:36 stephena Exp $ +// $Id: DebuggerDialog.cxx,v 1.6 2005-09-20 19:09:10 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -31,6 +31,7 @@ #include "RomWidget.hxx" #include "TiaWidget.hxx" #include "DataGridOpsWidget.hxx" +#include "EditTextWidget.hxx" #include "Rect.hxx" #include "Debugger.hxx" #include "DebuggerParser.hxx" @@ -75,6 +76,8 @@ void DebuggerDialog::loadConfig() myCpu->loadConfig(); myRam->loadConfig(); myRom->loadConfig(); + + myMessageBox->setEditString(""); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -173,6 +176,7 @@ void DebuggerDialog::addTabArea() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void DebuggerDialog::addStatusArea() { + const GUI::Font& font = instance()->consoleFont(); GUI::Rect r = instance()->debugger().getStatusBounds(); int xpos, ypos; @@ -182,6 +186,12 @@ void DebuggerDialog::addStatusArea() ypos += myTiaInfo->getHeight() + 10; myTiaZoom = new TiaZoomWidget(this, xpos+10, ypos); addToFocusList(myTiaZoom->getFocusList()); + + xpos += 10; ypos += myTiaZoom->getHeight() + 20; + myMessageBox = new EditTextWidget(this, xpos, ypos, myTiaZoom->getWidth(), + font.getLineHeight(), ""); + myMessageBox->setFont(font); + myMessageBox->setEditable(false); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/debugger/gui/DebuggerDialog.hxx b/stella/src/debugger/gui/DebuggerDialog.hxx index 70e061562..06a97ac1e 100644 --- a/stella/src/debugger/gui/DebuggerDialog.hxx +++ b/stella/src/debugger/gui/DebuggerDialog.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: DebuggerDialog.hxx,v 1.3 2005-09-15 19:43:36 stephena Exp $ +// $Id: DebuggerDialog.hxx,v 1.4 2005-09-20 19:09:10 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -29,6 +29,7 @@ class CpuWidget; class RamWidget; class RomWidget; class TabWidget; +class EditTextWidget; class TiaInfoWidget; class TiaOutputWidget; class TiaZoomWidget; @@ -43,11 +44,12 @@ class DebuggerDialog : public Dialog int x, int y, int w, int h); ~DebuggerDialog(); - PromptWidget* prompt() { return myPrompt; } - TiaInfoWidget* tiaInfo() { return myTiaInfo; } - TiaOutputWidget* tiaOutput() { return myTiaOutput; } - TiaZoomWidget* tiaZoom() { return myTiaZoom; } - RomWidget* rom() { return myRom; } + PromptWidget* prompt() { return myPrompt; } + TiaInfoWidget* tiaInfo() { return myTiaInfo; } + TiaOutputWidget* tiaOutput() { return myTiaOutput; } + TiaZoomWidget* tiaZoom() { return myTiaZoom; } + RomWidget* rom() { return myRom; } + EditTextWidget* message() { return myMessageBox; } virtual void loadConfig(); virtual void handleKeyDown(int ascii, int keycode, int modifiers); @@ -63,6 +65,7 @@ class DebuggerDialog : public Dialog CpuWidget* myCpu; RamWidget* myRam; RomWidget* myRom; + EditTextWidget* myMessageBox; private: void addTiaArea(); diff --git a/stella/src/emucore/m6502/src/M6502.cxx b/stella/src/emucore/m6502/src/M6502.cxx index 34fb3e4ef..903abadc7 100644 --- a/stella/src/emucore/m6502/src/M6502.cxx +++ b/stella/src/emucore/m6502/src/M6502.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: M6502.cxx,v 1.14 2005-08-24 22:54:30 stephena Exp $ +// $Id: M6502.cxx,v 1.15 2005-09-20 19:09:10 stephena Exp $ //============================================================================ #include "M6502.hxx" @@ -29,10 +29,10 @@ M6502::M6502(uInt32 systemCyclesPerProcessorCycle) mySystemCyclesPerProcessorCycle(systemCyclesPerProcessorCycle) { #ifdef DEVELOPER_SUPPORT - myDebugger = NULL; - breakPoints = NULL; - readTraps = NULL; - writeTraps = NULL; + myDebugger = NULL; + myBreakPoints = NULL; + myReadTraps = NULL; + myWriteTraps = NULL; #endif // Compute the BCD lookup table @@ -368,7 +368,8 @@ unsigned int M6502::addCondBreak(Expression *e, string name) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void M6502::delCondBreak(unsigned int brk) { - if(brk < myBreakConds.size()) { + if(brk < myBreakConds.size()) + { delete myBreakConds[brk]; myBreakConds.remove_at(brk); myBreakCondNames.remove_at(brk); @@ -393,26 +394,26 @@ const StringList& M6502::getCondBreakNames() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int M6502::evalCondBreaks() { - for(unsigned int i=0; ievaluate()) { - string name = myBreakCondNames[i]; // TODO: use this - cerr << "breakpoint due to condition: " << name << endl; + for(unsigned int i=0; ievaluate()) return i; - } } return -1; // no break hit } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void M6502::setBreakPoints(PackedBitArray *bp) { - breakPoints = bp; +void M6502::setBreakPoints(PackedBitArray *bp) +{ + myBreakPoints = bp; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void M6502::setTraps(PackedBitArray *read, PackedBitArray *write) { - readTraps = read; - writeTraps = write; +void M6502::setTraps(PackedBitArray *read, PackedBitArray *write) +{ + myReadTraps = read; + myWriteTraps = write; } #endif diff --git a/stella/src/emucore/m6502/src/M6502.hxx b/stella/src/emucore/m6502/src/M6502.hxx index 4fcfbe6f8..99f6f12a2 100644 --- a/stella/src/emucore/m6502/src/M6502.hxx +++ b/stella/src/emucore/m6502/src/M6502.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: M6502.hxx,v 1.13 2005-08-24 22:54:30 stephena Exp $ +// $Id: M6502.hxx,v 1.14 2005-09-20 19:09:10 stephena Exp $ //============================================================================ #ifndef M6502_HXX @@ -41,7 +41,7 @@ typedef GUI::Array ExpressionList; has a 64K addressing space. @author Bradford W. Mott - @version $Id: M6502.hxx,v 1.13 2005-08-24 22:54:30 stephena Exp $ + @version $Id: M6502.hxx,v 1.14 2005-09-20 19:09:10 stephena Exp $ */ class M6502 { @@ -229,12 +229,17 @@ class M6502 /// Pointer to the debugger for this processor or the null pointer Debugger* myDebugger; - PackedBitArray *breakPoints; - PackedBitArray *readTraps; - PackedBitArray *writeTraps; + PackedBitArray* myBreakPoints; + PackedBitArray* myReadTraps; + PackedBitArray* myWriteTraps; - // did we just now hit a trap? - bool justHitTrap; + // Did we just now hit a trap? + bool myJustHitTrapFlag; + struct HitTrapInfo { + string message; + int address; + }; + HitTrapInfo myHitTrapInfo; StringList myBreakCondNames; ExpressionList myBreakConds; diff --git a/stella/src/emucore/m6502/src/M6502Hi.cxx b/stella/src/emucore/m6502/src/M6502Hi.cxx index 9a1dbeca4..b1843be1f 100644 --- a/stella/src/emucore/m6502/src/M6502Hi.cxx +++ b/stella/src/emucore/m6502/src/M6502Hi.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: M6502Hi.cxx,v 1.12 2005-08-24 22:54:30 stephena Exp $ +// $Id: M6502Hi.cxx,v 1.13 2005-09-20 19:09:10 stephena Exp $ //============================================================================ #include "M6502Hi.hxx" @@ -34,7 +34,7 @@ M6502High::M6502High(uInt32 systemCyclesPerProcessorCycle) myLastAddress = 0; #ifdef DEVELOPER_SUPPORT - justHitTrap = false; + myJustHitTrapFlag = false; #endif } @@ -54,9 +54,12 @@ inline uInt8 M6502High::peek(uInt16 address) mySystem->incrementCycles(mySystemCyclesPerProcessorCycle); #ifdef DEVELOPER_SUPPORT - if(readTraps != NULL) - if(readTraps->isSet(address)) - justHitTrap = true; + if(myReadTraps != NULL && myReadTraps->isSet(address)) + { + myJustHitTrapFlag = true; + myHitTrapInfo.message = "Read trap: "; + myHitTrapInfo.address = address; + } #endif return mySystem->peek(address); @@ -73,9 +76,12 @@ inline void M6502High::poke(uInt16 address, uInt8 value) mySystem->incrementCycles(mySystemCyclesPerProcessorCycle); #ifdef DEVELOPER_SUPPORT - if(writeTraps != NULL) - if(writeTraps->isSet(address)) - justHitTrap = true; + if(myWriteTraps != NULL && myWriteTraps->isSet(address)) + { + myJustHitTrapFlag = true; + myHitTrapInfo.message = "Write trap: "; + myHitTrapInfo.address = address; + } #endif mySystem->poke(address, value); @@ -84,6 +90,8 @@ inline void M6502High::poke(uInt16 address, uInt8 value) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool M6502High::execute(uInt32 number) { + int cond = -1; + // Clear all of the execution status bits except for the fatal error bit myExecutionStatus &= FatalErrorBit; @@ -96,28 +104,29 @@ bool M6502High::execute(uInt32 number) uInt8 operand = 0; #ifdef DEVELOPER_SUPPORT - if(justHitTrap) + if(myJustHitTrapFlag) { - if(myDebugger->start()) { - justHitTrap = false; + if(myDebugger->start(myHitTrapInfo.message, myHitTrapInfo.address)) + { + myJustHitTrapFlag = false; return true; } } - if(breakPoints != NULL) + if(myBreakPoints != NULL) { - if(breakPoints->isSet(PC)) { - if(myDebugger->start()) { + if(myBreakPoints->isSet(PC)) + { + if(myDebugger->start("Breakpoint hit: ", PC)) return true; - } } } - if(evalCondBreaks() > -1) + if((cond = evalCondBreaks()) > -1) { - if(myDebugger->start()) { + string buf = "CBP: " + myBreakCondNames[cond]; + if(myDebugger->start(buf)) return true; - } } #endif diff --git a/stella/src/gui/ListWidget.cxx b/stella/src/gui/ListWidget.cxx index 458d5d96c..66dab0c0a 100644 --- a/stella/src/gui/ListWidget.cxx +++ b/stella/src/gui/ListWidget.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: ListWidget.cxx,v 1.31 2005-09-13 18:27:42 stephena Exp $ +// $Id: ListWidget.cxx,v 1.32 2005-09-20 19:09:10 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -91,9 +91,9 @@ void ListWidget::setHighlighted(int item) { assert(item >= -1 && item < (int)_list.size()); - if (isEnabled() && _highlightedItem != item) + if(isEnabled()) { - if (_editMode) + if(_editMode) abortEditMode(); _highlightedItem = item; @@ -133,7 +133,10 @@ void ListWidget::recalc() _currentPos = size - 1; if (_currentPos < 0) _currentPos = 0; - _selectedItem = -1; + + if(_selectedItem < 0 || _selectedItem >= size) + _selectedItem = 0; + _editMode = false; scrollBarRecalc(); }