mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-14 04:31:19 +00:00
Adds a container for the disk controller.
Thereby appears to prove that my Amiga is getting as far as attempting to load from floppy.
This commit is contained in:
parent
27726fd2d1
commit
9215535bee
@ -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;
|
||||
|
@ -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 <int shift> 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_;
|
||||
|
Loading…
x
Reference in New Issue
Block a user