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(); }