summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2020-07-20 11:39:56 +0200
committer Dirk Best <mail@dirk-best.de>2020-07-20 13:17:46 +0200
commitf5ded52474ae24fa069cda2b0a3e8192f7c620bb (patch)
tree9bb62fc68a69b6f3db193b1bffa5a99819c60fa1
parentd55e7a32a8922a28abe7173d24cffef90c2f0f68 (diff)
samcoupe: Add support for the S D IDE Adapter
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/samcoupe/expansion/modules.cpp2
-rw-r--r--src/devices/bus/samcoupe/expansion/sdide.cpp116
-rw-r--r--src/devices/bus/samcoupe/expansion/sdide.h49
4 files changed, 169 insertions, 0 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index e242e3ca39e..99192ac573d 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -4320,6 +4320,8 @@ if (BUSES["SAMCOUPE_EXPANSION"]~=null) then
MAME_DIR .. "src/devices/bus/samcoupe/expansion/onemeg.h",
MAME_DIR .. "src/devices/bus/samcoupe/expansion/sambus.cpp",
MAME_DIR .. "src/devices/bus/samcoupe/expansion/sambus.h",
+ MAME_DIR .. "src/devices/bus/samcoupe/expansion/sdide.cpp",
+ MAME_DIR .. "src/devices/bus/samcoupe/expansion/sdide.h",
MAME_DIR .. "src/devices/bus/samcoupe/expansion/sid.cpp",
MAME_DIR .. "src/devices/bus/samcoupe/expansion/sid.h",
MAME_DIR .. "src/devices/bus/samcoupe/expansion/spi.cpp",
diff --git a/src/devices/bus/samcoupe/expansion/modules.cpp b/src/devices/bus/samcoupe/expansion/modules.cpp
index adc5cbaa137..cd85b69258d 100644
--- a/src/devices/bus/samcoupe/expansion/modules.cpp
+++ b/src/devices/bus/samcoupe/expansion/modules.cpp
@@ -13,6 +13,7 @@
#include "dallas.h"
#include "onemeg.h"
#include "sambus.h"
+#include "sdide.h"
#include "sid.h"
#include "spi.h"
#include "voicebox.h"
@@ -23,6 +24,7 @@ void samcoupe_expansion_modules(device_slot_interface &device)
device.option_add("dallas", SAM_DALLAS_CLOCK);
device.option_add("onemeg", SAM_ONEMEG);
device.option_add("sambus", SAM_SAMBUS);
+ device.option_add("sdide", SAM_SDIDE);
device.option_add("sid6581", SAM_SID6581);
device.option_add("sid8580", SAM_SID8580);
device.option_add("spi", SAM_SPI);
diff --git a/src/devices/bus/samcoupe/expansion/sdide.cpp b/src/devices/bus/samcoupe/expansion/sdide.cpp
new file mode 100644
index 00000000000..4c442b816c6
--- /dev/null
+++ b/src/devices/bus/samcoupe/expansion/sdide.cpp
@@ -0,0 +1,116 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ S D IDE Adapter for SAM Coupe
+
+***************************************************************************/
+
+#include "emu.h"
+#include "sdide.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(SAM_SDIDE, sam_sdide_device, "sam_sdide", "S D IDE Adapter")
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void sam_sdide_device::device_add_mconfig(machine_config &config)
+{
+ ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, false);
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// sam_sdide_device - constructor
+//-------------------------------------------------
+
+sam_sdide_device::sam_sdide_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, SAM_SDIDE, tag, owner, clock),
+ device_samcoupe_expansion_interface(mconfig, *this),
+ m_ata(*this, "ata"),
+ m_address_latch(0),
+ m_data_latch(0),
+ m_data_pending(false)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void sam_sdide_device::device_start()
+{
+ // register for savestates
+ save_item(NAME(m_address_latch));
+ save_item(NAME(m_data_latch));
+ save_item(NAME(m_data_pending));
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+uint8_t sam_sdide_device::iorq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ switch (offset & 0xff)
+ {
+ case 0xbd: // data
+ if (m_data_pending)
+ data = m_data_latch;
+ else
+ {
+ uint16_t result = 0;
+
+ if (BIT(m_address_latch, 3) == 0)
+ result = m_ata->cs0_r(m_address_latch & 0x07);
+ if (BIT(m_address_latch, 4) == 0)
+ result = m_ata->cs1_r(m_address_latch & 0x07);
+
+ m_data_latch = result >> 8;
+ data = result;
+ }
+
+ m_data_pending = !m_data_pending;
+ break;
+ }
+
+ return data;
+}
+
+void sam_sdide_device::iorq_w(offs_t offset, uint8_t data)
+{
+ switch (offset & 0xff)
+ {
+ case 0xbd: // data
+ if (!m_data_pending)
+ m_data_latch = data;
+ else
+ {
+ if (BIT(m_address_latch, 3) == 0)
+ m_ata->cs0_w(m_address_latch & 0x07, (data << 8) | m_data_latch);
+ if (BIT(m_address_latch, 4) == 0)
+ m_ata->cs1_w(m_address_latch & 0x07, (data << 8) | m_data_latch);
+ }
+
+ m_data_pending = !m_data_pending;
+ break;
+
+ case 0xbf: // register select
+ m_address_latch = data;
+ m_data_pending = false;
+ break;
+ }
+}
diff --git a/src/devices/bus/samcoupe/expansion/sdide.h b/src/devices/bus/samcoupe/expansion/sdide.h
new file mode 100644
index 00000000000..75974d885f8
--- /dev/null
+++ b/src/devices/bus/samcoupe/expansion/sdide.h
@@ -0,0 +1,49 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ S D IDE Adapter for SAM Coupe
+
+***************************************************************************/
+
+#ifndef MAME_BUS_SAMCOUPE_EXPANSION_SDIDE_H
+#define MAME_BUS_SAMCOUPE_EXPANSION_SDIDE_H
+
+#pragma once
+
+#include "expansion.h"
+#include "bus/ata/ataintf.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> sam_sdide_device
+
+class sam_sdide_device : public device_t, public device_samcoupe_expansion_interface
+{
+public:
+ // construction/destruction
+ sam_sdide_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // from host
+ virtual uint8_t iorq_r(offs_t offset) override;
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+
+private:
+ required_device<ata_interface_device> m_ata;
+
+ uint8_t m_address_latch;
+ uint8_t m_data_latch;
+ bool m_data_pending;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(SAM_SDIDE, sam_sdide_device)
+
+#endif // MAME_BUS_SAMCOUPE_EXPANSION_SDIDE_H