mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
ics2115: Improved sound using next-state logic
This commit is contained in:
parent
1f192de48f
commit
091944f534
@ -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()
|
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;
|
int ret = 0;
|
||||||
if (vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop)
|
if (vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop)
|
||||||
return ret;
|
return ret;
|
||||||
@ -231,15 +253,26 @@ int ics2115_device::ics2115_voice::update_volume_envelope()
|
|||||||
if (osc_conf.bitflags.eightbit)
|
if (osc_conf.bitflags.eightbit)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (vol_ctrl.bitflags.loop)
|
if (vol_ctrl.bitflags.loop)
|
||||||
{
|
{
|
||||||
if (vol_ctrl.bitflags.loop_bidir)
|
if (bc) {
|
||||||
vol_ctrl.bitflags.invert = !vol_ctrl.bitflags.invert;
|
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)
|
if (!vol_ctrl.bitflags.loop_bidir && vol_ctrl.bitflags.invert)
|
||||||
vol.acc = vol.end + vol.left;
|
// 1 1 blen = 0 dir= 1 1 end + ( (VOL(L) - VINC) - start)
|
||||||
else
|
vol.acc = vol.end + ((vol.acc - vol.incr) - vol.start);
|
||||||
vol.acc = vol.start - vol.left;
|
|
||||||
|
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
|
else
|
||||||
vol_ctrl.bitflags.done = true;
|
vol_ctrl.bitflags.done = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user