From 2253ff656a855fd7c32998ca6c65059aedf462a8 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 5 Oct 2021 16:12:30 -0700 Subject: [PATCH] Adds route for inserting disks. --- Machines/Amiga/Amiga.cpp | 14 ++++++++++++-- Machines/Amiga/Chipset.cpp | 18 ++++++++++++++++++ Machines/Amiga/Chipset.hpp | 6 ++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Machines/Amiga/Amiga.cpp b/Machines/Amiga/Amiga.cpp index a8b1aeb09..de593f76b 100644 --- a/Machines/Amiga/Amiga.cpp +++ b/Machines/Amiga/Amiga.cpp @@ -39,6 +39,7 @@ namespace Amiga { class ConcreteMachine: public Activity::Source, public CPU::MC68000::BusHandler, + public MachineTypes::MediaTarget, public MachineTypes::ScanProducer, public MachineTypes::TimedMachine, public Machine { @@ -47,8 +48,6 @@ class ConcreteMachine: mc68000_(*this), chipset_(memory_, PALClockRate) { - (void)target; - // Temporary: use a hard-coded Kickstart selection. constexpr ROM::Name rom_name = ROM::Name::AmigaA500Kickstart13; ROM::Request request(rom_name); @@ -58,7 +57,18 @@ class ConcreteMachine: } Memory::PackBigEndian16(roms.find(rom_name)->second, memory_.kickstart.data()); + // For now, also hard-code assumption of PAL. + // (Assumption is both here and in the video timing of the Chipset). set_clock_rate(PALClockRate); + + // Insert supplied media. + insert_media(target.media); + } + + // MARK: - MediaTarget. + + bool insert_media(const Analyser::Static::Media &media) final { + return chipset_.insert(media.disks); } // MARK: - MC68000::BusHandler. diff --git a/Machines/Amiga/Chipset.cpp b/Machines/Amiga/Chipset.cpp index 1853ead29..20a9e7828 100644 --- a/Machines/Amiga/Chipset.cpp +++ b/Machines/Amiga/Chipset.cpp @@ -1125,3 +1125,21 @@ uint8_t Chipset::DiskController::get_rdy_trk0_wpro_chng() { (drive.get_is_read_only() ? 0x08 : 0x00); return 0xff & ~active_high; } + +bool Chipset::DiskController::insert(const std::shared_ptr &disk, size_t drive) { + if(drive >= 4) return false; + get_drive(drive).set_disk(disk); + return true; +} + +bool Chipset::insert(const std::vector> &disks) { + bool inserted = false; + + size_t target = 0; + for(const auto &disk: disks) { + inserted |= disk_controller_.insert(disk, target); + ++target; + } + + return inserted; +} diff --git a/Machines/Amiga/Chipset.hpp b/Machines/Amiga/Chipset.hpp index 88e589e3e..a8bbc9eb1 100644 --- a/Machines/Amiga/Chipset.hpp +++ b/Machines/Amiga/Chipset.hpp @@ -91,6 +91,10 @@ class Chipset: private ClockingHint::Observer { return interrupt_level_; } + /// Inserts the disks provided. + /// @returns @c true if anything was inserted; @c false otherwise. + bool insert(const std::vector> &disks); + // The standard CRT set. void set_scan_target(Outputs::Display::ScanTarget *scan_target); Outputs::Display::ScanStatus get_scaled_scan_status() const; @@ -230,6 +234,8 @@ class Chipset: private ClockingHint::Observer { Storage::Disk::Controller::run_for(duration); } + bool insert(const std::shared_ptr &disk, size_t drive); + private: void process_input_bit(int value) final; void process_index_hole() final;