summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/ics2115.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/ics2115.cpp')
-rw-r--r--src/devices/sound/ics2115.cpp49
1 files changed, 41 insertions, 8 deletions
diff --git a/src/devices/sound/ics2115.cpp b/src/devices/sound/ics2115.cpp
index 868bcb70bc4..7f9ebd7cc0a 100644
--- a/src/devices/sound/ics2115.cpp
+++ b/src/devices/sound/ics2115.cpp
@@ -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;