diff --git a/stella/src/emucore/TIA.cxx b/stella/src/emucore/TIA.cxx index 501ae2795..ba4555330 100644 --- a/stella/src/emucore/TIA.cxx +++ b/stella/src/emucore/TIA.cxx @@ -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 @@ -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; diff --git a/stella/src/emucore/TIA.hxx b/stella/src/emucore/TIA.hxx index 8f7706463..9cd46db9f 100644 --- a/stella/src/emucore/TIA.hxx +++ b/stella/src/emucore/TIA.hxx @@ -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];