From 60d4fea8c8c2af49b8c388c36aaf04b3095b13da Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 11 Jul 2019 16:56:39 -0400 Subject: [PATCH] nscsi_bus: Class overhaul (nw) - SCSI slot options are no longer required to implement nscsi_device themselves. Instead they implement nscsi_slot_device_interface, which contains a finder for a nscsi_device. This is to accommodate LLE SCSI drives with their own LSI interface chips. - SCSI bus device connection is now done through device_resolve_objects rather than device_config_complete. (The pessimized code to access the device finder is because that will not have been resolved yet.) - Added a validity checking method for nscsi_connector. --- src/devices/machine/53c7xx.cpp | 1 + src/devices/machine/53c7xx.h | 2 +- src/devices/machine/aic6250.cpp | 1 + src/devices/machine/aic6250.h | 2 +- src/devices/machine/mb87030.cpp | 1 + src/devices/machine/mb87030.h | 2 +- src/devices/machine/ncr5380n.cpp | 1 + src/devices/machine/ncr5380n.h | 2 +- src/devices/machine/ncr5390.cpp | 1 + src/devices/machine/ncr5390.h | 2 +- src/devices/machine/nscsi_bus.cpp | 46 +++++++++++++++++++++---------- src/devices/machine/nscsi_bus.h | 20 +++++++++++--- src/devices/machine/nscsi_cb.cpp | 1 + src/devices/machine/nscsi_cb.h | 2 +- src/devices/machine/wd33c9x.cpp | 1 + src/devices/machine/wd33c9x.h | 2 +- 16 files changed, 62 insertions(+), 25 deletions(-) diff --git a/src/devices/machine/53c7xx.cpp b/src/devices/machine/53c7xx.cpp index a3466da81f1..14f339c30f7 100644 --- a/src/devices/machine/53c7xx.cpp +++ b/src/devices/machine/53c7xx.cpp @@ -89,6 +89,7 @@ DEFINE_DEVICE_TYPE(NCR53C7XX, ncr53c7xx_device, "ncr537xx", "NCR 53C7xx SCSI") ncr53c7xx_device::ncr53c7xx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : nscsi_device(mconfig, NCR53C7XX, tag, owner, clock), + nscsi_slot_card_interface(mconfig, *this, DEVICE_SELF), device_execute_interface(mconfig, *this), m_icount(0), m_irq_handler(*this), diff --git a/src/devices/machine/53c7xx.h b/src/devices/machine/53c7xx.h index 50d59c1d1b4..e6b846f0945 100644 --- a/src/devices/machine/53c7xx.h +++ b/src/devices/machine/53c7xx.h @@ -16,7 +16,7 @@ #include "machine/nscsi_bus.h" -class ncr53c7xx_device : public nscsi_device, public device_execute_interface +class ncr53c7xx_device : public nscsi_device, public nscsi_slot_card_interface, public device_execute_interface { public: // construction/destruction diff --git a/src/devices/machine/aic6250.cpp b/src/devices/machine/aic6250.cpp index 512d1625d8d..9c149f51627 100644 --- a/src/devices/machine/aic6250.cpp +++ b/src/devices/machine/aic6250.cpp @@ -49,6 +49,7 @@ static char const *const aic6250_phase[] = { "DATA OUT", "*", "DATA IN", "*", "C aic6250_device::aic6250_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) , m_int_cb(*this) , m_breq_cb(*this) , m_port_a_r_cb(*this) diff --git a/src/devices/machine/aic6250.h b/src/devices/machine/aic6250.h index 2a4ba02d118..9f6febfd8a7 100644 --- a/src/devices/machine/aic6250.h +++ b/src/devices/machine/aic6250.h @@ -8,7 +8,7 @@ #include "machine/nscsi_bus.h" -class aic6250_device : public nscsi_device +class aic6250_device : public nscsi_device, public nscsi_slot_card_interface { public: aic6250_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/devices/machine/mb87030.cpp b/src/devices/machine/mb87030.cpp index cd0b4f2beae..25420dfad54 100644 --- a/src/devices/machine/mb87030.cpp +++ b/src/devices/machine/mb87030.cpp @@ -18,6 +18,7 @@ mb87030_device::mb87030_device(const machine_config &mconfig, const char *tag, d mb87030_device::mb87030_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), m_irq_handler(*this), m_dreq_handler(*this) { diff --git a/src/devices/machine/mb87030.h b/src/devices/machine/mb87030.h index 560e53c90c0..dc07f0edb9b 100644 --- a/src/devices/machine/mb87030.h +++ b/src/devices/machine/mb87030.h @@ -8,7 +8,7 @@ #include "machine/nscsi_bus.h" #include -class mb87030_device : public nscsi_device +class mb87030_device : public nscsi_device, public nscsi_slot_card_interface { public: mb87030_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/devices/machine/ncr5380n.cpp b/src/devices/machine/ncr5380n.cpp index 9681fbf4a7f..7adb63800d9 100644 --- a/src/devices/machine/ncr5380n.cpp +++ b/src/devices/machine/ncr5380n.cpp @@ -36,6 +36,7 @@ void ncr5380n_device::map(address_map &map) ncr5380n_device::ncr5380n_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) , m_fake_clock(10000000) , tm(nullptr), status(0), istatus(0), m_mode(0) , m_outdata(0), m_busstatus(0), m_dmalatch(0), m_icommand(0), m_tcommand(0), clock_conv(0), sync_offset(0), sync_period(0), bus_id(0), select_timeout(0) diff --git a/src/devices/machine/ncr5380n.h b/src/devices/machine/ncr5380n.h index 28cd0ec5fee..5bf01b10bb8 100644 --- a/src/devices/machine/ncr5380n.h +++ b/src/devices/machine/ncr5380n.h @@ -16,7 +16,7 @@ #include "machine/nscsi_bus.h" -class ncr5380n_device : public nscsi_device +class ncr5380n_device : public nscsi_device, public nscsi_slot_card_interface { public: ncr5380n_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/devices/machine/ncr5390.cpp b/src/devices/machine/ncr5390.cpp index 10b7510d707..b513566bb3a 100644 --- a/src/devices/machine/ncr5390.cpp +++ b/src/devices/machine/ncr5390.cpp @@ -124,6 +124,7 @@ void ncr53c94_device::write(offs_t offset, uint8_t data) ncr5390_device::ncr5390_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) , tm(nullptr), config(0), status(0), istatus(0), clock_conv(0), sync_offset(0), sync_period(0), bus_id(0) , select_timeout(0), seq(0), tcount(0), tcounter(0), mode(0), fifo_pos(0), command_pos(0), state(0), xfr_phase(0), command_length(0), dma_dir(0), irq(false), drq(false), test_mode(false) , m_irq_handler(*this) diff --git a/src/devices/machine/ncr5390.h b/src/devices/machine/ncr5390.h index 7cc2469bde5..76952fe0f7b 100644 --- a/src/devices/machine/ncr5390.h +++ b/src/devices/machine/ncr5390.h @@ -7,7 +7,7 @@ #include "machine/nscsi_bus.h" -class ncr5390_device : public nscsi_device +class ncr5390_device : public nscsi_device, public nscsi_slot_card_interface { public: ncr5390_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 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(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(*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(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(get_card_device()); + nscsi_slot_card_interface *connected = dynamic_cast(get_card_device()); + if (connected) + return connected->device().subdevice(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", "?", "?", "?", "?", diff --git a/src/devices/machine/nscsi_bus.h b/src/devices/machine/nscsi_bus.h index 244eda94fe8..6ee65f470c7 100644 --- a/src/devices/machine/nscsi_bus.h +++ b/src/devices/machine/nscsi_bus.h @@ -23,7 +23,7 @@ public: protected: virtual void device_start() override; virtual void device_reset() override; - virtual void device_config_complete() override; + virtual void device_resolve_objects() override; private: struct dev_t { @@ -60,10 +60,22 @@ public: nscsi_device *get_device(); protected: + virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override; }; -class nscsi_device : public device_t, public device_slot_card_interface +class nscsi_slot_card_interface : public device_slot_card_interface +{ + friend class nscsi_connector; + +public: + nscsi_slot_card_interface(const machine_config &mconfig, device_t &device, const char *nscsi_tag); + +private: + required_device m_nscsi; +}; + +class nscsi_device : public device_t { public: // Here because the biggest users are the devices, not the bus @@ -128,7 +140,7 @@ protected: nscsi_bus_device *scsi_bus; }; -class nscsi_full_device : public nscsi_device +class nscsi_full_device : public nscsi_device, public nscsi_slot_card_interface { public: virtual void scsi_ctrl_changed() override; @@ -300,7 +312,7 @@ protected: SBUF_SENSE }; - using nscsi_device::nscsi_device; + nscsi_full_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void device_start() override; virtual void device_reset() override; diff --git a/src/devices/machine/nscsi_cb.cpp b/src/devices/machine/nscsi_cb.cpp index 0bd3f76af21..5d42caf8265 100644 --- a/src/devices/machine/nscsi_cb.cpp +++ b/src/devices/machine/nscsi_cb.cpp @@ -7,6 +7,7 @@ DEFINE_DEVICE_TYPE(NSCSI_CB, nscsi_callback_device, "nscsi_cb", "SCSI callback ( nscsi_callback_device::nscsi_callback_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : nscsi_device(mconfig, NSCSI_CB, tag, owner, clock), + nscsi_slot_card_interface(mconfig, *this, DEVICE_SELF), m_write_rst(*this), m_write_atn(*this), m_write_ack(*this), diff --git a/src/devices/machine/nscsi_cb.h b/src/devices/machine/nscsi_cb.h index 575e8f19298..8a97b76c29f 100644 --- a/src/devices/machine/nscsi_cb.h +++ b/src/devices/machine/nscsi_cb.h @@ -8,7 +8,7 @@ #include "machine/nscsi_bus.h" -class nscsi_callback_device : public nscsi_device +class nscsi_callback_device : public nscsi_device, public nscsi_slot_card_interface { public: nscsi_callback_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); diff --git a/src/devices/machine/wd33c9x.cpp b/src/devices/machine/wd33c9x.cpp index ab82c36ec0a..476c6cc913c 100644 --- a/src/devices/machine/wd33c9x.cpp +++ b/src/devices/machine/wd33c9x.cpp @@ -359,6 +359,7 @@ DEFINE_DEVICE_TYPE(WD33C93B, wd33c93b_device, "wd33c93b", "Western Digital WD33C wd33c9x_base_device::wd33c9x_base_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) , m_addr{ 0 } , m_regs{ 0 } , m_command_length{ 0 } diff --git a/src/devices/machine/wd33c9x.h b/src/devices/machine/wd33c9x.h index 65e97852e00..bdfb84fe8d9 100644 --- a/src/devices/machine/wd33c9x.h +++ b/src/devices/machine/wd33c9x.h @@ -11,7 +11,7 @@ #include "machine/nscsi_bus.h" -class wd33c9x_base_device : public nscsi_device +class wd33c9x_base_device : public nscsi_device, public nscsi_slot_card_interface { public: auto irq_cb() { return m_irq_cb.bind(); }