summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/legscsi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/legscsi.cpp')
-rw-r--r--src/devices/machine/legscsi.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/devices/machine/legscsi.cpp b/src/devices/machine/legscsi.cpp
new file mode 100644
index 00000000000..4071ccf8c3a
--- /dev/null
+++ b/src/devices/machine/legscsi.cpp
@@ -0,0 +1,152 @@
+// license:BSD-3-Clause
+// copyright-holders:smf
+#include "legscsi.h"
+
+legacy_scsi_host_adapter::legacy_scsi_host_adapter(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ m_scsi_port(*this)
+{
+}
+
+void legacy_scsi_host_adapter::device_start()
+{
+}
+
+void legacy_scsi_host_adapter::reset_bus()
+{
+ for (int i = 0; i <= 7; i++)
+ {
+ scsihle_device *scsidev = get_device(i);
+ if (scsidev != NULL)
+ {
+ scsidev->reset();
+ }
+ }
+}
+
+bool legacy_scsi_host_adapter::select(int id)
+{
+ m_selected = id;
+
+ scsihle_device *scsidev = get_device(m_selected);
+ if (scsidev != NULL)
+ {
+ return true;
+ }
+
+ return false;
+}
+
+void legacy_scsi_host_adapter::send_command(UINT8 *data, int bytes)
+{
+ scsihle_device *scsidev = get_device(m_selected);
+ if (scsidev != NULL)
+ {
+ scsidev->SetCommand(data, bytes);
+ scsidev->ExecCommand();
+ }
+ else
+ {
+ logerror("%s: send_command unknown SCSI id %d\n", tag(), m_selected);
+ }
+}
+
+int legacy_scsi_host_adapter::get_length(void)
+{
+ scsihle_device *scsidev = get_device(m_selected);
+ if (scsidev != NULL)
+ {
+ int length;
+ scsidev->GetLength(&length);
+ return length;
+ }
+ else
+ {
+ logerror("%s: get_length unknown SCSI id %d\n", tag(), m_selected);
+ return 0;
+ }
+}
+
+int legacy_scsi_host_adapter::get_phase(void)
+{
+ scsihle_device *scsidev = get_device(m_selected);
+ if (scsidev != NULL)
+ {
+ int phase;
+ scsidev->GetPhase(&phase);
+ return phase;
+ }
+ else
+ {
+ logerror("%s: get_phase unknown SCSI id %d\n", tag(), m_selected);
+ return 0;
+ }
+}
+
+void legacy_scsi_host_adapter::read_data(UINT8 *data, int bytes)
+{
+ scsihle_device *scsidev = get_device(m_selected);
+ if (scsidev != NULL)
+ {
+ scsidev->ReadData(data, bytes);
+ }
+ else
+ {
+ logerror("%s: read_data unknown SCSI id %d\n", tag(), m_selected);
+ }
+}
+
+void legacy_scsi_host_adapter::write_data(UINT8 *data, int bytes)
+{
+ scsihle_device *scsidev = get_device(m_selected);
+ if (scsidev != NULL)
+ {
+ scsidev->WriteData(data, bytes);
+ }
+ else
+ {
+ logerror("%s: write_data unknown SCSI id %d\n", tag(), m_selected);
+ }
+}
+
+UINT8 legacy_scsi_host_adapter::get_status()
+{
+ scsihle_device *scsidev = get_device(m_selected);
+ if (scsidev != NULL)
+ {
+ void *image;
+
+ scsidev->GetDevice(&image);
+ if (image != NULL)
+ return 0x00;
+
+ return 0x02;
+ }
+ else
+ {
+ logerror("%s: get_status unknown SCSI id %d\n", tag(), m_selected);
+ return 0;
+ }
+}
+
+scsihle_device *legacy_scsi_host_adapter::get_device(int id)
+{
+ // steal scsi devices from bus
+ for (device_t *device = m_scsi_port->first_subdevice(); device != NULL; device = device->next())
+ {
+ SCSI_PORT_SLOT_device *slot = dynamic_cast<SCSI_PORT_SLOT_device *>(device);
+ if (slot != NULL)
+ {
+ scsihle_device *scsidev = dynamic_cast<scsihle_device *>(slot->dev());
+ if (scsidev != NULL)
+ {
+ if (scsidev->GetDeviceID() == id)
+ {
+ return scsidev;
+ }
+ }
+ }
+ }
+
+ return NULL;
+}