diff --git a/Machines/Atari2600/Atari2600.cpp b/Machines/Atari2600/Atari2600.cpp index 3353c7290..8abeb1d67 100644 --- a/Machines/Atari2600/Atari2600.cpp +++ b/Machines/Atari2600/Atari2600.cpp @@ -19,6 +19,7 @@ #include "Cartridges/CartridgeMegaBoy.hpp" #include "Cartridges/CartridgeMNetwork.hpp" #include "Cartridges/CartridgeParkerBros.hpp" +#include "Cartridges/CartridgePitfall2.hpp" #include "Cartridges/CartridgeTigervision.hpp" #include "Cartridges/CartridgeUnpaged.hpp" @@ -82,14 +83,16 @@ void Machine::set_switch_is_enabled(Atari2600Switch input, bool state) { void Machine::configure_as_target(const StaticAnalyser::Target &target) { const std::vector &rom = target.cartridges.front()->get_segments().front().data; switch(target.atari.paging_model) { - case StaticAnalyser::Atari2600PagingModel::None: bus_.reset(new CartridgeUnpaged(rom)); break; - case StaticAnalyser::Atari2600PagingModel::CommaVid: bus_.reset(new CartridgeCommaVid(rom)); break; case StaticAnalyser::Atari2600PagingModel::ActivisionStack: bus_.reset(new CartridgeActivisionStack(rom)); break; - case StaticAnalyser::Atari2600PagingModel::ParkerBros: bus_.reset(new CartridgeParkerBros(rom)); break; - case StaticAnalyser::Atari2600PagingModel::Tigervision: bus_.reset(new CartridgeTigervision(rom)); break; case StaticAnalyser::Atari2600PagingModel::CBSRamPlus: bus_.reset(new CartridgeCBSRAMPlus(rom)); break; + case StaticAnalyser::Atari2600PagingModel::CommaVid: bus_.reset(new CartridgeCommaVid(rom)); break; case StaticAnalyser::Atari2600PagingModel::MegaBoy: bus_.reset(new CartridgeMegaBoy(rom)); break; case StaticAnalyser::Atari2600PagingModel::MNetwork: bus_.reset(new CartridgeMNetwork(rom)); break; + case StaticAnalyser::Atari2600PagingModel::None: bus_.reset(new CartridgeUnpaged(rom)); break; + case StaticAnalyser::Atari2600PagingModel::ParkerBros: bus_.reset(new CartridgeParkerBros(rom)); break; + case StaticAnalyser::Atari2600PagingModel::Pitfall2: bus_.reset(new CartridgePitfall2(rom)); break; + case StaticAnalyser::Atari2600PagingModel::Tigervision: bus_.reset(new CartridgeTigervision(rom)); break; + case StaticAnalyser::Atari2600PagingModel::Atari8k: if(target.atari.uses_superchip) { bus_.reset(new CartridgeAtari8kSuperChip(rom)); diff --git a/Machines/Atari2600/Cartridges/CartridgePitfall2.hpp b/Machines/Atari2600/Cartridges/CartridgePitfall2.hpp new file mode 100644 index 000000000..fcd8c479e --- /dev/null +++ b/Machines/Atari2600/Cartridges/CartridgePitfall2.hpp @@ -0,0 +1,65 @@ +// +// CartridgePitfall2.h +// Clock Signal +// +// Created by Thomas Harte on 18/03/2017. +// Copyright © 2017 Thomas Harte. All rights reserved. +// + +#ifndef Atari2600_CartridgePitfall2_hpp +#define Atari2600_CartridgePitfall2_hpp + +namespace Atari2600 { + +class CartridgePitfall2: public Cartridge { + public: + CartridgePitfall2(const std::vector &rom) : + Cartridge(rom), + random_number_generator_(0), + featcher_address_{0, 0, 0, 0, 0, 0, 0, 0} { + rom_ptr_ = rom_.data(); + } + + void perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value) { + address &= 0x1fff; + if(!(address & 0x1000)) return; + + switch(address) { + // The random number generator + case 0x1000: case 0x1001: case 0x1002: case 0x1003: + if(isReadOperation(operation)) { + *value = random_number_generator_; + } + random_number_generator_ = (uint8_t)( + (random_number_generator_ << 1) | + ~(( (random_number_generator_ >> 7) ^ + (random_number_generator_ >> 5) ^ + (random_number_generator_ >> 4) ^ + (random_number_generator_ >> 3) + ) & 1)); + break; + + case 0x1040: case 0x1041: case 0x1042: case 0x1043: case 0x1044: case 0x1045: case 0x1046: case 0x1047: +// featcher_address_[address - 0x1040] + break; + + case 0x1ff8: rom_ptr_ = rom_.data(); break; + case 0x1ff9: rom_ptr_ = rom_.data() + 4096; break; + + default: + if(isReadOperation(operation)) { + *value = rom_ptr_[address & 4095]; + } + break; + } + } + + private: + uint16_t featcher_address_[8]; + uint8_t random_number_generator_; + uint8_t *rom_ptr_; +}; + +} + +#endif /* Atari2600_CartridgePitfall2_hpp */ diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 3915a3812..b9f53cea6 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -953,6 +953,7 @@ 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 = ""; }; + 4BEAC08E1E7E110500EE56B2 /* CartridgePitfall2.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CartridgePitfall2.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 = ""; }; @@ -1971,6 +1972,7 @@ 4BEAC08A1E7E0DF800EE56B2 /* CartridgeParkerBros.hpp */, 4BEAC08B1E7E0DF800EE56B2 /* CartridgeTigervision.hpp */, 4BEAC08C1E7E0DF800EE56B2 /* CartridgeUnpaged.hpp */, + 4BEAC08E1E7E110500EE56B2 /* CartridgePitfall2.hpp */, ); path = Cartridges; sourceTree = "";