mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
k052109: start adding irq/firq/nmi support
This commit is contained in:
parent
0f5344075d
commit
741dd1e705
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user