Many TIADebug methods for the TIA tab to use.

git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@690 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
urchlay 2005-07-23 15:55:21 +00:00
parent 042977d4cf
commit f088765c01
2 changed files with 393 additions and 15 deletions

View File

@ -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.15 2005-07-21 04:10:15 urchlay Exp $ // $Id: TIADebug.cxx,v 1.16 2005-07-23 15:55:21 urchlay Exp $
//============================================================================ //============================================================================
#include "System.hxx" #include "System.hxx"
@ -67,13 +67,208 @@ void TIADebug::saveOldState()
myOldState.coluRegs.push_back(coluBK()); myOldState.coluRegs.push_back(coluBK());
} }
/* the set methods now use mySystem->poke(). This will save us the
trouble of masking the values here, since TIA::poke() will do it
for us.
This means that the GUI should *never* just display the value the
user entered: it should always read the return value of the set
method and display that.
An Example:
User enters "ff" in the AUDV0 field. GUI calls value = tiaDebug->audV0(0xff).
The AUDV0 register is only 4 bits wide, so "value" is 0x0f. That's what
should be displayed.
In a perfect world, the GUI would only allow one hex digit to be entered...
but we allow decimal or binary input in the GUI (with # or \ prefix). The
only way to make that work would be to validate the data entry after every
keystroke... which would be a pain for both us and the user. Using poke()
here is a compromise that allows the TIA to do the range-checking for us,
so the GUI and/or TIADebug don't have to duplicate logic from TIA::poke().
*/
// bool vdelP0(int newVal = -1);
// bool vdelP1(int newVal = -1);
// bool vdelBL(int newVal = -1);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::vdelP0(int newVal)
{
if(newVal > -1)
mySystem->poke(VDELP0, ((bool)newVal));
return myTIA->myVDELP0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::vdelP1(int newVal)
{
if(newVal > -1)
mySystem->poke(VDELP1, ((bool)newVal));
return myTIA->myVDELP1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::vdelBL(int newVal)
{
if(newVal > -1)
mySystem->poke(VDELBL, ((bool)newVal));
return myTIA->myVDELBL;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::enaM0(int newVal)
{
if(newVal > -1)
mySystem->poke(ENAM0, ((bool)newVal) << 1);
return myTIA->myENAM0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::enaM1(int newVal)
{
if(newVal > -1)
mySystem->poke(ENAM1, ((bool)newVal) << 1);
return myTIA->myENAM1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::enaBL(int newVal)
{
if(newVal > -1)
mySystem->poke(ENABL, ((bool)newVal) << 1);
return myTIA->myENABL;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::resMP0(int newVal)
{
if(newVal > -1)
mySystem->poke(RESMP0, ((bool)newVal) << 1);
return myTIA->myRESMP0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::resMP1(int newVal)
{
if(newVal > -1)
mySystem->poke(RESMP1, ((bool)newVal) << 1);
return myTIA->myRESMP1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::refP0(int newVal)
{
if(newVal > -1)
mySystem->poke(REFP0, ((bool)newVal) << 3);
return myTIA->myREFP0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TIADebug::refP1(int newVal)
{
if(newVal > -1)
mySystem->poke(REFP1, ((bool)newVal) << 3);
return myTIA->myREFP1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::audC0(int newVal)
{
if(newVal > -1)
mySystem->poke(AUDC0, newVal);
return myTIA->myAUDC0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::audC1(int newVal)
{
if(newVal > -1)
mySystem->poke(AUDC1, newVal);
return myTIA->myAUDC1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::audV0(int newVal)
{
if(newVal > -1)
mySystem->poke(AUDV0, newVal);
return myTIA->myAUDV0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::audV1(int newVal)
{
if(newVal > -1)
mySystem->poke(AUDV1, newVal);
return myTIA->myAUDV1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::audF0(int newVal)
{
if(newVal > -1)
mySystem->poke(AUDF0, newVal);
return myTIA->myAUDF0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::audF1(int newVal)
{
if(newVal > -1)
mySystem->poke(AUDF1, newVal);
return myTIA->myAUDF1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::pf0(int newVal)
{
if(newVal > -1)
mySystem->poke(PF0, newVal << 4);
return myTIA->myPF & 0x0f;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::pf1(int newVal)
{
if(newVal > -1)
mySystem->poke(PF1, newVal);
return (myTIA->myPF & 0xff0) >> 4;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::pf2(int newVal)
{
if(newVal > -1)
mySystem->poke(PF2, newVal);
return (myTIA->myPF & 0xff000) >> 12;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::coluP0(int newVal) uInt8 TIADebug::coluP0(int newVal)
{ {
// TIA::myCOLUxx are stored 4 copies to each int,
// we need only 1 when fetching, but store all 4
if(newVal > -1) if(newVal > -1)
myTIA->myCOLUP0 = (((((newVal << 8) | newVal) << 8) | newVal) << 8) | newVal; mySystem->poke(COLUP0, newVal);
return myTIA->myCOLUP0 & 0xff; return myTIA->myCOLUP0 & 0xff;
} }
@ -81,10 +276,8 @@ uInt8 TIADebug::coluP0(int newVal)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::coluP1(int newVal) uInt8 TIADebug::coluP1(int newVal)
{ {
// TIA::myCOLUxx are stored 4 copies to each int,
// we need only 1 when fetching, but store all 4
if(newVal > -1) if(newVal > -1)
myTIA->myCOLUP1 = (((((newVal << 8) | newVal) << 8) | newVal) << 8) | newVal; mySystem->poke(COLUP0, newVal);
return myTIA->myCOLUP1 & 0xff; return myTIA->myCOLUP1 & 0xff;
} }
@ -92,10 +285,8 @@ uInt8 TIADebug::coluP1(int newVal)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::coluPF(int newVal) uInt8 TIADebug::coluPF(int newVal)
{ {
// TIA::myCOLUxx are stored 4 copies to each int,
// we need only 1 when fetching, but store all 4
if(newVal > -1) if(newVal > -1)
myTIA->myCOLUPF = (((((newVal << 8) | newVal) << 8) | newVal) << 8) | newVal; mySystem->poke(COLUPF, newVal);
return myTIA->myCOLUPF & 0xff; return myTIA->myCOLUPF & 0xff;
} }
@ -103,14 +294,102 @@ uInt8 TIADebug::coluPF(int newVal)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::coluBK(int newVal) uInt8 TIADebug::coluBK(int newVal)
{ {
// TIA::myCOLUxx are stored 4 copies to each int,
// we need only 1 when fetching, but store all 4
if(newVal > -1) if(newVal > -1)
myTIA->myCOLUBK = (((((newVal << 8) | newVal) << 8) | newVal) << 8) | newVal; mySystem->poke(COLUBK, newVal);
return myTIA->myCOLUBK & 0xff; return myTIA->myCOLUBK & 0xff;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::nusiz0(int newVal)
{
if(newVal > -1)
mySystem->poke(NUSIZ0, newVal);
return myTIA->myGRP0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::nusiz1(int newVal)
{
if(newVal > -1)
mySystem->poke(NUSIZ1, newVal);
return myTIA->myGRP1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::grP0(int newVal)
{
if(newVal > -1)
mySystem->poke(GRP0, newVal);
return myTIA->myGRP0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::grP1(int newVal)
{
if(newVal > -1)
mySystem->poke(GRP1, newVal);
return myTIA->myGRP1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::ctrlPF(int newVal)
{
if(newVal > -1)
mySystem->poke(CTRLPF, newVal);
return myTIA->myCTRLPF;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::hmP0(int newVal)
{
if(newVal > -1)
mySystem->poke(HMP0, newVal << 4);
return myTIA->myHMP0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::hmP1(int newVal)
{
if(newVal > -1)
mySystem->poke(HMP1, newVal << 4);
return myTIA->myHMP1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::hmM0(int newVal)
{
if(newVal > -1)
mySystem->poke(HMM0, newVal << 4);
return myTIA->myHMM0;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::hmM1(int newVal)
{
if(newVal > -1)
mySystem->poke(HMM1, newVal << 4);
return myTIA->myHMM1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt8 TIADebug::hmBL(int newVal)
{
if(newVal > -1)
mySystem->poke(HMBL, newVal << 4);
return myTIA->myHMBL;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int TIADebug::frameCount() int TIADebug::frameCount()
{ {

View File

@ -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.13 2005-07-21 04:10:15 urchlay Exp $ // $Id: TIADebug.hxx,v 1.14 2005-07-23 15:55:21 urchlay Exp $
//============================================================================ //============================================================================
#ifndef TIA_DEBUG_HXX #ifndef TIA_DEBUG_HXX
@ -33,6 +33,54 @@ typedef int (TIADebug::*TIADEBUG_INT_METHOD)();
// call the pointed-to method on the (global) debugger object. // call the pointed-to method on the (global) debugger object.
#define CALL_TIADEBUG_METHOD(method) ( ( Debugger::debugger().tiaDebug().*method)() ) #define CALL_TIADEBUG_METHOD(method) ( ( Debugger::debugger().tiaDebug().*method)() )
enum TIALabel {
VSYNC = 0,
VBLANK,
WSYNC,
RSYNC,
NUSIZ0,
NUSIZ1,
COLUP0,
COLUP1,
COLUPF, // $08
COLUBK,
CTRLPF,
REFP0,
REFP1,
PF0,
PF1,
PF2,
RESP0, // $10
RESP1,
RESM0,
RESM1,
RESBL,
AUDC0,
AUDC1,
AUDF0,
AUDF1, // $18
AUDV0,
AUDV1,
GRP0,
GRP1,
ENAM0,
ENAM1,
ENABL,
HMP0, // $20
HMP1,
HMM0,
HMM1,
HMBL,
VDELP0,
VDELP1,
VDELBL,
RESMP0, // $28
RESMP1,
HMOVE,
HMCLR,
CXCLR // $2C
};
class TiaState : public DebuggerState class TiaState : public DebuggerState
{ {
public: public:
@ -50,12 +98,63 @@ class TIADebug : public DebuggerSystem
void saveOldState(); void saveOldState();
// FIXME - add whole slew of setXXX() methods /* TIA byte (or part of a byte) registers */
uInt8 nusiz0(int newVal = -1);
uInt8 nusiz1(int newVal = -1);
uInt8 coluP0(int newVal = -1); uInt8 coluP0(int newVal = -1);
uInt8 coluP1(int newVal = -1); uInt8 coluP1(int newVal = -1);
uInt8 coluPF(int newVal = -1); uInt8 coluPF(int newVal = -1);
uInt8 coluBK(int newVal = -1); uInt8 coluBK(int newVal = -1);
uInt8 ctrlPF(int newVal = -1);
uInt8 pf0(int newVal = -1);
uInt8 pf1(int newVal = -1);
uInt8 pf2(int newVal = -1);
uInt8 grP0(int newVal = -1);
uInt8 grP1(int newVal = -1);
uInt8 hmP0(int newVal = -1);
uInt8 hmP1(int newVal = -1);
uInt8 hmM0(int newVal = -1);
uInt8 hmM1(int newVal = -1);
uInt8 hmBL(int newVal = -1);
uInt8 audC0(int newVal = -1);
uInt8 audC1(int newVal = -1);
uInt8 audF0(int newVal = -1);
uInt8 audF1(int newVal = -1);
uInt8 audV0(int newVal = -1);
uInt8 audV1(int newVal = -1);
/* TIA bool registers */
bool refP0(int newVal = -1);
bool refP1(int newVal = -1);
bool enaM0(int newVal = -1);
bool enaM1(int newVal = -1);
bool enaBL(int newVal = -1);
bool vdelP0(int newVal = -1);
bool vdelP1(int newVal = -1);
bool vdelBL(int newVal = -1);
bool resMP0(int newVal = -1);
bool resMP1(int newVal = -1);
/* TIA strobe registers */
void strobeWsync() { mySystem->poke(WSYNC, 0); }
void strobeRsync() { mySystem->poke(RSYNC, 0); } // not emulated!
void strobeResP0() { mySystem->poke(RESP0, 0); }
void strobeResP1() { mySystem->poke(RESP1, 0); }
void strobeResM0() { mySystem->poke(RESM0, 0); }
void strobeResM1() { mySystem->poke(RESM1, 0); }
void strobeResBL() { mySystem->poke(RESBL, 0); }
void strobeHmove() { mySystem->poke(HMOVE, 0); }
void strobeHmclr() { mySystem->poke(HMCLR, 0); }
void strobeCxclr() { mySystem->poke(CXCLR, 0); }
/* read-only internal TIA state */
int scanlines(); int scanlines();
int frameCount(); int frameCount();
int clocksThisLine(); int clocksThisLine();