ES5506: Fix pingpong loop

This commit is contained in:
cam900 2025-06-02 16:56:41 +09:00
parent ece9dd83c7
commit 967e717396
3 changed files with 15 additions and 3 deletions

View file

@ -344,6 +344,9 @@ void DivPlatformES5506::tick(bool sysTick) {
chan[i].crDirVal=es5506.regs_r(i,0,false)&0x41; chan[i].crDirVal=es5506.regs_r(i,0,false)&0x41;
chan[i].crDirValInit=false; chan[i].crDirValInit=false;
} }
if (!chan[i].crDirValChanged) {
chan[i].crDirVal=es5506.regs_r(i,0,false)&0x41;
}
chan[i].std.next(); chan[i].std.next();
DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_ES5506); DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_ES5506);
signed int k1=chan[i].k1Prev,k2=chan[i].k2Prev; 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)) { if (chan[i].pcm.pause!=(bool)(chan[i].std.alg.val&1)) {
chan[i].pcm.pause=chan[i].std.alg.val&1; chan[i].pcm.pause=chan[i].std.alg.val&1;
if (!chan[i].keyOn) { 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].crWriteVal=(chan[i].crWriteVal&~0x0002)|(chan[i].pcm.pause?0x0002:0x0000);
chan[i].crChanged=true; chan[i].crChanged=true;
} }
@ -525,6 +528,7 @@ void DivPlatformES5506::tick(bool sysTick) {
if (!chan[i].keyOn) { if (!chan[i].keyOn) {
chan[i].crDirVal=(chan[i].crDirVal&~0x0040)|(chan[i].pcm.direction?0x0040:0x0000); 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&~0x41)|chan[i].crDirVal;
chan[i].crDirValChanged=true;
chan[i].crChanged=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].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&~0x41)|chan[i].crDirVal;
chan[i].crWriteVal=(chan[i].crWriteVal&~0xe0fd)|loopFlag; chan[i].crWriteVal=(chan[i].crWriteVal&~0xe0fd)|loopFlag;
chan[i].crDirValChanged=true;
chan[i].crChanged=true; chan[i].crChanged=true;
} }
chan[i].pcmChanged.loopBank=0; 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].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&~0x41)|chan[i].crDirVal;
chan[i].crWriteVal=(chan[i].crWriteVal&~0x3cff)|loopFlag; chan[i].crWriteVal=(chan[i].crWriteVal&~0x3cff)|loopFlag;
chan[i].crDirValChanged=true;
chan[i].crChanged=true; chan[i].crChanged=true;
pageWrite(0x00|i,0x06,(unsigned int)chan[i].envelope.ecount); // Clear ECOUNT 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) { if (chan[i].crChanged) {
crWrite(0x00|i,chan[i].crWriteVal); crWrite(0x00|i,chan[i].crWriteVal);
chan[i].crChanged=false; 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].pcm.direction=c.value&1;
chan[c.chan].crDirVal=(chan[c.chan].crDirVal&~0x0040)|(chan[c.chan].pcm.direction?0x0040:0x0000); 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].crWriteVal=(chan[c.chan].crWriteVal&~0x41)|chan[c.chan].crDirVal;
chan[c.chan].crDirValChanged=true;
chan[c.chan].crChanged=true; chan[c.chan].crChanged=true;
} }
break; break;

View file

@ -68,7 +68,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf {
int volMacroMax, panMacroMax; int volMacroMax, panMacroMax;
bool useWave, isReverseLoop; bool useWave, isReverseLoop;
unsigned short cr, crWriteVal, crDirVal; unsigned short cr, crWriteVal, crDirVal;
bool crChanged, crDirValInit; bool crChanged, crDirValChanged, crDirValInit;
struct NoteChanged { // Note changed flags struct NoteChanged { // Note changed flags
union { // pack flag bits in single byte union { // pack flag bits in single byte
@ -200,6 +200,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf {
cr(0), cr(0),
crWriteVal(0), crWriteVal(0),
crChanged(false), crChanged(false),
crDirValChanged(false),
crDirValInit(true), crDirValInit(true),
noteChanged(NoteChanged()), noteChanged(NoteChanged()),
volChanged(VolChanged()), volChanged(VolChanged()),

View file

@ -952,6 +952,7 @@ void putDispatchChan(void* data, int chanNum, int type) {
ImGui::TextColored(ch->pcmChanged.loopBank?colorOn:colorOff,">> PCMLoopBankChanged"); ImGui::TextColored(ch->pcmChanged.loopBank?colorOn:colorOff,">> PCMLoopBankChanged");
ImGui::TextColored(ch->isReverseLoop?colorOn:colorOff,">> IsReverseLoop"); ImGui::TextColored(ch->isReverseLoop?colorOn:colorOff,">> IsReverseLoop");
ImGui::TextColored(ch->crChanged?colorOn:colorOff,">> CRChanged"); ImGui::TextColored(ch->crChanged?colorOn:colorOff,">> CRChanged");
ImGui::TextColored(ch->crDirValChanged?colorOn:colorOff,">> CRDirValChanged");
ImGui::TextColored(ch->crDirValInit?colorOn:colorOff,">> CRDirValInit"); ImGui::TextColored(ch->crDirValInit?colorOn:colorOff,">> CRDirValInit");
ImGui::TextColored(ch->pcm.isNoteMap?colorOn:colorOff,">> PCMIsNoteMap"); ImGui::TextColored(ch->pcm.isNoteMap?colorOn:colorOff,">> PCMIsNoteMap");
ImGui::TextColored(ch->pcm.pause?colorOn:colorOff,">> PCMPause"); ImGui::TextColored(ch->pcm.pause?colorOn:colorOff,">> PCMPause");