// license:BSD-3-Clause // copyright-holders:smf #include "emu.h" #include "legscsi.h" legacy_scsi_host_adapter::legacy_scsi_host_adapter(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) , m_selected(0) , m_scsi_port(*this, finder_base::DUMMY_TAG) { } 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 != nullptr) { scsidev->reset(); } } } bool legacy_scsi_host_adapter::select(int id) { m_selected = id; scsihle_device *scsidev = get_device(m_selected); if (scsidev != nullptr) { return true; } return false; } void legacy_scsi_host_adapter::send_command(uint8_t *data, int bytes) { scsihle_device *scsidev = get_device(m_selected); if (scsidev != nullptr) { scsidev->SetCommand(data, bytes); scsidev->ExecCommand(); } else { logerror("send_command unknown SCSI id %d\n", m_selected); } } int legacy_scsi_host_adapter::get_length(void) { scsihle_device *scsidev = get_device(m_selected); if (scsidev != nullptr) { int length; scsidev->GetLength(&length); return length; } else { logerror("get_length unknown SCSI id %d\n", m_selected); return 0; } } int legacy_scsi_host_adapter::get_phase(void) { scsihle_device *scsidev = get_device(m_selected); if (scsidev != nullptr) { int phase; scsidev->GetPhase(&phase); return phase; } else { logerror("get_phase unknown SCSI id %d\n", m_selected); return 0; } } void legacy_scsi_host_adapter::read_data(uint8_t *data, int bytes) { scsihle_device *scsidev = get_device(m_selected); if (scsidev != nullptr) { scsidev->ReadData(data, bytes); } else { logerror("read_data unknown SCSI id %d\n", m_selected); } } void legacy_scsi_host_adapter::write_data(uint8_t *data, int bytes) { scsihle_device *scsidev = get_device(m_selected); if (scsidev != nullptr) { scsidev->WriteData(data, bytes); } else { logerror("write_data unknown SCSI id %d\n", m_selected); } } uint8_t legacy_scsi_host_adapter::get_status() { scsihle_device *scsidev = get_device(m_selected); if (scsidev != nullptr) { void *image; scsidev->GetDevice(&image); if (image != nullptr) return 0x00; return 0x02; } else { logerror("get_status unknown SCSI id %d\n", 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->subdevices()) { scsi_port_slot_device *slot = dynamic_cast(&device); if (slot != nullptr) { scsihle_device *scsidev = dynamic_cast(slot->dev()); if (scsidev != nullptr) { if (scsidev->GetDeviceID() == id) { return scsidev; } } } } return nullptr; }