From fa360c3324d0fa7724ca324f62302cd8a4ecd507 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 24 Apr 2025 21:07:20 +0200 Subject: [PATCH] c6280: optimization for games that have sound disabled --- src/devices/sound/c6280.cpp | 71 +++++++++++++++++++++---------------- src/devices/sound/c6280.h | 1 + 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/devices/sound/c6280.cpp b/src/devices/sound/c6280.cpp index c6f3e92a4fd..474a3bf57a6 100644 --- a/src/devices/sound/c6280.cpp +++ b/src/devices/sound/c6280.cpp @@ -44,6 +44,14 @@ void c6280_device::sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) { + // Fast method if none of the channels are enabled (most Data East arcade games) + if (!(m_enabled & 0x3f)) + { + outputs[0].fill(0); + outputs[1].fill(0); + return; + } + static const u8 scale_tab[16] = { 0x00, 0x03, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0f, @@ -53,24 +61,21 @@ void c6280_device::sound_stream_update(sound_stream &stream, std::vector> 4) & 0x0f]; const u8 rmal = scale_tab[(m_balance >> 0) & 0x0f]; - /* Clear buffer */ - outputs[0].fill(0); - outputs[1].fill(0); - for (int i = 0; i < outputs[0].samples(); i++) { s32 lout = 0, rout = 0; for (int ch = 0; ch < 6; ch++) { - channel &chan = m_channel[ch]; - /* Only look at enabled channels */ - if (BIT(chan.control, 7)) + // Only look at enabled channels + if (BIT(m_enabled, ch)) { + channel &chan = m_channel[ch]; + const u8 lal = scale_tab[(chan.balance >> 4) & 0x0f]; const u8 ral = scale_tab[(chan.balance >> 0) & 0x0f]; const u8 al = chan.control & 0x1f; - // verified from both patent and manual + // Verified from both patent and manual int vll = (0x1f - lmal) + (0x1f - al) + (0x1f - lal); if (vll > 0x1f) vll = 0x1f; @@ -80,10 +85,10 @@ void c6280_device::sound_stream_update(sound_stream &stream, std::vector= 4) && BIT(chan.noise_control, 7)) { - /* Noise mode */ + // Noise mode const u32 step = (chan.noise_control & 0x1f) ^ 0x1f; const s16 data = BIT(chan.noise_seed, 0) ? 0x1f : 0; chan.noise_counter--; @@ -99,7 +104,7 @@ void c6280_device::sound_stream_update(sound_stream &stream, std::vectorupdate(); switch (offset & 0x0f) { - case 0x00: /* Channel select */ + case 0x00: // Channel select m_select = data & 0x07; break; - case 0x01: /* Global balance */ - m_balance = data; + case 0x01: // Global balance + m_balance = data; break; - case 0x02: /* Channel frequency (LSB) */ + case 0x02: // Channel frequency (LSB) chan.frequency = (chan.frequency & 0x0f00) | data; break; - case 0x03: /* Channel frequency (MSB) */ + case 0x03: // Channel frequency (MSB) chan.frequency = (chan.frequency & 0x00ff) | ((data << 8) & 0x0f00); break; - case 0x04: /* Channel control (key-on, DDA mode, volume) */ + case 0x04: // Channel control (key-on, DDA mode, volume) - /* 1-to-0 transition of DDA bit resets waveform index */ + // 1-to-0 transition of DDA bit resets waveform index if (BIT(chan.control, 6) && BIT(~data, 6)) { chan.index = 0; @@ -255,13 +260,17 @@ void c6280_device::c6280_w(offs_t offset, uint8_t data) chan.tick = chan.frequency; } chan.control = data; + + // Cache channel enable flag + m_enabled &= ~(1 << m_select); + m_enabled |= BIT(data, 7) << m_select; break; - case 0x05: /* Channel balance */ + case 0x05: // Channel balance chan.balance = data; break; - case 0x06: /* Channel waveform data */ + case 0x06: // Channel waveform data switch (chan.control & 0x40) { @@ -278,15 +287,15 @@ void c6280_device::c6280_w(offs_t offset, uint8_t data) break; - case 0x07: /* Noise control (enable, frequency) */ + case 0x07: // Noise control (enable, frequency) chan.noise_control = data; break; - case 0x08: /* LFO frequency */ + case 0x08: // LFO frequency m_lfo_frequency = data; break; - case 0x09: /* LFO control (enable, mode) */ + case 0x09: // LFO control (enable, mode) m_lfo_control = data; break; @@ -314,11 +323,12 @@ void c6280_device::device_clock_changed() void c6280_device::device_start() { - /* Loudest volume level for table */ + // Loudest volume level for table double level = 65535.0 / 6.0 / 32.0; - /* Clear context */ + // Clear context m_select = 0; + m_enabled = 0; m_balance = 0; m_lfo_frequency = 0; m_lfo_control = 0; @@ -326,8 +336,8 @@ void c6280_device::device_start() m_stream = stream_alloc(0, 2, clock()); - /* Make volume table */ - /* PSG has 48dB volume range spread over 32 steps */ + // Make volume table + // PSG has 48dB volume range spread over 32 steps double step = 48.0 / 32.0; for (int i = 0; i < 31; i++) { @@ -337,6 +347,7 @@ void c6280_device::device_start() m_volume_table[31] = 0; save_item(NAME(m_select)); + save_item(NAME(m_enabled)); save_item(NAME(m_balance)); save_item(NAME(m_lfo_frequency)); save_item(NAME(m_lfo_control)); diff --git a/src/devices/sound/c6280.h b/src/devices/sound/c6280.h index 407f5abaad0..dda6dbfa833 100644 --- a/src/devices/sound/c6280.h +++ b/src/devices/sound/c6280.h @@ -42,6 +42,7 @@ private: // internal state sound_stream *m_stream; u8 m_select; + u8 m_enabled; u8 m_balance; u8 m_lfo_frequency; u8 m_lfo_control;