fix playSub strategy

properly handle nested playSubs
fixes #174
This commit is contained in:
tildearrow 2022-02-20 23:03:42 -05:00
parent 9068b7013b
commit 18c5867d9c

View file

@ -743,6 +743,7 @@ void DivEngine::getCommandStream(std::vector<DivCommand>& where) {
} }
void DivEngine::playSub(bool preserveDrift, int goalRow) { void DivEngine::playSub(bool preserveDrift, int goalRow) {
for (int i=0; i<song.systemLen; i++) disCont[i].dispatch->setSkipRegisterWrites(false);
reset(); reset();
if (preserveDrift && curOrder==0) return; if (preserveDrift && curOrder==0) return;
bool oldRepeatPattern=repeatPattern; bool oldRepeatPattern=repeatPattern;
@ -767,11 +768,11 @@ void DivEngine::playSub(bool preserveDrift, int goalRow) {
playing=true; playing=true;
for (int i=0; i<song.systemLen; i++) disCont[i].dispatch->setSkipRegisterWrites(true); for (int i=0; i<song.systemLen; i++) disCont[i].dispatch->setSkipRegisterWrites(true);
while (playing && curOrder<goal) { while (playing && curOrder<goal) {
if (nextTick(preserveDrift)) break; if (nextTick(preserveDrift)) return;
} }
int oldOrder=curOrder; int oldOrder=curOrder;
while (playing && curRow<goalRow) { while (playing && curRow<goalRow) {
if (nextTick(preserveDrift)) break; if (nextTick(preserveDrift)) return;
if (oldOrder!=curOrder) break; if (oldOrder!=curOrder) break;
} }
for (int i=0; i<song.systemLen; i++) disCont[i].dispatch->setSkipRegisterWrites(false); for (int i=0; i<song.systemLen; i++) disCont[i].dispatch->setSkipRegisterWrites(false);