diff --git a/src/common/PKeyboardHandler.cxx b/src/common/PKeyboardHandler.cxx index 76d48dd1a..0389928aa 100644 --- a/src/common/PKeyboardHandler.cxx +++ b/src/common/PKeyboardHandler.cxx @@ -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") diff --git a/src/emucore/Console.cxx b/src/emucore/Console.cxx index 5cef206b0..260478441 100644 --- a/src/emucore/Console.cxx +++ b/src/emucore/Console.cxx @@ -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, diff --git a/src/emucore/Console.hxx b/src/emucore/Console.hxx index eb85025a6..c46d5780e 100644 --- a/src/emucore/Console.hxx +++ b/src/emucore/Console.hxx @@ -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; diff --git a/src/emucore/Event.hxx b/src/emucore/Event.hxx index b82bb7f50..9a3925650 100644 --- a/src/emucore/Event.hxx +++ b/src/emucore/Event.hxx @@ -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 }; diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx index 70b3c6d0c..fb251af72 100644 --- a/src/emucore/EventHandler.cxx +++ b/src/emucore/EventHandler.cxx @@ -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, }; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/EventHandler.hxx b/src/emucore/EventHandler.hxx index 7fa56d17d..d27b37d80 100644 --- a/src/emucore/EventHandler.hxx +++ b/src/emucore/EventHandler.hxx @@ -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 ; diff --git a/src/emucore/Props.cxx b/src/emucore/Props.cxx index 0ff65f975..6b3296262 100644 --- a/src/emucore/Props.cxx +++ b/src/emucore/Props.cxx @@ -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 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 Properties::ourPropertyNames = "Display.Format", "Display.VCenter", "Display.Phosphor", - "Display.PPBlend" + "Display.PPBlend", + "Cart.Players", + "Cart.Variations", + "Cart.Addresses" }; diff --git a/src/emucore/Props.hxx b/src/emucore/Props.hxx index af3f67568..d7fcbf7b4 100644 --- a/src/emucore/Props.hxx +++ b/src/emucore/Props.hxx @@ -42,6 +42,9 @@ enum class PropType : uInt8 { Display_VCenter, Display_Phosphor, Display_PPBlend, + Cart_Players, + Cart_Variations, + Cart_Addresses, NumTypes }; diff --git a/src/emucore/stella.pro b/src/emucore/stella.pro index f2edd993d..e48c5808a 100644 --- a/src/emucore/stella.pro +++ b/src/emucore/stella.pro @@ -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"