diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index a6855550c..f610467ab 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -696,6 +696,11 @@ void DivPlatformYM2608::tick(bool sysTick) { chan[15].freqChanged=false; } + if (writeRSSOff) { + immWrite(0x10,0x80|writeRSSOff); + writeRSSOff=0; + } + for (int i=16; i<512; i++) { if (pendingWrites[i]!=oldWrites[i]) { immWrite(i,pendingWrites[i]&0xff); @@ -731,6 +736,11 @@ void DivPlatformYM2608::tick(bool sysTick) { chan[i].keyOn=false; } } + + if (writeRSSOn) { + immWrite(0x10,writeRSSOn); + writeRSSOn=0; + } } int DivPlatformYM2608::dispatch(DivCommand c) { @@ -805,10 +815,10 @@ int DivPlatformYM2608::dispatch(DivCommand c) { } break; } - if (c.chan>8) { // RSS TODO: improve rhythm writing strategy + if (c.chan>8) { // RSS if (skipRegisterWrites) break; + writeRSSOn|=(1<<(c.chan-9)); immWrite(0x18+(c.chan-9),isMuted[c.chan]?0:((chan[c.chan].pan<<6)|chan[c.chan].vol)); - immWrite(0x10,0x00|(1<<(c.chan-9))); break; } DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); @@ -866,7 +876,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } if (c.chan>8) { - immWrite(0x10,0x80|(1<<(c.chan-9))); + writeRSSOff|=1<<(c.chan-9); break; } chan[c.chan].keyOff=true; @@ -880,7 +890,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } if (c.chan>8) { - immWrite(0x10,0x80|(1<<(c.chan-9))); + writeRSSOff|=1<<(c.chan-9); break; } chan[c.chan].keyOff=true; @@ -1340,6 +1350,8 @@ void DivPlatformYM2608::reset() { lastBusy=60; sampleBank=0; + writeRSSOff=0; + writeRSSOn=0; delay=0; diff --git a/src/engine/platform/ym2608.h b/src/engine/platform/ym2608.h index 6845f0a3e..5c6736295 100644 --- a/src/engine/platform/ym2608.h +++ b/src/engine/platform/ym2608.h @@ -104,6 +104,7 @@ class DivPlatformYM2608: public DivDispatch { DivPlatformAY8910* ay; unsigned char sampleBank; + unsigned char writeRSSOff, writeRSSOn; int delay;