mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
k051960: start adding irq/firq/nmi callback support
This commit is contained in:
parent
2cdb17de45
commit
2c98b6913e
@ -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_t(mconfig, K051960, "K051960 Sprite Generator", tag, owner, clock, "k051960", __FILE__),
|
||||||
device_gfx_interface(mconfig, *this, gfxinfo),
|
device_gfx_interface(mconfig, *this, gfxinfo),
|
||||||
m_ram(NULL),
|
m_ram(NULL),
|
||||||
|
m_screen_tag(NULL),
|
||||||
|
m_irq_handler(*this),
|
||||||
|
m_firq_handler(*this),
|
||||||
|
m_nmi_handler(*this),
|
||||||
m_romoffset(0),
|
m_romoffset(0),
|
||||||
m_spriteflip(0),
|
m_spriteflip(0),
|
||||||
m_readroms(0),
|
m_readroms(0),
|
||||||
m_irq_enabled(0),
|
m_irq_enabled(0),
|
||||||
m_nmi_enabled(0),
|
m_nmi_enabled(0),
|
||||||
m_k051937_counter(0)
|
m_k051937_counter(0),
|
||||||
|
m_vblank(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,12 +165,33 @@ 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
|
// device_start - device-specific startup
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
void k051960_device::device_start()
|
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_rom = region()->base();
|
||||||
m_sprite_size = region()->bytes();
|
m_sprite_size = region()->bytes();
|
||||||
|
|
||||||
@ -180,6 +206,12 @@ void k051960_device::device_start()
|
|||||||
// bind callbacks
|
// bind callbacks
|
||||||
m_k051960_cb.bind_relative_to(*owner());
|
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_romoffset));
|
||||||
save_item(NAME(m_spriteflip));
|
save_item(NAME(m_spriteflip));
|
||||||
save_item(NAME(m_readroms));
|
save_item(NAME(m_readroms));
|
||||||
@ -187,8 +219,8 @@ void k051960_device::device_start()
|
|||||||
save_pointer(NAME(m_ram), 0x400);
|
save_pointer(NAME(m_ram), 0x400);
|
||||||
save_item(NAME(m_irq_enabled));
|
save_item(NAME(m_irq_enabled));
|
||||||
save_item(NAME(m_nmi_enabled));
|
save_item(NAME(m_nmi_enabled));
|
||||||
|
|
||||||
save_item(NAME(m_k051937_counter));
|
save_item(NAME(m_k051937_counter));
|
||||||
|
save_item(NAME(m_vblank));
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -215,6 +247,17 @@ void k051960_device::device_reset()
|
|||||||
DEVICE HANDLERS
|
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 k051960_device::k051960_fetchromdata( int byte )
|
||||||
{
|
{
|
||||||
int code, color, pri, shadow, off1, addr;
|
int code, color, pri, shadow, off1, addr;
|
||||||
@ -274,6 +317,7 @@ WRITE8_MEMBER( k051960_device::k051937_w )
|
|||||||
|
|
||||||
/* bit 0 is IRQ enable */
|
/* bit 0 is IRQ enable */
|
||||||
m_irq_enabled = data & 0x01;
|
m_irq_enabled = data & 0x01;
|
||||||
|
update_irq();
|
||||||
|
|
||||||
/* bit 1: probably FIRQ enable */
|
/* bit 1: probably FIRQ enable */
|
||||||
|
|
||||||
|
@ -21,6 +21,12 @@ typedef device_delegate<void (int *code, int *color, int *priority, int *shadow)
|
|||||||
#define MCFG_K051960_PLANEORDER(_order) \
|
#define MCFG_K051960_PLANEORDER(_order) \
|
||||||
k051960_device::set_plane_order(*device, _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,
|
class k051960_device : public device_t,
|
||||||
public device_gfx_interface
|
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(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
~k051960_device() {}
|
~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 configuration
|
||||||
static void set_k051960_callback(device_t &device, k051960_cb_delegate callback) { downcast<k051960_device &>(device).m_k051960_cb = callback; }
|
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_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:
|
The callback is passed:
|
||||||
@ -64,10 +74,13 @@ public:
|
|||||||
int k051960_is_irq_enabled();
|
int k051960_is_irq_enabled();
|
||||||
int k051960_is_nmi_enabled();
|
int k051960_is_nmi_enabled();
|
||||||
|
|
||||||
|
void vblank_callback(screen_device &screen, bool state);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
virtual void device_start();
|
virtual void device_start();
|
||||||
virtual void device_reset();
|
virtual void device_reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// internal state
|
// internal state
|
||||||
UINT8 *m_ram;
|
UINT8 *m_ram;
|
||||||
@ -75,8 +88,14 @@ private:
|
|||||||
UINT8 *m_sprite_rom;
|
UINT8 *m_sprite_rom;
|
||||||
UINT32 m_sprite_size;
|
UINT32 m_sprite_size;
|
||||||
|
|
||||||
|
const char *m_screen_tag;
|
||||||
|
|
||||||
k051960_cb_delegate m_k051960_cb;
|
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];
|
UINT8 m_spriterombank[3];
|
||||||
int m_romoffset;
|
int m_romoffset;
|
||||||
int m_spriteflip, m_readroms;
|
int m_spriteflip, m_readroms;
|
||||||
@ -84,6 +103,9 @@ private:
|
|||||||
|
|
||||||
int m_k051937_counter;
|
int m_k051937_counter;
|
||||||
|
|
||||||
|
int m_vblank;
|
||||||
|
void update_irq();
|
||||||
|
|
||||||
int k051960_fetchromdata( int byte );
|
int k051960_fetchromdata( int byte );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user