segac2.cpp: fix ribbit random jumps back to 1st round

This commit is contained in:
MetalliC 2020-03-20 00:37:06 +02:00
parent 221c07ca7e
commit 9cff09c902
3 changed files with 14 additions and 3 deletions

View File

@ -167,6 +167,7 @@ upd775x_device::upd775x_device(const machine_config &mconfig, device_type type,
, m_first_valid_header(0)
, m_offset(0)
, m_repeat_offset(0)
, m_start_delay(0)
, m_adpcm_state(0)
, m_adpcm_data(0)
, m_sample(0)
@ -412,7 +413,7 @@ void upd775x_device::advance_state()
* Depending on the state the chip was in just before the /MD was set to 0 (reset, standby
* or just-finished-playing-previous-sample) this number can range from 35 up to ~24000).
* It also varies slightly from test to test, but not much - a few cycles at most.) */
m_clocks_left = 70; /* 35 - breaks cotton */
m_clocks_left = 35 + m_start_delay; /* 35 - breaks cotton */
m_state = STATE_FIRST_REQ;
break;

View File

@ -23,6 +23,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( reset_w );
DECLARE_READ_LINE_MEMBER( busy_r );
virtual void port_w(u8 data);
void set_start_delay(uint32_t data) { m_start_delay = data; };
protected:
// chip states
@ -89,6 +90,7 @@ protected:
uint8_t m_first_valid_header; /* did we get our first valid header yet? */
uint32_t m_offset; /* current ROM offset */
uint32_t m_repeat_offset; /* current ROM repeat offset */
uint32_t m_start_delay;
/* ADPCM processing */
int8_t m_adpcm_state; /* ADPCM state index */

View File

@ -118,6 +118,7 @@ public:
void segac(machine_config &config);
void segac2_tfrceacjpb(machine_config &config);
void segac2_ribbit(machine_config &config);
void init_c2boot();
void init_bloxeedc();
@ -1663,6 +1664,13 @@ void segac2_state::segac2_tfrceacjpb(machine_config& config)
m_io->set_ignore_read_direction();
}
// Ribbit does random measure of UPD7759 sample #A playback time and reset to round 1 if its not in expected range (see routine @1D8D2)
// current UPD code is too fast, add slight delay
void segac2_state::segac2_ribbit(machine_config& config)
{
segac2(config);
m_upd7759->set_start_delay(250);
}
/******************************************************************************
@ -2655,8 +2663,8 @@ GAME( 1990, borench, 0, segac2, borench, segac2_state, init_
GAME( 1990, borencha, borench, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (set 2)", 0 )
GAME( 1990, borenchj, borench, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (Japan)", 0 )
GAME( 1991, ribbit, 0, segac2, ribbit, segac2_state, init_ribbit, ROT0, "Sega", "Ribbit!", 0 )
GAME( 1991, ribbitj, ribbit, segac2, ribbitj, segac2_state, init_ribbit, ROT0, "Sega", "Ribbit! (Japan)", 0 )
GAME( 1991, ribbit, 0, segac2_ribbit, ribbit, segac2_state, init_ribbit, ROT0, "Sega", "Ribbit!", 0 )
GAME( 1991, ribbitj, ribbit, segac2_ribbit, ribbitj, segac2_state, init_ribbit, ROT0, "Sega", "Ribbit! (Japan)", 0 )
GAME( 1991, twinsqua, 0, segac2, twinsqua, segac2_state, init_twinsqua, ROT0, "Sega", "Twin Squash", 0 )