ics2115: Improved sound using next-state logic

This commit is contained in:
Esteban Diez Laiz 2021-08-16 21:45:17 +02:00
parent 1f192de48f
commit 091944f534

View File

@ -201,9 +201,31 @@ device_memory_interface::space_config_vector ics2115_device::memory_space_config
}
//TODO: improve using next-state logic from column 126 of patent 5809466
// Using next-state logic from column 126 of patent 5809466.
// VOL(L) = vol.acc
// VINC = vol.inc
// DIR = invert
// BC = boundary cross (start or end )
// BLEN = bi directional loop enable
// LEN loop enable
// UVOL LEN BLEN DIR BC Next VOL(L)
// 0 x x x x VOL(L) // no change no vol envelope
// 1 x x 0 0 VOL(L) + VINC // foward dir no bc
// 1 x x 1 0 VOL(L) - VINC // invert no bc
// 1 0 x x 1 VOL(L) // no env len no vel envelope
// ----------------------------------------------------------------------------
// 1 1 0 0 1 start - ( end - (VOL(L) + VINC) )
// 1 1 0 1 1 end + ( (VOL(L) - VINC) - start)
// 1 1 1 0 1 end + (end - (VOL(L) + VINC) ) // here
// 1 1 1 1 1 start - ( (VOL(L) - VINC)- start)
int ics2115_device::ics2115_voice::update_volume_envelope()
{
// test for boundary cross
bool bc = false;
if (vol.acc >= vol.end || vol.acc <= vol.end)
bc = true;
int ret = 0;
if (vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop)
return ret;
@ -231,15 +253,26 @@ int ics2115_device::ics2115_voice::update_volume_envelope()
if (osc_conf.bitflags.eightbit)
return ret;
if (vol_ctrl.bitflags.loop)
if (vol_ctrl.bitflags.loop)
{
if (vol_ctrl.bitflags.loop_bidir)
vol_ctrl.bitflags.invert = !vol_ctrl.bitflags.invert;
if (bc) {
if (!vol_ctrl.bitflags.loop_bidir && !vol_ctrl.bitflags.invert)
// uvol = 1* len = 1* blen = 0 dir = 0 bc = 1* start - ( end - (VOL(L) + VINC) )
vol.acc = vol.start - (vol.end - (vol.acc + vol.incr));
if (vol_ctrl.bitflags.invert)
vol.acc = vol.end + vol.left;
else
vol.acc = vol.start - vol.left;
if (!vol_ctrl.bitflags.loop_bidir && vol_ctrl.bitflags.invert)
// 1 1 blen = 0 dir= 1 1 end + ( (VOL(L) - VINC) - start)
vol.acc = vol.end + ((vol.acc - vol.incr) - vol.start);
if (vol_ctrl.bitflags.loop_bidir && !vol_ctrl.bitflags.invert)
// 1 1 blen = 1 dir = 0 1 end + (end - (VOL(L) + VINC) )
vol.acc = vol.end + (vol.end - (vol.acc + vol.incr));
if (vol_ctrl.bitflags.loop_bidir && vol_ctrl.bitflags.invert)
// 1 1 beln = 1 dir = 1 1 start - ( (VOL(L) - VINC)- start)
vol.acc = vol.start - ((vol.acc - vol.incr) - vol.start);
}
}
else
vol_ctrl.bitflags.done = true;