diff options
author | 2015-08-15 17:38:06 +0200 | |
---|---|---|
committer | 2015-08-15 17:38:06 +0200 | |
commit | 2c98b6913e3f836ef2d8b1e201d2dbeb69da7bd7 (patch) | |
tree | ba1c803c8c5de7150e11daa6c67a96c5fb055a79 /src | |
parent | 2cdb17de4513dcfcb27e6da3345d5f15b8e02a7e (diff) |
k051960: start adding irq/firq/nmi callback support
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/video/k051960.c | 48 | ||||
-rw-r--r-- | src/mame/video/k051960.h | 22 |
2 files changed, 68 insertions, 2 deletions
diff --git a/src/mame/video/k051960.c b/src/mame/video/k051960.c index 1b2270db7fc..ff895b5bd13 100644 --- a/src/mame/video/k051960.c +++ b/src/mame/video/k051960.c @@ -128,12 +128,17 @@ k051960_device::k051960_device(const machine_config &mconfig, const char *tag, d : device_t(mconfig, K051960, "K051960 Sprite Generator", tag, owner, clock, "k051960", __FILE__), device_gfx_interface(mconfig, *this, gfxinfo), m_ram(NULL), + m_screen_tag(NULL), + m_irq_handler(*this), + m_firq_handler(*this), + m_nmi_handler(*this), m_romoffset(0), m_spriteflip(0), m_readroms(0), m_irq_enabled(0), m_nmi_enabled(0), - m_k051937_counter(0) + m_k051937_counter(0), + m_vblank(0) { } @@ -161,11 +166,32 @@ void k051960_device::set_plane_order(device_t &device, int order) } //------------------------------------------------- +// set_screen_tag - set screen we are attached to +//------------------------------------------------- + +void k051960_device::set_screen_tag(device_t &device, device_t *owner, const char *tag) +{ + k051960_device &dev = dynamic_cast<k051960_device &>(device); + dev.m_screen_tag = tag; +} + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void k051960_device::device_start() { + if (m_screen_tag != NULL) + { + // 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(k051960_device::vblank_callback), this)); + } + m_sprite_rom = region()->base(); m_sprite_size = region()->bytes(); @@ -180,6 +206,12 @@ void k051960_device::device_start() // bind callbacks m_k051960_cb.bind_relative_to(*owner()); + // resolve callbacks + m_irq_handler.resolve_safe(); + m_firq_handler.resolve_safe(); + m_nmi_handler.resolve_safe(); + + // register for save states save_item(NAME(m_romoffset)); save_item(NAME(m_spriteflip)); save_item(NAME(m_readroms)); @@ -187,8 +219,8 @@ void k051960_device::device_start() save_pointer(NAME(m_ram), 0x400); save_item(NAME(m_irq_enabled)); save_item(NAME(m_nmi_enabled)); - save_item(NAME(m_k051937_counter)); + save_item(NAME(m_vblank)); } //------------------------------------------------- @@ -215,6 +247,17 @@ void k051960_device::device_reset() DEVICE HANDLERS *****************************************************************************/ +void k051960_device::update_irq() +{ + m_irq_handler(m_irq_enabled && m_vblank ? ASSERT_LINE : CLEAR_LINE); +} + +void k051960_device::vblank_callback(screen_device &screen, bool state) +{ + m_vblank = state; + update_irq(); +} + int k051960_device::k051960_fetchromdata( int byte ) { int code, color, pri, shadow, off1, addr; @@ -274,6 +317,7 @@ WRITE8_MEMBER( k051960_device::k051937_w ) /* bit 0 is IRQ enable */ m_irq_enabled = data & 0x01; + update_irq(); /* bit 1: probably FIRQ enable */ diff --git a/src/mame/video/k051960.h b/src/mame/video/k051960.h index 353974ed734..1f1dac5f332 100644 --- a/src/mame/video/k051960.h +++ b/src/mame/video/k051960.h @@ -21,6 +21,12 @@ typedef device_delegate<void (int *code, int *color, int *priority, int *shadow) #define MCFG_K051960_PLANEORDER(_order) \ k051960_device::set_plane_order(*device, _order); +#define MCFG_K051960_SCREEN_TAG(_tag) \ + k051960_device::set_screen_tag(*device, owner, _tag); + +#define MCFG_K051960_IRQ_HANDLER(_devcb) \ + devcb = &k051960_device::set_irq_handler(*device, DEVCB_##_devcb); + class k051960_device : public device_t, public device_gfx_interface @@ -36,9 +42,13 @@ public: k051960_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); ~k051960_device() {} + template<class _Object> static devcb_base &set_irq_handler(device_t &device, _Object object) + { return downcast<k051960_device &>(device).m_irq_handler.set_callback(object); } + // static configuration static void set_k051960_callback(device_t &device, k051960_cb_delegate callback) { downcast<k051960_device &>(device).m_k051960_cb = callback; } static void set_plane_order(device_t &device, int order); + static void set_screen_tag(device_t &device, device_t *owner, const char *tag); /* The callback is passed: @@ -64,10 +74,13 @@ public: int k051960_is_irq_enabled(); int k051960_is_nmi_enabled(); + 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; @@ -75,8 +88,14 @@ private: UINT8 *m_sprite_rom; UINT32 m_sprite_size; + const char *m_screen_tag; + k051960_cb_delegate m_k051960_cb; + devcb_write_line m_irq_handler; + devcb_write_line m_firq_handler; + devcb_write_line m_nmi_handler; + UINT8 m_spriterombank[3]; int m_romoffset; int m_spriteflip, m_readroms; @@ -84,6 +103,9 @@ private: int m_k051937_counter; + int m_vblank; + void update_irq(); + int k051960_fetchromdata( int byte ); }; |