summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/hp_dio/hp_dio.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/hp_dio/hp_dio.h')
-rw-r--r--src/devices/bus/hp_dio/hp_dio.h248
1 files changed, 248 insertions, 0 deletions
diff --git a/src/devices/bus/hp_dio/hp_dio.h b/src/devices/bus/hp_dio/hp_dio.h
new file mode 100644
index 00000000000..20789a53803
--- /dev/null
+++ b/src/devices/bus/hp_dio/hp_dio.h
@@ -0,0 +1,248 @@
+// license:BSD-3-Clause
+// copyright-holders:Miodrag Milanovic, R.Belmont
+/***************************************************************************
+
+ HP DIO and DIO-II bus devices
+
+ DIO is 16-bit, essentially the MC68000 bus
+ DIO-II extends to 32-bit for 68020/030/040 machines
+
+ 16-bit DIO cards fit and work in either 16 or 32 bit systems, much like 8-bit ISA.
+ 32-bit DIO-II cards only work in 32 bit DIO-II systems.
+
+***************************************************************************/
+
+#ifndef MAME_BUS_HPDIO_HPDIO_H
+#define MAME_BUS_HPDIO_HPDIO_H
+
+#pragma once
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_DIO16_CPU(_cputag) \
+ dio16_device::static_set_cputag(*device, _cputag);
+#define MCFG_DIO16_SLOT_ADD(_diotag, _tag, _slot_intf, _def_slot, _fixed) \
+ MCFG_DEVICE_ADD(_tag, DIO16_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) \
+ dio16_slot_device::static_set_dio16_slot(*device, owner, _diotag);
+#define MCFG_DIO32_CPU(_cputag) \
+ dio32_device::static_set_cputag(*device, _cputag);
+#define MCFG_DIO32_SLOT_ADD(_diotag, _tag, _slot_intf, _def_slot, _fixed) \
+ MCFG_DEVICE_ADD(_tag, DIO32_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed) \
+ dio32_slot_device::static_set_dio32_slot(*device, owner, _diotag);
+
+#define MCFG_ISA_OUT_IRQ3_CB(_devcb) \
+ devcb = &dio16_device::set_out_irq3_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_ISA_OUT_IRQ4_CB(_devcb) \
+ devcb = &dio16_device::set_out_irq4_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_ISA_OUT_IRQ5_CB(_devcb) \
+ devcb = &dio16_device::set_out_irq5_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_ISA_OUT_IRQ6_CB(_devcb) \
+ devcb = &dio16_device::set_out_irq6_callback(*device, DEVCB_##_devcb);
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class dio16_device;
+
+class dio16_slot_device : public device_t,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ dio16_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+
+ // inline configuration
+ static void static_set_dio16_slot(device_t &device, device_t *owner, const char *dio_tag);
+
+protected:
+ dio16_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // configuration
+ device_t *m_owner;
+ const char *m_dio_tag;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(DIO16_SLOT, dio16_slot_device)
+
+class device_dio16_card_interface;
+// ======================> dio16_device
+class dio16_device : public device_t,
+ public device_memory_interface
+{
+public:
+ // construction/destruction
+ dio16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ // inline configuration
+ static void static_set_cputag(device_t &device, const char *tag);
+ template <class Object> static devcb_base &set_out_irq3_callback(device_t &device, Object &&cb) { return downcast<dio16_device &>(device).m_out_irq3_cb.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_out_irq4_callback(device_t &device, Object &&cb) { return downcast<dio16_device &>(device).m_out_irq4_cb.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_out_irq5_callback(device_t &device, Object &&cb) { return downcast<dio16_device &>(device).m_out_irq5_cb.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_out_irq6_callback(device_t &device, Object &&cb) { return downcast<dio16_device &>(device).m_out_irq6_cb.set_callback(std::forward<Object>(cb)); }
+
+ // for DIO16, put the 16-bit configs in the primary slots and the 32-bit configs in the secondary
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override
+ {
+ switch (spacenum)
+ {
+ case AS_PROGRAM: return &m_program_config;
+ case AS_DATA: return &m_program32_config;
+ default: return nullptr;
+ }
+ }
+
+ void install_device(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler);
+
+ void install_bank(offs_t start, offs_t end, const char *tag, uint8_t *data);
+ void install_rom(device_t *dev, offs_t start, offs_t end, const char *tag, const char *region);
+ void install_memory(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler);
+
+ void unmap_bank(offs_t start, offs_t end);
+ void unmap_rom(offs_t start, offs_t end);
+
+ // IRQs 1, 2, and 7 are reserved for non-bus usage.
+ DECLARE_WRITE_LINE_MEMBER( irq3_w );
+ DECLARE_WRITE_LINE_MEMBER( irq4_w );
+ DECLARE_WRITE_LINE_MEMBER( irq5_w );
+ DECLARE_WRITE_LINE_MEMBER( irq6_w );
+
+ const address_space_config m_program_config, m_program32_config;
+
+protected:
+ dio16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ void install_space(address_spacenum spacenum, offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // internal state
+ cpu_device *m_maincpu;
+
+ // address spaces
+ address_space *m_prgspace;
+ int m_prgwidth;
+
+ devcb_write_line m_out_irq3_cb;
+ devcb_write_line m_out_irq4_cb;
+ devcb_write_line m_out_irq5_cb;
+ devcb_write_line m_out_irq6_cb;
+
+ const char *m_cputag;
+
+private:
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(DIO16, dio16_device)
+
+// ======================> device_dio16_card_interface
+
+// class representing interface-specific live dio16 card
+class device_dio16_card_interface : public device_slot_card_interface
+{
+ friend class dio16_device;
+ template <class ElementType> friend class simple_list;
+public:
+ // construction/destruction
+ virtual ~device_dio16_card_interface();
+
+ device_dio16_card_interface *next() const { return m_next; }
+
+ void set_dio_device();
+
+ // inline configuration
+ static void static_set_diobus(device_t &device, device_t *dio_device);
+
+public:
+ device_dio16_card_interface(const machine_config &mconfig, device_t &device);
+
+ dio16_device *m_dio;
+ device_t *m_dio_dev;
+
+private:
+ device_dio16_card_interface *m_next;
+};
+
+class dio32_device;
+
+class dio32_slot_device : public dio16_slot_device
+{
+public:
+ // construction/destruction
+ dio32_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ // device-level overrides
+ virtual void device_start() override;
+
+ // inline configuration
+ static void static_set_dio32_slot(device_t &device, device_t *owner, const char *dio_tag);
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(DIO32_SLOT, dio32_slot_device)
+
+// ======================> dio32_device
+class dio32_device : public dio16_device
+{
+public:
+ // construction/destruction
+ dio32_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ void install16_device(offs_t start, offs_t end, read16_delegate rhandler, write16_delegate whandler);
+
+ // for DIO32, put the 32-bit configs in the primary slots and the 16-bit configs in the secondary
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum) const override
+ {
+ switch (spacenum)
+ {
+ case AS_PROGRAM: return &m_program32_config;
+ case AS_DATA: return &m_program_config;
+ default: return nullptr;
+ }
+ }
+
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(DIO32, dio32_device)
+
+// ======================> device_dio32_card_interface
+
+// class representing interface-specific live dio32 card
+class device_dio32_card_interface : public device_dio16_card_interface
+{
+ friend class dio32_device;
+public:
+ // construction/destruction
+ virtual ~device_dio32_card_interface();
+
+ void set_dio_device();
+
+protected:
+ device_dio32_card_interface(const machine_config &mconfig, device_t &device);
+
+ dio32_device *m_dio;
+};
+
+#endif // MAME_BUS_HPDIO_HPDIO_H