summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/upd65031.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/upd65031.h')
-rw-r--r--src/mame/machine/upd65031.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/mame/machine/upd65031.h b/src/mame/machine/upd65031.h
new file mode 100644
index 00000000000..75801beb0c4
--- /dev/null
+++ b/src/mame/machine/upd65031.h
@@ -0,0 +1,121 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+/**********************************************************************
+
+ NEC uPD65031 'BLINK' emulation
+
+**********************************************************************/
+
+#pragma once
+
+#ifndef __UPD65031__
+#define __UPD65031__
+
+#include "emu.h"
+
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_UPD65031_KB_CALLBACK(_read) \
+ devcb = &upd65031_device::set_kb_rd_callback(*device, DEVCB_##_read);
+
+#define MCFG_UPD65031_INT_CALLBACK(_write) \
+ devcb = &upd65031_device::set_int_wr_callback(*device, DEVCB_##_write);
+
+#define MCFG_UPD65031_NMI_CALLBACK(_write) \
+ devcb = &upd65031_device::set_nmi_wr_callback(*device, DEVCB_##_write);
+
+#define MCFG_UPD65031_SPKR_CALLBACK(_write) \
+ devcb = &upd65031_device::set_spkr_wr_callback(*device, DEVCB_##_write);
+
+#define MCFG_UPD65031_SCR_UPDATE_CB(_class, _method) \
+ upd65031_device::set_screen_update_callback(*device, upd65031_screen_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
+
+#define MCFG_UPD65031_MEM_UPDATE_CB(_class, _method) \
+ upd65031_device::set_memory_update_callback(*device, upd65031_memory_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+typedef device_delegate<void (bitmap_ind16 &bitmap, UINT16 sbf, UINT16 hires0, UINT16 hires1, UINT16 lores0, UINT16 lores1, int flash)> upd65031_screen_update_delegate;
+typedef device_delegate<void (int bank, UINT16 page, int rams)> upd65031_memory_update_delegate;
+
+#define UPD65031_SCREEN_UPDATE(_name) void _name(bitmap_ind16 &bitmap, UINT16 sbf, UINT16 hires0, UINT16 hires1, UINT16 lores0, UINT16 lores1, int flash)
+#define UPD65031_MEMORY_UPDATE(_name) void _name(int bank, UINT16 page, int rams)
+
+
+// ======================> upd65031_device
+
+class upd65031_device : public device_t
+{
+public:
+ // construction/destruction
+ upd65031_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ template<class _Object> static devcb_base &set_kb_rd_callback(device_t &device, _Object object) { return downcast<upd65031_device &>(device).m_read_kb.set_callback(object); }
+ template<class _Object> static devcb_base &set_int_wr_callback(device_t &device, _Object object) { return downcast<upd65031_device &>(device).m_write_int.set_callback(object); }
+ template<class _Object> static devcb_base &set_nmi_wr_callback(device_t &device, _Object object) { return downcast<upd65031_device &>(device).m_write_nmi.set_callback(object); }
+ template<class _Object> static devcb_base &set_spkr_wr_callback(device_t &device, _Object object) { return downcast<upd65031_device &>(device).m_write_spkr.set_callback(object); }
+
+ static void set_screen_update_callback(device_t &device, upd65031_screen_update_delegate callback) { downcast<upd65031_device &>(device).m_screen_update_cb = callback; }
+ static void set_memory_update_callback(device_t &device, upd65031_memory_update_delegate callback) { downcast<upd65031_device &>(device).m_out_mem_cb = callback; }
+
+ DECLARE_READ8_MEMBER( read );
+ DECLARE_WRITE8_MEMBER( write );
+ DECLARE_WRITE_LINE_MEMBER( flp_w );
+ DECLARE_WRITE_LINE_MEMBER( btl_w );
+ UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+private:
+ inline void interrupt_refresh();
+ inline void update_rtc_interrupt();
+ inline void set_mode(int mode);
+ static const device_timer_id TIMER_RTC = 0;
+ static const device_timer_id TIMER_FLASH = 1;
+ static const device_timer_id TIMER_SPEAKER = 2;
+
+ devcb_read8 m_read_kb;
+ devcb_write_line m_write_int;
+ devcb_write_line m_write_nmi;
+ devcb_write_line m_write_spkr;
+
+ upd65031_screen_update_delegate m_screen_update_cb; // callback for update the LCD
+ upd65031_memory_update_delegate m_out_mem_cb; // callback for update bankswitch
+
+ int m_mode;
+ UINT16 m_lcd_regs[5]; // LCD registers
+ UINT8 m_tim[5]; // RTC registers
+ UINT8 m_sr[4]; // segment registers
+ UINT8 m_sta; // interrupt status
+ UINT8 m_int; // interrupts mask
+ UINT8 m_ack; // interrupts acknowledge
+ UINT8 m_tsta; // timer interrupt status
+ UINT8 m_tmk; // timer interrupt mask
+ UINT8 m_tack; // timer interrupts acknowledge
+ UINT8 m_com; // command register
+ int m_flash; // cursor flash
+ int m_speaker_state; // spkr line
+
+ // timers
+ emu_timer *m_rtc_timer;
+ emu_timer *m_flash_timer;
+ emu_timer *m_speaker_timer;
+};
+
+
+// device type definition
+extern const device_type UPD65031;
+
+
+#endif