From 7fbd239b8572a932db504bee1205862de43ae02e Mon Sep 17 00:00:00 2001 From: cam900 Date: Wed, 27 Apr 2022 00:47:01 +0900 Subject: [PATCH] emulation core related fix, reversed loop and volume --- src/engine/platform/es5506.cpp | 2 +- src/engine/platform/sound/es550x/es5506.cpp | 6 +++--- src/engine/platform/sound/es550x/es550x.hpp | 2 +- src/engine/platform/sound/es550x/es550x_alu.cpp | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 66e60d420..c94fdf416 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -217,7 +217,7 @@ void DivPlatformES5506::e(bool state) if ((irqv&0x80)==0) { unsigned char ch=irqv&0x1f; if (chan[ch].isReverseLoop) { // Reversed loop - pageWriteMask(0x00|ch,0x5f,0x00,(chan[ch].pcm.reversed?0x0040:0x0000)|0x08,0x78); + pageWriteMask(0x00|ch,0x5f,0x00,(chan[ch].pcm.reversed?0x0000:0x0040)|0x08,0x78); chan[ch].isReverseLoop=false; } } diff --git a/src/engine/platform/sound/es550x/es5506.cpp b/src/engine/platform/sound/es550x/es5506.cpp index 1bbee0e17..d1ac89bb0 100644 --- a/src/engine/platform/sound/es550x/es5506.cpp +++ b/src/engine/platform/sound/es550x/es5506.cpp @@ -261,8 +261,8 @@ void es5506_core::voice_t::tick(u8 voice) if (!m_mute) { // Send to output - m_ch.m_left = volume_calc(sign_ext(m_filter.m_o4_1, 16), m_lvol); - m_ch.m_right = volume_calc(sign_ext(m_filter.m_o4_1, 16), m_rvol); + m_ch.m_left = volume_calc(m_lvol, sign_ext(m_filter.m_o4_1, 16)); + m_ch.m_right = volume_calc(m_rvol, sign_ext(m_filter.m_o4_1, 16)); } // ALU execute @@ -307,7 +307,7 @@ s32 es5506_core::voice_t::volume_calc(u16 volume, s32 in) { u8 exponent = bitfield(volume, 12, 4); u8 mantissa = bitfield(volume, 4, 8); - return (in * s32(0x100 | mantissa)) >> (20 - exponent); + return (in * s32(0x100 | mantissa)) >> (19 - exponent); } void es5506_core::reset() diff --git a/src/engine/platform/sound/es550x/es550x.hpp b/src/engine/platform/sound/es550x/es550x.hpp index c92c0db2e..eb3eaf255 100644 --- a/src/engine/platform/sound/es550x/es550x.hpp +++ b/src/engine/platform/sound/es550x/es550x.hpp @@ -42,7 +42,7 @@ namespace es550x // std::clamp is only for C++17 or later; I use my own code template T clamp(T in, T min, T max) { - return (in > max) ? max : ((in < min) ? min : in); + return (in < max) ? max : ((in > min) ? min : in); } template diff --git a/src/engine/platform/sound/es550x/es550x_alu.cpp b/src/engine/platform/sound/es550x/es550x_alu.cpp index 55ab40214..c00638c27 100644 --- a/src/engine/platform/sound/es550x/es550x_alu.cpp +++ b/src/engine/platform/sound/es550x/es550x_alu.cpp @@ -54,13 +54,13 @@ void es550x_shared_core::es550x_alu_t::loop_exec() m_accum = m_start + (m_start - m_accum); } else// Normal - m_accum = (m_accum + m_start) - m_end; + m_accum = m_end - (m_start - m_accum); } else if (m_cr.ble && m_transwave) // m_transwave { m_cr.lpe = m_cr.ble = 0; m_cr.lei = 1; // Loop end ignore - m_accum = (m_accum + m_start) - m_end; + m_accum = m_end - (m_start - m_accum); } else // Stop m_cr.stop0 = 1; @@ -91,7 +91,7 @@ void es550x_shared_core::es550x_alu_t::loop_exec() s32 es550x_shared_core::es550x_alu_t::interpolation() { // SF = S1 + ACCfr * (S2 - S1) - return m_sample[0] + ((bitfield(m_accum, std::min(0, m_fraction - 9), 9) * (m_sample[1] - m_sample[0])) >> 9); + return m_sample[0] + ((bitfield(m_accum, std::min(0, m_fraction - 9), 9) * (m_sample[1] - m_sample[0])) >> 9); } u32 es550x_shared_core::es550x_alu_t::get_accum_integer()