fix wiz lab AGAIN and implement repeat pat
0x0b + 0x0d = broken
This commit is contained in:
parent
7b360b55a7
commit
c2669f208e
5 changed files with 80 additions and 14 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue