diff options
author | 2017-07-26 18:30:26 -0400 | |
---|---|---|
committer | 2017-07-26 18:30:26 -0400 | |
commit | 817103a9fd6488adc4ce2452fe38513c7b1795fa (patch) | |
tree | 30fa794aaa4b91f000a895b8dc1e76949df406b7 | |
parent | a85ee9046d6fb96fb6e0529efbba38b3d7f81406 (diff) |
dynax.cpp: Fix blitter IRQ acknowledgment in most games (nw)
-rw-r--r-- | src/mame/drivers/dynax.cpp | 30 | ||||
-rw-r--r-- | src/mame/includes/dynax.h | 14 |
2 files changed, 32 insertions, 12 deletions
diff --git a/src/mame/drivers/dynax.cpp b/src/mame/drivers/dynax.cpp index ea69eb4b402..fadd6038dbf 100644 --- a/src/mame/drivers/dynax.cpp +++ b/src/mame/drivers/dynax.cpp @@ -106,7 +106,7 @@ TODO: /* It runs in IM 0, thus needs an opcode on the data bus */ void dynax_state::sprtmtch_update_irq() { - int irq = (m_sound_irq ? 0x08 : 0) | ((m_vblank_irq) ? 0x10 : 0) | ((m_blitter_irq) ? 0x20 : 0) ; + int irq = (m_sound_irq ? 0x08 : 0) | ((m_vblank_irq) ? 0x10 : 0) | ((m_blitter_irq && m_blitter_irq_mask) ? 0x20 : 0) ; m_maincpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ } @@ -118,8 +118,12 @@ WRITE8_MEMBER(dynax_state::dynax_vblank_ack_w) WRITE_LINE_MEMBER(dynax_state::blitter_ack_w) { - // probably not exactly how this works - m_blitter_irq = 0; + m_blitter_irq_mask = state; + + // this must be acknowledged somewhere else + if (!m_blitter_irq_mask) + m_blitter_irq = 0; + sprtmtch_update_irq(); } @@ -143,7 +147,7 @@ WRITE_LINE_MEMBER(dynax_state::sprtmtch_sound_callback) /* It runs in IM 0, thus needs an opcode on the data bus */ void dynax_state::jantouki_update_irq() { - int irq = ((m_blitter_irq) ? 0x08 : 0) | ((m_blitter2_irq) ? 0x10 : 0) | ((m_vblank_irq) ? 0x20 : 0) ; + int irq = ((m_blitter_irq && m_blitter_irq_mask) ? 0x08 : 0) | ((m_blitter2_irq && m_blitter2_irq_mask) ? 0x10 : 0) | ((m_vblank_irq) ? 0x20 : 0) ; m_maincpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ } @@ -155,13 +159,23 @@ WRITE8_MEMBER(dynax_state::jantouki_vblank_ack_w) WRITE_LINE_MEMBER(dynax_state::jantouki_blitter_ack_w) { - m_blitter_irq = state; + m_blitter_irq_mask = state; + + // this must be acknowledged somewhere else + if (!m_blitter_irq_mask) + m_blitter_irq = 0; + jantouki_update_irq(); } WRITE_LINE_MEMBER(dynax_state::jantouki_blitter2_ack_w) { - m_blitter2_irq = state; + m_blitter2_irq_mask = state; + + // this must be acknowledged somewhere else + if (!m_blitter2_irq_mask) + m_blitter2_irq = 0; + jantouki_update_irq(); } @@ -4198,9 +4212,13 @@ INPUT_PORTS_END MACHINE_START_MEMBER(dynax_state,dynax) { + m_blitter_irq_mask = 1; + m_blitter2_irq_mask = 1; + save_item(NAME(m_sound_irq)); save_item(NAME(m_vblank_irq)); save_item(NAME(m_blitter_irq)); + save_item(NAME(m_blitter_irq_mask)); save_item(NAME(m_blitter2_irq)); save_item(NAME(m_soundlatch_irq)); save_item(NAME(m_sound_vblank_irq)); diff --git a/src/mame/includes/dynax.h b/src/mame/includes/dynax.h index 8c728b2acd9..f807e1787d7 100644 --- a/src/mame/includes/dynax.h +++ b/src/mame/includes/dynax.h @@ -66,12 +66,14 @@ public: /* irq */ typedef void (dynax_state::*irq_func)(); // some games trigger IRQ at blitter end, some don't irq_func m_update_irq_func; - uint8_t m_sound_irq; - uint8_t m_vblank_irq; - uint8_t m_blitter_irq; - uint8_t m_blitter2_irq; - uint8_t m_soundlatch_irq; - uint8_t m_sound_vblank_irq; + bool m_sound_irq; + bool m_vblank_irq; + bool m_blitter_irq; + bool m_blitter_irq_mask; + bool m_blitter2_irq; + bool m_blitter2_irq_mask; + bool m_soundlatch_irq; + bool m_sound_vblank_irq; /* blitters */ int m_blit_scroll_x; |