mirror of https://github.com/stella-emu/stella.git
Totally revamped DebuggerDialog. The dialog now takes up the whole
screen, which means that the area right of the TIA image can be used for widgets (that's the next thing I'll be doing). Created TiaOutputWidget, which is contained in the DebuggerDialog and handles all drawing/updating of the TIA image while in debugger mode. Some advantages of this are a greatly simplified FrameBuffer::update() wrt debugger mode and instant updates for frame and scanline advance. Another big advantage is that the TIA image is now a widget, which means it can receive key/mouse events. These events can trigger updates in other parts of the interface (imagine clicking on a certain line and having scanlines filled to that area, etc). The biggest disadvantage right now is that the TIA is redrawn each time the dialog changes (ie, when a key is pressed). This needs to be optimized. Fixed bug whereby toggling video modes while in the debugger sometimes screwed up the palette. Removed some FIXME's, since the functionality has been provided. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@678 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
8f81b56384
commit
570d8735ed
|
@ -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: Debugger.cxx,v 1.69 2005-07-19 02:24:12 urchlay Exp $
|
// $Id: Debugger.cxx,v 1.70 2005-07-19 17:59:57 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "bspf.hxx"
|
#include "bspf.hxx"
|
||||||
|
@ -35,6 +35,7 @@
|
||||||
#include "RamDebug.hxx"
|
#include "RamDebug.hxx"
|
||||||
#include "TIADebug.hxx"
|
#include "TIADebug.hxx"
|
||||||
|
|
||||||
|
#include "TiaOutputWidget.hxx"
|
||||||
#include "Debugger.hxx"
|
#include "Debugger.hxx"
|
||||||
|
|
||||||
Debugger* Debugger::myStaticDebugger;
|
Debugger* Debugger::myStaticDebugger;
|
||||||
|
@ -48,6 +49,7 @@ Debugger::Debugger(OSystem* osystem)
|
||||||
myCpuDebug(NULL),
|
myCpuDebug(NULL),
|
||||||
myRamDebug(NULL),
|
myRamDebug(NULL),
|
||||||
myTiaDebug(NULL),
|
myTiaDebug(NULL),
|
||||||
|
myTiaOutput(NULL),
|
||||||
equateList(NULL),
|
equateList(NULL),
|
||||||
breakPoints(NULL),
|
breakPoints(NULL),
|
||||||
readTraps(NULL),
|
readTraps(NULL),
|
||||||
|
@ -85,14 +87,16 @@ Debugger::~Debugger()
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Debugger::initialize()
|
void Debugger::initialize()
|
||||||
{
|
{
|
||||||
int x, y, w, h;
|
GUI::Rect r = getDialogBounds();
|
||||||
getDialogBounds(&x, &y, &w, &h);
|
|
||||||
|
|
||||||
delete myBaseDialog;
|
delete myBaseDialog;
|
||||||
DebuggerDialog *dd = new DebuggerDialog(myOSystem, this, x, y, w, h);
|
DebuggerDialog *dd = new DebuggerDialog(myOSystem, this,
|
||||||
|
r.left, r.top, r.width(), r.height());
|
||||||
myPrompt = dd->prompt();
|
myPrompt = dd->prompt();
|
||||||
myBaseDialog = dd;
|
myBaseDialog = dd;
|
||||||
|
|
||||||
|
myTiaOutput = dd->tiaOutput();
|
||||||
|
|
||||||
// set up any breakpoint that was on the command line
|
// set up any breakpoint that was on the command line
|
||||||
// (and remove the key from the settings, so they won't get set again)
|
// (and remove the key from the settings, so they won't get set again)
|
||||||
string initBreak = myOSystem->settings().getString("break");
|
string initBreak = myOSystem->settings().getString("break");
|
||||||
|
@ -104,11 +108,10 @@ void Debugger::initialize()
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Debugger::initializeVideo()
|
void Debugger::initializeVideo()
|
||||||
{
|
{
|
||||||
int x, y, w, h;
|
GUI::Rect r = getDialogBounds();
|
||||||
getDialogBounds(&x, &y, &w, &h);
|
|
||||||
|
|
||||||
string title = string("Stella ") + STELLA_VERSION + ": Debugger mode";
|
string title = string("Stella ") + STELLA_VERSION + ": Debugger mode";
|
||||||
myOSystem->frameBuffer().initialize(title, w, y+h, false);
|
myOSystem->frameBuffer().initialize(title, r.width(), r.height(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -513,11 +516,6 @@ int Debugger::step()
|
||||||
mySystem->m6502().execute(1);
|
mySystem->m6502().execute(1);
|
||||||
mySystem->lockDataBus();
|
mySystem->lockDataBus();
|
||||||
|
|
||||||
// FIXME - this doesn't work yet, pending a partial rewrite of TIA class
|
|
||||||
myTiaDebug->updateTIA();
|
|
||||||
myOSystem->frameBuffer().refreshTIA(true);
|
|
||||||
///////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
return mySystem->cycles() - cyc;
|
return mySystem->cycles() - cyc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,8 +530,6 @@ int Debugger::step()
|
||||||
// to share between stack and variables, I doubt any 2600 games will ever
|
// to share between stack and variables, I doubt any 2600 games will ever
|
||||||
// use recursion...
|
// use recursion...
|
||||||
|
|
||||||
// FIXME: TIA framebuffer should be updated during tracing!
|
|
||||||
|
|
||||||
int Debugger::trace()
|
int Debugger::trace()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -551,11 +547,6 @@ int Debugger::trace()
|
||||||
|
|
||||||
mySystem->lockDataBus();
|
mySystem->lockDataBus();
|
||||||
|
|
||||||
// FIXME - this doesn't work yet, pending a partial rewrite of TIA class
|
|
||||||
myTiaDebug->updateTIA();
|
|
||||||
myOSystem->frameBuffer().refreshTIA(true);
|
|
||||||
///////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
return mySystem->cycles() - cyc;
|
return mySystem->cycles() - cyc;
|
||||||
} else {
|
} else {
|
||||||
return step();
|
return step();
|
||||||
|
@ -647,13 +638,7 @@ const string& Debugger::disassemble(int start, int lines) {
|
||||||
void Debugger::nextScanline(int lines) {
|
void Debugger::nextScanline(int lines) {
|
||||||
saveOldState();
|
saveOldState();
|
||||||
mySystem->unlockDataBus();
|
mySystem->unlockDataBus();
|
||||||
// FIXME - add code to 'darken' the current TIA framebuffer, so we can
|
myTiaOutput->advanceScanline(lines);
|
||||||
// differentiate between old content and newly drawn scanlines
|
|
||||||
// myTiaDebug->clearTIA();
|
|
||||||
|
|
||||||
myOSystem->frameBuffer().advanceScanline(lines);
|
|
||||||
myOSystem->frameBuffer().refreshTIA();
|
|
||||||
|
|
||||||
mySystem->lockDataBus();
|
mySystem->lockDataBus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -661,8 +646,7 @@ void Debugger::nextScanline(int lines) {
|
||||||
void Debugger::nextFrame(int frames) {
|
void Debugger::nextFrame(int frames) {
|
||||||
saveOldState();
|
saveOldState();
|
||||||
mySystem->unlockDataBus();
|
mySystem->unlockDataBus();
|
||||||
myOSystem->frameBuffer().advance(frames);
|
myTiaOutput->advance(frames);
|
||||||
myOSystem->frameBuffer().refreshTIA();
|
|
||||||
mySystem->lockDataBus();
|
mySystem->lockDataBus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -785,7 +769,7 @@ void Debugger::setQuitState()
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Debugger::getDialogBounds(int* x, int* y, int* w, int* h)
|
GUI::Rect Debugger::getDialogBounds() const
|
||||||
{
|
{
|
||||||
int userHeight = myOSystem->settings().getInt("debugheight");
|
int userHeight = myOSystem->settings().getInt("debugheight");
|
||||||
if(userHeight < kDebuggerLines)
|
if(userHeight < kDebuggerLines)
|
||||||
|
@ -795,10 +779,43 @@ void Debugger::getDialogBounds(int* x, int* y, int* w, int* h)
|
||||||
}
|
}
|
||||||
userHeight = (userHeight + 3) * kDebuggerLineHeight - 8;
|
userHeight = (userHeight + 3) * kDebuggerLineHeight - 8;
|
||||||
|
|
||||||
*x = 0;
|
GUI::Rect r(0, 0, kDebuggerWidth, userHeight + myConsole->mediaSource().height());
|
||||||
*y = myConsole->mediaSource().height();
|
return r;
|
||||||
*w = kDebuggerWidth;
|
}
|
||||||
*h = userHeight;
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
GUI::Rect Debugger::getTiaBounds() const
|
||||||
|
{
|
||||||
|
GUI::Rect r(0, 0,
|
||||||
|
myConsole->mediaSource().width() << 1, // width is doubled
|
||||||
|
myConsole->mediaSource().height());
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
GUI::Rect Debugger::getStatusBounds() const
|
||||||
|
{
|
||||||
|
// The status area is the full area to the right of the TIA image
|
||||||
|
GUI::Rect dialog = getDialogBounds();
|
||||||
|
GUI::Rect tia = getTiaBounds();
|
||||||
|
|
||||||
|
GUI::Rect r(tia.width() + 1, 0,
|
||||||
|
dialog.width(),
|
||||||
|
tia.height());
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
GUI::Rect Debugger::getTabBounds() const
|
||||||
|
{
|
||||||
|
// The tab area is the full area below the TIA image
|
||||||
|
GUI::Rect dialog = getDialogBounds();
|
||||||
|
GUI::Rect tia = getTiaBounds();
|
||||||
|
|
||||||
|
GUI::Rect r(0, tia.height() + 1,
|
||||||
|
dialog.width(),
|
||||||
|
dialog.height());
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -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: Debugger.hxx,v 1.56 2005-07-19 01:31:36 urchlay Exp $
|
// $Id: Debugger.hxx,v 1.57 2005-07-19 17:59:58 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef DEBUGGER_HXX
|
#ifndef DEBUGGER_HXX
|
||||||
|
@ -25,6 +25,7 @@ class System;
|
||||||
class CpuDebug;
|
class CpuDebug;
|
||||||
class RamDebug;
|
class RamDebug;
|
||||||
class TIADebug;
|
class TIADebug;
|
||||||
|
class TiaOutputWidget;
|
||||||
|
|
||||||
#include "Array.hxx"
|
#include "Array.hxx"
|
||||||
#include "DialogContainer.hxx"
|
#include "DialogContainer.hxx"
|
||||||
|
@ -33,6 +34,7 @@ class TIADebug;
|
||||||
#include "EquateList.hxx"
|
#include "EquateList.hxx"
|
||||||
#include "PackedBitArray.hxx"
|
#include "PackedBitArray.hxx"
|
||||||
#include "PromptWidget.hxx"
|
#include "PromptWidget.hxx"
|
||||||
|
#include "Rect.hxx"
|
||||||
#include "bspf.hxx"
|
#include "bspf.hxx"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -63,10 +65,11 @@ typedef uInt16 (Debugger::*DEBUGGER_WORD_METHOD)();
|
||||||
for all debugging operations in Stella (parser, 6502 debugger, etc).
|
for all debugging operations in Stella (parser, 6502 debugger, etc).
|
||||||
|
|
||||||
@author Stephen Anthony
|
@author Stephen Anthony
|
||||||
@version $Id: Debugger.hxx,v 1.56 2005-07-19 01:31:36 urchlay Exp $
|
@version $Id: Debugger.hxx,v 1.57 2005-07-19 17:59:58 stephena Exp $
|
||||||
*/
|
*/
|
||||||
class Debugger : public DialogContainer
|
class Debugger : public DialogContainer
|
||||||
{
|
{
|
||||||
|
friend class DebuggerDialog;
|
||||||
friend class DebuggerParser;
|
friend class DebuggerParser;
|
||||||
friend class EventHandler;
|
friend class EventHandler;
|
||||||
|
|
||||||
|
@ -251,9 +254,13 @@ class Debugger : public DialogContainer
|
||||||
void setQuitState();
|
void setQuitState();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the dimensions of the debugger dialog (takes mediasource into account)
|
Get the dimensions of the various debugger dialog areas
|
||||||
|
(takes mediasource into account)
|
||||||
*/
|
*/
|
||||||
void getDialogBounds(int* x, int* y, int* w, int* h);
|
GUI::Rect getDialogBounds() const;
|
||||||
|
GUI::Rect getStatusBounds() const;
|
||||||
|
GUI::Rect getTiaBounds() const;
|
||||||
|
GUI::Rect getTabBounds() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resize the debugger dialog based on the current dimensions from
|
Resize the debugger dialog based on the current dimensions from
|
||||||
|
@ -311,6 +318,8 @@ class Debugger : public DialogContainer
|
||||||
RamDebug* myRamDebug;
|
RamDebug* myRamDebug;
|
||||||
TIADebug* myTiaDebug;
|
TIADebug* myTiaDebug;
|
||||||
|
|
||||||
|
TiaOutputWidget* myTiaOutput;
|
||||||
|
|
||||||
EquateList *equateList;
|
EquateList *equateList;
|
||||||
PackedBitArray *breakPoints;
|
PackedBitArray *breakPoints;
|
||||||
PackedBitArray *readTraps;
|
PackedBitArray *readTraps;
|
||||||
|
|
|
@ -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: TIADebug.cxx,v 1.13 2005-07-15 18:19:29 stephena Exp $
|
// $Id: TIADebug.cxx,v 1.14 2005-07-19 17:59:58 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "System.hxx"
|
#include "System.hxx"
|
||||||
|
@ -67,12 +67,6 @@ void TIADebug::saveOldState()
|
||||||
myOldState.coluRegs.push_back(coluBK());
|
myOldState.coluRegs.push_back(coluBK());
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void TIADebug::clearTIA()
|
|
||||||
{
|
|
||||||
myTIA->clearBuffers();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
uInt8 TIADebug::coluP0(int newVal)
|
uInt8 TIADebug::coluP0(int newVal)
|
||||||
{
|
{
|
||||||
|
@ -141,13 +135,6 @@ bool TIADebug::vblank()
|
||||||
return (myTIA->myVBLANK & 2) == 2;
|
return (myTIA->myVBLANK & 2) == 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void TIADebug::updateTIA()
|
|
||||||
{
|
|
||||||
// not working the way I expected:
|
|
||||||
// myTIA->updateFrame(myTIA->mySystem->cycles() * 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
string TIADebug::colorSwatch(uInt8 c)
|
string TIADebug::colorSwatch(uInt8 c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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: TIADebug.hxx,v 1.11 2005-07-19 00:05:21 urchlay Exp $
|
// $Id: TIADebug.hxx,v 1.12 2005-07-19 17:59:58 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef TIA_DEBUG_HXX
|
#ifndef TIA_DEBUG_HXX
|
||||||
|
@ -50,8 +50,6 @@ class TIADebug : public DebuggerSystem
|
||||||
|
|
||||||
void saveOldState();
|
void saveOldState();
|
||||||
|
|
||||||
void clearTIA();
|
|
||||||
|
|
||||||
// FIXME - add whole slew of setXXX() methods
|
// FIXME - add whole slew of setXXX() methods
|
||||||
uInt8 coluP0(int newVal = -1);
|
uInt8 coluP0(int newVal = -1);
|
||||||
uInt8 coluP1(int newVal = -1);
|
uInt8 coluP1(int newVal = -1);
|
||||||
|
@ -62,7 +60,6 @@ class TIADebug : public DebuggerSystem
|
||||||
int frameCount();
|
int frameCount();
|
||||||
bool vsync();
|
bool vsync();
|
||||||
bool vblank();
|
bool vblank();
|
||||||
void updateTIA();
|
|
||||||
string state();
|
string state();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
|
||||||
|
//
|
||||||
|
// See the file "license" for information on usage and redistribution of
|
||||||
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
//
|
||||||
|
// $Id: TiaOutputWidget.cxx,v 1.1 2005-07-19 17:59:58 stephena Exp $
|
||||||
|
//
|
||||||
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#include "OSystem.hxx"
|
||||||
|
#include "FrameBuffer.hxx"
|
||||||
|
#include "Widget.hxx"
|
||||||
|
#include "GuiObject.hxx"
|
||||||
|
|
||||||
|
#include "TiaOutputWidget.hxx"
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
TiaOutputWidget::TiaOutputWidget(GuiObject* boss, int x, int y, int w, int h)
|
||||||
|
: Widget(boss, x, y, w, h),
|
||||||
|
CommandSender(boss),
|
||||||
|
_dirty(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
TiaOutputWidget::~TiaOutputWidget()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TiaOutputWidget::advanceScanline(int lines)
|
||||||
|
{
|
||||||
|
while(lines)
|
||||||
|
{
|
||||||
|
instance()->console().mediaSource().updateScanline();
|
||||||
|
--lines;
|
||||||
|
}
|
||||||
|
_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TiaOutputWidget::advance(int frames)
|
||||||
|
{
|
||||||
|
while(frames)
|
||||||
|
{
|
||||||
|
instance()->console().mediaSource().update();
|
||||||
|
--frames;
|
||||||
|
}
|
||||||
|
_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TiaOutputWidget::drawWidget(bool hilite)
|
||||||
|
{
|
||||||
|
// if(_dirty) // FIXME - only redraw this when necessary??
|
||||||
|
{
|
||||||
|
instance()->frameBuffer().refreshTIA();
|
||||||
|
instance()->frameBuffer().drawMediaSource();
|
||||||
|
_dirty = false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
|
||||||
|
//
|
||||||
|
// See the file "license" for information on usage and redistribution of
|
||||||
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
//
|
||||||
|
// $Id: TiaOutputWidget.hxx,v 1.1 2005-07-19 17:59:58 stephena Exp $
|
||||||
|
//
|
||||||
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#ifndef TIA_OUTPUT_WIDGET_HXX
|
||||||
|
#define TIA_OUTPUT_WIDGET_HXX
|
||||||
|
|
||||||
|
class GuiObject;
|
||||||
|
|
||||||
|
#include "Widget.hxx"
|
||||||
|
#include "Command.hxx"
|
||||||
|
|
||||||
|
|
||||||
|
class TiaOutputWidget : public Widget, public CommandSender
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TiaOutputWidget(GuiObject *boss, int x, int y, int w, int h);
|
||||||
|
virtual ~TiaOutputWidget();
|
||||||
|
|
||||||
|
// Eventually, these methods will enable access to the onscreen TIA image
|
||||||
|
// For example, clicking an area may cause an action
|
||||||
|
// (fill to this scanline, etc).
|
||||||
|
/*
|
||||||
|
virtual void handleMouseDown(int x, int y, int button, int clickCount);
|
||||||
|
virtual void handleMouseUp(int x, int y, int button, int clickCount);
|
||||||
|
virtual void handleMouseWheel(int x, int y, int direction);
|
||||||
|
virtual bool handleKeyDown(int ascii, int keycode, int modifiers);
|
||||||
|
virtual bool handleKeyUp(int ascii, int keycode, int modifiers);
|
||||||
|
virtual void handleCommand(CommandSender* sender, int cmd, int data, int id);
|
||||||
|
*/
|
||||||
|
virtual bool wantsFocus() { return false; }
|
||||||
|
|
||||||
|
void advanceScanline(int lines);
|
||||||
|
void advance(int frames);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void drawWidget(bool hilite);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _dirty;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -38,7 +38,8 @@ MODULE_OBJS := \
|
||||||
src/debugger/PackedBitArray.o \
|
src/debugger/PackedBitArray.o \
|
||||||
src/debugger/CpuDebug.o \
|
src/debugger/CpuDebug.o \
|
||||||
src/debugger/RamDebug.o \
|
src/debugger/RamDebug.o \
|
||||||
src/debugger/TIADebug.o
|
src/debugger/TIADebug.o \
|
||||||
|
src/debugger/TiaOutputWidget.o
|
||||||
|
|
||||||
MODULE_DIRS += \
|
MODULE_DIRS += \
|
||||||
src/debugger
|
src/debugger
|
||||||
|
|
|
@ -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: FrameBuffer.cxx,v 1.52 2005-07-15 18:19:29 stephena Exp $
|
// $Id: FrameBuffer.cxx,v 1.53 2005-07-19 17:59:58 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -130,6 +130,10 @@ void FrameBuffer::initialize(const string& title, uInt32 width, uInt32 height,
|
||||||
// Initialize video subsystem
|
// Initialize video subsystem
|
||||||
initSubsystem();
|
initSubsystem();
|
||||||
|
|
||||||
|
// Set emulation palette if a console exists
|
||||||
|
if(&myOSystem->console())
|
||||||
|
setPalette(myOSystem->console().mediaSource().palette());
|
||||||
|
|
||||||
// Enable unicode so we can see translated key events
|
// Enable unicode so we can see translated key events
|
||||||
// (lowercase vs. uppercase characters)
|
// (lowercase vs. uppercase characters)
|
||||||
SDL_EnableUNICODE(1);
|
SDL_EnableUNICODE(1);
|
||||||
|
@ -231,26 +235,6 @@ void FrameBuffer::update()
|
||||||
|
|
||||||
case EventHandler::S_DEBUGGER:
|
case EventHandler::S_DEBUGGER:
|
||||||
{
|
{
|
||||||
// Get one frames' worth of data
|
|
||||||
bool advance = false;
|
|
||||||
if(theFrameAdvanceIndicator > 0)
|
|
||||||
{
|
|
||||||
myOSystem->console().mediaSource().update();
|
|
||||||
advance = true;
|
|
||||||
--theFrameAdvanceIndicator;
|
|
||||||
}
|
|
||||||
else if(theScanlineAdvanceIndicator > 0)
|
|
||||||
{
|
|
||||||
myOSystem->console().mediaSource().updateScanline();
|
|
||||||
advance = true;
|
|
||||||
--theScanlineAdvanceIndicator;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only update the screen if it's been invalidated or we're in
|
|
||||||
// frame advance mode
|
|
||||||
if(advance || theRedrawTIAIndicator)
|
|
||||||
drawMediaSource();
|
|
||||||
|
|
||||||
// Only update the overlay if it's changed
|
// Only update the overlay if it's changed
|
||||||
if(theRedrawOverlayIndicator)
|
if(theRedrawOverlayIndicator)
|
||||||
{
|
{
|
||||||
|
@ -301,28 +285,6 @@ void FrameBuffer::refreshOverlay(bool now)
|
||||||
if(now) update();
|
if(now) update();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void FrameBuffer::advanceScanline(int lines)
|
|
||||||
{
|
|
||||||
if(myOSystem->eventHandler().state() != EventHandler::S_DEBUGGER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
theScanlineAdvanceIndicator = lines;
|
|
||||||
while(theScanlineAdvanceIndicator)
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void FrameBuffer::advance(int frames)
|
|
||||||
{
|
|
||||||
if(myOSystem->eventHandler().state() != EventHandler::S_DEBUGGER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
theFrameAdvanceIndicator = frames;
|
|
||||||
while(theFrameAdvanceIndicator)
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void FrameBuffer::showMessage(const string& message)
|
void FrameBuffer::showMessage(const string& message)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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: FrameBuffer.hxx,v 1.47 2005-07-15 18:19:29 stephena Exp $
|
// $Id: FrameBuffer.hxx,v 1.48 2005-07-19 17:59:59 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef FRAMEBUFFER_HXX
|
#ifndef FRAMEBUFFER_HXX
|
||||||
|
@ -52,7 +52,7 @@ enum FrameStyle {
|
||||||
All GUI elements (ala ScummVM) are drawn here as well.
|
All GUI elements (ala ScummVM) are drawn here as well.
|
||||||
|
|
||||||
@author Stephen Anthony
|
@author Stephen Anthony
|
||||||
@version $Id: FrameBuffer.hxx,v 1.47 2005-07-15 18:19:29 stephena Exp $
|
@version $Id: FrameBuffer.hxx,v 1.48 2005-07-19 17:59:59 stephena Exp $
|
||||||
*/
|
*/
|
||||||
class FrameBuffer
|
class FrameBuffer
|
||||||
{
|
{
|
||||||
|
@ -145,16 +145,6 @@ class FrameBuffer
|
||||||
*/
|
*/
|
||||||
void refreshOverlay(bool now = false);
|
void refreshOverlay(bool now = false);
|
||||||
|
|
||||||
/**
|
|
||||||
Indicates that the emulation should advance given number of scanlines.
|
|
||||||
*/
|
|
||||||
void advanceScanline(int lines);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Indicates that the emulation should advance given number of frames.
|
|
||||||
*/
|
|
||||||
void advance(int frames);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Toggles between fullscreen and window mode.
|
Toggles between fullscreen and window mode.
|
||||||
Grabmouse activated when in fullscreen mode.
|
Grabmouse activated when in fullscreen mode.
|
||||||
|
|
|
@ -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: DebuggerDialog.cxx,v 1.25 2005-07-16 21:29:46 stephena Exp $
|
// $Id: DebuggerDialog.cxx,v 1.26 2005-07-19 17:59:59 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,11 +22,13 @@
|
||||||
#include "Widget.hxx"
|
#include "Widget.hxx"
|
||||||
#include "Dialog.hxx"
|
#include "Dialog.hxx"
|
||||||
#include "TabWidget.hxx"
|
#include "TabWidget.hxx"
|
||||||
|
#include "TiaOutputWidget.hxx"
|
||||||
#include "PromptWidget.hxx"
|
#include "PromptWidget.hxx"
|
||||||
#include "CpuWidget.hxx"
|
#include "CpuWidget.hxx"
|
||||||
#include "RamWidget.hxx"
|
#include "RamWidget.hxx"
|
||||||
#include "TiaWidget.hxx"
|
#include "TiaWidget.hxx"
|
||||||
#include "CheatWidget.hxx"
|
#include "CheatWidget.hxx"
|
||||||
|
#include "Rect.hxx"
|
||||||
#include "Debugger.hxx"
|
#include "Debugger.hxx"
|
||||||
|
|
||||||
#include "DebuggerDialog.hxx"
|
#include "DebuggerDialog.hxx"
|
||||||
|
@ -45,61 +47,9 @@ DebuggerDialog::DebuggerDialog(OSystem* osystem, DialogContainer* parent,
|
||||||
: Dialog(osystem, parent, x, y, w, h),
|
: Dialog(osystem, parent, x, y, w, h),
|
||||||
myTab(NULL)
|
myTab(NULL)
|
||||||
{
|
{
|
||||||
const int vBorder = 4;
|
addTiaArea();
|
||||||
const int vWidth = _w - kButtonWidth - 20;
|
addTabArea();
|
||||||
|
addStatusArea();
|
||||||
// The tab widget
|
|
||||||
myTab = new TabWidget(this, 0, vBorder, vWidth, _h - vBorder - 1);
|
|
||||||
|
|
||||||
// 1) The Prompt/console tab
|
|
||||||
myTab->addTab("Prompt");
|
|
||||||
myPrompt = new PromptWidget(myTab, 2, 2, vWidth - vBorder, _h - 25);
|
|
||||||
myTab->setParentWidget(0, myPrompt, myPrompt);
|
|
||||||
|
|
||||||
// 2) The CPU tab
|
|
||||||
myTab->addTab("CPU");
|
|
||||||
CpuWidget* cpu = new CpuWidget(myTab, 2, 2, vWidth - vBorder, _h - 25);
|
|
||||||
myTab->setParentWidget(1, cpu, cpu->activeWidget());
|
|
||||||
|
|
||||||
// 3) The RAM tab (part of RIOT)
|
|
||||||
myTab->addTab("RAM");
|
|
||||||
RamWidget* ram = new RamWidget(myTab, 2, 2, vWidth - vBorder, _h - 25);
|
|
||||||
myTab->setParentWidget(2, ram, ram->activeWidget());
|
|
||||||
|
|
||||||
// 4) The input/output tab (part of RIOT)
|
|
||||||
myTab->addTab("I/O");
|
|
||||||
|
|
||||||
|
|
||||||
// 5) The TIA tab
|
|
||||||
myTab->addTab("TIA");
|
|
||||||
TiaWidget* tia = new TiaWidget(myTab, 2, 2, vWidth - vBorder, _h - 25);
|
|
||||||
myTab->setParentWidget(4, tia, tia->activeWidget());
|
|
||||||
|
|
||||||
|
|
||||||
// 6) The ROM tab
|
|
||||||
myTab->addTab("ROM");
|
|
||||||
|
|
||||||
|
|
||||||
// 7) The Cheat tab
|
|
||||||
myTab->addTab("Cheat");
|
|
||||||
CheatWidget* cheat = new CheatWidget(myTab, 2, 2,
|
|
||||||
vWidth - vBorder, _h - 25);
|
|
||||||
myTab->setParentWidget(6, cheat, cheat->activeWidget());
|
|
||||||
|
|
||||||
// Set active tab to prompt
|
|
||||||
myTab->setActiveTab(0);
|
|
||||||
|
|
||||||
// Add some buttons that are always shown, no matter which tab we're in
|
|
||||||
int yoff = vBorder + kTabHeight + 5;
|
|
||||||
addButton(vWidth + 10, yoff, "Step", kDDStepCmd, 0);
|
|
||||||
yoff += 22;
|
|
||||||
addButton(vWidth + 10, yoff, "Trace", kDDTraceCmd, 0);
|
|
||||||
yoff += 22;
|
|
||||||
addButton(vWidth + 10, yoff, "Scan +1", kDDSAdvCmd, 0);
|
|
||||||
yoff += 22;
|
|
||||||
addButton(vWidth + 10, yoff, "Frame +1", kDDAdvCmd, 0);
|
|
||||||
|
|
||||||
addButton(vWidth + 10, _h - 22 - 10, "Exit", kDDExitCmd, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -165,6 +115,90 @@ void DebuggerDialog::handleCommand(CommandSender* sender, int cmd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void DebuggerDialog::addTiaArea()
|
||||||
|
{
|
||||||
|
GUI::Rect r = instance()->debugger().getTiaBounds();
|
||||||
|
|
||||||
|
myTiaOutput = new TiaOutputWidget(this, r.left, r.top, r.width(), r.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void DebuggerDialog::addTabArea()
|
||||||
|
{
|
||||||
|
const int vBorder = 4;
|
||||||
|
const int vWidth = _w - kButtonWidth - 20;
|
||||||
|
|
||||||
|
GUI::Rect r = instance()->debugger().getTabBounds();
|
||||||
|
|
||||||
|
// The tab widget
|
||||||
|
myTab = new TabWidget(this, r.left, r.top + vBorder, vWidth,
|
||||||
|
r.height() - vBorder);
|
||||||
|
|
||||||
|
// 1) The Prompt/console tab
|
||||||
|
myTab->addTab("Prompt");
|
||||||
|
myPrompt = new PromptWidget(myTab, 2, 2, vWidth - vBorder,
|
||||||
|
r.height() - 25);
|
||||||
|
myTab->setParentWidget(0, myPrompt, myPrompt);
|
||||||
|
|
||||||
|
// 2) The CPU tab
|
||||||
|
myTab->addTab("CPU");
|
||||||
|
CpuWidget* cpu = new CpuWidget(myTab, 2, 2, vWidth - vBorder,
|
||||||
|
r.height() - 25);
|
||||||
|
myTab->setParentWidget(1, cpu, cpu->activeWidget());
|
||||||
|
|
||||||
|
// 3) The RAM tab (part of RIOT)
|
||||||
|
myTab->addTab("RAM");
|
||||||
|
RamWidget* ram = new RamWidget(myTab, 2, 2, vWidth - vBorder,
|
||||||
|
r.height() - 25);
|
||||||
|
myTab->setParentWidget(2, ram, ram->activeWidget());
|
||||||
|
|
||||||
|
// 4) The input/output tab (part of RIOT)
|
||||||
|
myTab->addTab("I/O");
|
||||||
|
|
||||||
|
|
||||||
|
// 5) The TIA tab
|
||||||
|
myTab->addTab("TIA");
|
||||||
|
TiaWidget* tia = new TiaWidget(myTab, 2, 2, vWidth - vBorder,
|
||||||
|
r.height() - 25);
|
||||||
|
myTab->setParentWidget(4, tia, tia->activeWidget());
|
||||||
|
|
||||||
|
|
||||||
|
// 6) The ROM tab
|
||||||
|
myTab->addTab("ROM");
|
||||||
|
|
||||||
|
|
||||||
|
// 7) The Cheat tab
|
||||||
|
myTab->addTab("Cheat");
|
||||||
|
CheatWidget* cheat = new CheatWidget(myTab, 2, 2,
|
||||||
|
vWidth - vBorder, r.height() - 25);
|
||||||
|
myTab->setParentWidget(6, cheat, cheat->activeWidget());
|
||||||
|
|
||||||
|
// Set active tab to prompt
|
||||||
|
myTab->setActiveTab(0);
|
||||||
|
|
||||||
|
// Add some buttons that are always shown, no matter which tab we're in
|
||||||
|
int yoff = r.top + vBorder + kTabHeight + 5;
|
||||||
|
addButton(vWidth + 10, yoff, "Step", kDDStepCmd, 0);
|
||||||
|
yoff += 22;
|
||||||
|
addButton(vWidth + 10, yoff, "Trace", kDDTraceCmd, 0);
|
||||||
|
yoff += 22;
|
||||||
|
addButton(vWidth + 10, yoff, "Scan +1", kDDSAdvCmd, 0);
|
||||||
|
yoff += 22;
|
||||||
|
addButton(vWidth + 10, yoff, "Frame +1", kDDAdvCmd, 0);
|
||||||
|
|
||||||
|
addButton(vWidth + 10, r.bottom - 22 - 10, "Exit", kDDExitCmd, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void DebuggerDialog::addStatusArea()
|
||||||
|
{
|
||||||
|
GUI::Rect r = instance()->debugger().getStatusBounds();
|
||||||
|
|
||||||
|
new StaticTextWidget(this, r.left, r.top, 100, kLineHeight,
|
||||||
|
"Just a test", kTextAlignLeft);
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void DebuggerDialog::doStep()
|
void DebuggerDialog::doStep()
|
||||||
{
|
{
|
||||||
|
@ -198,9 +232,3 @@ void DebuggerDialog::doExit()
|
||||||
{
|
{
|
||||||
instance()->debugger().quit();
|
instance()->debugger().quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
PromptWidget *DebuggerDialog::prompt()
|
|
||||||
{
|
|
||||||
return myPrompt;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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: DebuggerDialog.hxx,v 1.12 2005-07-15 15:27:29 stephena Exp $
|
// $Id: DebuggerDialog.hxx,v 1.13 2005-07-19 17:59:59 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,9 +22,11 @@
|
||||||
#ifndef DEBUGGER_DIALOG_HXX
|
#ifndef DEBUGGER_DIALOG_HXX
|
||||||
#define DEBUGGER_DIALOG_HXX
|
#define DEBUGGER_DIALOG_HXX
|
||||||
|
|
||||||
|
class Debugger;
|
||||||
class OSystem;
|
class OSystem;
|
||||||
class DialogContainer;
|
class DialogContainer;
|
||||||
class TabWidget;
|
class TabWidget;
|
||||||
|
class TiaOutputWidget;
|
||||||
|
|
||||||
#include "Dialog.hxx"
|
#include "Dialog.hxx"
|
||||||
#include "PromptWidget.hxx"
|
#include "PromptWidget.hxx"
|
||||||
|
@ -36,16 +38,23 @@ class DebuggerDialog : public Dialog
|
||||||
int x, int y, int w, int h);
|
int x, int y, int w, int h);
|
||||||
~DebuggerDialog();
|
~DebuggerDialog();
|
||||||
|
|
||||||
PromptWidget *prompt();
|
PromptWidget* prompt() { return myPrompt; }
|
||||||
|
TiaOutputWidget* tiaOutput() { return myTiaOutput; }
|
||||||
|
|
||||||
virtual void loadConfig();
|
virtual void loadConfig();
|
||||||
virtual void handleKeyDown(int ascii, int keycode, int modifiers);
|
virtual void handleKeyDown(int ascii, int keycode, int modifiers);
|
||||||
virtual void handleCommand(CommandSender* sender, int cmd, int data, int id);
|
virtual void handleCommand(CommandSender* sender, int cmd, int data, int id);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TabWidget* myTab;
|
TabWidget* myTab;
|
||||||
|
TiaOutputWidget* myTiaOutput;
|
||||||
PromptWidget *myPrompt;
|
PromptWidget *myPrompt;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void addTiaArea();
|
||||||
|
void addTabArea();
|
||||||
|
void addStatusArea();
|
||||||
|
|
||||||
void doStep();
|
void doStep();
|
||||||
void doTrace();
|
void doTrace();
|
||||||
void doScanlineAdvance();
|
void doScanlineAdvance();
|
||||||
|
|
Loading…
Reference in New Issue