summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/spectrum/exp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/spectrum/exp.h')
-rw-r--r--src/devices/bus/spectrum/exp.h147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/devices/bus/spectrum/exp.h b/src/devices/bus/spectrum/exp.h
new file mode 100644
index 00000000000..b82707073a6
--- /dev/null
+++ b/src/devices/bus/spectrum/exp.h
@@ -0,0 +1,147 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ ZX Spectrum Expansion Port emulation
+
+**********************************************************************
+
+ Pinout:
+
+ A15 1 A14
+ A13 2 A12
+ D7 3 +5v
+ ¬OE 4 NC
+ SLOT 5 SLOT
+ D0 6 0v
+ D1 7 0v
+ D2 8 ¬CK
+ D6 9 A0
+ D5 10 A1
+ D3 11 A2
+ D4 12 A3
+ ¬INT 13 NC
+ ¬NMI 14 0v
+ ¬HALT 15 ¬OE
+ ¬MREQ 16 NC
+ ¬IORQ 17 NC
+ ¬RD 18 NC
+ ¬WR 19 ¬BUSRQ
+ NC 20 ¬RESET
+ ¬WAIT 21 A7
+ +12v 22 A6
+ NC 23 A5
+ ¬M1 24 A4
+ ¬RFSH 25 ¬ROMCS
+ A8 26 ¬BUSACK
+ A10 27 A9
+ NC 28 A11
+
+**********************************************************************/
+
+#ifndef MAME_BUS_SPECTRUM_EXP_H
+#define MAME_BUS_SPECTRUM_EXP_H
+
+#pragma once
+
+
+//**************************************************************************
+// CONSTANTS
+//**************************************************************************
+
+#define SPECTRUM_EXPANSION_SLOT_TAG "exp"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_SPECTRUM_EXPANSION_SLOT_ADD(_tag, _slot_intf, _def_slot) \
+ MCFG_DEVICE_ADD(_tag, SPECTRUM_EXPANSION_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
+
+#define MCFG_SPECTRUM_PASSTHRU_EXPANSION_SLOT_ADD() \
+ MCFG_SPECTRUM_EXPANSION_SLOT_ADD(SPECTRUM_EXPANSION_SLOT_TAG, spectrum_expansion_devices, nullptr) \
+ MCFG_SPECTRUM_EXPANSION_SLOT_IRQ_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, spectrum_expansion_slot_device, irq_w)) \
+ MCFG_SPECTRUM_EXPANSION_SLOT_NMI_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, spectrum_expansion_slot_device, nmi_w))
+
+#define MCFG_SPECTRUM_EXPANSION_SLOT_IRQ_HANDLER(_devcb) \
+ devcb = &spectrum_expansion_slot_device::set_irq_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_SPECTRUM_EXPANSION_SLOT_NMI_HANDLER(_devcb) \
+ devcb = &spectrum_expansion_slot_device::set_nmi_handler(*device, DEVCB_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> spectrum_expansion_slot_device
+
+class device_spectrum_expansion_interface;
+
+class spectrum_expansion_slot_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ spectrum_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual ~spectrum_expansion_slot_device();
+
+ // callbacks
+ template <class Object> static devcb_base &set_irq_handler(device_t &device, Object &&cb)
+ { return downcast<spectrum_expansion_slot_device &>(device).m_irq_handler.set_callback(std::forward<Object>(cb)); }
+
+ template <class Object> static devcb_base &set_nmi_handler(device_t &device, Object &&cb)
+ { return downcast<spectrum_expansion_slot_device &>(device).m_nmi_handler.set_callback(std::forward<Object>(cb)); }
+
+ DECLARE_READ8_MEMBER( mreq_r );
+ DECLARE_WRITE8_MEMBER( mreq_w );
+ DECLARE_READ8_MEMBER( port_fe_r );
+ DECLARE_READ_LINE_MEMBER( romcs );
+
+ DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
+ DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ device_spectrum_expansion_interface *m_card;
+
+private:
+ devcb_write_line m_irq_handler;
+ devcb_write_line m_nmi_handler;
+};
+
+
+// ======================> device_spectrum_expansion_interface
+
+class device_spectrum_expansion_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ virtual ~device_spectrum_expansion_interface();
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(mreq_r) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(mreq_w) { }
+ virtual DECLARE_READ8_MEMBER(port_fe_r) { return 0xff; }
+ virtual DECLARE_READ_LINE_MEMBER(romcs) { return 0; }
+
+protected:
+ device_spectrum_expansion_interface(const machine_config &mconfig, device_t &device);
+
+ spectrum_expansion_slot_device *m_slot;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(SPECTRUM_EXPANSION_SLOT, spectrum_expansion_slot_device)
+
+SLOT_INTERFACE_EXTERN( spectrum_expansion_devices );
+SLOT_INTERFACE_EXTERN( spec128_expansion_devices );
+SLOT_INTERFACE_EXTERN( specpls3_expansion_devices );
+
+
+#endif // MAME_BUS_SPECTRUM_EXP_H