diff --git a/Machines/Atari2600/Atari2600.cpp b/Machines/Atari2600/Atari2600.cpp index 3d6bea78c..3353c7290 100644 --- a/Machines/Atari2600/Atari2600.cpp +++ b/Machines/Atari2600/Atari2600.cpp @@ -10,17 +10,17 @@ #include #include -#include "CartridgeAtari8k.hpp" -#include "CartridgeAtari16k.hpp" -#include "CartridgeAtari32k.hpp" -#include "CartridgeActivisionStack.hpp" -#include "CartridgeCBSRAMPlus.hpp" -#include "CartridgeCommaVid.hpp" -#include "CartridgeMegaBoy.hpp" -#include "CartridgeMNetwork.hpp" -#include "CartridgeParkerBros.hpp" -#include "CartridgeTigervision.hpp" -#include "CartridgeUnpaged.hpp" +#include "Cartridges/CartridgeAtari8k.hpp" +#include "Cartridges/CartridgeAtari16k.hpp" +#include "Cartridges/CartridgeAtari32k.hpp" +#include "Cartridges/CartridgeActivisionStack.hpp" +#include "Cartridges/CartridgeCBSRAMPlus.hpp" +#include "Cartridges/CartridgeCommaVid.hpp" +#include "Cartridges/CartridgeMegaBoy.hpp" +#include "Cartridges/CartridgeMNetwork.hpp" +#include "Cartridges/CartridgeParkerBros.hpp" +#include "Cartridges/CartridgeTigervision.hpp" +#include "Cartridges/CartridgeUnpaged.hpp" using namespace Atari2600; namespace { @@ -112,22 +112,6 @@ void Machine::configure_as_target(const StaticAnalyser::Target &target) { } break; } - -/* switch(target.atari.paging_model) { - case StaticAnalyser::Atari2600PagingModel::MNetwork: - ram_.resize(2048); - // Put 256 bytes of RAM for writing at 0x1800 and reading at 0x1900 - ram_write_targets_[16] = ram_.data(); - ram_write_targets_[17] = ram_write_targets_[16] + 128; - ram_read_targets_[18] = ram_write_targets_[16]; - ram_read_targets_[19] = ram_write_targets_[17]; - - rom_pages_[0] = rom_; - rom_pages_[1] = rom_pages_[0] + 1024; - rom_pages_[2] = rom_pages_[0] + 2048; - rom_pages_[3] = rom_pages_[0] + 3072; - break; - }*/ } #pragma mark - CRT delegate diff --git a/Machines/Atari2600/Atari2600.hpp b/Machines/Atari2600/Atari2600.hpp index e579e1896..f5055b30c 100644 --- a/Machines/Atari2600/Atari2600.hpp +++ b/Machines/Atari2600/Atari2600.hpp @@ -13,10 +13,10 @@ #include "../../Processors/6502/CPU6502.hpp" #include "../CRTMachine.hpp" +#include "Bus.hpp" #include "PIA.hpp" #include "Speaker.hpp" #include "TIA.hpp" -#include "Cartridge.hpp" #include "../ConfigurationTarget.hpp" #include "Atari2600Inputs.h" diff --git a/Machines/Atari2600/Bus.hpp b/Machines/Atari2600/Bus.hpp new file mode 100644 index 000000000..864d22715 --- /dev/null +++ b/Machines/Atari2600/Bus.hpp @@ -0,0 +1,63 @@ +// +// Bus.h +// Clock Signal +// +// Created by Thomas Harte on 18/03/2017. +// Copyright © 2017 Thomas Harte. All rights reserved. +// + +#ifndef Atari2600_Bus_hpp +#define Atari2600_Bus_hpp + +#include "PIA.hpp" +#include "TIA.hpp" +#include "Speaker.hpp" + +namespace Atari2600 { + +class Bus { + public: + Bus() : + tia_input_value_{0xff, 0xff}, + cycles_since_speaker_update_(0), + cycles_since_video_update_(0), + cycles_since_6532_update_(0) {} + + virtual void run_for_cycles(int number_of_cycles) = 0; + virtual void set_reset_line(bool state) = 0; + + // the RIOT, TIA and speaker + PIA mos6532_; + std::shared_ptr tia_; + std::shared_ptr speaker_; + + // joystick state + uint8_t tia_input_value_[2]; + + protected: + // speaker backlog accumlation counter + unsigned int cycles_since_speaker_update_; + inline void update_audio() { + unsigned int audio_cycles = cycles_since_speaker_update_ / 114; + cycles_since_speaker_update_ %= 114; + speaker_->run_for_cycles(audio_cycles); + } + + // video backlog accumulation counter + unsigned int cycles_since_video_update_; + inline void update_video() { + tia_->run_for_cycles((int)cycles_since_video_update_); + cycles_since_video_update_ = 0; + } + + // RIOT backlog accumulation counter + unsigned int cycles_since_6532_update_; + inline void update_6532() { + mos6532_.run_for_cycles(cycles_since_6532_update_); + cycles_since_6532_update_ = 0; + } +}; + +} + +#endif /* Atari2600_Bus_hpp */ diff --git a/Machines/Atari2600/Cartridge.hpp b/Machines/Atari2600/Cartridges/Cartridge.hpp similarity index 84% rename from Machines/Atari2600/Cartridge.hpp rename to Machines/Atari2600/Cartridges/Cartridge.hpp index 24a2d291c..8581270fe 100644 --- a/Machines/Atari2600/Cartridge.hpp +++ b/Machines/Atari2600/Cartridges/Cartridge.hpp @@ -9,53 +9,11 @@ #ifndef Atari2600_Cartridge_hpp #define Atari2600_Cartridge_hpp -#include "../../Processors/6502/CPU6502.hpp" +#include "../../../Processors/6502/CPU6502.hpp" +#include "../Bus.hpp" namespace Atari2600 { -class Bus { - public: - Bus() : - tia_input_value_{0xff, 0xff}, - cycles_since_speaker_update_(0), - cycles_since_video_update_(0), - cycles_since_6532_update_(0) {} - - virtual void run_for_cycles(int number_of_cycles) = 0; - virtual void set_reset_line(bool state) = 0; - - // the RIOT, TIA and speaker - PIA mos6532_; - std::shared_ptr tia_; - std::shared_ptr speaker_; - - // joystick state - uint8_t tia_input_value_[2]; - - protected: - // speaker backlog accumlation counter - unsigned int cycles_since_speaker_update_; - inline void update_audio() { - unsigned int audio_cycles = cycles_since_speaker_update_ / 114; - cycles_since_speaker_update_ %= 114; - speaker_->run_for_cycles(audio_cycles); - } - - // video backlog accumulation counter - unsigned int cycles_since_video_update_; - inline void update_video() { - tia_->run_for_cycles((int)cycles_since_video_update_); - cycles_since_video_update_ = 0; - } - - // RIOT backlog accumulation counter - unsigned int cycles_since_6532_update_; - inline void update_6532() { - mos6532_.run_for_cycles(cycles_since_6532_update_); - cycles_since_6532_update_ = 0; - } -}; - template class Cartridge: public CPU6502::Processor>, public Bus { diff --git a/Machines/Atari2600/CartridgeActivisionStack.hpp b/Machines/Atari2600/Cartridges/CartridgeActivisionStack.hpp similarity index 83% rename from Machines/Atari2600/CartridgeActivisionStack.hpp rename to Machines/Atari2600/Cartridges/CartridgeActivisionStack.hpp index 8cf8a2713..1b67bfd10 100644 --- a/Machines/Atari2600/CartridgeActivisionStack.hpp +++ b/Machines/Atari2600/Cartridges/CartridgeActivisionStack.hpp @@ -22,6 +22,9 @@ class CartridgeActivisionStack: public Cartridge { void perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value) { if(!(address & 0x1000)) return; + // This is a bit of a hack; a real cartridge can't see either the sync or read lines, and can't see + // address line 13. Instead it looks for a pattern in recent address accesses that would imply an + // RST or JSR. if(operation == CPU6502::BusOperation::ReadOpcode && (last_opcode_ == 0x20 || last_opcode_ == 0x60)) { if(address & 0x2000) { rom_ptr_ = rom_.data(); diff --git a/Machines/Atari2600/CartridgeAtari16k.hpp b/Machines/Atari2600/Cartridges/CartridgeAtari16k.hpp similarity index 100% rename from Machines/Atari2600/CartridgeAtari16k.hpp rename to Machines/Atari2600/Cartridges/CartridgeAtari16k.hpp diff --git a/Machines/Atari2600/CartridgeAtari32k.hpp b/Machines/Atari2600/Cartridges/CartridgeAtari32k.hpp similarity index 100% rename from Machines/Atari2600/CartridgeAtari32k.hpp rename to Machines/Atari2600/Cartridges/CartridgeAtari32k.hpp diff --git a/Machines/Atari2600/CartridgeAtari8k.hpp b/Machines/Atari2600/Cartridges/CartridgeAtari8k.hpp similarity index 100% rename from Machines/Atari2600/CartridgeAtari8k.hpp rename to Machines/Atari2600/Cartridges/CartridgeAtari8k.hpp diff --git a/Machines/Atari2600/CartridgeCBSRAMPlus.hpp b/Machines/Atari2600/Cartridges/CartridgeCBSRAMPlus.hpp similarity index 100% rename from Machines/Atari2600/CartridgeCBSRAMPlus.hpp rename to Machines/Atari2600/Cartridges/CartridgeCBSRAMPlus.hpp diff --git a/Machines/Atari2600/CartridgeCommaVid.hpp b/Machines/Atari2600/Cartridges/CartridgeCommaVid.hpp similarity index 100% rename from Machines/Atari2600/CartridgeCommaVid.hpp rename to Machines/Atari2600/Cartridges/CartridgeCommaVid.hpp diff --git a/Machines/Atari2600/CartridgeMNetwork.hpp b/Machines/Atari2600/Cartridges/CartridgeMNetwork.hpp similarity index 100% rename from Machines/Atari2600/CartridgeMNetwork.hpp rename to Machines/Atari2600/Cartridges/CartridgeMNetwork.hpp diff --git a/Machines/Atari2600/CartridgeMegaBoy.hpp b/Machines/Atari2600/Cartridges/CartridgeMegaBoy.hpp similarity index 100% rename from Machines/Atari2600/CartridgeMegaBoy.hpp rename to Machines/Atari2600/Cartridges/CartridgeMegaBoy.hpp diff --git a/Machines/Atari2600/CartridgeParkerBros.hpp b/Machines/Atari2600/Cartridges/CartridgeParkerBros.hpp similarity index 100% rename from Machines/Atari2600/CartridgeParkerBros.hpp rename to Machines/Atari2600/Cartridges/CartridgeParkerBros.hpp diff --git a/Machines/Atari2600/CartridgeTigervision.hpp b/Machines/Atari2600/Cartridges/CartridgeTigervision.hpp similarity index 100% rename from Machines/Atari2600/CartridgeTigervision.hpp rename to Machines/Atari2600/Cartridges/CartridgeTigervision.hpp diff --git a/Machines/Atari2600/CartridgeUnpaged.hpp b/Machines/Atari2600/Cartridges/CartridgeUnpaged.hpp similarity index 100% rename from Machines/Atari2600/CartridgeUnpaged.hpp rename to Machines/Atari2600/Cartridges/CartridgeUnpaged.hpp diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 450d31b92..3915a3812 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -582,8 +582,6 @@ 4B9CCDA21DA27C3F0098B625 /* CSJoystickMachine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSJoystickMachine.h; sourceTree = ""; }; 4BA22B051D8817CE0008C640 /* Disk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Disk.cpp; path = ../../StaticAnalyser/Commodore/Disk.cpp; sourceTree = ""; }; 4BA22B061D8817CE0008C640 /* Disk.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Disk.hpp; path = ../../StaticAnalyser/Commodore/Disk.hpp; sourceTree = ""; }; - 4BA443E71E7DB54700C86749 /* CartridgeCommaVid.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeCommaVid.hpp; sourceTree = ""; }; - 4BA443E81E7DB8F900C86749 /* CartridgeAtari8k.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeAtari8k.hpp; sourceTree = ""; }; 4BA61EAE1D91515900B3C876 /* NSData+StdVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+StdVector.h"; sourceTree = ""; }; 4BA61EAF1D91515900B3C876 /* NSData+StdVector.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSData+StdVector.mm"; sourceTree = ""; }; 4BA799931D8B656E0045123D /* StaticAnalyser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StaticAnalyser.cpp; path = ../../StaticAnalyser/Atari/StaticAnalyser.cpp; sourceTree = ""; }; @@ -930,8 +928,6 @@ 4BD5F1941D13528900631CD1 /* CSBestEffortUpdater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CSBestEffortUpdater.m; path = Updater/CSBestEffortUpdater.m; sourceTree = ""; }; 4BD69F921D98760000243FE1 /* AcornADF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AcornADF.cpp; sourceTree = ""; }; 4BD69F931D98760000243FE1 /* AcornADF.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = AcornADF.hpp; sourceTree = ""; }; - 4BE069991E7C942C00DD379F /* Cartridge.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Cartridge.hpp; sourceTree = ""; }; - 4BE0699A1E7C9C5A00DD379F /* CartridgeUnpaged.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeUnpaged.hpp; sourceTree = ""; }; 4BE77A2C1D84ADFB00BC3827 /* File.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = File.cpp; path = ../../StaticAnalyser/Commodore/File.cpp; sourceTree = ""; }; 4BE77A2D1D84ADFB00BC3827 /* File.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = File.hpp; path = ../../StaticAnalyser/Commodore/File.hpp; sourceTree = ""; }; 4BE7C9161E3D397100A5496D /* TIA.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TIA.cpp; sourceTree = ""; }; @@ -944,14 +940,19 @@ 4BEA52641DF3472B007E74F2 /* Speaker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Speaker.cpp; sourceTree = ""; }; 4BEA52651DF3472B007E74F2 /* Speaker.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Speaker.hpp; sourceTree = ""; }; 4BEA52671DF34909007E74F2 /* PIA.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = PIA.hpp; sourceTree = ""; }; - 4BEAC0781E7DD86E00EE56B2 /* CartridgeAtari16k.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeAtari16k.hpp; sourceTree = ""; }; - 4BEAC0791E7DD86E00EE56B2 /* CartridgeAtari32k.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeAtari32k.hpp; sourceTree = ""; }; - 4BEAC07A1E7DDFDA00EE56B2 /* CartridgeActivisionStack.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeActivisionStack.hpp; sourceTree = ""; }; - 4BEAC07B1E7DE74200EE56B2 /* CartridgeParkerBros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeParkerBros.hpp; sourceTree = ""; }; - 4BEAC07C1E7DEA6B00EE56B2 /* CartridgeTigervision.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeTigervision.hpp; sourceTree = ""; }; - 4BEAC07D1E7DF13E00EE56B2 /* CartridgeCBSRAMPlus.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeCBSRAMPlus.hpp; sourceTree = ""; }; - 4BEAC07E1E7DF2D000EE56B2 /* CartridgeMegaBoy.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeMegaBoy.hpp; sourceTree = ""; }; - 4BEAC07F1E7DF45900EE56B2 /* CartridgeMNetwork.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgeMNetwork.hpp; sourceTree = ""; }; + 4BEAC0811E7E0DF800EE56B2 /* Cartridge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Cartridge.hpp; sourceTree = ""; }; + 4BEAC0821E7E0DF800EE56B2 /* CartridgeActivisionStack.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeActivisionStack.hpp; sourceTree = ""; }; + 4BEAC0831E7E0DF800EE56B2 /* CartridgeAtari16k.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeAtari16k.hpp; sourceTree = ""; }; + 4BEAC0841E7E0DF800EE56B2 /* CartridgeAtari32k.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeAtari32k.hpp; sourceTree = ""; }; + 4BEAC0851E7E0DF800EE56B2 /* CartridgeAtari8k.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeAtari8k.hpp; sourceTree = ""; }; + 4BEAC0861E7E0DF800EE56B2 /* CartridgeCBSRAMPlus.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeCBSRAMPlus.hpp; sourceTree = ""; }; + 4BEAC0871E7E0DF800EE56B2 /* CartridgeCommaVid.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeCommaVid.hpp; sourceTree = ""; }; + 4BEAC0881E7E0DF800EE56B2 /* CartridgeMegaBoy.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeMegaBoy.hpp; sourceTree = ""; }; + 4BEAC0891E7E0DF800EE56B2 /* CartridgeMNetwork.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeMNetwork.hpp; sourceTree = ""; }; + 4BEAC08A1E7E0DF800EE56B2 /* CartridgeParkerBros.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeParkerBros.hpp; sourceTree = ""; }; + 4BEAC08B1E7E0DF800EE56B2 /* CartridgeTigervision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeTigervision.hpp; sourceTree = ""; }; + 4BEAC08C1E7E0DF800EE56B2 /* CartridgeUnpaged.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartridgeUnpaged.hpp; sourceTree = ""; }; + 4BEAC08D1E7E0E1A00EE56B2 /* Bus.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Bus.hpp; sourceTree = ""; }; 4BEE0A6A1D72496600532C7B /* Cartridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cartridge.cpp; sourceTree = ""; }; 4BEE0A6B1D72496600532C7B /* Cartridge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Cartridge.hpp; sourceTree = ""; }; 4BEE0A6D1D72496600532C7B /* PRG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PRG.cpp; sourceTree = ""; }; @@ -1119,21 +1120,11 @@ 4BE7C9161E3D397100A5496D /* TIA.cpp */, 4B2E2D991C3A06EC00138695 /* Atari2600Inputs.h */, 4B2E2D981C3A06EC00138695 /* Atari2600.hpp */, - 4BE069991E7C942C00DD379F /* Cartridge.hpp */, - 4BEAC07A1E7DDFDA00EE56B2 /* CartridgeActivisionStack.hpp */, - 4BA443E81E7DB8F900C86749 /* CartridgeAtari8k.hpp */, - 4BEAC0781E7DD86E00EE56B2 /* CartridgeAtari16k.hpp */, - 4BEAC0791E7DD86E00EE56B2 /* CartridgeAtari32k.hpp */, - 4BEAC07D1E7DF13E00EE56B2 /* CartridgeCBSRAMPlus.hpp */, - 4BA443E71E7DB54700C86749 /* CartridgeCommaVid.hpp */, - 4BEAC07E1E7DF2D000EE56B2 /* CartridgeMegaBoy.hpp */, - 4BEAC07B1E7DE74200EE56B2 /* CartridgeParkerBros.hpp */, - 4BEAC07C1E7DEA6B00EE56B2 /* CartridgeTigervision.hpp */, - 4BE0699A1E7C9C5A00DD379F /* CartridgeUnpaged.hpp */, + 4BEAC08D1E7E0E1A00EE56B2 /* Bus.hpp */, 4BEA52671DF34909007E74F2 /* PIA.hpp */, 4BEA52651DF3472B007E74F2 /* Speaker.hpp */, 4BE7C9171E3D397100A5496D /* TIA.hpp */, - 4BEAC07F1E7DF45900EE56B2 /* CartridgeMNetwork.hpp */, + 4BEAC0801E7E0DF800EE56B2 /* Cartridges */, ); path = Atari2600; sourceTree = ""; @@ -1965,6 +1956,25 @@ path = Resources; sourceTree = ""; }; + 4BEAC0801E7E0DF800EE56B2 /* Cartridges */ = { + isa = PBXGroup; + children = ( + 4BEAC0811E7E0DF800EE56B2 /* Cartridge.hpp */, + 4BEAC0821E7E0DF800EE56B2 /* CartridgeActivisionStack.hpp */, + 4BEAC0831E7E0DF800EE56B2 /* CartridgeAtari16k.hpp */, + 4BEAC0841E7E0DF800EE56B2 /* CartridgeAtari32k.hpp */, + 4BEAC0851E7E0DF800EE56B2 /* CartridgeAtari8k.hpp */, + 4BEAC0861E7E0DF800EE56B2 /* CartridgeCBSRAMPlus.hpp */, + 4BEAC0871E7E0DF800EE56B2 /* CartridgeCommaVid.hpp */, + 4BEAC0881E7E0DF800EE56B2 /* CartridgeMegaBoy.hpp */, + 4BEAC0891E7E0DF800EE56B2 /* CartridgeMNetwork.hpp */, + 4BEAC08A1E7E0DF800EE56B2 /* CartridgeParkerBros.hpp */, + 4BEAC08B1E7E0DF800EE56B2 /* CartridgeTigervision.hpp */, + 4BEAC08C1E7E0DF800EE56B2 /* CartridgeUnpaged.hpp */, + ); + path = Cartridges; + sourceTree = ""; + }; 4BEE0A691D72496600532C7B /* Cartridge */ = { isa = PBXGroup; children = (