initial commit

defines properties for Asteroids, Chopper Command and Frooger
add new properties parser
add reading score etc. from RAM
add test hotkeys (CTRL+SHIFT S/V) display current score and variation
This commit is contained in:
thrust26 2020-02-07 23:08:44 +01:00
parent ae43b33c7b
commit 4f100b0fce
9 changed files with 296 additions and 6 deletions

View File

@ -505,6 +505,8 @@ PhysicalKeyboardHandler::EventMappingArray PhysicalKeyboardHandler::DefaultCommo
{Event::Unwind1Menu, KBDK_RIGHT, MOD3},
{Event::Unwind10Menu, KBDK_RIGHT, KBDM_SHIFT | MOD3},
{Event::UnwindAllMenu, KBDK_UP, MOD3},
{Event::ShowScore, KBDK_S, KBDM_SHIFT | KBDM_CTRL},
{Event::ShowVariation, KBDK_V, KBDM_SHIFT | KBDM_CTRL},
#if defined(RETRON77)
{Event::ConsoleColorToggle, KBDK_F4}, // back ("COLOR","B/W")

View File

@ -1145,6 +1145,144 @@ void Console::stateChanged(EventHandlerState state)
// only the CompuMate used to care about state changes
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 Console::numVariations()
{
string numVariations = myProperties.get(PropType::Cart_Variations);
return (numVariations == EmptyString) ? 1 : std::min(stoi(numVariations), 256);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 Console::numPlayers()
{
string numPlayers = myProperties.get(PropType::Cart_Players);
return (numPlayers == EmptyString) ? 1 : std::min(stoi(numPlayers), 4);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Console::parseAdresses(Int32& variation, Int32& player, Int32 scores[])
{
// format:
// b, ; variation format (BCD, HEX)
// 0, ; add to variation
// 80, ; variation address in hex
// 81, ; player address in hex
// b, ; score format (BCD, HEX)
// 10, ; score multiplier
// 2, ; score addresses per player
// n-times 82, ; score addresses player 1 in hex, high to low
// n-times 83, ; score addresses player 2 in hex, high to low
// ...
/*
Frogger
"Cart.Players" "2"
"Cart.Variations" "6"
"Cart.Addresses" "b,0,dd,e6,b,1,2,cc,ce,cd,cf"
Chopper Command:
"Cart.Variations" "4"
"Cart.Players" "2"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
Asteroids
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
*/
string addresses = myProperties.get(PropType::Cart_Addresses);
char format;
Int16 addr;
Int32 varAdd, numScoreAddr, scoreMult;
// Since istringstream swallows whitespace, we have to make the
// delimiters be spaces
std::replace(addresses.begin(), addresses.end(), ',', ' ');
std::replace(addresses.begin(), addresses.end(), '|', ' ');
istringstream buf(addresses);
// 1. retrieve current variation (0..255)
if (!(buf >> format && buf >> varAdd && buf >> std::hex >> addr))
return false;
variation = mySystem->peek(addr);
if (format == 'b')
variation = (variation >> 4) * 10 + variation % 16;
variation += varAdd;
variation = std::min(variation, numVariations());
// 2. retrieve current player (0..3)
string playerFormat;
if (!(buf >> std::hex >> addr))
return false;
player = mySystem->peek(addr);
player = std::min(player, numPlayers());
// 3. retrieve current scores for all players
if (!(buf >> format && buf >> std::dec >> scoreMult && buf >> std::hex >> numScoreAddr))
return false;
for (int i = 0; i < numPlayers(); ++i)
{
Int32 totalScore = 0;
for (int j = 0; j < numScoreAddr; ++j)
{
Int32 score;
if (!(buf >> std::hex >> addr))
return false;
totalScore *= (format == 'b') ? 100 : 256;
score = mySystem->peek(addr);
if (format == 'b')
score = (score >> 4) * 10 + score % 16;
totalScore += score;
}
scores[i] = totalScore * scoreMult;
}
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 Console::variation()
{
Int32 variation, player, scores[4];
if (parseAdresses(variation, player, scores))
return variation;
return -1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 Console::player()
{
Int32 variation, player, scores[4];
if (parseAdresses(variation, player, scores))
return player;
return -1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Int32 Console::score()
{
Int32 variation, player, scores[4];
if (parseAdresses(variation, player, scores))
return scores[std::min(player, Int32(3))];
return -1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PaletteArray Console::ourNTSCPalette = {
0x000000, 0, 0x4a4a4a, 0, 0x6f6f6f, 0, 0x8e8e8e, 0,

View File

@ -326,6 +326,16 @@ class Console : public Serializable, public ConsoleIO
*/
void setTIAProperties();
/*
Methods for returning high score related variables
Return -1 if undefined
*/
Int32 numVariations();
Int32 numPlayers();
Int32 variation();
Int32 player();
Int32 score();
private:
/**
* Define console timing based on current display format
@ -442,6 +452,8 @@ class Console : public Serializable, public ConsoleIO
// The audio settings
AudioSettings& myAudioSettings;
bool parseAdresses(Int32& variation, Int32& player, Int32 scores[]);
// Table of RGB values for NTSC, PAL and SECAM
static PaletteArray ourNTSCPalette;
static PaletteArray ourPALPalette;

View File

@ -120,6 +120,7 @@ class Event
ToggleFrameStats, ToggleSAPortOrder, ExitGame,
// add new events from here to avoid that user remapped events get overwritten
ShowScore, ShowVariation,
LastType
};

View File

@ -717,6 +717,24 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated)
if(pressed && !repeated) myOSystem.frameBuffer().tiaSurface().saveSnapShot();
return;
case Event::ShowScore:
if (pressed)
{
ostringstream msg;
msg << "Score: " << myOSystem.console().score();
myOSystem.frameBuffer().showMessage(msg.str());
}
return;
case Event::ShowVariation:
if (pressed)
{
ostringstream msg;
msg << "Variation: " << myOSystem.console().variation();
myOSystem.frameBuffer().showMessage(msg.str());
}
return;
case Event::ExitMode:
// Special handling for Escape key
// Basically, exit whichever mode we're currently in
@ -1987,7 +2005,9 @@ EventHandler::EmulActionList EventHandler::ourEmulActionList = { {
{ Event::Combo13, "Combo 13", "" },
{ Event::Combo14, "Combo 14", "" },
{ Event::Combo15, "Combo 15", "" },
{ Event::Combo16, "Combo 16", "" }
{ Event::Combo16, "Combo 16", "" },
{ Event::ShowScore, "Display current score", "" },
{ Event::ShowVariation, "Display current variation", "" },
} };
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -2026,6 +2046,7 @@ const Event::EventSet EventHandler::MiscEvents = {
// Event::MouseButtonLeftValue, Event::MouseButtonRightValue,
Event::HandleMouseControl, Event::ToggleGrabMouse,
Event::ToggleSAPortOrder,
Event::ShowScore, Event::ShowVariation,
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -468,7 +468,7 @@ class EventHandler
#else
PNG_SIZE = 0,
#endif
EMUL_ACTIONLIST_SIZE = 144 + PNG_SIZE + COMBO_SIZE,
EMUL_ACTIONLIST_SIZE = 144 + 2 + PNG_SIZE + COMBO_SIZE,
MENU_ACTIONLIST_SIZE = 18
;

View File

@ -255,7 +255,10 @@ void Properties::print() const
<< get(PropType::Display_Format) << "|"
<< get(PropType::Display_VCenter) << "|"
<< get(PropType::Display_Phosphor) << "|"
<< get(PropType::Display_PPBlend)
<< get(PropType::Display_PPBlend) << "|"
<< get(PropType::Cart_Players) << "|"
<< get(PropType::Cart_Variations) << "|"
<< get(PropType::Cart_Addresses)
<< endl;
}
@ -300,7 +303,10 @@ void Properties::printHeader()
<< "Display_Format|"
<< "Display_VCenter|"
<< "Display_Phosphor|"
<< "Display_PPBlend"
<< "Display_PPBlend|"
<< "Cart_Players|"
<< "Cart_Variations|"
<< "Cart_Addresses"
<< endl;
}
@ -327,7 +333,10 @@ std::array<string, Properties::NUM_PROPS> Properties::ourDefaultProperties =
"AUTO", // Display.Format
"0", // Display.VCenter
"NO", // Display.Phosphor
"0" // Display.PPBlend
"0", // Display.PPBlend
"1", // Cart.Players
"1", // Cart.Variations
"" // Cart.Addresses
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -353,5 +362,8 @@ std::array<string, Properties::NUM_PROPS> Properties::ourPropertyNames =
"Display.Format",
"Display.VCenter",
"Display.Phosphor",
"Display.PPBlend"
"Display.PPBlend",
"Cart.Players",
"Cart.Variations",
"Cart.Addresses"
};

View File

@ -42,6 +42,9 @@ enum class PropType : uInt8 {
Display_VCenter,
Display_Phosphor,
Display_PPBlend,
Cart_Players,
Cart_Variations,
Cart_Addresses,
NumTypes
};

View File

@ -210,6 +210,10 @@
"Cart.Manufacturer" "Parker Brothers, Ed English, David Lamkins"
"Cart.ModelNo" "931502"
"Cart.Name" "Frogger (1982) (Parker Bros) (PAL)"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "6"
"Cart.Addresses" "b,0,dd,e6,b,1,2,cc,ce,cd,cf"
""
"Cart.MD5" "02cee0b140d2f1a1efcfb1d482a5c392"
@ -638,6 +642,10 @@
"Cart.Manufacturer" "Parker Brothers, Ed English, David Lamkins"
"Cart.ModelNo" "PB5300"
"Cart.Name" "Frogger (1982) (Parker Bros)"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "6"
"Cart.Addresses" "b,0,dd,e6,b,1,2,cc,ce,cd,cf"
""
"Cart.MD5" "082fdc8bd47fef01482ce5883c4ffdb8"
@ -1501,6 +1509,9 @@
"Cart.Manufacturer" "Activision, Bob Whitehead - Ariola"
"Cart.ModelNo" "EAX-015, EAX-015-04I - 711 015-725"
"Cart.Name" "Chopper Command (1982) (Activision) (PAL)"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "11bcf5c752088b5aaf86d6c7a6a11e8d"
@ -2209,6 +2220,9 @@
"Cart.ModelNo" "CX2649, CX2649P"
"Cart.Name" "Asteroids (1981) (Atari) (PAL) [a2]"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "19b3b807507653516985ba95da92499d"
@ -2380,6 +2394,9 @@
"Cart.Manufacturer" "Jone Yuan Telephonic Enterprise Co"
"Cart.Name" "Chopper Command (Jone Yuan)"
"Cart.Note" "2600 Screen Search Console"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "1cafa9f3f9a2fce4af6e4b85a2bbd254"
@ -3138,6 +3155,9 @@
"Cart.Manufacturer" "Activision, Bob Whitehead"
"Cart.ModelNo" "AX-015, AX-015-04"
"Cart.Name" "Chopper Command (1982) (Activision) (16K)"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "25e73efb9a6edf119114718bd2f646ba"
@ -3553,6 +3573,9 @@
"Cart.ModelNo" "PGP213"
"Cart.Name" "Spy Vs. Spy (4 Game in One) (1983) (BitCorp) (PAL)"
"Cart.Note" "AKA Chopper Command"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "2a9f9001540c55a302befd8e9d54b47b"
@ -3877,6 +3900,9 @@
"Controller.Right" "DRIVING"
"Controller.MouseAxis" "58"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "2dcf9ce486393cd36ca0928cd53b96cb"
@ -4262,6 +4288,9 @@
"Cart.Note" "Hack of Asteroids"
"Cart.Rarity" "Hack"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "3276c777cbe97cdd2b4a63ffc16b7151"
@ -4727,6 +4756,9 @@
"Cart.Name" "Pyramid War (1983) (Rainbow Vision) (PAL) [a2]"
"Cart.Note" "AKA Chopper Command"
"Display.Format" "PAL"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "384db97670817103dd8c0bbdef132445"
@ -5097,6 +5129,9 @@
"Cart.Manufacturer" "Dismac"
"Cart.Name" "Comando Suicida (Dismac)"
"Cart.Note" "AKA Chopper Command"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "3c7a7b3a0a7e6319b2fa0f923ef6c9af"
@ -5270,6 +5305,9 @@
"Cart.Note" "Genesis controller (C is hyperspace)"
"Cart.Rarity" "Hack of Asteroids"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "3e5ca1afaa27c5da3c54c9942fec528b"
@ -6022,6 +6060,9 @@
"Cart.Note" "Hack of Asteroids"
"Cart.Rarity" "Hack"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "47cd61f83457a0890de381e478f5cf5f"
@ -6879,6 +6920,9 @@
"Cart.Manufacturer" "Activision, Bob Whitehead"
"Cart.ModelNo" "AX-015, AX-015-04"
"Cart.Name" "Chopper Command (1982) (Activision) (8K)"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "521f4dd1eb84a09b2b19959a41839aad"
@ -7677,6 +7721,9 @@
"Cart.Note" "Hack of Asteroids"
"Cart.Rarity" "Hack"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "5bcc83677d68f7ef74c1b4a0697ba2a8"
@ -7711,6 +7758,9 @@
"Cart.ModelNo" "SS-004"
"Cart.Name" "Pyramid War (1983) (Rainbow Vision) (PAL) [a1]"
"Cart.Note" "AKA Chopper Command"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "5c19f6da638c4c7c1f98d09e63df43e4"
@ -9458,6 +9508,9 @@
"Cart.ModelNo" "SS-004"
"Cart.Name" "Pyramid War (1983) (Rainbow Vision) (PAL)"
"Cart.Note" "AKA Chopper Command"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "6fc27a9233fc69d28d3f190b4ff80f03"
@ -11366,6 +11419,9 @@
"Cart.Manufacturer" "CCE"
"Cart.ModelNo" "C-827"
"Cart.Name" "Chopper Command (1983) (CCE)"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "85b1bca93e69f13905107cc802a02470"
@ -11927,6 +11983,9 @@
"Cart.Name" "Asteroids (1981) (Atari) (PAL)"
"Cart.Rarity" "Common"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "8d00a38f4c8f8800f1c237215ac243fc"
@ -11966,6 +12025,9 @@
"Cart.Note" "Hack of Asteroids"
"Cart.Rarity" "Hack"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "8e0ab801b1705a740b476b7f588c6d16"
@ -14070,6 +14132,9 @@
"Cart.ModelNo" "CX2649, CX2649P"
"Cart.Name" "Asteroids (1981) (Atari) (PAL) [a1]"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "a97733b0852ee3096300102cb0689175"
@ -14752,6 +14817,9 @@
"Cart.Name" "Asteroids (1981) (Atari) [a1]"
"Cart.Rarity" "Common"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "b23ebf427713dd0198b7ef47dbd07ef4"
@ -15326,6 +15394,9 @@
"Cart.Manufacturer" "SuperVision"
"Cart.ModelNo" "405, 427, 806, 808, 813, 816"
"Cart.Name" "Chopper Command (SuperVision) (PAL)"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "ba257438f8a78862a9e014d831143690"
@ -15399,6 +15470,9 @@
"Cart.ModelNo" "CX2649, CX2649P"
"Cart.Name" "Asteroids (1981) (Atari) (PAL) [no copyright]"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "bb579404924c40ca378b4aff6ccf302d"
@ -15835,6 +15909,9 @@
"Cart.Manufacturer" "Activision, Bob Whitehead"
"Cart.ModelNo" "AX-015, AX-015-04"
"Cart.Name" "Chopper Command (1982) (Activision)"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "c1e6e4e7ef5f146388a090f1c469a2fa"
@ -15946,6 +16023,9 @@
"Cart.MD5" "c2c7a11717e255593e54d0acaf653ee5"
"Cart.Name" "Chopper Command (208 in 1) (Unknown) (PAL) (Hack)"
"Cart.Rarity" "Hack"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "c2c8eb642765137bb82b83a65232961f"
@ -16780,6 +16860,9 @@
"Cart.Name" "Asteroids (1981) (Atari) [no copyright]"
"Cart.Rarity" "Common"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "cccfe9e9a11b1dad04beba46eefb7351"
@ -17595,6 +17678,9 @@
"Cart.ModelNo" "CX2649, 49-75163"
"Cart.Name" "Asteroids (1981) (Atari) [a2]"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "d573089534ca596e64efef474be7b6bc"
@ -17983,6 +18069,9 @@
"Cart.MD5" "da66d75e4b47fab99733529743f86f4f"
"Cart.Manufacturer" "Digitel"
"Cart.Name" "Chopper Command (1983) (Digitel)"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "da732c57697ad7d7af414998fa527e75"
@ -18279,6 +18368,9 @@
"Cart.ModelNo" "CX2649, 49-75163"
"Cart.Name" "Asteroids (1981) (Atari)"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "dd8a2124d4eda200df715c698a6ea887"
@ -18435,6 +18527,9 @@
"Cart.Note" "Hack of Asteroids"
"Cart.Rarity" "Hack"
"Display.Phosphor" "YES"
"Cart.Players" "2"
"Cart.Variations" "66"
"Cart.Addresses" "h,1,80,c7,b,10,2,bd,be,c0,c1"
""
"Cart.MD5" "df5cc5cccdc140eb7107f5b8adfacda1"
@ -20717,6 +20812,9 @@
"Cart.Name" "Chopper Command (Jone Yuan) (Hack)"
"Cart.Note" "2600 Screen Search Console"
"Cart.Rarity" "Hack"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "f8b2a6a4d73ebff10d805a9b59041986"
@ -21381,6 +21479,9 @@
"Cart.Manufacturer" "CCE"
"Cart.ModelNo" "C-827"
"Cart.Name" "Chopper Command (1983) (CCE) [a]"
"Cart.Players" "2"
"Cart.Variations" "4"
"Cart.Addresses" "b,1,e0,eb,b,1,3,ec,ee,f0,ed,ef,f1"
""
"Cart.MD5" "ffe51989ba6da2c6ae5a12d277862e16"