From 967e717396a234a71a364634655b9f3cd6e170d3 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 2 Jun 2025 16:56:41 +0900 Subject: [PATCH] ES5506: Fix pingpong loop --- src/engine/platform/es5506.cpp | 14 ++++++++++++-- src/engine/platform/es5506.h | 3 ++- src/gui/debug.cpp | 1 + 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/engine/platform/es5506.cpp b/src/engine/platform/es5506.cpp index 02924043b..e610abb65 100644 --- a/src/engine/platform/es5506.cpp +++ b/src/engine/platform/es5506.cpp @@ -344,6 +344,9 @@ void DivPlatformES5506::tick(bool sysTick) { chan[i].crDirVal=es5506.regs_r(i,0,false)&0x41; chan[i].crDirValInit=false; } + if (!chan[i].crDirValChanged) { + chan[i].crDirVal=es5506.regs_r(i,0,false)&0x41; + } chan[i].std.next(); DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_ES5506); signed int k1=chan[i].k1Prev,k2=chan[i].k2Prev; @@ -515,7 +518,7 @@ void DivPlatformES5506::tick(bool sysTick) { if (chan[i].pcm.pause!=(bool)(chan[i].std.alg.val&1)) { chan[i].pcm.pause=chan[i].std.alg.val&1; if (!chan[i].keyOn) { - chan[i].crWriteVal=(chan[i].crWriteVal&~0x41)|chan[i].crDirVal; + chan[i].crWriteVal=(chan[i].crWriteVal&~0x41)|(chan[i].crDirVal); chan[i].crWriteVal=(chan[i].crWriteVal&~0x0002)|(chan[i].pcm.pause?0x0002:0x0000); chan[i].crChanged=true; } @@ -525,6 +528,7 @@ void DivPlatformES5506::tick(bool sysTick) { if (!chan[i].keyOn) { chan[i].crDirVal=(chan[i].crDirVal&~0x0040)|(chan[i].pcm.direction?0x0040:0x0000); chan[i].crWriteVal=(chan[i].crWriteVal&~0x41)|chan[i].crDirVal; + chan[i].crDirValChanged=true; chan[i].crChanged=true; } } @@ -673,6 +677,7 @@ void DivPlatformES5506::tick(bool sysTick) { chan[i].crDirVal=(chan[i].crDirVal&~0x0040)|(chan[i].pcm.direction?0x0040:0x0000); chan[i].crWriteVal=(chan[i].crWriteVal&~0x41)|chan[i].crDirVal; chan[i].crWriteVal=(chan[i].crWriteVal&~0xe0fd)|loopFlag; + chan[i].crDirValChanged=true; chan[i].crChanged=true; } chan[i].pcmChanged.loopBank=0; @@ -862,6 +867,7 @@ void DivPlatformES5506::tick(bool sysTick) { chan[i].crDirVal=(chan[i].crDirVal&~0x0040)|(chan[i].pcm.direction?0x0040:0x0000); chan[i].crWriteVal=(chan[i].crWriteVal&~0x41)|chan[i].crDirVal; chan[i].crWriteVal=(chan[i].crWriteVal&~0x3cff)|loopFlag; + chan[i].crDirValChanged=true; chan[i].crChanged=true; pageWrite(0x00|i,0x06,(unsigned int)chan[i].envelope.ecount); // Clear ECOUNT } @@ -890,7 +896,10 @@ void DivPlatformES5506::tick(bool sysTick) { if (chan[i].crChanged) { crWrite(0x00|i,chan[i].crWriteVal); chan[i].crChanged=false; - chan[i].crDirValInit=true; + if (chan[i].crDirValChanged) { + chan[i].crDirValInit=true; + chan[i].crDirValChanged=false; + } } } } @@ -1253,6 +1262,7 @@ int DivPlatformES5506::dispatch(DivCommand c) { chan[c.chan].pcm.direction=c.value&1; chan[c.chan].crDirVal=(chan[c.chan].crDirVal&~0x0040)|(chan[c.chan].pcm.direction?0x0040:0x0000); chan[c.chan].crWriteVal=(chan[c.chan].crWriteVal&~0x41)|chan[c.chan].crDirVal; + chan[c.chan].crDirValChanged=true; chan[c.chan].crChanged=true; } break; diff --git a/src/engine/platform/es5506.h b/src/engine/platform/es5506.h index 2d378f9ea..cbbe01b4d 100644 --- a/src/engine/platform/es5506.h +++ b/src/engine/platform/es5506.h @@ -68,7 +68,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf { int volMacroMax, panMacroMax; bool useWave, isReverseLoop; unsigned short cr, crWriteVal, crDirVal; - bool crChanged, crDirValInit; + bool crChanged, crDirValChanged, crDirValInit; struct NoteChanged { // Note changed flags union { // pack flag bits in single byte @@ -200,6 +200,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf { cr(0), crWriteVal(0), crChanged(false), + crDirValChanged(false), crDirValInit(true), noteChanged(NoteChanged()), volChanged(VolChanged()), diff --git a/src/gui/debug.cpp b/src/gui/debug.cpp index 1e0d9bc56..fa8afdba4 100644 --- a/src/gui/debug.cpp +++ b/src/gui/debug.cpp @@ -952,6 +952,7 @@ void putDispatchChan(void* data, int chanNum, int type) { ImGui::TextColored(ch->pcmChanged.loopBank?colorOn:colorOff,">> PCMLoopBankChanged"); ImGui::TextColored(ch->isReverseLoop?colorOn:colorOff,">> IsReverseLoop"); ImGui::TextColored(ch->crChanged?colorOn:colorOff,">> CRChanged"); + ImGui::TextColored(ch->crDirValChanged?colorOn:colorOff,">> CRDirValChanged"); ImGui::TextColored(ch->crDirValInit?colorOn:colorOff,">> CRDirValInit"); ImGui::TextColored(ch->pcm.isNoteMap?colorOn:colorOff,">> PCMIsNoteMap"); ImGui::TextColored(ch->pcm.pause?colorOn:colorOff,">> PCMPause");