From 42920b9101d92ecda6193706985682407891b6bb Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Mar 2025 02:22:45 -0500 Subject: [PATCH] AY: this sucks, part 3 improve heuristics... noise is very slow --- src/engine/platform/ay.cpp | 52 +++++++++++++++++++++------- src/engine/platform/sound/ay8910.cpp | 14 ++++---- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index e751d962f..7c186a043 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -255,33 +255,59 @@ void DivPlatformAY8910::acquire_mame(blip_buffer_t** bb, size_t len) { oscBuf[i]->begin(len); } + //logV("%d, %d, %d",ay->noise_enable(0),ay->noise_enable(1),ay->noise_enable(2)); + for (size_t i=0; im_tone[j].period)*(ay->m_step_mul<<1); - const int remain=period-ay->m_tone[j].count; - if (remaintone_enable(j) && ay->m_tone[j].volume!=0) { + const int period=MAX(1,ay->m_tone[j].period)*(ay->m_step_mul<<1); + const int remain=(period-ay->m_tone[j].count)>>1; + if (remainm_envelope[j].holding==0) { - const int periodEnv=MAX(1,ay->m_envelope[j].period)*ay->m_env_step_mul; - const int remainEnv=periodEnv-ay->m_envelope[j].count; - if (remainEnvnoise_enable(j) && ay->m_tone[j].volume!=0) { + careAboutNoise=true; + } + + // envelope check + if (ay->m_tone[j].volume&16) { + careAboutEnv=true; + } + } + // envelope + if (careAboutEnv) { + if (ay->m_envelope[0].holding==0) { + const int periodEnv=MAX(1,ay->m_envelope[0].period)*ay->m_env_step_mul; + const int remainEnv=periodEnv-ay->m_envelope[0].count; + if (remainEnvnoise_period())*ay->m_step_mul; - const int noiseRemain=noisePeriod-ay->m_count_noise; - if (noiseRemainnoise_period())*ay->m_step_mul; + const int noiseRemain=noisePeriod-ay->m_count_noise; + if (noiseRemainsound_stream_update(ayBuf,advance); diff --git a/src/engine/platform/sound/ay8910.cpp b/src/engine/platform/sound/ay8910.cpp index 85171b148..2aadec9b6 100644 --- a/src/engine/platform/sound/ay8910.cpp +++ b/src/engine/platform/sound/ay8910.cpp @@ -1060,21 +1060,21 @@ void ay8910_device::sound_stream_update(short* outputs, int advance) tone = &m_tone[chan]; const int period = std::max(1, tone->period) * (m_step_mul << 1); tone->count += advance << (is_expanded_mode() ? 5 : ((m_feature & PSG_HAS_EXPANDED_MODE) ? 0 : 1)); - if (tone->count>=period) { - tone->duty_cycle = (tone->duty_cycle - (tone->count/period)) & 0x1f; - tone->output = is_expanded_mode() ? BIT(duty_cycle[tone_duty(tone)], tone->duty_cycle) : BIT(tone->duty_cycle, 0); - tone->count = tone->count % period; - } + if (tone->count>=period) { + tone->duty_cycle = (tone->duty_cycle - (tone->count/period)) & 0x1f; + tone->output = is_expanded_mode() ? BIT(duty_cycle[tone_duty(tone)], tone->duty_cycle) : BIT(tone->duty_cycle, 0); + tone->count = tone->count % period; + } } const int period_noise = (int)(noise_period()) * m_step_mul; m_count_noise+=advance; - while (m_count_noise >= period_noise) + if (m_count_noise >= period_noise) { /* toggle the prescaler output. Noise is no different to * channels. */ - m_count_noise -= period_noise; + m_count_noise = 0; m_prescale_noise = (m_prescale_noise + 1) & ((m_feature & PSG_HAS_EXPANDED_MODE) ? 3 : 1); if (is_expanded_mode()) // AY8930 noise generator rate is twice? compares as compatibility mode