From 06e31f51024e58b50bc107495242e7104599b995 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 16 Aug 2017 12:39:15 -0400 Subject: [PATCH] Consequential to the 6502 change, severs the Atari 2600's cartridge container from its former attempt at runtime polymorphism, in favour of each cartridge's specific hardware being defined as a 'bus extender'. --- Machines/Atari2600/Atari2600.cpp | 54 +++++++++---------- ...ctivisionStack.hpp => ActivisionStack.hpp} | 19 ++++--- .../{CartridgeAtari16k.hpp => Atari16k.hpp} | 22 ++++---- .../{CartridgeAtari32k.hpp => Atari32k.hpp} | 18 +++---- .../{CartridgeAtari8k.hpp => Atari8k.hpp} | 22 +++----- ...CartridgeCBSRAMPlus.hpp => CBSRAMPlus.hpp} | 9 ++-- Machines/Atari2600/Cartridges/Cartridge.hpp | 29 +++++++--- .../{CartridgeCommaVid.hpp => CommaVid.hpp} | 7 +-- .../{CartridgeMNetwork.hpp => MNetwork.hpp} | 11 ++-- .../{CartridgeMegaBoy.hpp => MegaBoy.hpp} | 10 ++-- ...CartridgeParkerBros.hpp => ParkerBros.hpp} | 10 ++-- .../{CartridgePitfall2.hpp => Pitfall2.hpp} | 19 ++++--- ...rtridgeTigervision.hpp => Tigervision.hpp} | 12 ++--- .../{CartridgeUnpaged.hpp => Unpaged.hpp} | 7 ++- .../Clock Signal.xcodeproj/project.pbxproj | 48 ++++++++--------- 15 files changed, 145 insertions(+), 152 deletions(-) rename Machines/Atari2600/Cartridges/{CartridgeActivisionStack.hpp => ActivisionStack.hpp} (73%) rename Machines/Atari2600/Cartridges/{CartridgeAtari16k.hpp => Atari16k.hpp} (66%) rename Machines/Atari2600/Cartridges/{CartridgeAtari32k.hpp => Atari32k.hpp} (66%) rename Machines/Atari2600/Cartridges/{CartridgeAtari8k.hpp => Atari8k.hpp} (65%) rename Machines/Atari2600/Cartridges/{CartridgeCBSRAMPlus.hpp => CBSRAMPlus.hpp} (75%) rename Machines/Atari2600/Cartridges/{CartridgeCommaVid.hpp => CommaVid.hpp} (78%) rename Machines/Atari2600/Cartridges/{CartridgeMNetwork.hpp => MNetwork.hpp} (86%) rename Machines/Atari2600/Cartridges/{CartridgeMegaBoy.hpp => MegaBoy.hpp} (78%) rename Machines/Atari2600/Cartridges/{CartridgeParkerBros.hpp => ParkerBros.hpp} (78%) rename Machines/Atari2600/Cartridges/{CartridgePitfall2.hpp => Pitfall2.hpp} (89%) rename Machines/Atari2600/Cartridges/{CartridgeTigervision.hpp => Tigervision.hpp} (71%) rename Machines/Atari2600/Cartridges/{CartridgeUnpaged.hpp => Unpaged.hpp} (74%) diff --git a/Machines/Atari2600/Atari2600.cpp b/Machines/Atari2600/Atari2600.cpp index 0d705ed45..c640dc91b 100644 --- a/Machines/Atari2600/Atari2600.cpp +++ b/Machines/Atari2600/Atari2600.cpp @@ -10,18 +10,18 @@ #include #include -#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/CartridgePitfall2.hpp" -#include "Cartridges/CartridgeTigervision.hpp" -#include "Cartridges/CartridgeUnpaged.hpp" +#include "Cartridges/Atari8k.hpp" +#include "Cartridges/Atari16k.hpp" +#include "Cartridges/Atari32k.hpp" +#include "Cartridges/ActivisionStack.hpp" +#include "Cartridges/CBSRAMPlus.hpp" +#include "Cartridges/CommaVid.hpp" +#include "Cartridges/MegaBoy.hpp" +#include "Cartridges/MNetwork.hpp" +#include "Cartridges/ParkerBros.hpp" +#include "Cartridges/Pitfall2.hpp" +#include "Cartridges/Tigervision.hpp" +#include "Cartridges/Unpaged.hpp" using namespace Atari2600; namespace { @@ -83,35 +83,35 @@ 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::ActivisionStack: bus_.reset(new Cartridge::CartridgeActivisionStack(rom)); break; - case StaticAnalyser::Atari2600PagingModel::CBSRamPlus: bus_.reset(new Cartridge::CartridgeCBSRAMPlus(rom)); break; - case StaticAnalyser::Atari2600PagingModel::CommaVid: bus_.reset(new Cartridge::CartridgeCommaVid(rom)); break; - case StaticAnalyser::Atari2600PagingModel::MegaBoy: bus_.reset(new Cartridge::CartridgeMegaBoy(rom)); break; - case StaticAnalyser::Atari2600PagingModel::MNetwork: bus_.reset(new Cartridge::CartridgeMNetwork(rom)); break; - case StaticAnalyser::Atari2600PagingModel::None: bus_.reset(new Cartridge::CartridgeUnpaged(rom)); break; - case StaticAnalyser::Atari2600PagingModel::ParkerBros: bus_.reset(new Cartridge::CartridgeParkerBros(rom)); break; - case StaticAnalyser::Atari2600PagingModel::Pitfall2: bus_.reset(new Cartridge::CartridgePitfall2(rom)); break; - case StaticAnalyser::Atari2600PagingModel::Tigervision: bus_.reset(new Cartridge::CartridgeTigervision(rom)); break; + case StaticAnalyser::Atari2600PagingModel::ActivisionStack: bus_.reset(new Cartridge::Cartridge(rom)); break; + case StaticAnalyser::Atari2600PagingModel::CBSRamPlus: bus_.reset(new Cartridge::Cartridge(rom)); break; + case StaticAnalyser::Atari2600PagingModel::CommaVid: bus_.reset(new Cartridge::Cartridge(rom)); break; + case StaticAnalyser::Atari2600PagingModel::MegaBoy: bus_.reset(new Cartridge::Cartridge(rom)); break; + case StaticAnalyser::Atari2600PagingModel::MNetwork: bus_.reset(new Cartridge::Cartridge(rom)); break; + case StaticAnalyser::Atari2600PagingModel::None: bus_.reset(new Cartridge::Cartridge(rom)); break; + case StaticAnalyser::Atari2600PagingModel::ParkerBros: bus_.reset(new Cartridge::Cartridge(rom)); break; + case StaticAnalyser::Atari2600PagingModel::Pitfall2: bus_.reset(new Cartridge::Cartridge(rom)); break; + case StaticAnalyser::Atari2600PagingModel::Tigervision: bus_.reset(new Cartridge::Cartridge(rom)); break; case StaticAnalyser::Atari2600PagingModel::Atari8k: if(target.atari.uses_superchip) { - bus_.reset(new Cartridge::CartridgeAtari8kSuperChip(rom)); + bus_.reset(new Cartridge::Cartridge(rom)); } else { - bus_.reset(new Cartridge::CartridgeAtari8k(rom)); + bus_.reset(new Cartridge::Cartridge(rom)); } break; case StaticAnalyser::Atari2600PagingModel::Atari16k: if(target.atari.uses_superchip) { - bus_.reset(new Cartridge::CartridgeAtari16kSuperChip(rom)); + bus_.reset(new Cartridge::Cartridge(rom)); } else { - bus_.reset(new Cartridge::CartridgeAtari16k(rom)); + bus_.reset(new Cartridge::Cartridge(rom)); } break; case StaticAnalyser::Atari2600PagingModel::Atari32k: if(target.atari.uses_superchip) { - bus_.reset(new Cartridge::CartridgeAtari32kSuperChip(rom)); + bus_.reset(new Cartridge::Cartridge(rom)); } else { - bus_.reset(new Cartridge::CartridgeAtari32k(rom)); + bus_.reset(new Cartridge::Cartridge(rom)); } break; } diff --git a/Machines/Atari2600/Cartridges/CartridgeActivisionStack.hpp b/Machines/Atari2600/Cartridges/ActivisionStack.hpp similarity index 73% rename from Machines/Atari2600/Cartridges/CartridgeActivisionStack.hpp rename to Machines/Atari2600/Cartridges/ActivisionStack.hpp index b79807470..4083bd15c 100644 --- a/Machines/Atari2600/Cartridges/CartridgeActivisionStack.hpp +++ b/Machines/Atari2600/Cartridges/ActivisionStack.hpp @@ -6,19 +6,18 @@ // Copyright © 2017 Thomas Harte. All rights reserved. // -#ifndef Atari2600_CartridgeActivisionStack_hpp -#define Atari2600_CartridgeActivisionStack_hpp +#ifndef Atari2600_ActivisionStack_hpp +#define Atari2600_ActivisionStack_hpp namespace Atari2600 { namespace Cartridge { -class CartridgeActivisionStack: public Cartridge { +class ActivisionStack: public BusExtender { public: - CartridgeActivisionStack(const std::vector &rom) : - Cartridge(rom), - last_opcode_(0x00) { - rom_ptr_ = rom_.data(); - } + ActivisionStack(uint8_t *rom_base, size_t rom_size) : + BusExtender(rom_base, rom_size), + rom_ptr_(rom_base), + last_opcode_(0x00) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { if(!(address & 0x1000)) return; @@ -28,9 +27,9 @@ class CartridgeActivisionStack: public Cartridge { // RST or JSR. if(operation == CPU::MOS6502::BusOperation::ReadOpcode && (last_opcode_ == 0x20 || last_opcode_ == 0x60)) { if(address & 0x2000) { - rom_ptr_ = rom_.data(); + rom_ptr_ = rom_base_; } else { - rom_ptr_ = rom_.data() + 4096; + rom_ptr_ = rom_base_ + 4096; } } diff --git a/Machines/Atari2600/Cartridges/CartridgeAtari16k.hpp b/Machines/Atari2600/Cartridges/Atari16k.hpp similarity index 66% rename from Machines/Atari2600/Cartridges/CartridgeAtari16k.hpp rename to Machines/Atari2600/Cartridges/Atari16k.hpp index c109d76e4..c6559426c 100644 --- a/Machines/Atari2600/Cartridges/CartridgeAtari16k.hpp +++ b/Machines/Atari2600/Cartridges/Atari16k.hpp @@ -14,18 +14,17 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeAtari16k: public Cartridge { +class Atari16k: public BusExtender { public: - CartridgeAtari16k(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_ = rom_.data(); - } + Atari16k(uint8_t *rom_base, size_t rom_size) : + BusExtender(rom_base, rom_size), + rom_ptr_(rom_base) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { address &= 0x1fff; if(!(address & 0x1000)) return; - if(address >= 0x1ff6 && address <= 0x1ff9) rom_ptr_ = rom_.data() + (address - 0x1ff6) * 4096; + if(address >= 0x1ff6 && address <= 0x1ff9) rom_ptr_ = rom_base_ + (address - 0x1ff6) * 4096; if(isReadOperation(operation)) { *value = rom_ptr_[address & 4095]; @@ -36,18 +35,17 @@ class CartridgeAtari16k: public Cartridge { uint8_t *rom_ptr_; }; -class CartridgeAtari16kSuperChip: public Cartridge { +class Atari16kSuperChip: public BusExtender { public: - CartridgeAtari16kSuperChip(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_ = rom_.data(); - } + Atari16kSuperChip(uint8_t *rom_base, size_t rom_size) : + BusExtender(rom_base, rom_size), + rom_ptr_(rom_base) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { address &= 0x1fff; if(!(address & 0x1000)) return; - if(address >= 0x1ff6 && address <= 0x1ff9) rom_ptr_ = rom_.data() + (address - 0x1ff6) * 4096; + if(address >= 0x1ff6 && address <= 0x1ff9) rom_ptr_ = rom_base_ + (address - 0x1ff6) * 4096; if(isReadOperation(operation)) { *value = rom_ptr_[address & 4095]; diff --git a/Machines/Atari2600/Cartridges/CartridgeAtari32k.hpp b/Machines/Atari2600/Cartridges/Atari32k.hpp similarity index 66% rename from Machines/Atari2600/Cartridges/CartridgeAtari32k.hpp rename to Machines/Atari2600/Cartridges/Atari32k.hpp index 3ae85f052..facc56e70 100644 --- a/Machines/Atari2600/Cartridges/CartridgeAtari32k.hpp +++ b/Machines/Atari2600/Cartridges/Atari32k.hpp @@ -14,18 +14,15 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeAtari32k: public Cartridge { +class Atari32k: public BusExtender { public: - CartridgeAtari32k(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_ = rom_.data(); - } + Atari32k(uint8_t *rom_base, size_t rom_size) : BusExtender(rom_base, rom_size), rom_ptr_(rom_base) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { address &= 0x1fff; if(!(address & 0x1000)) return; - if(address >= 0x1ff4 && address <= 0x1ffb) rom_ptr_ = rom_.data() + (address - 0x1ff4) * 4096; + if(address >= 0x1ff4 && address <= 0x1ffb) rom_ptr_ = rom_base_ + (address - 0x1ff4) * 4096; if(isReadOperation(operation)) { *value = rom_ptr_[address & 4095]; @@ -36,18 +33,15 @@ class CartridgeAtari32k: public Cartridge { uint8_t *rom_ptr_; }; -class CartridgeAtari32kSuperChip: public Cartridge { +class Atari32kSuperChip: public BusExtender { public: - CartridgeAtari32kSuperChip(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_ = rom_.data(); - } + Atari32kSuperChip(uint8_t *rom_base, size_t rom_size) : BusExtender(rom_base, rom_size), rom_ptr_(rom_base) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { address &= 0x1fff; if(!(address & 0x1000)) return; - if(address >= 0x1ff4 && address <= 0x1ffb) rom_ptr_ = rom_.data() + (address - 0x1ff4) * 4096; + if(address >= 0x1ff4 && address <= 0x1ffb) rom_ptr_ = rom_base_ + (address - 0x1ff4) * 4096; if(isReadOperation(operation)) { *value = rom_ptr_[address & 4095]; diff --git a/Machines/Atari2600/Cartridges/CartridgeAtari8k.hpp b/Machines/Atari2600/Cartridges/Atari8k.hpp similarity index 65% rename from Machines/Atari2600/Cartridges/CartridgeAtari8k.hpp rename to Machines/Atari2600/Cartridges/Atari8k.hpp index 04e489c91..ffaa79433 100644 --- a/Machines/Atari2600/Cartridges/CartridgeAtari8k.hpp +++ b/Machines/Atari2600/Cartridges/Atari8k.hpp @@ -14,19 +14,16 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeAtari8k: public Cartridge { +class Atari8k: public BusExtender { public: - CartridgeAtari8k(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_ = rom_.data(); - } + Atari8k(uint8_t *rom_base, size_t rom_size) : BusExtender(rom_base, rom_size), rom_ptr_(rom_base) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { address &= 0x1fff; if(!(address & 0x1000)) return; - if(address == 0x1ff8) rom_ptr_ = rom_.data(); - else if(address == 0x1ff9) rom_ptr_ = rom_.data() + 4096; + if(address == 0x1ff8) rom_ptr_ = rom_base_; + else if(address == 0x1ff9) rom_ptr_ = rom_base_ + 4096; if(isReadOperation(operation)) { *value = rom_ptr_[address & 4095]; @@ -37,19 +34,16 @@ class CartridgeAtari8k: public Cartridge { uint8_t *rom_ptr_; }; -class CartridgeAtari8kSuperChip: public Cartridge { +class Atari8kSuperChip: public BusExtender { public: - CartridgeAtari8kSuperChip(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_ = rom_.data(); - } + Atari8kSuperChip(uint8_t *rom_base, size_t rom_size) : BusExtender(rom_base, rom_size), rom_ptr_(rom_base) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { address &= 0x1fff; if(!(address & 0x1000)) return; - if(address == 0x1ff8) rom_ptr_ = rom_.data(); - if(address == 0x1ff9) rom_ptr_ = rom_.data() + 4096; + if(address == 0x1ff8) rom_ptr_ = rom_base_; + if(address == 0x1ff9) rom_ptr_ = rom_base_ + 4096; if(isReadOperation(operation)) { *value = rom_ptr_[address & 4095]; diff --git a/Machines/Atari2600/Cartridges/CartridgeCBSRAMPlus.hpp b/Machines/Atari2600/Cartridges/CBSRAMPlus.hpp similarity index 75% rename from Machines/Atari2600/Cartridges/CartridgeCBSRAMPlus.hpp rename to Machines/Atari2600/Cartridges/CBSRAMPlus.hpp index ffde1af7b..1ea652a1b 100644 --- a/Machines/Atari2600/Cartridges/CartridgeCBSRAMPlus.hpp +++ b/Machines/Atari2600/Cartridges/CBSRAMPlus.hpp @@ -14,18 +14,15 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeCBSRAMPlus: public Cartridge { +class CBSRAMPlus: public BusExtender { public: - CartridgeCBSRAMPlus(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_ = rom_.data(); - } + CBSRAMPlus(uint8_t *rom_base, size_t rom_size) : BusExtender(rom_base, rom_size), rom_ptr_(rom_base) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { address &= 0x1fff; if(!(address & 0x1000)) return; - if(address >= 0x1ff8 && address <= 0x1ffa) rom_ptr_ = rom_.data() + (address - 0x1ff8) * 4096; + if(address >= 0x1ff8 && address <= 0x1ffa) rom_ptr_ = rom_base_ + (address - 0x1ff8) * 4096; if(isReadOperation(operation)) { *value = rom_ptr_[address & 4095]; diff --git a/Machines/Atari2600/Cartridges/Cartridge.hpp b/Machines/Atari2600/Cartridges/Cartridge.hpp index 059ae3915..8d49f9f58 100644 --- a/Machines/Atari2600/Cartridges/Cartridge.hpp +++ b/Machines/Atari2600/Cartridges/Cartridge.hpp @@ -15,6 +15,17 @@ namespace Atari2600 { namespace Cartridge { +class BusExtender: public CPU::MOS6502::BusHandler { + public: + BusExtender(uint8_t *rom_base, size_t rom_size) : rom_base_(rom_base), rom_size_(rom_size) {} + + void advance_cycles(int cycles) {} + + protected: + uint8_t *rom_base_; + size_t rom_size_; +}; + template class Cartridge: public CPU::MOS6502::BusHandler, public Bus { @@ -22,11 +33,14 @@ template class Cartridge: public: Cartridge(const std::vector &rom) : m6502_(*this), - rom_(rom) {} + rom_(rom), + bus_extender_(rom_.data(), rom.size()) { + // The above works because bus_extender_ is declared after rom_ in the instance storage list; + // consider doing something less fragile. + } - void run_for(const Cycles cycles) { m6502_.run_for(cycles); } - void set_reset_line(bool state) { m6502_.set_reset_line(state); } - void advance_cycles(int cycles) {} + void run_for(const Cycles cycles) { m6502_.run_for(cycles); } + void set_reset_line(bool state) { m6502_.set_reset_line(state); } // to satisfy CPU::MOS6502::Processor Cycles perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { @@ -43,11 +57,11 @@ template class Cartridge: cycles_since_speaker_update_ += Cycles(cycles_run_for); cycles_since_video_update_ += Cycles(cycles_run_for); cycles_since_6532_update_ += Cycles(cycles_run_for / 3); - static_cast(this)->advance_cycles(cycles_run_for / 3); + bus_extender_.advance_cycles(cycles_run_for / 3); if(operation != CPU::MOS6502::BusOperation::Ready) { // give the cartridge a chance to respond to the bus access - static_cast(this)->perform_bus_operation(operation, address, value); + bus_extender_.perform_bus_operation(operation, address, value); // check for a RIOT RAM access if((address&0x1280) == 0x80) { @@ -172,6 +186,9 @@ template class Cartridge: protected: CPU::MOS6502::Processor> m6502_; std::vector rom_; + + private: + BusExtender bus_extender_; }; } diff --git a/Machines/Atari2600/Cartridges/CartridgeCommaVid.hpp b/Machines/Atari2600/Cartridges/CommaVid.hpp similarity index 78% rename from Machines/Atari2600/Cartridges/CartridgeCommaVid.hpp rename to Machines/Atari2600/Cartridges/CommaVid.hpp index 26c8e89ce..9a389b43f 100644 --- a/Machines/Atari2600/Cartridges/CartridgeCommaVid.hpp +++ b/Machines/Atari2600/Cartridges/CommaVid.hpp @@ -12,11 +12,8 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeCommaVid: public Cartridge { +class CommaVid: public BusExtender { public: - CartridgeCommaVid(const std::vector &rom) : - Cartridge(rom) {} - void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { if(!(address & 0x1000)) return; address &= 0x1fff; @@ -31,7 +28,7 @@ class CartridgeCommaVid: public Cartridge { return; } - if(isReadOperation(operation)) *value = rom_[address & 2047]; + if(isReadOperation(operation)) *value = rom_base_[address & 2047]; } private: diff --git a/Machines/Atari2600/Cartridges/CartridgeMNetwork.hpp b/Machines/Atari2600/Cartridges/MNetwork.hpp similarity index 86% rename from Machines/Atari2600/Cartridges/CartridgeMNetwork.hpp rename to Machines/Atari2600/Cartridges/MNetwork.hpp index b759e70db..187787389 100644 --- a/Machines/Atari2600/Cartridges/CartridgeMNetwork.hpp +++ b/Machines/Atari2600/Cartridges/MNetwork.hpp @@ -14,11 +14,11 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeMNetwork: public Cartridge { +class MNetwork: public BusExtender { public: - CartridgeMNetwork(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_[0] = rom_.data() + rom_.size() - 4096; + MNetwork(uint8_t *rom_base, size_t rom_size) : + BusExtender(rom_base, rom_size) { + rom_ptr_[0] = rom_base + rom_size_ - 4096; rom_ptr_[1] = rom_ptr_[0] + 2048; high_ram_ptr_ = high_ram_; } @@ -28,7 +28,7 @@ class CartridgeMNetwork: public Cartridge { if(!(address & 0x1000)) return; if(address >= 0x1fe0 && address <= 0x1fe6) { - rom_ptr_[0] = rom_.data() + (address - 0x1fe0) * 2048; + rom_ptr_[0] = rom_base_ + (address - 0x1fe0) * 2048; } else if(address == 0x1fe7) { rom_ptr_[0] = nullptr; } else if(address >= 0x1ff8 && address <= 0x1ffb) { @@ -55,7 +55,6 @@ class CartridgeMNetwork: public Cartridge { } } } - } private: diff --git a/Machines/Atari2600/Cartridges/CartridgeMegaBoy.hpp b/Machines/Atari2600/Cartridges/MegaBoy.hpp similarity index 78% rename from Machines/Atari2600/Cartridges/CartridgeMegaBoy.hpp rename to Machines/Atari2600/Cartridges/MegaBoy.hpp index 1d2a09e73..5ef7da21d 100644 --- a/Machines/Atari2600/Cartridges/CartridgeMegaBoy.hpp +++ b/Machines/Atari2600/Cartridges/MegaBoy.hpp @@ -14,12 +14,12 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeMegaBoy: public Cartridge { +class MegaBoy: public BusExtender { public: - CartridgeMegaBoy(const std::vector &rom) : - Cartridge(rom), + MegaBoy(uint8_t *rom_base, size_t rom_size) : + BusExtender(rom_base, rom_size), + rom_ptr_(rom_base), current_page_(0) { - rom_ptr_ = rom_.data(); } void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { @@ -28,7 +28,7 @@ class CartridgeMegaBoy: public Cartridge { if(address == 0x1ff0) { current_page_ = (current_page_ + 1) & 15; - rom_ptr_ = rom_.data() + current_page_ * 4096; + rom_ptr_ = rom_base_ + current_page_ * 4096; } if(isReadOperation(operation)) { diff --git a/Machines/Atari2600/Cartridges/CartridgeParkerBros.hpp b/Machines/Atari2600/Cartridges/ParkerBros.hpp similarity index 78% rename from Machines/Atari2600/Cartridges/CartridgeParkerBros.hpp rename to Machines/Atari2600/Cartridges/ParkerBros.hpp index 4138991ba..8a2647460 100644 --- a/Machines/Atari2600/Cartridges/CartridgeParkerBros.hpp +++ b/Machines/Atari2600/Cartridges/ParkerBros.hpp @@ -14,11 +14,11 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeParkerBros: public Cartridge { +class ParkerBros: public BusExtender { public: - CartridgeParkerBros(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_[0] = rom_.data() + 4096; + ParkerBros(uint8_t *rom_base, size_t rom_size) : + BusExtender(rom_base, rom_size) { + rom_ptr_[0] = rom_base + 4096; rom_ptr_[1] = rom_ptr_[0] + 1024; rom_ptr_[2] = rom_ptr_[1] + 1024; rom_ptr_[3] = rom_ptr_[2] + 1024; @@ -30,7 +30,7 @@ class CartridgeParkerBros: public Cartridge { if(address >= 0x1fe0 && address < 0x1ff8) { int slot = (address >> 3)&3; - rom_ptr_[slot] = rom_.data() + ((address & 7) * 1024); + rom_ptr_[slot] = rom_base_ + ((address & 7) * 1024); } if(isReadOperation(operation)) { diff --git a/Machines/Atari2600/Cartridges/CartridgePitfall2.hpp b/Machines/Atari2600/Cartridges/Pitfall2.hpp similarity index 89% rename from Machines/Atari2600/Cartridges/CartridgePitfall2.hpp rename to Machines/Atari2600/Cartridges/Pitfall2.hpp index c77239113..f383a453f 100644 --- a/Machines/Atari2600/Cartridges/CartridgePitfall2.hpp +++ b/Machines/Atari2600/Cartridges/Pitfall2.hpp @@ -12,16 +12,15 @@ namespace Atari2600 { namespace Cartridge { -class CartridgePitfall2: public Cartridge { +class Pitfall2: public BusExtender { public: - CartridgePitfall2(const std::vector &rom) : - Cartridge(rom), + Pitfall2(uint8_t *rom_base, size_t rom_size) : + BusExtender(rom_base, rom_size), + rom_ptr_(rom_base), random_number_generator_(0), featcher_address_{0, 0, 0, 0, 0, 0, 0, 0}, mask_{0, 0, 0, 0, 0, 0, 0, 0}, - cycles_since_audio_update_(0) { - rom_ptr_ = rom_.data(); - } + cycles_since_audio_update_(0) {} void advance_cycles(int cycles) { cycles_since_audio_update_ += cycles; @@ -54,11 +53,11 @@ class CartridgePitfall2: public Cartridge { break; case 0x1008: case 0x1009: case 0x100a: case 0x100b: case 0x100c: case 0x100d: case 0x100e: case 0x100f: - *value = rom_[8192 + address_for_counter(address & 7)]; + *value = rom_base_[8192 + address_for_counter(address & 7)]; break; case 0x1010: case 0x1011: case 0x1012: case 0x1013: case 0x1014: case 0x1015: case 0x1016: case 0x1017: - *value = rom_[8192 + address_for_counter(address & 7)] & mask_[address & 7]; + *value = rom_base_[8192 + address_for_counter(address & 7)] & mask_[address & 7]; break; #pragma mark - Writes @@ -82,8 +81,8 @@ class CartridgePitfall2: public Cartridge { #pragma mark - Paging - case 0x1ff8: rom_ptr_ = rom_.data(); break; - case 0x1ff9: rom_ptr_ = rom_.data() + 4096; break; + case 0x1ff8: rom_ptr_ = rom_base_; break; + case 0x1ff9: rom_ptr_ = rom_base_ + 4096; break; #pragma mark - Business as usual diff --git a/Machines/Atari2600/Cartridges/CartridgeTigervision.hpp b/Machines/Atari2600/Cartridges/Tigervision.hpp similarity index 71% rename from Machines/Atari2600/Cartridges/CartridgeTigervision.hpp rename to Machines/Atari2600/Cartridges/Tigervision.hpp index 1abcedac5..4c8e8959f 100644 --- a/Machines/Atari2600/Cartridges/CartridgeTigervision.hpp +++ b/Machines/Atari2600/Cartridges/Tigervision.hpp @@ -14,18 +14,18 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeTigervision: public Cartridge { +class Tigervision: public BusExtender { public: - CartridgeTigervision(const std::vector &rom) : - Cartridge(rom) { - rom_ptr_[0] = rom_.data() + rom_.size() - 4096; + Tigervision(uint8_t *rom_base, size_t rom_size) : + BusExtender(rom_base, rom_size) { + rom_ptr_[0] = rom_base + rom_size - 4096; rom_ptr_[1] = rom_ptr_[0] + 2048; } void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { if((address&0x1fff) == 0x3f) { - int offset = ((*value) * 2048) & (rom_.size() - 1); - rom_ptr_[0] = rom_.data() + offset; + int offset = ((*value) * 2048) & (rom_size_ - 1); + rom_ptr_[0] = rom_base_ + offset; return; } else if((address&0x1000) && isReadOperation(operation)) { *value = rom_ptr_[(address >> 11)&1][address & 2047]; diff --git a/Machines/Atari2600/Cartridges/CartridgeUnpaged.hpp b/Machines/Atari2600/Cartridges/Unpaged.hpp similarity index 74% rename from Machines/Atari2600/Cartridges/CartridgeUnpaged.hpp rename to Machines/Atari2600/Cartridges/Unpaged.hpp index cc09b5a53..8761d72f5 100644 --- a/Machines/Atari2600/Cartridges/CartridgeUnpaged.hpp +++ b/Machines/Atari2600/Cartridges/Unpaged.hpp @@ -14,14 +14,13 @@ namespace Atari2600 { namespace Cartridge { -class CartridgeUnpaged: public Cartridge { +class Unpaged: public BusExtender { public: - CartridgeUnpaged(const std::vector &rom) : - Cartridge(rom) {} + Unpaged(uint8_t *rom_base, size_t rom_size) : BusExtender(rom_base, rom_size) {} void perform_bus_operation(CPU::MOS6502::BusOperation operation, uint16_t address, uint8_t *value) { if(isReadOperation(operation) && (address & 0x1000)) { - *value = rom_[address & (rom_.size() - 1)]; + *value = rom_base_[address] & (rom_size_ - 1); } } }; diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 10b16ea4c..ac8083b5e 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -1036,19 +1036,19 @@ 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 = ""; }; 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 = ""; }; + 4BEAC0821E7E0DF800EE56B2 /* ActivisionStack.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ActivisionStack.hpp; sourceTree = ""; }; + 4BEAC0831E7E0DF800EE56B2 /* Atari16k.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Atari16k.hpp; sourceTree = ""; }; + 4BEAC0841E7E0DF800EE56B2 /* Atari32k.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Atari32k.hpp; sourceTree = ""; }; + 4BEAC0851E7E0DF800EE56B2 /* Atari8k.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Atari8k.hpp; sourceTree = ""; }; + 4BEAC0861E7E0DF800EE56B2 /* CBSRAMPlus.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CBSRAMPlus.hpp; sourceTree = ""; }; + 4BEAC0871E7E0DF800EE56B2 /* CommaVid.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CommaVid.hpp; sourceTree = ""; }; + 4BEAC0881E7E0DF800EE56B2 /* MegaBoy.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MegaBoy.hpp; sourceTree = ""; }; + 4BEAC0891E7E0DF800EE56B2 /* MNetwork.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MNetwork.hpp; sourceTree = ""; }; + 4BEAC08A1E7E0DF800EE56B2 /* ParkerBros.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ParkerBros.hpp; sourceTree = ""; }; + 4BEAC08B1E7E0DF800EE56B2 /* Tigervision.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Tigervision.hpp; sourceTree = ""; }; + 4BEAC08C1E7E0DF800EE56B2 /* Unpaged.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Unpaged.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 = ""; }; + 4BEAC08E1E7E110500EE56B2 /* Pitfall2.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Pitfall2.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 = ""; }; @@ -2216,18 +2216,18 @@ 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 */, - 4BEAC08E1E7E110500EE56B2 /* CartridgePitfall2.hpp */, + 4BEAC0821E7E0DF800EE56B2 /* ActivisionStack.hpp */, + 4BEAC0851E7E0DF800EE56B2 /* Atari8k.hpp */, + 4BEAC0831E7E0DF800EE56B2 /* Atari16k.hpp */, + 4BEAC0841E7E0DF800EE56B2 /* Atari32k.hpp */, + 4BEAC0861E7E0DF800EE56B2 /* CBSRAMPlus.hpp */, + 4BEAC0871E7E0DF800EE56B2 /* CommaVid.hpp */, + 4BEAC0881E7E0DF800EE56B2 /* MegaBoy.hpp */, + 4BEAC0891E7E0DF800EE56B2 /* MNetwork.hpp */, + 4BEAC08A1E7E0DF800EE56B2 /* ParkerBros.hpp */, + 4BEAC08E1E7E110500EE56B2 /* Pitfall2.hpp */, + 4BEAC08B1E7E0DF800EE56B2 /* Tigervision.hpp */, + 4BEAC08C1E7E0DF800EE56B2 /* Unpaged.hpp */, ); path = Cartridges; sourceTree = "";