diff --git a/Machines/Amiga/Amiga.cpp b/Machines/Amiga/Amiga.cpp index e8543712f..c53452704 100644 --- a/Machines/Amiga/Amiga.cpp +++ b/Machines/Amiga/Amiga.cpp @@ -18,8 +18,6 @@ #include "../Utility/MemoryPacker.hpp" #include "../Utility/MemoryFuzzer.hpp" -#include "../../Storage/Disk/Drive.hpp" - //#define NDEBUG #define LOG_PREFIX "[Amiga] " #include "../../Outputs/Log.hpp" @@ -27,6 +25,15 @@ #include "Chipset.hpp" #include "MemoryMap.hpp" +namespace { + +// NTSC clock rate: 2*3.579545 = 7.15909Mhz. +// PAL clock rate: 7.09379Mhz; 227 cycles/line. +constexpr int PALClockRate = 7'093'790; +constexpr int NTSCClockRate = 7'159'090; + +} + namespace Amiga { class ConcreteMachine: @@ -38,7 +45,7 @@ class ConcreteMachine: public: ConcreteMachine(const Analyser::Static::Amiga::Target &target, const ROMMachine::ROMFetcher &rom_fetcher) : mc68000_(*this), - chipset_(memory_) + chipset_(memory_, PALClockRate) { (void)target; @@ -51,9 +58,7 @@ class ConcreteMachine: } Memory::PackBigEndian16(roms.find(rom_name)->second, memory_.kickstart.data()); - // NTSC clock rate: 2*3.579545 = 7.15909Mhz. - // PAL clock rate: 7.09379Mhz; 227 cycles/line. - set_clock_rate(7'093'790.0); + set_clock_rate(PALClockRate); } // MARK: - MC68000::BusHandler. diff --git a/Machines/Amiga/Chipset.cpp b/Machines/Amiga/Chipset.cpp index d55665861..15fc7f004 100644 --- a/Machines/Amiga/Chipset.cpp +++ b/Machines/Amiga/Chipset.cpp @@ -32,13 +32,19 @@ template struct DMAMask: Mask {}; } -Chipset::Chipset(MemoryMap &map) : +Chipset::Chipset(MemoryMap &map, int input_clock_rate) : cia_a_handler_(map), cia_a(cia_a_handler_), cia_b(cia_b_handler_), blitter_(*this, reinterpret_cast(map.chip_ram.data()), map.chip_ram.size() >> 1), bitplanes_(*this, reinterpret_cast(map.chip_ram.data()), map.chip_ram.size() >> 1), copper_(*this, reinterpret_cast(map.chip_ram.data()), map.chip_ram.size() >> 1), + drives_{ + {input_clock_rate, 300, 2, Storage::Disk::Drive::ReadyType::ShugartRDY}, + {input_clock_rate, 300, 2, Storage::Disk::Drive::ReadyType::ShugartRDY}, + {input_clock_rate, 300, 2, Storage::Disk::Drive::ReadyType::ShugartRDY}, + {input_clock_rate, 300, 2, Storage::Disk::Drive::ReadyType::ShugartRDY} + }, disk_(*this, reinterpret_cast(map.chip_ram.data()), map.chip_ram.size() >> 1), crt_(908, 4, Outputs::Display::Type::PAL50, Outputs::Display::InputDataType::Red4Green4Blue4) { } diff --git a/Machines/Amiga/Chipset.hpp b/Machines/Amiga/Chipset.hpp index 21480d1fd..4168f6e2e 100644 --- a/Machines/Amiga/Chipset.hpp +++ b/Machines/Amiga/Chipset.hpp @@ -16,6 +16,7 @@ #include "../../Components/6526/6526.hpp" #include "../../Outputs/CRT/CRT.hpp" #include "../../Processors/68000/68000.hpp" +#include "../../Storage/Disk/Drive.hpp" #include "Blitter.hpp" #include "Copper.hpp" @@ -59,7 +60,7 @@ enum class DMAFlag: uint16_t { class Chipset { public: - Chipset(MemoryMap &memory_map); + Chipset(MemoryMap &memory_map, int input_clock_rate); struct Changes { int interrupt_level = 0; @@ -241,6 +242,8 @@ class Chipset { // MARK: - Disk drives. + Storage::Disk::Drive drives_[4]; + class DiskDMA: public DMADevice<1> { public: using DMADevice::DMADevice;