summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/i82357.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/i82357.h')
-rw-r--r--src/devices/machine/i82357.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/devices/machine/i82357.h b/src/devices/machine/i82357.h
new file mode 100644
index 00000000000..3c5a7756061
--- /dev/null
+++ b/src/devices/machine/i82357.h
@@ -0,0 +1,91 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#ifndef MAME_MACHINE_I82357_H
+#define MAME_MACHINE_I82357_H
+
+#pragma once
+
+#include "machine/pic8259.h"
+#include "machine/pit8253.h"
+#include "machine/am9517a.h"
+
+class i82357_device : public device_t
+{
+public:
+ i82357_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ auto out_rtc_cb() { return m_out_rtc.bind(); }
+ auto out_int_cb() { return subdevice<pic8259_device>("pic0")->out_int_callback(); }
+ auto out_nmi_cb() { return m_out_nmi.bind(); }
+ auto out_spkr_cb() { return m_out_spkr.bind(); }
+
+ u32 eisa_irq_ack() { return m_pic[0]->acknowledge(); }
+
+ DECLARE_WRITE_LINE_MEMBER(in_iochk);
+ DECLARE_WRITE_LINE_MEMBER(in_parity);
+
+ void map(address_map &map);
+
+protected:
+ // standard device_t overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ void nmi_reg_w(u8 data);
+ void nmi_ext_w(u8 data);
+ u8 nmi_reg_r() { return m_nmi_reg; }
+ u8 nmi_ext_r() { return m_nmi_ext; }
+
+ TIMER_CALLBACK_MEMBER(nmi_check);
+
+private:
+ required_device_array<pic8259_device, 2> m_pic;
+ required_device_array<pit8254_device, 2> m_pit;
+ required_device_array<eisa_dma_device, 2> m_dma;
+
+ devcb_write8 m_out_rtc;
+ devcb_write_line m_out_nmi;
+ devcb_write_line m_out_spkr;
+
+ enum nmi_reg_mask : u8
+ {
+ NMI_T1C2_GATE = 0x01,
+ NMI_SPEAKER_DATA = 0x02,
+ NMI_PARITY_DISABLE = 0x04,
+ NMI_IOCHK_DISABLE = 0x08,
+ NMI_REFRESH = 0x10,
+ NMI_T1C2_STATE = 0x20,
+ NMI_IOCHK = 0x40,
+ NMI_PARITY = 0x80,
+
+ NMI_WMASK = 0x0f,
+ NMI_NMI = 0xc0,
+ };
+ enum nmi_ext_mask : u8
+ {
+ NMI_EXT_BUS_RESET = 0x01, // bus reset (read/write)
+ NMI_EXT_EN_IOPORT = 0x02,
+ NMI_EXT_EN_FAILSAFE = 0x04,
+ NMI_EXT_EN_TIMEOUT = 0x08,
+ NMI_EXT_8US_TIMEOUT = 0x10, // 8us EISA bus master timeout occurred
+ NMI_EXT_IOPORT = 0x20, // NMI I/O port interrupt pending
+ NMI_EXT_TIMEOUT = 0x40, // EISA bus master timeout occurred, NMI requested
+ NMI_EXT_FAILSAFE = 0x80, // Fail-safe timer is active, NMI requested
+
+ NMI_EXT_WMASK = 0x0f,
+ NMI_EXT_NMI = 0xe0,
+ };
+ u8 m_elcr[2];
+
+ emu_timer *m_nmi_check;
+ bool m_out_nmi_asserted;
+ bool m_nmi_enabled;
+ u8 m_nmi_reg;
+ u8 m_nmi_ext;
+};
+
+DECLARE_DEVICE_TYPE(I82357, i82357_device)
+
+#endif // MAME_MACHINE_I82357_H