From 9215535beec67afff56447eca1987b7095d857f4 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 9 Aug 2021 17:35:09 -0400 Subject: [PATCH] Adds a container for the disk controller. Thereby appears to prove that my Amiga is getting as far as attempting to load from floppy. --- Machines/Amiga/Chipset.cpp | 6 ++++- Machines/Amiga/Chipset.hpp | 48 ++++++++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/Machines/Amiga/Chipset.cpp b/Machines/Amiga/Chipset.cpp index acf823468..42dc3d941 100644 --- a/Machines/Amiga/Chipset.cpp +++ b/Machines/Amiga/Chipset.cpp @@ -40,6 +40,7 @@ enum InterruptFlag: uint16_t { Chipset::Chipset(uint16_t *ram, size_t size) : blitter_(ram, size), copper_(*this, ram, size), + disk_(*this, ram, size), crt_(908, 4, Outputs::Display::Type::PAL50, Outputs::Display::InputDataType::Red4Green4Blue4) { } @@ -420,7 +421,10 @@ void Chipset::perform(const CPU::MC68000::Microcycle &cycle) { break; // Disk DMA. - case Write(0x020): case Write(0x022): case Write(0x024): + case Write(0x020): disk_.set_address<16>(cycle.value16()); break; + case Write(0x022): disk_.set_address<0>(cycle.value16()); break; + case Write(0x024): disk_.set_length(cycle.value16()); break; + case Write(0x026): LOG("TODO: disk DMA; " << PADHEX(4) << cycle.value16() << " to " << *cycle.address); break; diff --git a/Machines/Amiga/Chipset.hpp b/Machines/Amiga/Chipset.hpp index cc8130f20..39d33deaa 100644 --- a/Machines/Amiga/Chipset.hpp +++ b/Machines/Amiga/Chipset.hpp @@ -61,6 +61,18 @@ class Chipset { Outputs::Display::DisplayType get_display_type() const; private: + // MARK: - Common base for DMA components. + + class DMADevice { + public: + DMADevice(Chipset &chipset, uint16_t *ram, size_t size) : chipset_(chipset), ram_(ram), ram_mask_(uint32_t(size - 1)) {} + + protected: + Chipset &chipset_; + uint16_t *ram_ = nullptr; + uint32_t ram_mask_ = 0; + }; + // MARK: - Interrupts. uint16_t interrupt_enable_ = 0; @@ -103,9 +115,9 @@ class Chipset { // MARK: - Copper. - class Copper { + class Copper: public DMADevice { public: - Copper(Chipset &chipset, uint16_t *ram, size_t size) : chipset_(chipset), ram_(ram), ram_mask_(uint32_t(size - 1)) {} + using DMADevice::DMADevice; /// Offers a DMA slot to the Copper, specifying the current beam position. /// @@ -134,8 +146,6 @@ class Chipset { } private: - Chipset &chipset_; - uint32_t address_ = 0; uint32_t addresses_[2]{}; uint16_t control_ = 0; @@ -146,9 +156,6 @@ class Chipset { bool skip_next_ = false; uint16_t instruction_[2]{}; uint16_t position_mask_ = 0xffff; - - uint16_t *ram_ = nullptr; - uint32_t ram_mask_ = 0; } copper_; // MARK: - Serial port. @@ -163,6 +170,33 @@ class Chipset { uint16_t status; } serial_; + // MARK: - Disk drives. + + class DiskDMA: public DMADevice { + public: + using DMADevice::DMADevice; + + template void set_address(uint16_t value) { + address_ = (address_ & (0xffff'0000 >> shift)) | uint32_t(value << shift); + } + + void set_length(uint16_t value) { + dma_enable_ = value & 0x8000; + write_ = value & 0x4000; + length_ = value & 0x3fff; + + if(dma_enable_) { + printf("Not yet implemented: disk DMA [%s of %d to %06x]\n", write_ ? "write" : "read", length_, address_); + } + } + + private: + uint32_t address_; + uint16_t length_; + bool dma_enable_ = false; + bool write_ = false; + } disk_; + // MARK: - Pixel output. Outputs::CRT::CRT crt_;