diff options
Diffstat (limited to 'src/emu/sound')
-rw-r--r-- | src/emu/sound/ymz770.c | 12 | ||||
-rw-r--r-- | src/emu/sound/ymz770.h | 3 |
2 files changed, 11 insertions, 4 deletions
diff --git a/src/emu/sound/ymz770.c b/src/emu/sound/ymz770.c index 42ee87ca0ad..f5321944b50 100644 --- a/src/emu/sound/ymz770.c +++ b/src/emu/sound/ymz770.c @@ -40,7 +40,7 @@ void ymz770_device::device_start() // create the stream m_stream = machine().sound().stream_alloc(*this, 0, 2, 16000, this); m_rom_base = device().machine().root_device().memregion(":ymz770")->base(); - m_rom_size = device().machine().root_device().memregion(":ymz770")->bytes() * 8; + m_rom_limit = device().machine().root_device().memregion(":ymz770")->bytes() * 8; for (int i = 0; i < 8; i++) { @@ -67,6 +67,7 @@ void ymz770_device::device_start() save_item(NAME(m_channels[i].last_block), i); save_item(NAME(m_channels[i].output_remaining), i); save_item(NAME(m_channels[i].output_ptr), i); + save_item(NAME(m_channels[i].atbl), i); save_item(NAME(m_channels[i].pptr), i); save_item(NAME(m_channels[i].sequence), i); save_item(NAME(m_channels[i].seqcontrol), i); @@ -131,6 +132,7 @@ void ymz770_device::sound_stream_update(sound_stream &stream, stream_sample_t ** case 0x0f: if (m_channels[ch].seqcontrol & 1) { + // loop sequence UINT8 sqn = m_channels[ch].sequence; UINT32 pptr = m_rom_base[(4*sqn)+1+0x400]<<16 | m_rom_base[(4*sqn)+2+0x400]<<8 | m_rom_base[(4*sqn)+3+0x400]; m_channels[ch].seqdata = &m_rom_base[pptr]; @@ -163,7 +165,9 @@ retry: { if (m_channels[ch].control & 1) { + // loop sample UINT8 phrase = m_channels[ch].phrase; + m_channels[ch].atbl = m_rom_base[(4*phrase)+0] >> 4 & 7; m_channels[ch].pptr = 8*(m_rom_base[(4*phrase)+1]<<16 | m_rom_base[(4*phrase)+2]<<8 | m_rom_base[(4*phrase)+3]); } else @@ -175,13 +179,14 @@ retry: if (m_channels[ch].is_playing) { int sample_rate, channel_count; - if(!m_channels[ch].decoder->decode_buffer(m_channels[ch].pptr, - m_rom_size, + if (!m_channels[ch].decoder->decode_buffer(m_channels[ch].pptr, + m_rom_limit, m_channels[ch].output_data, m_channels[ch].output_remaining, sample_rate, channel_count)) { + m_channels[ch].is_playing = !m_channels[ch].last_block; // detect infinite retry loop m_channels[ch].last_block = true; goto retry; } @@ -269,6 +274,7 @@ void ymz770_device::internal_reg_write(UINT8 reg, UINT8 data) if (data & 6) { UINT8 phrase = m_channels[voice].phrase; + m_channels[voice].atbl = m_rom_base[(4*phrase)+0] >> 4 & 7; m_channels[voice].pptr = 8*(m_rom_base[(4*phrase)+1]<<16 | m_rom_base[(4*phrase)+2]<<8 | m_rom_base[(4*phrase)+3]); m_channels[voice].output_remaining = 0; m_channels[voice].output_ptr = 0; diff --git a/src/emu/sound/ymz770.h b/src/emu/sound/ymz770.h index df94881c28a..41c07177583 100644 --- a/src/emu/sound/ymz770.h +++ b/src/emu/sound/ymz770.h @@ -48,6 +48,7 @@ class ymz770_device : public device_t, public device_sound_interface INT16 output_data[1152]; int output_remaining; int output_ptr; + int atbl; int pptr; UINT8 sequence; @@ -84,7 +85,7 @@ protected: UINT8 m_bsl; // boost level UINT8 m_cpl; // clip limiter UINT8 *m_rom_base; - int m_rom_size; + int m_rom_limit; ymz_channel m_channels[8]; }; |