summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/modem/scsiaiv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/bbc/modem/scsiaiv.cpp')
-rw-r--r--src/devices/bus/bbc/modem/scsiaiv.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/devices/bus/bbc/modem/scsiaiv.cpp b/src/devices/bus/bbc/modem/scsiaiv.cpp
new file mode 100644
index 00000000000..f3e1ed19f27
--- /dev/null
+++ b/src/devices/bus/bbc/modem/scsiaiv.cpp
@@ -0,0 +1,142 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn AIV SCSI Host Adaptor
+
+**********************************************************************/
+
+#include "emu.h"
+#include "scsiaiv.h"
+#include "machine/nscsi_bus.h"
+#include "bus/nscsi/devices.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_SCSIAIV, bbc_scsiaiv_device, "bbc_scsiaiv", "Acorn AIV SCSI Host Adaptor");
+//DEFINE_DEVICE_TYPE(BBC_VP415, bbc_vp415_device, "bbc_vp415", "BBC Philips VP415");
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void bbc_scsiaiv_device::device_add_mconfig(machine_config& config)
+{
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", default_scsi_devices, "scsicb", true)
+ .option_add_internal("scsicb", NSCSI_CB)
+ .machine_config([this](device_t* device) {
+ downcast<nscsi_callback_device&>(*device).bsy_callback().set(*this, FUNC(bbc_scsiaiv_device::bsy_w));
+ downcast<nscsi_callback_device&>(*device).req_callback().set(*this, FUNC(bbc_scsiaiv_device::req_w));
+ });
+}
+
+//void bbc_vp415_device::device_add_mconfig(machine_config& config)
+//{
+// bbc_scsiaiv_device::device_add_mconfig(config);
+//
+// /* Philips VP415 */
+// subdevice<nscsi_connector>("scsi:0")->set_default_option("vp415");
+// subdevice<nscsi_connector>("scsi:0")->set_fixed(true);
+//}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_scsiaiv_device - constructor
+//-------------------------------------------------
+
+bbc_scsiaiv_device::bbc_scsiaiv_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_bbc_modem_interface(mconfig, *this)
+ , m_scsi(*this, "scsi:7:scsicb")
+{
+}
+
+bbc_scsiaiv_device::bbc_scsiaiv_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock)
+ : bbc_scsiaiv_device(mconfig, BBC_SCSIAIV, tag, owner, clock)
+{
+}
+
+//bbc_vp415_device::bbc_vp415_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock)
+// : bbc_scsiaiv_device(mconfig, BBC_VP415, tag, owner, clock)
+//{
+//}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_scsiaiv_device::device_start()
+{
+ /* register for save states */
+ save_item(NAME(m_irq_enable));
+ save_item(NAME(m_irq_state));
+}
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+uint8_t bbc_scsiaiv_device::read(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ switch (offset & 0x07)
+ {
+ case 0x00:
+ data = m_scsi->read();
+ m_scsi->ack_w(1);
+ break;
+ case 0x01:
+ data = (m_scsi->msg_r() << 0)
+ | (m_scsi->bsy_r() << 1)
+ | (m_scsi->rst_r() << 2)
+ | (!m_irq_state << 4)
+ | (m_scsi->req_r() << 5)
+ | (m_scsi->io_r() << 6)
+ | (m_scsi->cd_r() << 7);
+ break;
+ }
+
+ return data;
+}
+
+void bbc_scsiaiv_device::write(offs_t offset, uint8_t data)
+{
+ switch (offset & 0x07)
+ {
+ case 0x00:
+ m_scsi->write(~data);
+ m_scsi->ack_w(1);
+ break;
+ case 0x02:
+ m_scsi->sel_w(1);
+ break;
+ case 0x03:
+ m_irq_enable = BIT(data, 0);
+ break;
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_scsiaiv_device::bsy_w)
+{
+ m_scsi->sel_w(0);
+}
+
+WRITE_LINE_MEMBER(bbc_scsiaiv_device::req_w)
+{
+ m_scsi->ack_w(0);
+
+ m_irq_state = (m_irq_enable && !state) ? 0 : 1;
+ m_slot->irq_w(m_irq_state ? CLEAR_LINE : ASSERT_LINE);
+}