fix wiz lab AGAIN and implement repeat pat

0x0b + 0x0d = broken
This commit is contained in:
tildearrow 2021-12-21 17:42:27 -05:00
parent 7b360b55a7
commit c2669f208e
5 changed files with 80 additions and 14 deletions

View file

@ -1424,6 +1424,8 @@ void DivEngine::setLoops(int loops) {
void DivEngine::playSub(bool preserveDrift) {
reset();
if (preserveDrift && curOrder==0) return;
bool oldRepeatPattern=repeatPattern;
repeatPattern=false;
int goal=curOrder;
curOrder=0;
curRow=0;
@ -1446,6 +1448,7 @@ void DivEngine::playSub(bool preserveDrift) {
if (goal>0) {
dispatch->forceIns();
}
repeatPattern=oldRepeatPattern;
if (preserveDrift) {
clockDrift=prevDrift;
} else {
@ -1548,6 +1551,16 @@ int DivEngine::getTotalTicks() {
return totalTicks;
}
bool DivEngine::getRepeatPattern() {
return repeatPattern;
}
void DivEngine::setRepeatPattern(bool value) {
isBusy.lock();
repeatPattern=value;
isBusy.unlock();
}
bool DivEngine::hasExtValue() {
return extValuePresent;
}

View file

@ -78,6 +78,7 @@ class DivEngine {
bool endOfSong;
bool consoleMode;
bool extValuePresent;
bool repeatPattern;
int ticks, cycles, curRow, curOrder, remainingLoops, nextSpeed, clockDrift;
int changeOrd, changePos, totalTicks, totalCmds, lastCmds, cmdsPerSecond;
unsigned char extValue;
@ -232,6 +233,12 @@ class DivEngine {
// get time
int getTotalTicks();
// get repeat pattern
bool getRepeatPattern();
// set repeat pattern
void setRepeatPattern(bool value);
// has ext value
bool hasExtValue();
@ -311,6 +318,7 @@ class DivEngine {
endOfSong(false),
consoleMode(false),
extValuePresent(false),
repeatPattern(false),
ticks(0),
cycles(0),
curRow(0),

View file

@ -5,6 +5,7 @@
void DivEngine::nextOrder() {
curRow=0;
if (repeatPattern) return;
if (++curOrder>=song.ordersLen) {
endOfSong=true;
curOrder=0;
@ -385,14 +386,14 @@ void DivEngine::processRow(int i, bool afterDelay) {
speed2=effectVal;
break;
case 0x0b: // change order
if (changeOrd==-1) {
if (changeOrd<0) {
changeOrd=effectVal;
changePos=0;
}
break;
case 0x0d: // next order
if (changeOrd==-1) {
changeOrd=curOrder+1;
if (changeOrd<0) {
changeOrd=-2;
changePos=effectVal;
}
break;
@ -610,15 +611,21 @@ void DivEngine::nextRow() {
if (++curRow>=song.patLen) {
nextOrder();
}
if (changeOrd>=0) {
curRow=changePos;
if (changeOrd<=curOrder) endOfSong=true;
curOrder=changeOrd;
if (curOrder>=song.ordersLen) {
curOrder=0;
endOfSong=true;
if (changeOrd!=-1) {
if (repeatPattern) {
curRow=0;
changeOrd=-1;
} else {
curRow=changePos;
if (changeOrd==-2) changeOrd=curOrder+1;
if (changeOrd<=curOrder) endOfSong=true;
curOrder=changeOrd;
if (curOrder>=song.ordersLen) {
curOrder=0;
endOfSong=true;
}
changeOrd=-1;
}
changeOrd=-1;
}
if (song.system==DIV_SYSTEM_YMU759) {