mirror of https://github.com/stella-emu/stella.git
For a change of pace from the GUI stuff, I added the ability to enable/
disable the various bits in the TIA (P0, P1, M0, M1, BL, PL). The code works, but isn't yet tied to a key event. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@395 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
93563f4929
commit
9fd0aded02
|
@ -13,7 +13,7 @@
|
|||
// See the file "license" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//
|
||||
// $Id: TIA.cxx,v 1.38 2005-02-22 02:59:54 stephena Exp $
|
||||
// $Id: TIA.cxx,v 1.39 2005-04-21 18:55:15 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#include <cassert>
|
||||
|
@ -49,6 +49,9 @@ TIA::TIA(const Console& console, Sound& sound, Settings& settings)
|
|||
myCurrentFrameBuffer = new uInt8[160 * 300];
|
||||
myPreviousFrameBuffer = new uInt8[160 * 300];
|
||||
|
||||
for(uInt32 i = 0; i < 6; ++i)
|
||||
myBitEnabled[i] = true;
|
||||
|
||||
for(uInt16 x = 0; x < 2; ++x)
|
||||
{
|
||||
for(uInt16 enabled = 0; enabled < 256; ++enabled)
|
||||
|
@ -186,7 +189,6 @@ void TIA::reset()
|
|||
myPOSM1 = 0;
|
||||
myPOSBL = 0;
|
||||
|
||||
|
||||
// Some default values for the "current" variables
|
||||
myCurrentGRP0 = 0;
|
||||
myCurrentGRP1 = 0;
|
||||
|
@ -202,6 +204,9 @@ void TIA::reset()
|
|||
myM0CosmicArkMotionEnabled = false;
|
||||
myM0CosmicArkCounter = 0;
|
||||
|
||||
for(uInt32 i = 0; i < 6; ++i)
|
||||
myBitEnabled[i] = true;
|
||||
|
||||
myDumpEnabled = false;
|
||||
myDumpDisabledCycle = 0;
|
||||
|
||||
|
@ -358,6 +363,11 @@ bool TIA::save(Serializer& out)
|
|||
out.putBool(myM0CosmicArkMotionEnabled);
|
||||
out.putLong(myM0CosmicArkCounter);
|
||||
|
||||
// There are currently six bits defined in TIABit
|
||||
out.putLong(6);
|
||||
for(uInt32 i = 0; i < 6; ++i)
|
||||
out.putBool(myBitEnabled[i]);
|
||||
|
||||
out.putBool(myDumpEnabled);
|
||||
out.putLong(myDumpDisabledCycle);
|
||||
|
||||
|
@ -454,6 +464,11 @@ bool TIA::load(Deserializer& in)
|
|||
myM0CosmicArkMotionEnabled = in.getBool();
|
||||
myM0CosmicArkCounter = (uInt32) in.getLong();
|
||||
|
||||
// We abuse the concept of 'enum' here
|
||||
uInt32 limit = (uInt32) in.getLong();
|
||||
for(uInt32 i = 0; i < limit; ++i)
|
||||
myBitEnabled[i] = in.getBool();
|
||||
|
||||
myDumpEnabled = in.getBool();
|
||||
myDumpDisabledCycle = (Int32) in.getLong();
|
||||
|
||||
|
@ -2150,10 +2165,10 @@ void TIA::poke(uInt16 addr, uInt8 value)
|
|||
{
|
||||
myPF = (myPF & 0x000FFFF0) | ((value >> 4) & 0x0F);
|
||||
|
||||
if(myPF != 0)
|
||||
myEnabledObjects |= myPFBit;
|
||||
else
|
||||
if(!myBitEnabled[TIA::PF] || myPF == 0)
|
||||
myEnabledObjects &= ~myPFBit;
|
||||
else
|
||||
myEnabledObjects |= myPFBit;
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -2162,10 +2177,10 @@ void TIA::poke(uInt16 addr, uInt8 value)
|
|||
{
|
||||
myPF = (myPF & 0x000FF00F) | ((uInt32)value << 4);
|
||||
|
||||
if(myPF != 0)
|
||||
myEnabledObjects |= myPFBit;
|
||||
else
|
||||
if(!myBitEnabled[TIA::PF] || myPF == 0)
|
||||
myEnabledObjects &= ~myPFBit;
|
||||
else
|
||||
myEnabledObjects |= myPFBit;
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -2174,10 +2189,10 @@ void TIA::poke(uInt16 addr, uInt8 value)
|
|||
{
|
||||
myPF = (myPF & 0x00000FFF) | ((uInt32)value << 12);
|
||||
|
||||
if(myPF != 0)
|
||||
myEnabledObjects |= myPFBit;
|
||||
else
|
||||
if(!myBitEnabled[TIA::PF] || myPF == 0)
|
||||
myEnabledObjects &= ~myPFBit;
|
||||
else
|
||||
myEnabledObjects |= myPFBit;
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -2385,7 +2400,7 @@ void TIA::poke(uInt16 addr, uInt8 value)
|
|||
case 0x1B: // Graphics Player 0
|
||||
{
|
||||
// Set player 0 graphics
|
||||
myGRP0 = value;
|
||||
myGRP0 = (myBitEnabled[TIA::P0] ? value : 0);
|
||||
|
||||
// Copy player 1 graphics into its delayed register
|
||||
myDGRP1 = myGRP1;
|
||||
|
@ -2415,7 +2430,7 @@ void TIA::poke(uInt16 addr, uInt8 value)
|
|||
case 0x1C: // Graphics Player 1
|
||||
{
|
||||
// Set player 1 graphics
|
||||
myGRP1 = value;
|
||||
myGRP1 = (myBitEnabled[TIA::P1] ? value : 0);
|
||||
|
||||
// Copy player 0 graphics into its delayed register
|
||||
myDGRP0 = myGRP0;
|
||||
|
@ -2450,9 +2465,9 @@ void TIA::poke(uInt16 addr, uInt8 value)
|
|||
break;
|
||||
}
|
||||
|
||||
case 0x1D: // Enable Missle 0 graphics
|
||||
case 0x1D: // Enable Missile 0 graphics
|
||||
{
|
||||
myENAM0 = value & 0x02;
|
||||
myENAM0 = (myBitEnabled[TIA::M0] ? value & 0x02 : 0);
|
||||
|
||||
if(myENAM0 && !myRESMP0)
|
||||
myEnabledObjects |= myM0Bit;
|
||||
|
@ -2461,9 +2476,9 @@ void TIA::poke(uInt16 addr, uInt8 value)
|
|||
break;
|
||||
}
|
||||
|
||||
case 0x1E: // Enable Missle 1 graphics
|
||||
case 0x1E: // Enable Missile 1 graphics
|
||||
{
|
||||
myENAM1 = value & 0x02;
|
||||
myENAM1 = (myBitEnabled[TIA::M1] ? value & 0x02 : 0);
|
||||
|
||||
if(myENAM1 && !myRESMP1)
|
||||
myEnabledObjects |= myM1Bit;
|
||||
|
@ -2474,7 +2489,7 @@ void TIA::poke(uInt16 addr, uInt8 value)
|
|||
|
||||
case 0x1F: // Enable Ball graphics
|
||||
{
|
||||
myENABL = value & 0x02;
|
||||
myENABL = (myBitEnabled[TIA::BL] ? value & 0x02 : 0);
|
||||
|
||||
if(myVDELBL ? myDENABL : myENABL)
|
||||
myEnabledObjects |= myBLBit;
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// See the file "license" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//
|
||||
// $Id: TIA.hxx,v 1.16 2005-02-21 20:43:25 stephena Exp $
|
||||
// $Id: TIA.hxx,v 1.17 2005-04-21 18:55:15 stephena Exp $
|
||||
//============================================================================
|
||||
|
||||
#ifndef TIA_HXX
|
||||
|
@ -42,7 +42,7 @@ class Settings;
|
|||
be displayed on screen.
|
||||
|
||||
@author Bradford W. Mott
|
||||
@version $Id: TIA.hxx,v 1.16 2005-02-21 20:43:25 stephena Exp $
|
||||
@version $Id: TIA.hxx,v 1.17 2005-04-21 18:55:15 stephena Exp $
|
||||
*/
|
||||
class TIA : public Device , public MediaSource
|
||||
{
|
||||
|
@ -171,6 +171,29 @@ class TIA : public Device , public MediaSource
|
|||
*/
|
||||
uInt32 scanlines() const;
|
||||
|
||||
enum TIABit {
|
||||
P0, // Descriptor for Player 0 Bit
|
||||
M0, // Descriptor for Missle 0 Bit
|
||||
P1, // Descriptor for Player 1 Bit
|
||||
M1, // Descriptor for Missle 1 Bit
|
||||
BL, // Descriptor for Ball Bit
|
||||
PF // Descriptor for Playfield Bit
|
||||
};
|
||||
|
||||
/**
|
||||
Enables/disables the specified TIA bit.
|
||||
|
||||
@return Whether the bit was enabled or disabled
|
||||
*/
|
||||
bool enableBit(TIABit b, bool mode) { myBitEnabled[b] = mode; return mode; }
|
||||
|
||||
/**
|
||||
Toggles the specified TIA bit.
|
||||
|
||||
@return Whether the bit was enabled or disabled
|
||||
*/
|
||||
bool toggleBit(TIABit b) { myBitEnabled[b] = !myBitEnabled[b]; return myBitEnabled[b]; }
|
||||
|
||||
private:
|
||||
// Compute the ball mask table
|
||||
void computeBallMaskTable();
|
||||
|
@ -313,7 +336,7 @@ class TIA : public Device , public MediaSource
|
|||
bool myREFP0; // Indicates if player 0 is being reflected
|
||||
bool myREFP1; // Indicates if player 1 is being reflected
|
||||
|
||||
uInt32 myPF; // Playfield graphics (19-12:PF2 11-4:PF1 3-0:PF0)
|
||||
uInt32 myPF; // Playfield graphics (19-12:PF2 11-4:PF1 3-0:PF0)
|
||||
|
||||
uInt8 myGRP0; // Player 0 graphics register
|
||||
uInt8 myGRP1; // Player 1 graphics register
|
||||
|
@ -404,6 +427,9 @@ class TIA : public Device , public MediaSource
|
|||
// Counter used for TIA M0 "bug"
|
||||
uInt32 myM0CosmicArkCounter;
|
||||
|
||||
// Answers whether specified bits (from TIABit) are enabled or disabled
|
||||
bool myBitEnabled[6];
|
||||
|
||||
private:
|
||||
// Ball mask table (entries are true or false)
|
||||
static uInt8 ourBallMaskTable[4][4][320];
|
||||
|
|
Loading…
Reference in New Issue