summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/am9519.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/am9519.h')
-rw-r--r--src/devices/machine/am9519.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/devices/machine/am9519.h b/src/devices/machine/am9519.h
new file mode 100644
index 00000000000..2bfa9e89fe8
--- /dev/null
+++ b/src/devices/machine/am9519.h
@@ -0,0 +1,93 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol,Carl
+/***************************************************************************
+
+ AMD AM9519
+
+ Universal Interrupt Controller
+
+ _____ _____
+ _CS 1 |* \_/ | 28 VCC
+ _WR 2 | | 27 C/_D
+ _RD 3 | | 26 _IACK
+ DB7 4 | | 25 IREQ7
+ DB6 5 | | 24 IREQ6
+ DB5 6 | | 23 IREQ5
+ DB4 7 | AM9519 | 22 IREQ4
+ DB3 8 | | 21 IREQ3
+ DB2 9 | | 20 IREQ2
+ DB1 10 | | 19 IREQ1
+ DB0 11 | | 18 IREQ0
+ _RIP 12 | | 17 GINT
+ EI 13 | | 16 _EO
+ GND 14 |_____________| 15 _PAUSE
+
+***************************************************************************/
+
+#ifndef MAME_MACHINE_AM9519_H
+#define MAME_MACHINE_AM9519_H
+
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+***************************************************************************/
+
+#define MCFG_AM9519_OUT_INT_CB(_devcb) \
+ devcb = &am9519_device::static_set_out_int_callback(*device, DEVCB_##_devcb);
+
+
+class am9519_device : public device_t
+{
+public:
+ am9519_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ template <class Object> static devcb_base &static_set_out_int_callback(device_t &device, Object &&cb) { return downcast<am9519_device &>(device).m_out_int_func.set_callback(std::forward<Object>(cb)); }
+
+ DECLARE_READ8_MEMBER( stat_r );
+ DECLARE_READ8_MEMBER( data_r );
+ DECLARE_WRITE8_MEMBER( cmd_w );
+ DECLARE_WRITE8_MEMBER( data_w );
+ u32 acknowledge();
+
+ DECLARE_WRITE_LINE_MEMBER( ireq0_w ) { set_irq_line(0, state); }
+ DECLARE_WRITE_LINE_MEMBER( ireq1_w ) { set_irq_line(1, state); }
+ DECLARE_WRITE_LINE_MEMBER( ireq2_w ) { set_irq_line(2, state); }
+ DECLARE_WRITE_LINE_MEMBER( ireq3_w ) { set_irq_line(3, state); }
+ DECLARE_WRITE_LINE_MEMBER( ireq4_w ) { set_irq_line(4, state); }
+ DECLARE_WRITE_LINE_MEMBER( ireq5_w ) { set_irq_line(5, state); }
+ DECLARE_WRITE_LINE_MEMBER( ireq6_w ) { set_irq_line(6, state); }
+ DECLARE_WRITE_LINE_MEMBER( ireq7_w ) { set_irq_line(7, state); }
+
+ IRQ_CALLBACK_MEMBER(iack_cb);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+private:
+ static constexpr device_timer_id TIMER_CHECK_IRQ = 0;
+
+ inline void set_timer() { timer_set(attotime::zero, TIMER_CHECK_IRQ); }
+ void set_irq_line(int irq, int state);
+
+ devcb_write_line m_out_int_func;
+
+ u8 m_isr;
+ u8 m_irr;
+ u8 m_prio;
+ u8 m_imr;
+ u8 m_irq_lines;
+
+ u8 m_curcnt;
+ u8 m_mode;
+ u8 m_cmd;
+ u8 m_aclear;
+ u8 m_count[8];
+ u8 m_resp[8][4];
+};
+
+DECLARE_DEVICE_TYPE(AM9519, am9519_device)
+
+#endif // MAME_MACHINE_AM9519_H