mirror of https://github.com/stella-emu/stella.git
Added ability to patch ROM from the RomListWidget. Currently the
changes aren't immediately seen, but this will be fixed when the DebuggerParser/loadConfig() infrastructure is complete. Implemented 'Set PC' in RomListWidget, with the same restrictions as above. Removed 'Add bookmark' and 'Patch ROM', since the former can't be done with more infrastructure work, and the latter is done by double-clicking a line (no need for two ways of doing the same thing). git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@772 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
f79b0a0f82
commit
17352bb0e9
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: RomListWidget.cxx,v 1.3 2005-09-01 19:14:09 stephena Exp $
|
// $Id: RomListWidget.cxx,v 1.4 2005-09-07 18:34:52 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -33,10 +33,8 @@ RomListWidget::RomListWidget(GuiObject* boss, const GUI::Font& font,
|
||||||
myMenu = new ContextMenu(this, font);
|
myMenu = new ContextMenu(this, font);
|
||||||
|
|
||||||
StringList l;
|
StringList l;
|
||||||
l.push_back("Add bookmark");
|
// l.push_back("Add bookmark");
|
||||||
l.push_back("Patch ROM");
|
|
||||||
l.push_back("Save ROM");
|
l.push_back("Save ROM");
|
||||||
l.push_back("Set Breakpoint");
|
|
||||||
l.push_back("Set PC");
|
l.push_back("Set PC");
|
||||||
|
|
||||||
myMenu->setList(l);
|
myMenu->setList(l);
|
||||||
|
@ -74,21 +72,6 @@ void RomListWidget::handleMouseDown(int x, int y, int button, int clickCount)
|
||||||
ListWidget::handleMouseDown(x, y, button, clickCount);
|
ListWidget::handleMouseDown(x, y, button, clickCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void RomListWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
|
|
||||||
{
|
|
||||||
switch(cmd)
|
|
||||||
{
|
|
||||||
case kCMenuItemSelectedCmd:
|
|
||||||
cerr << "RMB selected: " << myMenu->getSelectedString() << endl;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ListWidget::handleCommand(sender, cmd, data, id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void RomListWidget::drawWidget(bool hilite)
|
void RomListWidget::drawWidget(bool hilite)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: RomListWidget.hxx,v 1.3 2005-09-01 19:14:09 stephena Exp $
|
// $Id: RomListWidget.hxx,v 1.4 2005-09-07 18:34:52 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -31,6 +31,8 @@ class ContextMenu;
|
||||||
/** RomListWidget */
|
/** RomListWidget */
|
||||||
class RomListWidget : public CheckListWidget
|
class RomListWidget : public CheckListWidget
|
||||||
{
|
{
|
||||||
|
friend class RomWidget;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RomListWidget(GuiObject* boss, const GUI::Font& font,
|
RomListWidget(GuiObject* boss, const GUI::Font& font,
|
||||||
int x, int y, int w, int h);
|
int x, int y, int w, int h);
|
||||||
|
@ -41,7 +43,6 @@ class RomListWidget : public CheckListWidget
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void handleMouseDown(int x, int y, int button, int clickCount);
|
void handleMouseDown(int x, int y, int button, int clickCount);
|
||||||
void handleCommand(CommandSender* sender, int cmd, int data, int id);
|
|
||||||
|
|
||||||
void drawWidget(bool hilite);
|
void drawWidget(bool hilite);
|
||||||
GUI::Rect getLineRect() const;
|
GUI::Rect getLineRect() const;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: RomWidget.cxx,v 1.2 2005-09-01 19:14:09 stephena Exp $
|
// $Id: RomWidget.cxx,v 1.3 2005-09-07 18:34:52 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -22,8 +22,10 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include "Debugger.hxx"
|
#include "Debugger.hxx"
|
||||||
|
#include "DebuggerParser.hxx"
|
||||||
#include "CpuDebug.hxx"
|
#include "CpuDebug.hxx"
|
||||||
#include "GuiObject.hxx"
|
#include "GuiObject.hxx"
|
||||||
|
#include "ContextMenu.hxx"
|
||||||
#include "RomListWidget.hxx"
|
#include "RomListWidget.hxx"
|
||||||
#include "RomWidget.hxx"
|
#include "RomWidget.hxx"
|
||||||
|
|
||||||
|
@ -40,6 +42,7 @@ RomWidget::RomWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
|
||||||
|
|
||||||
myRomList = new RomListWidget(boss, font, x, y, w, h);
|
myRomList = new RomListWidget(boss, font, x, y, w, h);
|
||||||
myRomList->setTarget(this);
|
myRomList->setTarget(this);
|
||||||
|
myRomList->myMenu->setTarget(this);
|
||||||
myRomList->setStyle(kSolidFill);
|
myRomList->setStyle(kSolidFill);
|
||||||
addFocusWidget(myRomList);
|
addFocusWidget(myRomList);
|
||||||
|
|
||||||
|
@ -65,15 +68,21 @@ void RomWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kListItemChecked:
|
case kListItemChecked:
|
||||||
|
setBreak(data);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kListItemDataChangedCmd:
|
||||||
|
patchROM(data, myRomList->getSelectedString());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kCMenuItemSelectedCmd:
|
||||||
{
|
{
|
||||||
// We don't care about state, as breakpoints are turned on
|
const string& rmb = myRomList->myMenu->getSelectedString();
|
||||||
// and off with the same command
|
|
||||||
// FIXME - at some point, we might want to add 'breakon'
|
if(rmb == "Save ROM")
|
||||||
// and 'breakoff' to DebuggerParser, so the states
|
saveROM();
|
||||||
// don't get out of sync
|
else if(rmb == "Set PC")
|
||||||
ostringstream cmd;
|
setPC(myRomList->getSelected());
|
||||||
cmd << "break #" << myAddrList[data];
|
|
||||||
instance()->debugger().run(cmd.str());
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -83,9 +92,10 @@ void RomWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void RomWidget::loadConfig()
|
void RomWidget::loadConfig()
|
||||||
{
|
{
|
||||||
//cerr << "RomWidget::loadConfig()\n";
|
|
||||||
// Only reload full bank when necessary
|
// Only reload full bank when necessary
|
||||||
if(myFirstLoad || myCurrentBank != instance()->debugger().getBank())
|
// if(myFirstLoad || myCurrentBank != instance()->debugger().getBank())
|
||||||
|
// FIXME - always do a full reload for now, will optimize later
|
||||||
|
if(true)
|
||||||
{
|
{
|
||||||
initialUpdate();
|
initialUpdate();
|
||||||
myFirstLoad = false;
|
myFirstLoad = false;
|
||||||
|
@ -139,3 +149,48 @@ void RomWidget::initialUpdate()
|
||||||
void RomWidget::incrementalUpdate()
|
void RomWidget::incrementalUpdate()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void RomWidget::setBreak(int data)
|
||||||
|
{
|
||||||
|
// We don't care about state, as breakpoints are turned on
|
||||||
|
// and off with the same command
|
||||||
|
// FIXME - at some point, we might want to add 'breakon'
|
||||||
|
// and 'breakoff' to DebuggerParser, so the states
|
||||||
|
// don't get out of sync
|
||||||
|
ostringstream command;
|
||||||
|
command << "break #" << myAddrList[data];
|
||||||
|
instance()->debugger().run(command.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void RomWidget::setPC(int data)
|
||||||
|
{
|
||||||
|
ostringstream command;
|
||||||
|
command << "pc #" << myAddrList[data];
|
||||||
|
instance()->debugger().run(command.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void RomWidget::patchROM(int data, const string& bytes)
|
||||||
|
{
|
||||||
|
ostringstream command;
|
||||||
|
|
||||||
|
// Temporarily set to base 16, since that's the format the disassembled
|
||||||
|
// byte string is in. This eliminates the need to prefix each byte with
|
||||||
|
// a '$' character
|
||||||
|
BaseFormat oldbase = instance()->debugger().parser()->base();
|
||||||
|
instance()->debugger().parser()->setBase(kBASE_16);
|
||||||
|
|
||||||
|
command << "rom #" << myAddrList[data] << " " << bytes;
|
||||||
|
instance()->debugger().run(command.str());
|
||||||
|
|
||||||
|
// Restore previous base
|
||||||
|
instance()->debugger().parser()->setBase(oldbase);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void RomWidget::saveROM()
|
||||||
|
{
|
||||||
|
cerr << "save ROM\n";
|
||||||
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: RomWidget.hxx,v 1.1 2005-08-30 17:51:26 stephena Exp $
|
// $Id: RomWidget.hxx,v 1.2 2005-09-07 18:34:52 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -49,6 +49,11 @@ class RomWidget : public Widget, public CommandSender
|
||||||
void initialUpdate();
|
void initialUpdate();
|
||||||
void incrementalUpdate();
|
void incrementalUpdate();
|
||||||
|
|
||||||
|
void setBreak(int data);
|
||||||
|
void setPC(int data);
|
||||||
|
void patchROM(int data, const string& bytes);
|
||||||
|
void saveROM();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RomListWidget* myRomList;
|
RomListWidget* myRomList;
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: ListWidget.cxx,v 1.29 2005-08-26 16:44:17 stephena Exp $
|
// $Id: ListWidget.cxx,v 1.30 2005-09-07 18:34:52 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -97,8 +97,6 @@ void ListWidget::setHighlighted(int item)
|
||||||
abortEditMode();
|
abortEditMode();
|
||||||
|
|
||||||
_highlightedItem = item;
|
_highlightedItem = item;
|
||||||
// FIXME - don't know if we need to send a signal
|
|
||||||
//sendCommand(kListSelectionChangedCmd, _selectedItem, _id);
|
|
||||||
|
|
||||||
// Only scroll the list if we're about to pass the page boundary
|
// Only scroll the list if we're about to pass the page boundary
|
||||||
if(_currentPos == 0)
|
if(_currentPos == 0)
|
||||||
|
@ -124,8 +122,6 @@ void ListWidget::scrollTo(int item)
|
||||||
_currentPos = item;
|
_currentPos = item;
|
||||||
scrollBarRecalc();
|
scrollBarRecalc();
|
||||||
}
|
}
|
||||||
|
|
||||||
setDirty(); draw();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -149,6 +145,8 @@ void ListWidget::scrollBarRecalc()
|
||||||
_scrollBar->_entriesPerPage = _rows;
|
_scrollBar->_entriesPerPage = _rows;
|
||||||
_scrollBar->_currentPos = _currentPos;
|
_scrollBar->_currentPos = _currentPos;
|
||||||
_scrollBar->recalc();
|
_scrollBar->recalc();
|
||||||
|
|
||||||
|
setDirty(); draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
Loading…
Reference in New Issue