summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2015-08-15 17:38:06 +0200
committer Dirk Best <mail@dirk-best.de>2015-08-15 17:38:06 +0200
commit2c98b6913e3f836ef2d8b1e201d2dbeb69da7bd7 (patch)
treeba1c803c8c5de7150e11daa6c67a96c5fb055a79 /src
parent2cdb17de4513dcfcb27e6da3345d5f15b8e02a7e (diff)
k051960: start adding irq/firq/nmi callback support
Diffstat (limited to 'src')
-rw-r--r--src/mame/video/k051960.c48
-rw-r--r--src/mame/video/k051960.h22
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 );
};