emulation core related fix, reversed loop and volume

This commit is contained in:
cam900 2022-04-27 00:47:01 +09:00
parent 97d2bddf1f
commit 7fbd239b85
4 changed files with 8 additions and 8 deletions

View file

@ -217,7 +217,7 @@ void DivPlatformES5506::e(bool state)
if ((irqv&0x80)==0) { if ((irqv&0x80)==0) {
unsigned char ch=irqv&0x1f; unsigned char ch=irqv&0x1f;
if (chan[ch].isReverseLoop) { // Reversed loop 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; chan[ch].isReverseLoop=false;
} }
} }

View file

@ -261,8 +261,8 @@ void es5506_core::voice_t::tick(u8 voice)
if (!m_mute) if (!m_mute)
{ {
// Send to output // Send to output
m_ch.m_left = volume_calc(sign_ext<s32>(m_filter.m_o4_1, 16), m_lvol); m_ch.m_left = volume_calc(m_lvol, sign_ext<s32>(m_filter.m_o4_1, 16));
m_ch.m_right = volume_calc(sign_ext<s32>(m_filter.m_o4_1, 16), m_rvol); m_ch.m_right = volume_calc(m_rvol, sign_ext<s32>(m_filter.m_o4_1, 16));
} }
// ALU execute // ALU execute
@ -307,7 +307,7 @@ s32 es5506_core::voice_t::volume_calc(u16 volume, s32 in)
{ {
u8 exponent = bitfield(volume, 12, 4); u8 exponent = bitfield(volume, 12, 4);
u8 mantissa = bitfield(volume, 4, 8); u8 mantissa = bitfield(volume, 4, 8);
return (in * s32(0x100 | mantissa)) >> (20 - exponent); return (in * s32(0x100 | mantissa)) >> (19 - exponent);
} }
void es5506_core::reset() void es5506_core::reset()

View file

@ -42,7 +42,7 @@ namespace es550x
// std::clamp is only for C++17 or later; I use my own code // std::clamp is only for C++17 or later; I use my own code
template<typename T> T clamp(T in, T min, T max) template<typename T> 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<typename T, T InitWidth, u8 InitEdge = 0> template<typename T, T InitWidth, u8 InitEdge = 0>

View file

@ -54,13 +54,13 @@ void es550x_shared_core::es550x_alu_t::loop_exec()
m_accum = m_start + (m_start - m_accum); m_accum = m_start + (m_start - m_accum);
} }
else// Normal 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 else if (m_cr.ble && m_transwave) // m_transwave
{ {
m_cr.lpe = m_cr.ble = 0; m_cr.lpe = m_cr.ble = 0;
m_cr.lei = 1; // Loop end ignore 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 else // Stop
m_cr.stop0 = 1; 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() s32 es550x_shared_core::es550x_alu_t::interpolation()
{ {
// SF = S1 + ACCfr * (S2 - S1) // SF = S1 + ACCfr * (S2 - S1)
return m_sample[0] + ((bitfield(m_accum, std::min<u8>(0, m_fraction - 9), 9) * (m_sample[1] - m_sample[0])) >> 9); return m_sample[0] + ((bitfield<s32>(m_accum, std::min<u8>(0, m_fraction - 9), 9) * (m_sample[1] - m_sample[0])) >> 9);
} }
u32 es550x_shared_core::es550x_alu_t::get_accum_integer() u32 es550x_shared_core::es550x_alu_t::get_accum_integer()