Fixes for 'illegal' VSYNC behaviour wrt 'short' frames.

git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2547 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2012-07-14 18:56:57 +00:00
parent 9a4323eece
commit 756a47bcf8
13 changed files with 125 additions and 109 deletions

View File

@ -12,13 +12,23 @@
Release History Release History
=========================================================================== ===========================================================================
3.7.2 to 3.8: (xxx xx, 2012)
* Improved handling of 'illegal' VSYNC signals, which sometimes created
'short' frames that caused massive flickering.
* The ROM properties database now uses 'Auto' instead of 'Auto-select'
everywhere. This makes for less typing when running from the
commandline.
-Have fun!
3.7.1 to 3.7.2: (June 10, 2012) 3.7.1 to 3.7.2: (June 10, 2012)
* Fixed bug in handling filenames with the '~' character, as is used * Fixed bug in handling filenames with the '~' character, as is used
extensively by RomHunter rom-sets. extensively by RomHunter rom-sets.
-Have fun!
3.7 to 3.7.1: (June 8, 2012) 3.7 to 3.7.1: (June 8, 2012)

View File

@ -3231,7 +3231,7 @@ Ms Pac-Man (Stella extended codes):
<tr> <tr>
<td VALIGN="TOP"><i>Cartridge.Type:</i></td> <td VALIGN="TOP"><i>Cartridge.Type:</i></td>
<td>Indicates the bank-switching type for the game. <td>Indicates the bank-switching type for the game.
The value of this property must be either <b>Auto-detect</b> or one of the following The value of this property must be either <b>Auto</b> or one of the following
(for more information about bank-switching see Kevin Horton's 2600 bankswitching (for more information about bank-switching see Kevin Horton's 2600 bankswitching
document or the documentation in each cartridges source code file). Types marked document or the documentation in each cartridges source code file). Types marked
as (&#185;) do not currently have reliable auto-detection, those marked as (&#178;) as (&#185;) do not currently have reliable auto-detection, those marked as (&#178;)
@ -3365,7 +3365,7 @@ Ms Pac-Man (Stella extended codes):
<tr> <tr>
<td VALIGN="TOP"><i>Display.Format:</i></td> <td VALIGN="TOP"><i>Display.Format:</i></td>
<td>Indicates the television format the game was designed for. The value <td>Indicates the television format the game was designed for. The value
must be <b>Auto-detect</b>, <b>NTSC</b>, <b>PAL</b>, <b>SECAM</b>, <b>NTSC50</b>, must be <b>Auto</b>, <b>NTSC</b>, <b>PAL</b>, <b>SECAM</b>, <b>NTSC50</b>,
<b>PAL60</b> or <b>SECAM60</b>.</td> <b>PAL60</b> or <b>SECAM60</b>.</td>
</tr> </tr>

View File

@ -74,11 +74,11 @@ Cartridge* Cartridge::create(const uInt8* image, uInt32 size, string& md5,
// See if we should try to auto-detect the cartridge type // See if we should try to auto-detect the cartridge type
// If we ask for extended info, always do an autodetect // If we ask for extended info, always do an autodetect
string autodetect = ""; string autodetect = "";
if(type == "AUTO-DETECT" || settings.getBool("rominfo")) if(type == "AUTO" || settings.getBool("rominfo"))
{ {
const string& detected = autodetectType(image, size); const string& detected = autodetectType(image, size);
autodetect = "*"; autodetect = "*";
if(type != "AUTO-DETECT" && type != detected) if(type != "AUTO" && type != detected)
cerr << "Auto-detection not consistent: " << type << ", " << detected << endl; cerr << "Auto-detection not consistent: " << type << ", " << detected << endl;
type = detected; type = detected;

View File

@ -112,8 +112,7 @@ Console::Console(OSystem* osystem, Cartridge* cart, const Properties& props)
// Auto-detect NTSC/PAL mode if it's requested // Auto-detect NTSC/PAL mode if it's requested
string autodetected = ""; string autodetected = "";
myDisplayFormat = myProperties.get(Display_Format); myDisplayFormat = myProperties.get(Display_Format);
if(myDisplayFormat == "AUTO-DETECT" || if(myDisplayFormat == "AUTO" || myOSystem->settings().getBool("rominfo"))
myOSystem->settings().getBool("rominfo"))
{ {
// Run the TIA, 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
@ -125,7 +124,7 @@ 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();
myDisplayFormat = myTIA->isPAL() ? "PAL" : "NTSC"; myDisplayFormat = myTIA->isPAL() ? "PAL" : "NTSC";
if(myProperties.get(Display_Format) == "AUTO-DETECT") if(myProperties.get(Display_Format) == "AUTO")
{ {
autodetected = "*"; autodetected = "*";
myCurrentFormat = 0; myCurrentFormat = 0;
@ -251,7 +250,7 @@ void Console::toggleFormat(int direction)
myTIA->update(); myTIA->update();
myDisplayFormat = myTIA->isPAL() ? "PAL" : "NTSC"; myDisplayFormat = myTIA->isPAL() ? "PAL" : "NTSC";
message = "Auto-detect mode: " + myDisplayFormat; message = "Auto-detect mode: " + myDisplayFormat;
saveformat = "AUTO-DETECT"; saveformat = "AUTO";
break; break;
case 1: case 1:
saveformat = myDisplayFormat = "NTSC"; saveformat = myDisplayFormat = "NTSC";

View File

@ -27,7 +27,7 @@
regenerated and the application recompiled. regenerated and the application recompiled.
*/ */
#define DEF_PROPS_SIZE 3281 #define DEF_PROPS_SIZE 3282
static const char* DefProps[DEF_PROPS_SIZE][21] = { static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "000509d1ed2b8d30a9d94be1b3b5febb", "Greg Zumwalt", "", "Jungle Jane (2003) (Greg Zumwalt) (Hack)", "Hack of Pitfall!", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "000509d1ed2b8d30a9d94be1b3b5febb", "Greg Zumwalt", "", "Jungle Jane (2003) (Greg Zumwalt) (Hack)", "Hack of Pitfall!", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -2784,7 +2784,7 @@ static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "da64f33d0521d5c9958e5d2d4434ff95", "", "", "Star Fire - Return of the Starfield (MP)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "da64f33d0521d5c9958e5d2d4434ff95", "", "", "Star Fire - Return of the Starfield (MP)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "da66d75e4b47fab99733529743f86f4f", "Digitel", "", "Chopper Command (1983) (Digitel)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "da66d75e4b47fab99733529743f86f4f", "Digitel", "", "Chopper Command (1983) (Digitel)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "da732c57697ad7d7af414998fa527e75", "Atari, Glenn Axworthy", "CX26129", "Midnight Magic (1984) (Atari) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, { "da732c57697ad7d7af414998fa527e75", "Atari, Glenn Axworthy", "CX26129", "Midnight Magic (1984) (Atari) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" },
{ "da79aad11572c80a96e261e4ac6392d0", "Salu - Ubi Soft, Dennis M. Kiss", "460673", "Pick 'n' Pile (1990) (Salu) (PAL)", "", "", "", "", "", "", "", "YES", "", "", "", "", "PAL", "38", "256", "YES", "" }, { "da79aad11572c80a96e261e4ac6392d0", "Salu - Ubi Soft, Dennis M. Kiss", "460673", "Pick 'n' Pile (1990) (Salu) (PAL)", "", "", "", "", "", "", "", "YES", "", "", "", "", "", "38", "256", "YES", "" },
{ "da7a17dcdaa62d6971393c0a6faf202a", "", "", "Flag Capture (208 in 1) (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "da7a17dcdaa62d6971393c0a6faf202a", "", "", "Flag Capture (208 in 1) (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "dab844deed4c752632b5e786b0f47999", "", "", "Super Challenge Baseball (208 in 1) (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "dab844deed4c752632b5e786b0f47999", "", "", "Super Challenge Baseball (208 in 1) (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "dac38b4dd3da73bb7b2e9d70c61d2b7c", "", "", "Hangman Monkey Biglist3 (Hack)", "Hack of Hangman", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "dac38b4dd3da73bb7b2e9d70c61d2b7c", "", "", "Hangman Monkey Biglist3 (Hack)", "Hack of Hangman", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -3256,6 +3256,7 @@ static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "fb531febf8e155328ec0cd39ef77a122", "", "", "Worm War I (208 in 1) (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, { "fb531febf8e155328ec0cd39ef77a122", "", "", "Worm War I (208 in 1) (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" },
{ "fb5c8af97bd8ffe88323656f462645a7", "", "", "Interlace Demo (Glenn Saunders)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, { "fb5c8af97bd8ffe88323656f462645a7", "", "", "Interlace Demo (Glenn Saunders)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" },
{ "fb833ed50c865a9a505a125fc9d79a7e", "Home Vision - Gem International Corp.", "", "Zoo Fun (1983) (Home Vision) (PAL)", "AKA Panda Chase", "", "", "", "", "", "", "", "", "", "", "", "", "30", "", "", "" }, { "fb833ed50c865a9a505a125fc9d79a7e", "Home Vision - Gem International Corp.", "", "Zoo Fun (1983) (Home Vision) (PAL)", "AKA Panda Chase", "", "", "", "", "", "", "", "", "", "", "", "", "30", "", "", "" },
{ "fb884ffd89013331a6f01ae3f6abd214", "Activision, David Crane", "", "Venetian Blinds Demo (1982) (Activision) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "fb88c400d602fe759ae74ef1716ee84e", "20th Century Fox Video Games, Bill Aspromonte", "11031", "Crash Dive (1983) (20th Century Fox)", "AKA Voyage to the Bottom of the Sea", "", "", "", "", "", "", "", "", "", "", "", "", "30", "", "", "" }, { "fb88c400d602fe759ae74ef1716ee84e", "20th Century Fox Video Games, Bill Aspromonte", "11031", "Crash Dive (1983) (20th Century Fox)", "AKA Voyage to the Bottom of the Sea", "", "", "", "", "", "", "", "", "", "", "", "", "30", "", "", "" },
{ "fb91da78455d9b1606913fbf8c859772", "", "", "Split Screen (Ballblazer) Demo (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "fb91da78455d9b1606913fbf8c859772", "", "", "Split Screen (Ballblazer) Demo (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "fb91dfc36cddaa54b09924ae8fd96199", "Parker Brothers, Mark Lesser", "PB5590", "Frogger II (1984) (Parker Bros) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, { "fb91dfc36cddaa54b09924ae8fd96199", "Parker Brothers, Mark Lesser", "PB5590", "Frogger II (1984) (Parker Bros) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" },

View File

@ -59,8 +59,11 @@ void Properties::set(PropertyType key, const string& value)
switch(key) switch(key)
{ {
case Cartridge_Sound:
case Cartridge_Type: case Cartridge_Type:
case Display_Format:
if(BSPF_equalsIgnoreCase(myProperties[key], "AUTO-DETECT"))
myProperties[key] = "AUTO";
case Cartridge_Sound:
case Console_LeftDifficulty: case Console_LeftDifficulty:
case Console_RightDifficulty: case Console_RightDifficulty:
case Console_TelevisionType: case Console_TelevisionType:
@ -69,7 +72,6 @@ void Properties::set(PropertyType key, const string& value)
case Controller_Right: case Controller_Right:
case Controller_SwapPaddles: case Controller_SwapPaddles:
case Controller_MouseAxis: case Controller_MouseAxis:
case Display_Format:
case Display_Phosphor: case Display_Phosphor:
{ {
transform(myProperties[key].begin(), myProperties[key].end(), transform(myProperties[key].begin(), myProperties[key].end(),
@ -301,27 +303,27 @@ void Properties::printHeader()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const char* Properties::ourDefaultProperties[LastPropType] = { const char* Properties::ourDefaultProperties[LastPropType] = {
"", // Cartridge.MD5 "", // Cartridge.MD5
"", // Cartridge.Manufacturer "", // Cartridge.Manufacturer
"", // Cartridge.ModelNo "", // Cartridge.ModelNo
"Untitled", // Cartridge.Name "Untitled", // Cartridge.Name
"", // Cartridge.Note "", // Cartridge.Note
"", // Cartridge.Rarity "", // Cartridge.Rarity
"MONO", // Cartridge.Sound "MONO", // Cartridge.Sound
"AUTO-DETECT", // Cartridge.Type "AUTO", // Cartridge.Type
"B", // Console.LeftDifficulty "B", // Console.LeftDifficulty
"B", // Console.RightDifficulty "B", // Console.RightDifficulty
"COLOR", // Console.TelevisionType "COLOR", // Console.TelevisionType
"NO", // Console.SwapPorts "NO", // Console.SwapPorts
"JOYSTICK", // Controller.Left "JOYSTICK", // Controller.Left
"JOYSTICK", // Controller.Right "JOYSTICK", // Controller.Right
"NO", // Controller.SwapPaddles "NO", // Controller.SwapPaddles
"AUTO", // Controller.MouseAxis "AUTO", // Controller.MouseAxis
"AUTO-DETECT", // Display.Format "AUTO", // Display.Format
"34", // Display.YStart "34", // Display.YStart
"210", // Display.Height "210", // Display.Height
"NO", // Display.Phosphor "NO", // Display.Phosphor
"77" // Display.PPBlend "77" // Display.PPBlend
}; };
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -141,12 +141,12 @@ void TIA::reset()
myFrameCounter = myPALFrameCounter = 0; myFrameCounter = myPALFrameCounter = 0;
myScanlineCountForLastFrame = 0; myScanlineCountForLastFrame = 0;
myCurrentP0Mask = &TIATables::PxMask[0][0][0][0]; myP0Mask = &TIATables::PxMask[0][0][0][0];
myCurrentP1Mask = &TIATables::PxMask[0][0][0][0]; myP1Mask = &TIATables::PxMask[0][0][0][0];
myCurrentM0Mask = &TIATables::MxMask[0][0][0][0]; myM0Mask = &TIATables::MxMask[0][0][0][0];
myCurrentM1Mask = &TIATables::MxMask[0][0][0][0]; myM1Mask = &TIATables::MxMask[0][0][0][0];
myCurrentBLMask = &TIATables::BLMask[0][0][0]; myBLMask = &TIATables::BLMask[0][0][0];
myCurrentPFMask = TIATables::PFMask[0]; myPFMask = TIATables::PFMask[0];
// Recalculate the size of the display // Recalculate the size of the display
toggleFixedColors(0); toggleFixedColors(0);
@ -600,6 +600,18 @@ inline void TIA::startFrame()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
inline void TIA::endFrame() inline void TIA::endFrame()
{ {
// The TIA may generate frames that are 'invisible' to TV (they complete
// before the first visible scanline)
// Such 'short' frames can't simply be eliminated, since they're running
// code at that point; however, they are not shown at all, otherwise the
// double-buffering of the video output will get confused
if(scanlines() <= myStartScanline)
{
// Skip display of this frame, as if it wasn't generated at all
startFrame();
return;
}
// This stuff should only happen at the end of a frame // This stuff should only happen at the end of a frame
// Compute the number of scanlines in the frame // Compute the number of scanlines in the frame
uInt32 previousCount = myScanlineCountForLastFrame; uInt32 previousCount = myScanlineCountForLastFrame;
@ -1024,12 +1036,12 @@ void TIA::updateFrame(Int32 clock)
else else
{ {
// Update masks // Update masks
myCurrentBLMask = &TIATables::BLMask[myPOSBL & 0x03] myP0Mask = &TIATables::PxMask[myPOSP0 & 0x03]
[(myCTRLPF & 0x30) >> 4][160 - (myPOSBL & 0xFC)];
myCurrentP0Mask = &TIATables::PxMask[myPOSP0 & 0x03]
[mySuppressP0][myNUSIZ0 & 0x07][160 - (myPOSP0 & 0xFC)]; [mySuppressP0][myNUSIZ0 & 0x07][160 - (myPOSP0 & 0xFC)];
myCurrentP1Mask = &TIATables::PxMask[myPOSP1 & 0x03] myP1Mask = &TIATables::PxMask[myPOSP1 & 0x03]
[mySuppressP1][myNUSIZ1 & 0x07][160 - (myPOSP1 & 0xFC)]; [mySuppressP1][myNUSIZ1 & 0x07][160 - (myPOSP1 & 0xFC)];
myBLMask = &TIATables::BLMask[myPOSBL & 0x03]
[(myCTRLPF & 0x30) >> 4][160 - (myPOSBL & 0xFC)];
// TODO - 08-27-2009: Simulate the weird effects of Cosmic Ark and // TODO - 08-27-2009: Simulate the weird effects of Cosmic Ark and
// Stay Frosty. The movement itself is well understood, but there // Stay Frosty. The movement itself is well understood, but there
@ -1045,21 +1057,23 @@ void TIA::updateFrame(Int32 clock)
case 3: case 3:
// Stretch this missle so it's 2 pixels wide and shifted one // Stretch this missle so it's 2 pixels wide and shifted one
// pixel to the left // pixel to the left
myCurrentM0Mask = &TIATables::MxMask[(myPOSM0-1) & 0x03] myM0Mask = &TIATables::MxMask[(myPOSM0-1) & 0x03]
[myNUSIZ0 & 0x07][((myNUSIZ0 & 0x30) >> 4)|1][160 - ((myPOSM0-1) & 0xFC)]; [myNUSIZ0 & 0x07][((myNUSIZ0 & 0x30) >> 4)|1]
[160 - ((myPOSM0-1) & 0xFC)];
break; break;
case 2: case 2:
// Missle is disabled on this line // Missle is disabled on this line
myCurrentM0Mask = &TIATables::DisabledMask[0]; myM0Mask = &TIATables::DisabledMask[0];
break; break;
default: default:
myCurrentM0Mask = &TIATables::MxMask[myPOSM0 & 0x03] myM0Mask = &TIATables::MxMask[myPOSM0 & 0x03]
[myNUSIZ0 & 0x07][(myNUSIZ0 & 0x30) >> 4][160 - (myPOSM0 & 0xFC)]; [myNUSIZ0 & 0x07][(myNUSIZ0 & 0x30) >> 4]
[160 - (myPOSM0 & 0xFC)];
break; break;
} }
} }
else else
myCurrentM0Mask = &TIATables::MxMask[myPOSM0 & 0x03] myM0Mask = &TIATables::MxMask[myPOSM0 & 0x03]
[myNUSIZ0 & 0x07][(myNUSIZ0 & 0x30) >> 4][160 - (myPOSM0 & 0xFC)]; [myNUSIZ0 & 0x07][(myNUSIZ0 & 0x30) >> 4][160 - (myPOSM0 & 0xFC)];
if(myHMM1mmr) if(myHMM1mmr)
{ {
@ -1068,21 +1082,23 @@ void TIA::updateFrame(Int32 clock)
case 3: case 3:
// Stretch this missle so it's 2 pixels wide and shifted one // Stretch this missle so it's 2 pixels wide and shifted one
// pixel to the left // pixel to the left
myCurrentM1Mask = &TIATables::MxMask[(myPOSM1-1) & 0x03] myM1Mask = &TIATables::MxMask[(myPOSM1-1) & 0x03]
[myNUSIZ1 & 0x07][((myNUSIZ1 & 0x30) >> 4)|1][160 - ((myPOSM1-1) & 0xFC)]; [myNUSIZ1 & 0x07][((myNUSIZ1 & 0x30) >> 4)|1]
[160 - ((myPOSM1-1) & 0xFC)];
break; break;
case 2: case 2:
// Missle is disabled on this line // Missle is disabled on this line
myCurrentM1Mask = &TIATables::DisabledMask[0]; myM1Mask = &TIATables::DisabledMask[0];
break; break;
default: default:
myCurrentM1Mask = &TIATables::MxMask[myPOSM1 & 0x03] myM1Mask = &TIATables::MxMask[myPOSM1 & 0x03]
[myNUSIZ1 & 0x07][(myNUSIZ1 & 0x30) >> 4][160 - (myPOSM1 & 0xFC)]; [myNUSIZ1 & 0x07][(myNUSIZ1 & 0x30) >> 4]
[160 - (myPOSM1 & 0xFC)];
break; break;
} }
} }
else else
myCurrentM1Mask = &TIATables::MxMask[myPOSM1 & 0x03] myM1Mask = &TIATables::MxMask[myPOSM1 & 0x03]
[myNUSIZ1 & 0x07][(myNUSIZ1 & 0x30) >> 4][160 - (myPOSM1 & 0xFC)]; [myNUSIZ1 & 0x07][(myNUSIZ1 & 0x30) >> 4][160 - (myPOSM1 & 0xFC)];
uInt8 enabledObjects = myEnabledObjects & myDisabledObjects; uInt8 enabledObjects = myEnabledObjects & myDisabledObjects;
@ -1090,21 +1106,21 @@ void TIA::updateFrame(Int32 clock)
for(; myFramePointer < ending; ++myFramePointer, ++hpos) for(; myFramePointer < ending; ++myFramePointer, ++hpos)
{ {
uInt8 enabled = ((enabledObjects & PFBit) && uInt8 enabled = ((enabledObjects & PFBit) &&
(myPF & myCurrentPFMask[hpos])) ? PFBit : 0; (myPF & myPFMask[hpos])) ? PFBit : 0;
if((enabledObjects & BLBit) && myCurrentBLMask[hpos]) if((enabledObjects & BLBit) && myBLMask[hpos])
enabled |= BLBit; enabled |= BLBit;
if((enabledObjects & P1Bit) && (myCurrentGRP1 & myCurrentP1Mask[hpos])) if((enabledObjects & P1Bit) && (myCurrentGRP1 & myP1Mask[hpos]))
enabled |= P1Bit; enabled |= P1Bit;
if((enabledObjects & M1Bit) && myCurrentM1Mask[hpos]) if((enabledObjects & M1Bit) && myM1Mask[hpos])
enabled |= M1Bit; enabled |= M1Bit;
if((enabledObjects & P0Bit) && (myCurrentGRP0 & myCurrentP0Mask[hpos])) if((enabledObjects & P0Bit) && (myCurrentGRP0 & myP0Mask[hpos]))
enabled |= P0Bit; enabled |= P0Bit;
if((enabledObjects & M0Bit) && myCurrentM0Mask[hpos]) if((enabledObjects & M0Bit) && myM0Mask[hpos])
enabled |= M0Bit; enabled |= M0Bit;
myCollision |= TIATables::CollisionMask[enabled]; myCollision |= TIATables::CollisionMask[enabled];
@ -1130,7 +1146,7 @@ void TIA::updateFrame(Int32 clock)
if(myClocksToEndOfScanLine == 228) if(myClocksToEndOfScanLine == 228)
{ {
// Yes, so set PF mask based on current CTRLPF reflection state // Yes, so set PF mask based on current CTRLPF reflection state
myCurrentPFMask = TIATables::PFMask[myCTRLPF & 0x01]; myPFMask = TIATables::PFMask[myCTRLPF & 0x01];
// TODO - 01-21-99: These should be reset right after the first copy // TODO - 01-21-99: These should be reset right after the first copy
// of the player has passed. However, for now we'll just reset at the // of the player has passed. However, for now we'll just reset at the
@ -1460,7 +1476,7 @@ bool TIA::poke(uInt16 addr, uInt8 value)
// Update the playfield mask based on reflection state if // Update the playfield mask based on reflection state if
// we're still on the left hand side of the playfield // we're still on the left hand side of the playfield
if(((clock - myClockWhenFrameStarted) % 228) < (68 + 79)) if(((clock - myClockWhenFrameStarted) % 228) < (68 + 79))
myCurrentPFMask = TIATables::PFMask[myCTRLPF & 0x01]; myPFMask = TIATables::PFMask[myCTRLPF & 0x01];
break; break;
} }

View File

@ -550,24 +550,12 @@ class TIA : public Device
// It's VERY important that the BL, M0, M1, P0 and P1 current // It's VERY important that the BL, M0, M1, P0 and P1 current
// mask pointers are always on a uInt32 boundary. Otherwise, // mask pointers are always on a uInt32 boundary. Otherwise,
// the TIA code will fail on a good number of CPUs. // the TIA code will fail on a good number of CPUs.
const uInt8* myP0Mask;
// Pointer to the currently active mask array for the ball const uInt8* myM0Mask;
uInt8* myCurrentBLMask; const uInt8* myM1Mask;
const uInt8* myP1Mask;
// Pointer to the currently active mask array for missle 0 const uInt8* myBLMask;
uInt8* myCurrentM0Mask; const uInt32* myPFMask;
// Pointer to the currently active mask array for missle 1
uInt8* myCurrentM1Mask;
// Pointer to the currently active mask array for player 0
uInt8* myCurrentP0Mask;
// Pointer to the currently active mask array for player 1
uInt8* myCurrentP1Mask;
// Pointer to the currently active mask array for the playfield
uInt32* myCurrentPFMask;
// Audio values; only used by TIADebug // Audio values; only used by TIADebug
uInt8 myAUDV0, myAUDV1, myAUDC0, myAUDC1, myAUDF0, myAUDF1; uInt8 myAUDV0, myAUDV1, myAUDC0, myAUDC1, myAUDF0, myAUDF1;

View File

@ -25,9 +25,7 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TIATables::computeAllTables() void TIATables::computeAllTables()
{ {
for(uInt32 i = 0; i < 640; ++i) memset(DisabledMask, 0, 640);
DisabledMask[i] = 0;
buildCollisionMaskTable(); buildCollisionMaskTable();
buildPxMaskTable(); buildPxMaskTable();
buildMxMaskTable(); buildMxMaskTable();
@ -102,10 +100,9 @@ void TIATables::buildPxMaskTable()
Int32 x, suppress, nusiz; Int32 x, suppress, nusiz;
// Set the player mask table to all zeros // Set the player mask table to all zeros
for(suppress = 0; suppress < 2; ++suppress) for(nusiz = 0; nusiz < 8; ++nusiz)
for(nusiz = 0; nusiz < 8; ++nusiz) for(x = 0; x < 160; ++x)
for(x = 0; x < 160; ++x) PxMask[0][0][nusiz][x] = PxMask[0][1][nusiz][x] = 0x00;
PxMask[0][suppress][nusiz][x] = 0x00;
// Now, compute the player mask table // Now, compute the player mask table
for(suppress = 0; suppress < 2; ++suppress) for(suppress = 0; suppress < 2; ++suppress)
@ -194,15 +191,14 @@ void TIATables::buildPxMaskTable()
// Now, copy data for alignments of 1, 2 and 3 // Now, copy data for alignments of 1, 2 and 3
for(uInt32 align = 1; align < 4; ++align) for(uInt32 align = 1; align < 4; ++align)
{ {
for(suppress = 0; suppress < 2; ++suppress) for(nusiz = 0; nusiz < 8; ++nusiz)
{ {
for(nusiz = 0; nusiz < 8; ++nusiz) for(x = 0; x < 320; ++x)
{ {
for(x = 0; x < 320; ++x) PxMask[align][0][nusiz][x] =
{ PxMask[0][0][nusiz][(x + 320 - align) % 320];
PxMask[align][suppress][nusiz][x] = PxMask[align][1][nusiz][x] =
PxMask[0][suppress][nusiz][(x + 320 - align) % 320]; PxMask[0][1][nusiz][(x + 320 - align) % 320];
}
} }
} }
} }
@ -662,7 +658,7 @@ const Int16 TIATables::PokeDelay[64] = {
0, // HMCLR 0, // HMCLR
0, // CXCLR 0, // CXCLR
// remaining values are undefined TIA write locations // remaining values are undefined TIA write locations
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}; };
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -8051,7 +8051,6 @@
"Cartridge.ModelNo" "460673" "Cartridge.ModelNo" "460673"
"Cartridge.Name" "Pick 'n' Pile (1990) (Salu) (PAL)" "Cartridge.Name" "Pick 'n' Pile (1990) (Salu) (PAL)"
"Console.SwapPorts" "YES" "Console.SwapPorts" "YES"
"Display.Format" "PAL"
"Display.YStart" "38" "Display.YStart" "38"
"Display.Height" "256" "Display.Height" "256"
"Display.Phosphor" "YES" "Display.Phosphor" "YES"
@ -19989,3 +19988,8 @@
"Cartridge.Rarity" "Homebrew" "Cartridge.Rarity" "Homebrew"
"Display.Phosphor" "YES" "Display.Phosphor" "YES"
"" ""
"Cartridge.MD5" "fb884ffd89013331a6f01ae3f6abd214"
"Cartridge.Manufacturer" "Activision, David Crane"
"Cartridge.Name" "Venetian Blinds Demo (1982) (Activision) (PAL)"
""

View File

@ -136,7 +136,7 @@ GameInfoDialog::GameInfoDialog(
"Type:", kTextAlignLeft); "Type:", kTextAlignLeft);
pwidth = font.getStringWidth("CM (SpectraVideo CompuMate)"); pwidth = font.getStringWidth("CM (SpectraVideo CompuMate)");
items.clear(); items.clear();
items.push_back("Auto-detect", "AUTO-DETECT"); items.push_back("Auto-detect", "AUTO" );
items.push_back("0840 (8K ECONObank)", "0840" ); items.push_back("0840 (8K ECONObank)", "0840" );
items.push_back("2IN1 Multicart (4-32K)", "2IN1" ); items.push_back("2IN1 Multicart (4-32K)", "2IN1" );
items.push_back("4IN1 Multicart (8-32K)", "4IN1" ); items.push_back("4IN1 Multicart (8-32K)", "4IN1" );
@ -339,7 +339,7 @@ GameInfoDialog::GameInfoDialog(
new StaticTextWidget(myTab, font, xpos, ypos+1, lwidth, fontHeight, new StaticTextWidget(myTab, font, xpos, ypos+1, lwidth, fontHeight,
"Format:", kTextAlignLeft); "Format:", kTextAlignLeft);
items.clear(); items.clear();
items.push_back("Auto-detect", "AUTO-DETECT"); items.push_back("Auto-detect", "AUTO");
items.push_back("NTSC", "NTSC"); items.push_back("NTSC", "NTSC");
items.push_back("PAL", "PAL"); items.push_back("PAL", "PAL");
items.push_back("SECAM", "SECAM"); items.push_back("SECAM", "SECAM");
@ -455,7 +455,7 @@ void GameInfoDialog::loadView()
myRarity->setEditString(myGameProperties.get(Cartridge_Rarity)); myRarity->setEditString(myGameProperties.get(Cartridge_Rarity));
myNote->setEditString(myGameProperties.get(Cartridge_Note)); myNote->setEditString(myGameProperties.get(Cartridge_Note));
mySound->setSelected(myGameProperties.get(Cartridge_Sound), "MONO"); mySound->setSelected(myGameProperties.get(Cartridge_Sound), "MONO");
myType->setSelected(myGameProperties.get(Cartridge_Type), "AUTO-DETECT"); myType->setSelected(myGameProperties.get(Cartridge_Type), "AUTO");
// Console properties // Console properties
myLeftDiff->setSelected(myGameProperties.get(Console_LeftDifficulty), "B"); myLeftDiff->setSelected(myGameProperties.get(Console_LeftDifficulty), "B");
@ -488,7 +488,7 @@ void GameInfoDialog::loadView()
myMouseY->setEnabled(!autoAxis); myMouseY->setEnabled(!autoAxis);
// Display properties // Display properties
myFormat->setSelected(myGameProperties.get(Display_Format), "AUTO-DETECT"); myFormat->setSelected(myGameProperties.get(Display_Format), "AUTO");
myYStart->setEditString(myGameProperties.get(Display_YStart)); myYStart->setEditString(myGameProperties.get(Display_YStart));
myHeight->setEditString(myGameProperties.get(Display_Height)); myHeight->setEditString(myGameProperties.get(Display_Height));

View File

@ -64,7 +64,7 @@ GlobalPropsDialog::
new StaticTextWidget(this, font, xpos, ypos+1, lwidth, fontHeight, new StaticTextWidget(this, font, xpos, ypos+1, lwidth, fontHeight,
"Bankswitch type:", kTextAlignLeft); "Bankswitch type:", kTextAlignLeft);
items.clear(); items.clear();
items.push_back("Auto-detect", "AUTO-DETECT"); items.push_back("Auto-detect", "AUTO" );
items.push_back("0840 (8K ECONObank)", "0840" ); items.push_back("0840 (8K ECONObank)", "0840" );
items.push_back("2IN1 Multicart (4-32K)", "2IN1" ); items.push_back("2IN1 Multicart (4-32K)", "2IN1" );
items.push_back("4IN1 Multicart (8-32K)", "4IN1" ); items.push_back("4IN1 Multicart (8-32K)", "4IN1" );
@ -184,7 +184,7 @@ void GlobalPropsDialog::loadConfig()
{ {
Settings& settings = instance().settings(); Settings& settings = instance().settings();
myBSType->setSelected(settings.getString("bs"), "AUTO-DETECT"); myBSType->setSelected(settings.getString("bs"), "AUTO");
myLeftDiff->setSelected(settings.getString("ld"), "DEFAULT"); myLeftDiff->setSelected(settings.getString("ld"), "DEFAULT");
myRightDiff->setSelected(settings.getString("rd"), "DEFAULT"); myRightDiff->setSelected(settings.getString("rd"), "DEFAULT");
myTVType->setSelected(settings.getString("tv"), "DEFAULT"); myTVType->setSelected(settings.getString("tv"), "DEFAULT");
@ -201,7 +201,7 @@ void GlobalPropsDialog::saveConfig()
string s; string s;
s = myBSType->getSelectedTag(); s = myBSType->getSelectedTag();
if(s == "AUTO-DETECT") s = ""; if(s == "AUTO") s = "";
settings.setString("bs", s); settings.setString("bs", s);
s = myLeftDiff->getSelectedTag(); s = myLeftDiff->getSelectedTag();
@ -224,7 +224,7 @@ void GlobalPropsDialog::saveConfig()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void GlobalPropsDialog::setDefaults() void GlobalPropsDialog::setDefaults()
{ {
myBSType->setSelected("AUTO-DETECT", ""); myBSType->setSelected("AUTO", "");
myLeftDiff->setSelected("DEFAULT", ""); myLeftDiff->setSelected("DEFAULT", "");
myRightDiff->setSelected("DEFAULT", ""); myRightDiff->setSelected("DEFAULT", "");
myTVType->setSelected("DEFAULT", ""); myTVType->setSelected("DEFAULT", "");

View File

@ -57,7 +57,7 @@ my @prop_defaults = (
"", "",
"", "",
"MONO", "MONO",
"AUTO-DETECT", "AUTO",
"B", "B",
"B", "B",
"COLOR", "COLOR",
@ -66,7 +66,7 @@ my @prop_defaults = (
"JOYSTICK", "JOYSTICK",
"NO", "NO",
"AUTO", "AUTO",
"AUTO-DETECT", "AUTO",
"34", "34",
"210", "210",
"NO", "NO",