diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index d8ae8b38..eefec5d8 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -130,6 +130,9 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { int destFreq=NOTE_FNUM_BLOCK(c.value2,11); int newFreq; bool return2=false; + if (opChan[ch].portaPause) { + opChan[ch].baseFreq=opChan[ch].portaPauseFreq; + } if (destFreq>opChan[ch].baseFreq) { newFreq=opChan[ch].baseFreq+c.value; if (newFreq>=destFreq) { @@ -144,23 +147,20 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { } } // what the heck! - // TODO: rework! if (!opChan[ch].portaPause) { if ((newFreq&0x7ff)>1288) { - newFreq=(644)|((newFreq+0x800)&0xf800); + opChan[ch].portaPauseFreq=(644)|((newFreq+0x800)&0xf800); opChan[ch].portaPause=true; - return2=false; - } else if ((newFreq&0x7ff)<644) { - newFreq=(1287)|((newFreq-0x800)&0xf800); - opChan[ch].portaPause=true; - return2=false; - } else { - opChan[ch].freqChanged=true; + break; + } + if ((newFreq&0x7ff)<644) { + opChan[ch].portaPauseFreq=newFreq=(1287)|((newFreq-0x800)&0xf800); + opChan[ch].portaPause=true; + break; } - } else { - opChan[ch].portaPause=false; - opChan[ch].freqChanged=true; } + opChan[ch].portaPause=false; + opChan[ch].freqChanged=true; opChan[ch].baseFreq=newFreq; if (return2) return 2; break; diff --git a/src/engine/platform/genesisext.h b/src/engine/platform/genesisext.h index fc9eed89..4cdf9fc6 100644 --- a/src/engine/platform/genesisext.h +++ b/src/engine/platform/genesisext.h @@ -25,13 +25,28 @@ class DivPlatformGenesisExt: public DivPlatformGenesis { struct OpChannel { DivMacroInt std; unsigned char freqH, freqL; - int freq, baseFreq, pitch; + int freq, baseFreq, pitch, portaPauseFreq; unsigned char ins; signed char konCycles; bool active, insChanged, freqChanged, keyOn, keyOff, portaPause; int vol; unsigned char pan; - OpChannel(): freqH(0), freqL(0), freq(0), baseFreq(0), pitch(0), ins(-1), active(false), insChanged(true), freqChanged(false), keyOn(false), keyOff(false), portaPause(false), vol(0), pan(3) {} + OpChannel(): + freqH(0), + freqL(0), + freq(0), + baseFreq(0), + pitch(0), + portaPauseFreq(0), + ins(-1), + active(false), + insChanged(true), + freqChanged(false), + keyOn(false), + keyOff(false), + portaPause(false), + vol(0), + pan(3) {} }; OpChannel opChan[4]; bool isOpMuted[4];