From 26739bba1167d875d9479a178ebed09ae702332d Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 5 Feb 2023 17:42:48 -0500 Subject: [PATCH] YM2612: fix CSM on ymfm finally --- src/engine/platform/genesis.cpp | 19 ++++++++++++++----- src/engine/platform/genesis.h | 5 +++-- src/engine/platform/sound/ymfm/ymfm_fm.ipp | 6 ++++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 239ad5f7c..05d3c08be 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -30,17 +30,26 @@ void DivYM2612Interface::ymfm_set_timer(uint32_t tnum, int32_t duration_in_clocks) { if (tnum==1) { - countB=duration_in_clocks; + setB=duration_in_clocks; } else if (tnum==0) { - countA=duration_in_clocks; + setA=duration_in_clocks; } - //logV("ymfm_set_timer(%d,%d)",tnum,duration_in_clocks); } void DivYM2612Interface::clock() { - if (countA>=0) { + if (setA>=0) { countA-=144; - if (countA<0) m_engine->engine_timer_expired(0); + if (countA<0) { + m_engine->engine_timer_expired(0); + countA+=setA; + } + } + if (setB>=0) { + countB-=144; + if (countB<0) { + m_engine->engine_timer_expired(1); + countB+=setB; + } } } diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 37449eb91..87b37e841 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -25,6 +25,7 @@ class DivYM2612Interface: public ymfm::ymfm_interface { + int setA, setB; int countA, countB; public: @@ -32,8 +33,8 @@ class DivYM2612Interface: public ymfm::ymfm_interface { void ymfm_set_timer(uint32_t tnum, int32_t duration_in_clocks); DivYM2612Interface(): ymfm::ymfm_interface(), - countA(-1), - countB(-1) {} + countA(0), + countB(0) {} }; class DivPlatformGenesis: public DivPlatformOPN { diff --git a/src/engine/platform/sound/ymfm/ymfm_fm.ipp b/src/engine/platform/sound/ymfm/ymfm_fm.ipp index 4fdff8a38..81b351fe9 100644 --- a/src/engine/platform/sound/ymfm/ymfm_fm.ipp +++ b/src/engine/platform/sound/ymfm/ymfm_fm.ipp @@ -431,6 +431,12 @@ bool fm_operator::prepare() // clock the key state clock_keystate(uint32_t(m_keyon_live != 0)); + if (m_keyon_live & (1<