diff options
Diffstat (limited to 'src/devices/bus/interpro/sr/sr.h')
-rw-r--r-- | src/devices/bus/interpro/sr/sr.h | 260 |
1 files changed, 215 insertions, 45 deletions
diff --git a/src/devices/bus/interpro/sr/sr.h b/src/devices/bus/interpro/sr/sr.h index 9be58c9ac12..cf987dc19e7 100644 --- a/src/devices/bus/interpro/sr/sr.h +++ b/src/devices/bus/interpro/sr/sr.h @@ -6,69 +6,92 @@ #pragma once -#define MCFG_SR_OUT_IRQ0_CB(_devcb) \ - devcb = &downcast<sr_device &>(*device).set_out_irq0_callback(DEVCB_##_devcb); +#define MCFG_CBUS_OUT_IRQ0_CB(_devcb) \ + devcb = &downcast<cbus_device &>(*device).set_out_irq0_callback(DEVCB_##_devcb); -#define MCFG_SR_OUT_IRQ1_CB(_devcb) \ - devcb = &downcast<sr_device &>(*device).set_out_irq1_callback(DEVCB_##_devcb); +#define MCFG_CBUS_OUT_IRQ1_CB(_devcb) \ + devcb = &downcast<cbus_device &>(*device).set_out_irq1_callback(DEVCB_##_devcb); -#define MCFG_SR_OUT_IRQ2_CB(_devcb) \ - devcb = &downcast<sr_device &>(*device).set_out_irq2_callback(DEVCB_##_devcb); +#define MCFG_CBUS_OUT_IRQ2_CB(_devcb) \ + devcb = &downcast<cbus_device &>(*device).set_out_irq2_callback(DEVCB_##_devcb); -#define MCFG_SR_SLOT_ADD(_srtag, _tag, _slot_intf, _def_slot, _fixed) \ - MCFG_DEVICE_ADD(_tag, SR_SLOT, 0) \ +#define MCFG_CBUS_OUT_VBLANK_CB(_devcb) \ + devcb = &downcast<cbus_device &>(*device).set_out_vblank_callback(DEVCB_##_devcb); + +#define MCFG_CBUS_SLOT_ADD(_bus_tag, _slot_tag, _slot_intf, _def_slot, _fixed) \ + MCFG_DEVICE_ADD(_slot_tag, CBUS_SLOT, 0) \ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) \ - downcast<sr_slot_device &>(*device).set_sr_slot(_srtag, _tag); + downcast<cbus_slot_device &>(*device).set_tags(_bus_tag, _slot_tag); + +#define MCFG_CBUS_MEMORY(_tag, _main_spacenum, _io_spacenum) \ + downcast<cbus_device &>(*device).set_memory(_tag, _main_spacenum, _io_spacenum); + + +#define MCFG_SRX_OUT_IRQ0_CB(_devcb) \ + devcb = &downcast<srx_device &>(*device).set_out_irq0_callback(DEVCB_##_devcb); + +#define MCFG_SRX_OUT_IRQ1_CB(_devcb) \ + devcb = &downcast<srx_device &>(*device).set_out_irq1_callback(DEVCB_##_devcb); + +#define MCFG_SRX_OUT_IRQ2_CB(_devcb) \ + devcb = &downcast<srx_device &>(*device).set_out_irq2_callback(DEVCB_##_devcb); + +#define MCFG_SRX_OUT_VBLANK_CB(_devcb) \ + devcb = &downcast<srx_device &>(*device).set_out_vblank_callback(DEVCB_##_devcb); -#define MCFG_SR_SLOT_REMOVE(_tag) \ - MCFG_DEVICE_REMOVE(_tag) +#define MCFG_SRX_SLOT_ADD(_bus_tag, _slot_tag, _slot_intf, _def_slot, _fixed) \ + MCFG_DEVICE_ADD(_slot_tag, SRX_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) \ + downcast<srx_slot_device &>(*device).set_tags(_bus_tag, _slot_tag); -#define MCFG_SR_MEMORY(_tag, _main_spacenum, _io_spacenum) \ - downcast<sr_device &>(*device).set_memory(_tag, _main_spacenum, _io_spacenum); +#define MCFG_SRX_MEMORY(_tag, _main_spacenum, _io_spacenum) \ + downcast<srx_device &>(*device).set_memory(_tag, _main_spacenum, _io_spacenum); -class sr_slot_device : public device_t, public device_slot_interface +class cbus_slot_device : public device_t, public device_slot_interface { public: // construction/destruction - sr_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + cbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); // inline configuration - void set_sr_slot(const char *tag, const char *slot_tag); + void set_tags(const char *bus_tag, const char *slot_tag); protected: - sr_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + cbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); // device-level overrides virtual void device_start() override; // configuration - const char *m_sr_tag; - const char *m_sr_slot_tag; + const char *m_bus_tag; + const char *m_slot_tag; }; -class device_sr_card_interface; +class device_cbus_card_interface; -class sr_device : public device_t +class cbus_device : public device_t { public: // construction/destruction - sr_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + cbus_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); // inline configuration template <class Object> devcb_base &set_out_irq0_callback(Object &&cb) { return m_out_irq0_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_out_irq1_callback(Object &&cb) { return m_out_irq1_cb.set_callback(std::forward<Object>(cb)); } template <class Object> devcb_base &set_out_irq2_callback(Object &&cb) { return m_out_irq2_cb.set_callback(std::forward<Object>(cb)); } + template <class Object> devcb_base &set_out_vblank_callback(Object &&cb) { return m_out_vblank_cb.set_callback(std::forward<Object>(cb)); } void set_memory(const char *const tag, const int main_spacenum, const int io_spacenum); - static const u32 SR_BASE = 0x87000000; - static const u32 SR_SIZE = 0x08000000; - static const int SR_COUNT = 16; + static const u32 CBUS_BASE = 0x87000000; + static const u32 CBUS_SIZE = 0x08000000; + static const int CBUS_COUNT = 16; DECLARE_WRITE_LINE_MEMBER(irq0_w) { m_out_irq0_cb(state); } DECLARE_WRITE_LINE_MEMBER(irq1_w) { m_out_irq1_cb(state); } DECLARE_WRITE_LINE_MEMBER(irq2_w) { m_out_irq2_cb(state); } + DECLARE_WRITE_LINE_MEMBER(vblank_w) { m_out_vblank_cb(state); } // installation function for card devices template <typename T> void install_card(T &device, void (T::*map)(address_map &map)) @@ -77,8 +100,8 @@ public: m_slot[m_slot_count] = &device; // compute slot base address - offs_t start = SR_BASE + m_slot_count * SR_SIZE; - offs_t end = start + (SR_SIZE - 1); + offs_t start = CBUS_BASE + m_slot_count * CBUS_SIZE; + offs_t end = start + (CBUS_SIZE - 1); // install the device address map m_main_space->install_device(start, end, device, map); @@ -88,7 +111,7 @@ public: } protected: - sr_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + cbus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); // device-level overrides virtual void device_start() override; @@ -101,9 +124,10 @@ protected: devcb_write_line m_out_irq0_cb; devcb_write_line m_out_irq1_cb; devcb_write_line m_out_irq2_cb; + devcb_write_line m_out_vblank_cb; private: - device_sr_card_interface *m_slot[SR_COUNT]; + device_cbus_card_interface *m_slot[CBUS_COUNT]; int m_slot_count; const char *m_memory_tag; @@ -111,45 +135,191 @@ private: int m_io_spacenum; }; -class device_sr_card_interface : public device_slot_card_interface +class device_cbus_card_interface : public device_slot_card_interface { public: - // construction/destruction - virtual ~device_sr_card_interface(); - - void set_sr_device(); - void irq(int state); + void set_bus_device(); // inline configuration - void set_sr_tag(const char *tag, const char *slot_tag) { m_sr_tag = tag; m_sr_slot_tag = slot_tag; } + void set_tags(const char *bus_tag, const char *slot_tag) { m_bus_tag = bus_tag; m_slot_tag = slot_tag; } + + DECLARE_WRITE_LINE_MEMBER(irq0) { m_bus->irq0_w(state); } + DECLARE_WRITE_LINE_MEMBER(irq1) { m_bus->irq1_w(state); } + DECLARE_WRITE_LINE_MEMBER(irq2) { m_bus->irq2_w(state); } + DECLARE_WRITE_LINE_MEMBER(vblank) { m_bus->vblank_w(state); } protected: - device_sr_card_interface(const machine_config &mconfig, device_t &device); + device_cbus_card_interface(const machine_config &mconfig, device_t &device); virtual void map(address_map &map) = 0; - sr_device *m_sr; - const char *m_sr_tag; - const char *m_sr_slot_tag; + cbus_device *m_bus; + const char *m_bus_tag; + const char *m_slot_tag; }; -class sr_card_device_base : public device_t, public device_sr_card_interface +class cbus_card_device_base : public device_cbus_card_interface { protected: - sr_card_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, const char *idprom_region = "idprom"); + cbus_card_device_base(const machine_config &mconfig, device_t &device, const char *idprom_region = "idprom"); + +public: + const char *tag() { return device().tag(); } + +protected: + virtual void map(address_map &map) override; +private: + const char *const m_idprom_region; +}; + +class srx_slot_device : public device_t, public device_slot_interface +{ public: - READ32_MEMBER(idprom_r) { return device().memregion(m_idprom_region)->as_u32(offset); } + // construction/destruction + srx_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // inline configuration + void set_tags(const char *bus_tag, const char *slot_tag); protected: + srx_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // device-level overrides virtual void device_start() override; + // configuration + const char *m_bus_tag; + const char *m_slot_tag; +}; + +class device_srx_card_interface; + +class srx_device : public device_t +{ +public: + // construction/destruction + srx_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // inline configuration + template <class Object> devcb_base &set_out_irq0_callback(Object &&cb) { return m_out_irq0_cb.set_callback(std::forward<Object>(cb)); } + template <class Object> devcb_base &set_out_irq1_callback(Object &&cb) { return m_out_irq1_cb.set_callback(std::forward<Object>(cb)); } + template <class Object> devcb_base &set_out_irq2_callback(Object &&cb) { return m_out_irq2_cb.set_callback(std::forward<Object>(cb)); } + template <class Object> devcb_base &set_out_vblank_callback(Object &&cb) { return m_out_vblank_cb.set_callback(std::forward<Object>(cb)); } + + void set_memory(const char *const tag, const int main_spacenum, const int io_spacenum); + + static const u32 SRX_BASE = 0x8f000000; + static const u32 SRX_SIZE = 0x8000; + static const int SRX_COUNT = 32; + + DECLARE_WRITE_LINE_MEMBER(irq0_w) { m_out_irq0_cb(state); } + DECLARE_WRITE_LINE_MEMBER(irq1_w) { m_out_irq1_cb(state); } + DECLARE_WRITE_LINE_MEMBER(irq2_w) { m_out_irq2_cb(state); } + DECLARE_WRITE_LINE_MEMBER(vblank_w) { m_out_vblank_cb(state); } + + // installation function for card devices + template <typename T> void install_card(T &device, void (T::*map)(address_map &map)) + { + // record the device in the next free slot + m_slot[m_slot_count] = &device; + + // compute slot base address + offs_t start = SRX_BASE + m_slot_count * SRX_SIZE; + offs_t end = start + (SRX_SIZE - 1); + + // install the device address map + m_main_space->install_device(start, end, device, map); + m_io_space->install_device(start, end, device, map); + + m_slot_count++; + } + + template <typename T> T *get_card() + { + for (auto device : m_slot) + if (dynamic_cast<T *>(device) != nullptr) + return dynamic_cast<T *>(device); + + return nullptr; + } + + template <typename T> void install_map(T &device, offs_t start, offs_t end, void (T::*map)(address_map &map)) + { + // install the device address map + m_main_space->install_device(start, end, device, map); + m_io_space->install_device(start, end, device, map); + } + + address_space *main_space() { return m_main_space; } + address_space *io_space() { return m_io_space; } + +protected: + srx_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // internal state + address_space *m_main_space; + address_space *m_io_space; + + devcb_write_line m_out_irq0_cb; + devcb_write_line m_out_irq1_cb; + devcb_write_line m_out_irq2_cb; + devcb_write_line m_out_vblank_cb; + +private: + device_srx_card_interface *m_slot[SRX_COUNT]; + int m_slot_count; + + const char *m_memory_tag; + int m_main_spacenum; + int m_io_spacenum; +}; + +class device_srx_card_interface : public device_slot_card_interface +{ +public: + void set_bus_device(); + + // inline configuration + void set_tags(const char *bus_tag, const char *slot_tag) { m_bus_tag = bus_tag; m_slot_tag = slot_tag; } + + DECLARE_WRITE_LINE_MEMBER(irq0) { m_bus->irq0_w(state); } + DECLARE_WRITE_LINE_MEMBER(irq1) { m_bus->irq1_w(state); } + DECLARE_WRITE_LINE_MEMBER(irq2) { m_bus->irq2_w(state); } + DECLARE_WRITE_LINE_MEMBER(vblank) { m_bus->vblank_w(state); } + +protected: + device_srx_card_interface(const machine_config &mconfig, device_t &device); + + virtual void map(address_map &map) = 0; + + srx_device *m_bus; + const char *m_bus_tag; + const char *m_slot_tag; +}; + +class srx_card_device_base : public device_srx_card_interface +{ +protected: + srx_card_device_base(const machine_config &mconfig, device_t &device, const char *idprom_region = "idprom"); + +public: + const char *tag() { return device().tag(); } + +protected: + virtual void map(address_map &map) override; + private: const char *const m_idprom_region; }; -DECLARE_DEVICE_TYPE(SR, sr_device) -DECLARE_DEVICE_TYPE(SR_SLOT, sr_slot_device) +DECLARE_DEVICE_TYPE(CBUS, cbus_device) +DECLARE_DEVICE_TYPE(CBUS_SLOT, cbus_slot_device) +DECLARE_DEVICE_TYPE(SRX, srx_device) +DECLARE_DEVICE_TYPE(SRX_SLOT, srx_slot_device) #endif // MAME_BUS_INTERPRO_SR_SR_H |