Updated how the debugger is created, and protected against using the

debugger before it has been initialized.

Tweaked the format auto-detection by also looking at the TIA scanline
at which drawing first occurs.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2359 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2012-01-17 22:20:20 +00:00
parent 69db96f441
commit 08ae1c3fe8
14 changed files with 122 additions and 101 deletions

View File

@ -37,6 +37,9 @@
* Fixed compile issues in Irix when using the default compiler * Fixed compile issues in Irix when using the default compiler
instead of gcc. Thanks go to Rainer M. Canavan for this code. instead of gcc. Thanks go to Rainer M. Canavan for this code.
* Fixed bug in PAL color-loss setting in Video Settings; changing the
settings wouldn't take effect until the ROM was reloaded.
* Added CompuMate bankswitching support to the emulation core; * Added CompuMate bankswitching support to the emulation core;
the SpectraVision Compumate ROM now works. the SpectraVision Compumate ROM now works.
(FIXME - this may not be complete) (FIXME - this may not be complete)

View File

@ -56,7 +56,7 @@
#include "Debugger.hxx" #include "Debugger.hxx"
Debugger* Debugger::myStaticDebugger; Debugger* Debugger::myStaticDebugger = 0;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static const char* builtin_functions[][3] = { static const char* builtin_functions[][3] = {
@ -108,10 +108,10 @@ static const char* pseudo_registers[][2] = {
}; };
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Debugger::Debugger(OSystem* osystem) Debugger::Debugger(OSystem& osystem, Console& console)
: DialogContainer(osystem), : DialogContainer(&osystem),
myConsole(NULL), myConsole(console),
mySystem(NULL), mySystem(console.system()),
myDialog(NULL), myDialog(NULL),
myParser(NULL), myParser(NULL),
myCartDebug(NULL), myCartDebug(NULL),
@ -127,6 +127,13 @@ Debugger::Debugger(OSystem* osystem)
{ {
// Init parser // Init parser
myParser = new DebuggerParser(this); myParser = new DebuggerParser(this);
// Create debugger subsystems
myCpuDebug = new CpuDebug(*this, myConsole);
myCartDebug = new CartDebug(*this, myConsole, osystem);
myRiotDebug = new RiotDebug(*this, myConsole);
myTiaDebug = new TIADebug(*this, myConsole);
myBreakPoints = new PackedBitArray(0x10000); myBreakPoints = new PackedBitArray(0x10000);
myReadTraps = new PackedBitArray(0x10000); myReadTraps = new PackedBitArray(0x10000);
myWriteTraps = new PackedBitArray(0x10000); myWriteTraps = new PackedBitArray(0x10000);
@ -142,45 +149,21 @@ Debugger::Debugger(OSystem* osystem)
Debugger::~Debugger() Debugger::~Debugger()
{ {
delete myParser; delete myParser;
delete myCartDebug; delete myCartDebug;
delete myCpuDebug; delete myCpuDebug;
delete myRiotDebug; delete myRiotDebug;
delete myTiaDebug; delete myTiaDebug;
delete myBreakPoints; delete myBreakPoints;
delete myReadTraps; delete myReadTraps;
delete myWriteTraps; delete myWriteTraps;
delete myRewindManager; delete myRewindManager;
myStaticDebugger = 0;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::initialize(Console* console) void Debugger::initialize()
{ {
assert(console);
// Keep pointers to these items for efficiency
myConsole = console;
mySystem = &(myConsole->system());
// Create debugger subsystems
delete myCpuDebug;
myCpuDebug = new CpuDebug(*this, *myConsole);
delete myCartDebug;
myCartDebug = new CartDebug(*this, *myConsole, *myOSystem);
delete myRiotDebug;
myRiotDebug = new RiotDebug(*this, *myConsole);
delete myTiaDebug;
myTiaDebug = new TIADebug(*this, *myConsole);
// Initialize breakpoints to known state
clearAllBreakPoints();
clearAllTraps();
// Get the dialog size // Get the dialog size
int w, h; int w, h;
myOSystem->settings().getSize("debuggerres", w, h); myOSystem->settings().getSize("debuggerres", w, h);
@ -375,7 +358,7 @@ string Debugger::setRAM(IntArray& args)
int count = args.size(); int count = args.size();
int address = args[0]; int address = args[0];
for(int i = 1; i < count; ++i) for(int i = 1; i < count; ++i)
mySystem->poke(address++, args[i]); mySystem.poke(address++, args[i]);
buf << "changed " << (count-1) << " location"; buf << "changed " << (count-1) << " location";
if(count != 2) if(count != 2)
@ -386,7 +369,7 @@ string Debugger::setRAM(IntArray& args)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::saveState(int state) void Debugger::saveState(int state)
{ {
mySystem->clearDirtyPages(); mySystem.clearDirtyPages();
unlockBankswitchState(); unlockBankswitchState();
myOSystem->state().saveState(state); myOSystem->state().saveState(state);
@ -396,7 +379,7 @@ void Debugger::saveState(int state)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::loadState(int state) void Debugger::loadState(int state)
{ {
mySystem->clearDirtyPages(); mySystem.clearDirtyPages();
unlockBankswitchState(); unlockBankswitchState();
myOSystem->state().loadState(state); myOSystem->state().loadState(state);
@ -407,15 +390,15 @@ void Debugger::loadState(int state)
int Debugger::step() int Debugger::step()
{ {
saveOldState(); saveOldState();
mySystem->clearDirtyPages(); mySystem.clearDirtyPages();
int cyc = mySystem->cycles(); int cyc = mySystem.cycles();
unlockBankswitchState(); unlockBankswitchState();
myOSystem->console().tia().updateScanlineByStep(); myOSystem->console().tia().updateScanlineByStep();
lockBankswitchState(); lockBankswitchState();
return mySystem->cycles() - cyc; return mySystem.cycles() - cyc;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -432,19 +415,19 @@ int Debugger::step()
int Debugger::trace() int Debugger::trace()
{ {
// 32 is the 6502 JSR instruction: // 32 is the 6502 JSR instruction:
if(mySystem->peek(myCpuDebug->pc()) == 32) if(mySystem.peek(myCpuDebug->pc()) == 32)
{ {
saveOldState(); saveOldState();
mySystem->clearDirtyPages(); mySystem.clearDirtyPages();
int cyc = mySystem->cycles(); int cyc = mySystem.cycles();
int targetPC = myCpuDebug->pc() + 3; // return address int targetPC = myCpuDebug->pc() + 3; // return address
unlockBankswitchState(); unlockBankswitchState();
myOSystem->console().tia().updateScanlineByTrace(targetPC); myOSystem->console().tia().updateScanlineByTrace(targetPC);
lockBankswitchState(); lockBankswitchState();
return mySystem->cycles() - cyc; return mySystem.cycles() - cyc;
} }
else else
return step(); return step();
@ -453,7 +436,7 @@ int Debugger::trace()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::toggleBreakPoint(int bp) void Debugger::toggleBreakPoint(int bp)
{ {
mySystem->m6502().setBreakPoints(myBreakPoints); mySystem.m6502().setBreakPoints(myBreakPoints);
if(bp < 0) bp = myCpuDebug->pc(); if(bp < 0) bp = myCpuDebug->pc();
myBreakPoints->toggle(bp); myBreakPoints->toggle(bp);
} }
@ -461,7 +444,7 @@ void Debugger::toggleBreakPoint(int bp)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::setBreakPoint(int bp, bool set) void Debugger::setBreakPoint(int bp, bool set)
{ {
mySystem->m6502().setBreakPoints(myBreakPoints); mySystem.m6502().setBreakPoints(myBreakPoints);
if(bp < 0) bp = myCpuDebug->pc(); if(bp < 0) bp = myCpuDebug->pc();
if(set) if(set)
myBreakPoints->set(bp); myBreakPoints->set(bp);
@ -479,14 +462,14 @@ bool Debugger::breakPoint(int bp)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::toggleReadTrap(int t) void Debugger::toggleReadTrap(int t)
{ {
mySystem->m6502().setTraps(myReadTraps, myWriteTraps); mySystem.m6502().setTraps(myReadTraps, myWriteTraps);
myReadTraps->toggle(t); myReadTraps->toggle(t);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::toggleWriteTrap(int t) void Debugger::toggleWriteTrap(int t)
{ {
mySystem->m6502().setTraps(myReadTraps, myWriteTraps); mySystem.m6502().setTraps(myReadTraps, myWriteTraps);
myWriteTraps->toggle(t); myWriteTraps->toggle(t);
} }
@ -512,14 +495,14 @@ bool Debugger::writeTrap(int t)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Debugger::cycles() int Debugger::cycles()
{ {
return mySystem->cycles(); return mySystem.cycles();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::nextScanline(int lines) void Debugger::nextScanline(int lines)
{ {
saveOldState(); saveOldState();
mySystem->clearDirtyPages(); mySystem.clearDirtyPages();
unlockBankswitchState(); unlockBankswitchState();
while(lines) while(lines)
@ -534,7 +517,7 @@ void Debugger::nextScanline(int lines)
void Debugger::nextFrame(int frames) void Debugger::nextFrame(int frames)
{ {
saveOldState(); saveOldState();
mySystem->clearDirtyPages(); mySystem.clearDirtyPages();
unlockBankswitchState(); unlockBankswitchState();
while(frames) while(frames)
@ -548,7 +531,7 @@ void Debugger::nextFrame(int frames)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Debugger::rewindState() bool Debugger::rewindState()
{ {
mySystem->clearDirtyPages(); mySystem.clearDirtyPages();
unlockBankswitchState(); unlockBankswitchState();
bool result = myRewindManager->rewindState(); bool result = myRewindManager->rewindState();
@ -562,7 +545,7 @@ void Debugger::clearAllBreakPoints()
{ {
delete myBreakPoints; delete myBreakPoints;
myBreakPoints = new PackedBitArray(0x10000); myBreakPoints = new PackedBitArray(0x10000);
mySystem->m6502().setBreakPoints(NULL); mySystem.m6502().setBreakPoints(NULL);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -572,7 +555,7 @@ void Debugger::clearAllTraps()
delete myWriteTraps; delete myWriteTraps;
myReadTraps = new PackedBitArray(0x10000); myReadTraps = new PackedBitArray(0x10000);
myWriteTraps = new PackedBitArray(0x10000); myWriteTraps = new PackedBitArray(0x10000);
mySystem->m6502().setTraps(NULL, NULL); mySystem.m6502().setTraps(NULL, NULL);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -584,11 +567,11 @@ string Debugger::showWatches()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Debugger::setBank(int bank) bool Debugger::setBank(int bank)
{ {
if(myConsole->cartridge().bankCount() > 1) if(myConsole.cartridge().bankCount() > 1)
{ {
myConsole->cartridge().unlockBank(); myConsole.cartridge().unlockBank();
bool status = myConsole->cartridge().bank(bank); bool status = myConsole.cartridge().bank(bank);
myConsole->cartridge().lockBank(); myConsole.cartridge().lockBank();
return status; return status;
} }
return false; return false;
@ -597,7 +580,7 @@ bool Debugger::setBank(int bank)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Debugger::patchROM(int addr, int value) bool Debugger::patchROM(int addr, int value)
{ {
return myConsole->cartridge().patch(addr, value); return myConsole.cartridge().patch(addr, value);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -638,7 +621,7 @@ void Debugger::setQuitState()
// sitting at a breakpoint/trap, this will get us past it. // sitting at a breakpoint/trap, this will get us past it.
// Somehow this feels like a hack to me, but I don't know why // Somehow this feels like a hack to me, but I don't know why
// if(myBreakPoints->isSet(myCpuDebug->pc())) // if(myBreakPoints->isSet(myCpuDebug->pc()))
mySystem->m6502().execute(1); mySystem.m6502().execute(1);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -833,7 +816,7 @@ string Debugger::saveROM(const string& filename) const
FilesystemNode node(path); FilesystemNode node(path);
ofstream out(node.getPath().c_str(), ios::out | ios::binary); ofstream out(node.getPath().c_str(), ios::out | ios::binary);
if(out.is_open() && myConsole->cartridge().save(out)) if(out.is_open() && myConsole.cartridge().save(out))
return node.getRelativePath(); return node.getRelativePath();
else else
return ""; return "";
@ -842,15 +825,15 @@ string Debugger::saveROM(const string& filename) const
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::lockBankswitchState() void Debugger::lockBankswitchState()
{ {
mySystem->lockDataBus(); mySystem.lockDataBus();
myConsole->cartridge().lockBank(); myConsole.cartridge().lockBank();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Debugger::unlockBankswitchState() void Debugger::unlockBankswitchState()
{ {
mySystem->unlockDataBus(); mySystem.unlockDataBus();
myConsole->cartridge().unlockBank(); myConsole.cartridge().unlockBank();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -83,7 +83,7 @@ class Debugger : public DialogContainer
/** /**
Create a new debugger parent object Create a new debugger parent object
*/ */
Debugger(OSystem* osystem); Debugger(OSystem& osystem, Console& console);
/** /**
Destructor Destructor
@ -92,11 +92,9 @@ class Debugger : public DialogContainer
public: public:
/** /**
Updates the basedialog to be of the type defined for this derived class. Initialize the debugger dialog container.
@param console The console to use for this debugging session.
*/ */
void initialize(Console* console); void initialize();
/** /**
Initialize the video subsystem wrt this class. Initialize the video subsystem wrt this class.
@ -233,12 +231,12 @@ class Debugger : public DialogContainer
GUI::Rect getTabBounds() const; GUI::Rect getTabBounds() const;
/* These are now exposed so Expressions can use them. */ /* These are now exposed so Expressions can use them. */
int peek(int addr) { return mySystem->peek(addr); } int peek(int addr) { return mySystem.peek(addr); }
int dpeek(int addr) { return mySystem->peek(addr) | (mySystem->peek(addr+1) << 8); } int dpeek(int addr) { return mySystem.peek(addr) | (mySystem.peek(addr+1) << 8); }
int getAccessFlags(uInt16 addr) int getAccessFlags(uInt16 addr)
{ return mySystem->getAccessFlags(addr); } { return mySystem.getAccessFlags(addr); }
void setAccessFlags(uInt16 addr, uInt8 flags) void setAccessFlags(uInt16 addr, uInt8 flags)
{ mySystem->setAccessFlags(addr, flags); } { mySystem.setAccessFlags(addr, flags); }
void setBreakPoint(int bp, bool set); void setBreakPoint(int bp, bool set);
@ -303,8 +301,8 @@ class Debugger : public DialogContainer
void loadState(int state); void loadState(int state);
private: private:
Console* myConsole; Console& myConsole;
System* mySystem; System& mySystem;
DebuggerDialog* myDialog; DebuggerDialog* myDialog;
DebuggerParser* myParser; DebuggerParser* myParser;

View File

@ -296,7 +296,8 @@ void Cartridge::registerRamArea(uInt16 start, uInt16 size,
void Cartridge::triggerReadFromWritePort(uInt16 address) void Cartridge::triggerReadFromWritePort(uInt16 address)
{ {
#ifdef DEBUGGER_SUPPORT #ifdef DEBUGGER_SUPPORT
Debugger::debugger().cartDebug().triggerReadFromWritePort(address); if(!mySystem->autodectMode())
Debugger::debugger().cartDebug().triggerReadFromWritePort(address);
#endif #endif
} }

View File

@ -98,9 +98,6 @@ Console::Console(OSystem* osystem, Cartridge* cart, const Properties& props)
myControllers[1] = new Joystick(Controller::Right, myEvent, *mySystem); myControllers[1] = new Joystick(Controller::Right, myEvent, *mySystem);
M6502* m6502 = new M6502(1); M6502* m6502 = new M6502(1);
#ifdef DEBUGGER_SUPPORT
m6502->attach(myOSystem->debugger());
#endif
myRiot = new M6532(*this, myOSystem->settings()); myRiot = new M6532(*this, myOSystem->settings());
myTIA = new TIA(*this, myOSystem->sound(), myOSystem->settings()); myTIA = new TIA(*this, myOSystem->sound(), myOSystem->settings());
@ -116,10 +113,16 @@ Console::Console(OSystem* osystem, Cartridge* cart, const Properties& props)
if(myDisplayFormat == "AUTO-DETECT" || if(myDisplayFormat == "AUTO-DETECT" ||
myOSystem->settings().getBool("rominfo")) myOSystem->settings().getBool("rominfo"))
{ {
// Run the system for 60 frames, looking for PAL scanline patterns // Run the TIA, looking for PAL scanline patterns
// We turn off the SuperCharger progress bars, otherwise the SC BIOS // We turn off the SuperCharger progress bars, otherwise the SC BIOS
// will take over 250 frames! // will take over 250 frames!
// The 'fastscbios' option must be changed before the system is reset // The 'fastscbios' option must be changed before the system is reset
// The algorithm used is as follows:
// Run for 60 frames, only consider frames in appropriate scanline range
// If there's a frame that starts drawing at scanline 50 or
// has more than 287 scanlines, count it as PAL
// If at least 20 PAL frames are found, then the format is PAL, else NTSC
bool fastscbios = myOSystem->settings().getBool("fastscbios"); bool fastscbios = myOSystem->settings().getBool("fastscbios");
myOSystem->settings().setBool("fastscbios", true); myOSystem->settings().setBool("fastscbios", true);
mySystem->reset(true); // autodetect in reset enabled mySystem->reset(true); // autodetect in reset enabled
@ -127,10 +130,13 @@ Console::Console(OSystem* osystem, Cartridge* cart, const Properties& props)
for(int i = 0; i < 60; ++i) for(int i = 0; i < 60; ++i)
{ {
myTIA->update(); myTIA->update();
if(myTIA->scanlines() > 285) int lines = myTIA->scanlines() - myTIA->startLine();
if((lines >= 180 && lines <= 342) &&
(myTIA->startLine() >= 50 || myTIA->scanlines() >= 287))
++palCount; ++palCount;
} }
myDisplayFormat = (palCount >= 20) ? "PAL" : "NTSC";
myDisplayFormat = (palCount >= 25) ? "PAL" : "NTSC";
if(myProperties.get(Display_Format) == "AUTO-DETECT") if(myProperties.get(Display_Format) == "AUTO-DETECT")
autodetected = "*"; autodetected = "*";
@ -202,7 +208,8 @@ Console::Console(OSystem* osystem, Cartridge* cart, const Properties& props)
mySystem->reset(); mySystem->reset();
#ifdef DEBUGGER_SUPPORT #ifdef DEBUGGER_SUPPORT
myOSystem->debugger().initialize(this); myOSystem->createDebugger(*this);
m6502->attach(myOSystem->debugger());
#endif #endif
// Finally, add remaining info about the console // Finally, add remaining info about the console
@ -331,6 +338,12 @@ void Console::toggleColorLoss()
myOSystem->frameBuffer().showMessage(message); myOSystem->frameBuffer().showMessage(message);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Console::toggleColorLoss(bool state)
{
myTIA->enableColorLoss(state);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Console::togglePalette() void Console::togglePalette()
{ {

View File

@ -88,7 +88,7 @@ class Console : public Serializable
*/ */
Controller& controller(Controller::Jack jack) const Controller& controller(Controller::Jack jack) const
{ {
return (jack == Controller::Left) ? *myControllers[0] : *myControllers[1]; return *myControllers[jack];
} }
/** /**
@ -204,6 +204,7 @@ class Console : public Serializable
Toggles the PAL color-loss effect. Toggles the PAL color-loss effect.
*/ */
void toggleColorLoss(); void toggleColorLoss();
void toggleColorLoss(bool state);
/** /**
Initialize the video subsystem wrt this class. Initialize the video subsystem wrt this class.

View File

@ -71,7 +71,7 @@ class Controller : public Serializable
/** /**
Enumeration of the controller jacks Enumeration of the controller jacks
*/ */
enum Jack { Left, Right }; enum Jack { Left = 0, Right = 1 };
/** /**
Enumeration of the digital pins of a controller port Enumeration of the digital pins of a controller port

View File

@ -245,7 +245,7 @@ bool M6502::execute(uInt32 number)
#ifdef DEBUGGER_SUPPORT #ifdef DEBUGGER_SUPPORT
if(myJustHitTrapFlag) if(myJustHitTrapFlag)
{ {
if(myDebugger->start(myHitTrapInfo.message, myHitTrapInfo.address)) if(myDebugger && myDebugger->start(myHitTrapInfo.message, myHitTrapInfo.address))
{ {
myJustHitTrapFlag = false; myJustHitTrapFlag = false;
return true; return true;
@ -256,7 +256,7 @@ bool M6502::execute(uInt32 number)
{ {
if(myBreakPoints->isSet(PC)) if(myBreakPoints->isSet(PC))
{ {
if(myDebugger->start("BP: ", PC)) if(myDebugger && myDebugger->start("BP: ", PC))
return true; return true;
} }
} }
@ -265,7 +265,7 @@ bool M6502::execute(uInt32 number)
if(cond > -1) if(cond > -1)
{ {
string buf = "CBP: " + myBreakCondNames[cond]; string buf = "CBP: " + myBreakCondNames[cond];
if(myDebugger->start(buf)) if(myDebugger && myDebugger->start(buf))
return true; return true;
} }
#endif #endif
@ -471,7 +471,7 @@ void M6502::attach(Debugger& debugger)
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
unsigned int M6502::addCondBreak(Expression *e, const string& name) uInt32 M6502::addCondBreak(Expression *e, const string& name)
{ {
myBreakConds.push_back(e); myBreakConds.push_back(e);
myBreakCondNames.push_back(name); myBreakCondNames.push_back(name);
@ -479,7 +479,7 @@ unsigned int M6502::addCondBreak(Expression *e, const string& name)
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void M6502::delCondBreak(unsigned int brk) void M6502::delCondBreak(uInt32 brk)
{ {
if(brk < myBreakConds.size()) if(brk < myBreakConds.size())
{ {
@ -506,7 +506,7 @@ const StringList& M6502::getCondBreakNames() const
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int M6502::evalCondBreaks() Int32 M6502::evalCondBreaks()
{ {
for(uInt32 i = 0; i < myBreakConds.size(); i++) for(uInt32 i = 0; i < myBreakConds.size(); i++)
if(myBreakConds[i]->evaluate()) if(myBreakConds[i]->evaluate())

View File

@ -217,11 +217,11 @@ class M6502 : public Serializable
void setBreakPoints(PackedBitArray* bp); void setBreakPoints(PackedBitArray* bp);
void setTraps(PackedBitArray* read, PackedBitArray* write); void setTraps(PackedBitArray* read, PackedBitArray* write);
unsigned int addCondBreak(Expression* e, const string& name); uInt32 addCondBreak(Expression* e, const string& name);
void delCondBreak(unsigned int brk); void delCondBreak(uInt32 brk);
void clearCondBreaks(); void clearCondBreaks();
const StringList& getCondBreakNames() const; const StringList& getCondBreakNames() const;
int evalCondBreaks(); Int32 evalCondBreaks();
#endif #endif
private: private:

View File

@ -280,9 +280,6 @@ bool OSystem::create()
myMenu = new Menu(this); myMenu = new Menu(this);
myCommandMenu = new CommandMenu(this); myCommandMenu = new CommandMenu(this);
myLauncher = new Launcher(this); myLauncher = new Launcher(this);
#ifdef DEBUGGER_SUPPORT
myDebugger = new Debugger(this);
#endif
myStateManager = new StateManager(this); myStateManager = new StateManager(this);
// Create the sound object; the sound subsystem isn't actually // Create the sound object; the sound subsystem isn't actually
@ -310,6 +307,16 @@ bool OSystem::create()
return true; return true;
} }
#ifdef DEBUGGER_SUPPORT
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void OSystem::createDebugger(Console& console)
{
delete myDebugger; myDebugger = NULL;
myDebugger = new Debugger(*this, console);
myDebugger->initialize();
}
#endif
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void OSystem::setConfigPaths() void OSystem::setConfigPaths()
{ {
@ -588,6 +595,7 @@ void OSystem::deleteConsole()
logMessage(buf.str(), 1); logMessage(buf.str(), 1);
delete myConsole; myConsole = NULL; delete myConsole; myConsole = NULL;
delete myDebugger; myDebugger = NULL;
} }
} }

View File

@ -165,6 +165,11 @@ class OSystem
StateManager& state() const { return *myStateManager; } StateManager& state() const { return *myStateManager; }
#ifdef DEBUGGER_SUPPORT #ifdef DEBUGGER_SUPPORT
/**
Create all child objects which belong to this OSystem
*/
void createDebugger(Console& console);
/** /**
Get the ROM debugger of the system. Get the ROM debugger of the system.

View File

@ -50,6 +50,7 @@ TIA::TIA(Console& console, Sound& sound, Settings& settings)
myFrameYStart(34), myFrameYStart(34),
myFrameHeight(210), myFrameHeight(210),
myMaximumNumberOfScanlines(262), myMaximumNumberOfScanlines(262),
myStartScanline(0),
myColorLossEnabled(false), myColorLossEnabled(false),
myPartialFrameFlag(false), myPartialFrameFlag(false),
myAutoFrameEnabled(false), myAutoFrameEnabled(false),
@ -601,8 +602,8 @@ inline void TIA::startFrame()
myColor[M1Color] &= 0xfefefefe; myColor[M1Color] &= 0xfefefefe;
myColor[BLColor] &= 0xfefefefe; myColor[BLColor] &= 0xfefefefe;
} }
} }
myStartScanline = 0x7FFFFFFF; myStartScanline = 0;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -1331,12 +1332,10 @@ bool TIA::poke(uInt16 addr, uInt8 value)
if (!(myVBLANK & 0x40)) if (!(myVBLANK & 0x40))
myINPT4 = myINPT5 = 0x80; myINPT4 = myINPT5 = 0x80;
#if 0 // TODO - this isn't yet complete
// Check for the first scanline at which VBLANK is disabled. // Check for the first scanline at which VBLANK is disabled.
// Usually, this will be the first scanline to start drawing. // Usually, this will be the first scanline to start drawing.
if(myStartScanline == 0x7FFFFFFF && !(value & 0x10)) if(myStartScanline == 0 && !(value & 0x10))
myStartScanline = scanlines(); myStartScanline = scanlines();
#endif
myVBLANK = value; myVBLANK = value;
break; break;

View File

@ -224,6 +224,14 @@ class TIA : public Device
uInt32 clocksThisLine() const uInt32 clocksThisLine() const
{ return ((mySystem->cycles() * 3) - myClockWhenFrameStarted) % 228; } { return ((mySystem->cycles() * 3) - myClockWhenFrameStarted) % 228; }
/**
Answers the scanline at which the current frame began drawing.
@return The starting scanline
*/
uInt32 startLine() const
{ return myStartScanline; }
/** /**
Answers the total number of scanlines the TIA generated in producing Answers the total number of scanlines the TIA generated in producing
the current frame buffer. For partial frames, this will be the the current frame buffer. For partial frames, this will be the

View File

@ -416,6 +416,8 @@ void VideoDialog::saveConfig()
// PAL color-loss effect // PAL color-loss effect
instance().settings().setBool("colorloss", myColorLossCheckbox->getState()); instance().settings().setBool("colorloss", myColorLossCheckbox->getState());
if(&instance().console())
instance().console().toggleColorLoss(myColorLossCheckbox->getState());
// GL stretch setting // GL stretch setting
instance().settings().setBool("gl_fsmax", myGLStretchCheckbox->getState()); instance().settings().setBool("gl_fsmax", myGLStretchCheckbox->getState());