summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-07-11 16:56:39 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-07-11 17:08:12 -0400
commit60d4fea8c8c2af49b8c388c36aaf04b3095b13da (patch)
treee57227498163820409eb6c7c7e4db164d2622cf3
parent2a751e00e7ae1f7e2180947a6ddeb1229ced6aa0 (diff)
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.
-rw-r--r--src/devices/machine/53c7xx.cpp1
-rw-r--r--src/devices/machine/53c7xx.h2
-rw-r--r--src/devices/machine/aic6250.cpp1
-rw-r--r--src/devices/machine/aic6250.h2
-rw-r--r--src/devices/machine/mb87030.cpp1
-rw-r--r--src/devices/machine/mb87030.h2
-rw-r--r--src/devices/machine/ncr5380n.cpp1
-rw-r--r--src/devices/machine/ncr5380n.h2
-rw-r--r--src/devices/machine/ncr5390.cpp1
-rw-r--r--src/devices/machine/ncr5390.h2
-rw-r--r--src/devices/machine/nscsi_bus.cpp46
-rw-r--r--src/devices/machine/nscsi_bus.h20
-rw-r--r--src/devices/machine/nscsi_cb.cpp1
-rw-r--r--src/devices/machine/nscsi_cb.h2
-rw-r--r--src/devices/machine/wd33c9x.cpp1
-rw-r--r--src/devices/machine/wd33c9x.h2
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 <queue>
-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<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", "?", "?", "?", "?",
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<nscsi_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(); }