diff options
Diffstat (limited to 'src/devices/machine/nscsi_bus.cpp')
-rw-r--r-- | src/devices/machine/nscsi_bus.cpp | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/src/devices/machine/nscsi_bus.cpp b/src/devices/machine/nscsi_bus.cpp index c8ac3428735..c2274f49c95 100644 --- a/src/devices/machine/nscsi_bus.cpp +++ b/src/devices/machine/nscsi_bus.cpp @@ -125,19 +125,15 @@ void nscsi_bus_device::ctrl_wait(int refid, uint32_t lines, uint32_t mask) dev[refid].wait_ctrl = (w & ~mask) | (lines & mask); } -void nscsi_bus_device::device_config_complete() +void nscsi_bus_device::device_resolve_objects() { - char id[3]; for(int i=0; i<16; i++) { - sprintf(id, "%d", i); - nscsi_connector *conn = downcast<nscsi_connector *>(subdevice(id)); - if(conn) { - nscsi_device *sdev = conn->get_device(); - if(sdev) { - int rid = devcnt++; - dev[rid].dev = sdev; - sdev->connect_to_bus(this, rid, i); - } + device_t *subdev = subdevice(string_format("%d", i).c_str()); + nscsi_device *sdev = subdev ? downcast<nscsi_connector &>(*subdev).get_device() : nullptr; + if(sdev) { + int rid = devcnt++; + dev[rid].dev = sdev; + sdev->connect_to_bus(this, rid, i); } } } @@ -153,18 +149,34 @@ nscsi_connector::~nscsi_connector() { } +void nscsi_connector::device_validity_check(validity_checker &valid) const +{ + device_t *const carddev = get_card_device(); + if (carddev && !dynamic_cast<nscsi_slot_card_interface *>(carddev)) + osd_printf_error("Card device %s (%s) does not implement nscsi_slot_card_interface\n", carddev->tag(), carddev->name()); +} + void nscsi_connector::device_start() { } nscsi_device *nscsi_connector::get_device() { - return dynamic_cast<nscsi_device *>(get_card_device()); + nscsi_slot_card_interface *connected = dynamic_cast<nscsi_slot_card_interface *>(get_card_device()); + if (connected) + return connected->device().subdevice<nscsi_device>(connected->m_nscsi.finder_tag()); + else + return nullptr; +} + +nscsi_slot_card_interface::nscsi_slot_card_interface(const machine_config &mconfig, device_t &device, const char *nscsi_tag) : + device_slot_card_interface(mconfig, device), + m_nscsi(device, nscsi_tag) +{ } nscsi_device::nscsi_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_slot_card_interface(mconfig, *this) + device_t(mconfig, type, tag, owner, clock) { scsi_id = scsi_refid = -1; scsi_bus = nullptr; @@ -187,6 +199,12 @@ void nscsi_device::device_start() } +nscsi_full_device::nscsi_full_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + nscsi_device(mconfig, type, tag, owner, clock), + nscsi_slot_card_interface(mconfig, *this, DEVICE_SELF) +{ +} + const char *const nscsi_full_device::command_names[256] = { /* 00 */ "TEST_UNIT_READY", "REZERO", "?", "REQUEST_SENSE", "FORMAT_UNIT", "?", "?", "REASSIGN_BLOCKS", /* 08 */ "READ_6/RECIEVE", "?", "WRITE_6/SEND", "SEEK", "?", "?", "?", "?", |