From 4ee5b635a5d798e7743e85a92154936b5cf62f0f Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Sat, 24 Feb 2018 11:25:23 +0100 Subject: cave: fix the fifo (nw) --- src/mame/drivers/cave.cpp | 10 +++++++--- src/mame/includes/cave.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/mame/drivers/cave.cpp b/src/mame/drivers/cave.cpp index 8f8e2565684..6bc448b7e2c 100644 --- a/src/mame/drivers/cave.cpp +++ b/src/mame/drivers/cave.cpp @@ -233,7 +233,7 @@ READ16_MEMBER(cave_state::soundflags_ack_r) // return ((m_sound_flag1 | m_sound_flag2) ? 1 : 0) | // ((m_soundbuf_wptr != m_soundbuf_rptr) ? 0 : 2) ; - return ((m_soundbuf_wptr != m_soundbuf_rptr) ? 0 : 2) ; + return m_soundbuf_empty ? 2 : 0; } /* Main CPU: write a 16 bit sound latch and generate a NMI on the sound CPU */ @@ -262,10 +262,11 @@ READ8_MEMBER(cave_state::soundlatch_hi_r) /* Main CPU: read the latch written by the sound CPU (acknowledge) */ READ16_MEMBER(cave_state::soundlatch_ack_r) { - if (m_soundbuf_wptr != m_soundbuf_rptr) + if (!m_soundbuf_empty) { uint8_t data = m_soundbuf_data[m_soundbuf_rptr]; m_soundbuf_rptr = (m_soundbuf_rptr + 1) & 0x1f; + m_soundbuf_empty = m_soundbuf_rptr == m_soundbuf_wptr; return data; } else @@ -279,10 +280,11 @@ READ16_MEMBER(cave_state::soundlatch_ack_r) /* Sound CPU: write latch for the main CPU (acknowledge) */ WRITE8_MEMBER(cave_state::soundlatch_ack_w) { - if (m_soundbuf_wptr != m_soundbuf_rptr) + if (m_soundbuf_empty || (m_soundbuf_wptr != m_soundbuf_rptr)) { m_soundbuf_data[m_soundbuf_wptr] = data; m_soundbuf_wptr = (m_soundbuf_wptr + 1) & 0x1f; + m_soundbuf_empty = false; } else logerror("CPU #2 - PC %04X: Sound Buffer 2 Overflow Error\n", m_audiocpu->pc()); @@ -2035,6 +2037,7 @@ MACHINE_START_MEMBER(cave_state,cave) save_item(NAME(m_soundbuf_wptr)); save_item(NAME(m_soundbuf_rptr)); save_item(NAME(m_soundbuf_data)); + save_item(NAME(m_soundbuf_empty)); save_item(NAME(m_vblank_irq)); save_item(NAME(m_sound_irq)); @@ -2047,6 +2050,7 @@ MACHINE_RESET_MEMBER(cave_state,cave) std::fill(std::begin(m_soundbuf_data), std::end(m_soundbuf_data), 0); m_soundbuf_wptr = 0; m_soundbuf_rptr = 0; + m_soundbuf_empty = true; m_vblank_irq = 0; m_sound_irq = 0; diff --git a/src/mame/includes/cave.h b/src/mame/includes/cave.h index 2c190ae6d9a..55925834755 100644 --- a/src/mame/includes/cave.h +++ b/src/mame/includes/cave.h @@ -139,6 +139,7 @@ public: int m_soundbuf_wptr; int m_soundbuf_rptr; uint8_t m_soundbuf_data[32]; + bool m_soundbuf_empty; //uint8_t m_sound_flag1; //uint8_t m_sound_flag2; -- cgit v1.2.3