summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2017-07-26 18:30:26 -0400
committer AJR <ajrhacker@users.noreply.github.com>2017-07-26 18:30:26 -0400
commit817103a9fd6488adc4ce2452fe38513c7b1795fa (patch)
tree30fa794aaa4b91f000a895b8dc1e76949df406b7
parenta85ee9046d6fb96fb6e0529efbba38b3d7f81406 (diff)
dynax.cpp: Fix blitter IRQ acknowledgment in most games (nw)
-rw-r--r--src/mame/drivers/dynax.cpp30
-rw-r--r--src/mame/includes/dynax.h14
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;