diff options
author | 2015-08-16 10:23:30 +0200 | |
---|---|---|
committer | 2015-08-16 10:26:31 +0200 | |
commit | 741dd1e705f9be9257b2b4bb5617413f19c6283a (patch) | |
tree | 071afcc61d97b14f6f5407e3f8a3edf263d5fd5c /src | |
parent | 0f5344075d2133b6d281ab4186562171a1b7869e (diff) |
k052109: start adding irq/firq/nmi support
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/video/k052109.c | 48 | ||||
-rw-r--r-- | src/mame/video/k052109.h | 23 |
2 files changed, 64 insertions, 7 deletions
diff --git a/src/mame/video/k052109.c b/src/mame/video/k052109.c index 52ef33ecb65..ccffe5f2e89 100644 --- a/src/mame/video/k052109.c +++ b/src/mame/video/k052109.c @@ -179,7 +179,11 @@ k052109_device::k052109_device(const machine_config &mconfig, const char *tag, d m_romsubbank(0), m_scrollctrl(0), m_char_rom(NULL), - m_char_size(0) + m_char_size(0), + m_screen_tag(NULL), + m_irq_handler(*this), + m_firq_handler(*this), + m_nmi_handler(*this) { } @@ -201,11 +205,21 @@ void k052109_device::set_ram(device_t &device, bool ram) void k052109_device::device_start() { - memory_region *ROM = region(); - if (ROM != NULL) + if (m_screen_tag != NULL) { - m_char_rom = ROM->base(); - m_char_size = ROM->bytes(); + // make sure our screen is started + screen_device *screen = m_owner->subdevice<screen_device>(m_screen_tag); + if (!screen->started()) + throw device_missing_dependencies(); + + // and register a callback for vblank state + screen->register_vblank_callback(vblank_state_delegate(FUNC(k052109_device::vblank_callback), this)); + } + + if (region() != NULL) + { + m_char_rom = region()->base(); + m_char_size = region()->bytes(); } decode_gfx(); @@ -234,6 +248,11 @@ void k052109_device::device_start() // bind callbacks m_k052109_cb.bind_relative_to(*owner()); + // resolve callbacks + m_irq_handler.resolve_safe(); + m_firq_handler.resolve_safe(); + m_nmi_handler.resolve_safe(); + save_pointer(NAME(m_ram), 0x6000); save_item(NAME(m_rmrd_line)); save_item(NAME(m_romsubbank)); @@ -265,10 +284,27 @@ void k052109_device::device_reset() } } +//------------------------------------------------- +// set_screen_tag - set screen we are attached to +//------------------------------------------------- + +void k052109_device::set_screen_tag(device_t &device, device_t *owner, const char *tag) +{ + k052109_device &dev = dynamic_cast<k052109_device &>(device); + dev.m_screen_tag = tag; +} + + /***************************************************************************** DEVICE HANDLERS *****************************************************************************/ +void k052109_device::vblank_callback(screen_device &screen, bool state) +{ + if (state) + m_irq_handler(ASSERT_LINE); +} + READ8_MEMBER( k052109_device::read ) { if (m_rmrd_line == CLEAR_LINE) @@ -351,6 +387,8 @@ WRITE8_MEMBER( k052109_device::write ) /* bit 2 = irq enable */ /* the custom chip can also generate NMI and FIRQ, for use with a 6809 */ m_irq_enabled = data & 0x04; + if (m_irq_enabled) + m_irq_handler(CLEAR_LINE); } else if (offset == 0x1d80) { diff --git a/src/mame/video/k052109.h b/src/mame/video/k052109.h index 13f63b61359..5c62bdf1638 100644 --- a/src/mame/video/k052109.h +++ b/src/mame/video/k052109.h @@ -13,8 +13,14 @@ typedef device_delegate<void (int layer, int bank, int *code, int *color, int *f #define MCFG_K052109_CHARRAM(_ram) \ k052109_device::set_ram(*device, _ram); -class k052109_device : public device_t, - public device_gfx_interface +#define MCFG_K052109_SCREEN_TAG(_tag) \ + k052109_device::set_screen_tag(*device, owner, _tag); + +#define MCFG_K052109_IRQ_HANDLER(_devcb) \ + devcb = &k052109_device::set_irq_handler(*device, DEVCB_##_devcb); + + +class k052109_device : public device_t, public device_gfx_interface { static const gfx_layout charlayout; static const gfx_layout charlayout_ram; @@ -25,8 +31,12 @@ public: k052109_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); ~k052109_device() {} + template<class _Object> static devcb_base &set_irq_handler(device_t &device, _Object object) + { return downcast<k052109_device &>(device).m_irq_handler.set_callback(object); } + static void set_k052109_callback(device_t &device, k052109_cb_delegate callback) { downcast<k052109_device &>(device).m_k052109_cb = callback; } static void set_ram(device_t &device, bool ram); + static void set_screen_tag(device_t &device, device_t *owner, const char *tag); /* The callback is passed: @@ -57,10 +67,13 @@ public: void tilemap_mark_dirty(int tmap_num); void tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int tmap_num, UINT32 flags, UINT8 priority); + void vblank_callback(screen_device &screen, bool state); + protected: // device-level overrides virtual void device_start(); virtual void device_reset(); + private: // internal state UINT8 *m_ram; @@ -86,8 +99,14 @@ private: UINT8 *m_char_rom; UINT32 m_char_size; + const char *m_screen_tag; + k052109_cb_delegate m_k052109_cb; + devcb_write_line m_irq_handler; + devcb_write_line m_firq_handler; + devcb_write_line m_nmi_handler; + TILE_GET_INFO_MEMBER(get_tile_info0); TILE_GET_INFO_MEMBER(get_tile_info1); TILE_GET_INFO_MEMBER(get_tile_info2); |