From a32e9f3a48bbd6b9bacfa45b002c77395ffeab24 Mon Sep 17 00:00:00 2001 From: Lord-Nightmare Date: Wed, 13 Nov 2024 15:42:28 -0500 Subject: snkwave.cpp: Fix frequency register bit alignment as well as waveform sample bit alignment based on the schematics and observations of running games. Fixes wrong laser/other sounds in Vanguard II and some wrong sounds in Marvin's Maze. [Lord Nightmare] --- src/devices/sound/snkwave.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/devices/sound/snkwave.cpp b/src/devices/sound/snkwave.cpp index bab1a44611e..9bd3ac62053 100644 --- a/src/devices/sound/snkwave.cpp +++ b/src/devices/sound/snkwave.cpp @@ -119,14 +119,11 @@ void snkwave_device::snkwave_w(offs_t offset, uint8_t data) { m_stream->update(); - // all registers are 6-bit - data &= 0x3f; - - if (offset == 0) - m_frequency = (m_frequency & 0x03f) | (data << 6); - else if (offset == 1) - m_frequency = (m_frequency & 0xfc0) | data; - else if (offset <= 5) + if (offset == 0) // F1, high 6 bits + m_frequency = (m_frequency & 0x03f) | ((data & 0xfc) << 4); + else if (offset == 1) // F2, low 6 bits + m_frequency = (m_frequency & 0xfc0) | (data & 0x3f); + else if (offset <= 5) // W3 thru W6, low 3 bits of each nybble update_waveform(offset - 2, data); } @@ -143,7 +140,7 @@ void snkwave_device::update_waveform(unsigned int offset, uint8_t data) { assert(offset < WAVEFORM_LENGTH/4); - m_waveform[offset * 2] = ((data & 0x38) >> 3) << (12-CLOCK_SHIFT); + m_waveform[offset * 2] = ((data & 0x70) >> 4) << (12-CLOCK_SHIFT); m_waveform[offset * 2 + 1] = ((data & 0x07) >> 0) << (12-CLOCK_SHIFT); m_waveform[WAVEFORM_LENGTH-2 - offset * 2] = ~m_waveform[offset * 2 + 1]; m_waveform[WAVEFORM_LENGTH-1 - offset * 2] = ~m_waveform[offset * 2]; -- cgit v1.2.3