summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/1mb5.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/1mb5.h')
-rw-r--r--src/devices/machine/1mb5.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/devices/machine/1mb5.h b/src/devices/machine/1mb5.h
new file mode 100644
index 00000000000..3350e4a968c
--- /dev/null
+++ b/src/devices/machine/1mb5.h
@@ -0,0 +1,95 @@
+// license:BSD-3-Clause
+// copyright-holders:F. Ulivi
+/*********************************************************************
+
+ 1mb5.h
+
+ HP-8x I/O Translator chip (1MB5-0101)
+
+*********************************************************************/
+
+#ifndef MAME_MACHINE_1MB5_H
+#define MAME_MACHINE_1MB5_H
+
+#pragma once
+
+#define MCFG_1MB5_IRL_HANDLER(_devcb) \
+ devcb = &hp_1mb5_device::set_irl_handler(*device , DEVCB_##_devcb);
+
+#define MCFG_1MB5_HALT_HANDLER(_devcb) \
+ devcb = &hp_1mb5_device::set_halt_handler(*device , DEVCB_##_devcb);
+
+#define MCFG_1MB5_RESET_HANDLER(_devcb) \
+ devcb = &hp_1mb5_device::set_reset_handler(*device , DEVCB_##_devcb);
+
+#define MCFG_1MB5_INT_HANDLER(_devcb) \
+ devcb = &hp_1mb5_device::set_int_handler(*device , DEVCB_##_devcb);
+
+class hp_1mb5_device : public device_t
+{
+public:
+ // construction/destruction
+ hp_1mb5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // static configuration helpers
+ template <class Object> static devcb_base &set_irl_handler(device_t &device, Object &&cb) { return downcast<hp_1mb5_device &>(device).m_irl_handler.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_halt_handler(device_t &device, Object &&cb) { return downcast<hp_1mb5_device &>(device).m_halt_handler.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_reset_handler(device_t &device, Object &&cb) { return downcast<hp_1mb5_device &>(device).m_reset_handler.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_int_handler(device_t &device, Object &&cb) { return downcast<hp_1mb5_device &>(device).m_int_handler.set_callback(std::forward<Object>(cb)); }
+
+ // CPU access
+ DECLARE_READ8_MEMBER(cpu_r);
+ DECLARE_WRITE8_MEMBER(cpu_w);
+
+ // uC access
+ DECLARE_READ8_MEMBER(uc_r);
+ DECLARE_WRITE8_MEMBER(uc_w);
+
+ // Signals to CPU
+ DECLARE_READ_LINE_MEMBER(irl_r);
+ DECLARE_READ_LINE_MEMBER(halt_r);
+
+ // Signals to uC
+ DECLARE_READ_LINE_MEMBER(reset_r);
+ DECLARE_READ_LINE_MEMBER(int_r);
+
+ // Interrupt enable
+ void inten();
+
+ // Interrupt clearing
+ void clear_service();
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ devcb_write_line m_irl_handler;
+ devcb_write_line m_halt_handler;
+ devcb_write_line m_reset_handler;
+ devcb_write_line m_int_handler;
+
+ // Registers
+ uint8_t m_sr;
+ uint8_t m_cr;
+ uint8_t m_ib;
+ uint8_t m_ob;
+ bool m_ibf;
+ bool m_obf;
+ bool m_hlten;
+ bool m_service;
+ bool m_cint;
+ bool m_reset;
+ bool m_halt;
+
+ bool set_service(bool new_service);
+ bool update_halt();
+ bool set_reset(bool new_reset);
+ bool set_int(bool new_int);
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(HP_1MB5, hp_1mb5_device)
+
+#endif /* MAME_MACHINE_1MB5_H */