diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 3da16eef4..ff938e9b8 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -195,6 +195,11 @@ void DivPlatformAmiga::tick() { if (chan[i].useWave && chan[i].active) { chan[i].ws.tick(); } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].audPos=0; + } + } if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { //DivInstrument* ins=parent->getIns(chan[i].ins); chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,true); diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 55172394c..061f40c67 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -264,6 +264,12 @@ void DivPlatformArcade::tick() { rWrite(0x1b,chan[i].std.wave.val&3); } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].keyOn=true; + } + } + if (chan[i].std.ex1.had) { amDepth=chan[i].std.ex1.val; immWrite(0x19,amDepth); diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index 727a14408..a33902efc 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -215,6 +215,12 @@ void DivPlatformAY8910::tick() { rWrite(0x08+i,(chan[i].outVol&15)|((chan[i].psgMode&4)<<2)); } } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + oldWrites[0x08+i]=-1; + oldWrites[0x0d]=-1; + } + } if (chan[i].std.ex2.had) { ayEnvMode=chan[i].std.ex2.val; rWrite(0x0d,ayEnvMode); diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index e9af64fc7..c32957d71 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -226,6 +226,12 @@ void DivPlatformAY8930::tick() { rWrite(0x08+i,(chan[i].outVol&31)|((chan[i].psgMode&4)<<3)); } } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + oldWrites[0x08+i]=-1; + oldWrites[regMode[i]]=-1; + } + } if (chan[i].std.ex1.had) { // duty rWrite(0x16+i,chan[i].std.ex1.val); } diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 13eac1f32..56a8fa45e 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -192,6 +192,11 @@ void DivPlatformGB::tick() { if (!chan[i].keyOff) chan[i].keyOn=true; } } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].keyOn=true; + } + } if (i==2) { if (chan[i].active) { if (ws.tick()) { diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index f00a521bc..03288a37e 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -258,6 +258,12 @@ void DivPlatformGenesis::tick() { } } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].keyOn=true; + } + } + if (chan[i].std.alg.had) { chan[i].state.alg=chan[i].std.alg.val; rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3)); diff --git a/src/engine/platform/mmc5.cpp b/src/engine/platform/mmc5.cpp index 79d9fc61e..28706ce6e 100644 --- a/src/engine/platform/mmc5.cpp +++ b/src/engine/platform/mmc5.cpp @@ -123,6 +123,12 @@ void DivPlatformMMC5::tick() { chan[i].duty=chan[i].std.duty.val; rWrite(0x5000+i*4,0x30|chan[i].outVol|((chan[i].duty&3)<<6)); } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].freqChanged=true; + chan[i].prevFreq=-1; + } + } if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,true)-1; if (chan[i].freq>2047) chan[i].freq=2047; diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index e99a3e29e..89467a88f 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -201,6 +201,12 @@ void DivPlatformNES::tick() { //rWrite(16+i*5,chan[i].sweep); } } + if (i<2) if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].freqChanged=true; + chan[i].prevFreq=-1; + } + } if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { if (i==3) { // noise int ntPos=chan[i].baseFreq; diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 3e222eec1..9f77350c5 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -269,6 +269,12 @@ void DivPlatformOPL::tick() { } } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].keyOn=true; + } + } + if (chan[i].std.alg.had) { chan[i].state.alg=chan[i].std.alg.val; } diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index ee07463c1..617972764 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -145,6 +145,12 @@ void DivPlatformOPLL::tick() { } } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].keyOn=true; + } + } + if (chan[i].state.opllPreset==0) { if (chan[i].std.alg.had) { // SUS chan[i].state.alg=chan[i].std.alg.val; diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 0789c804d..7a601ca59 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -197,7 +197,7 @@ void DivPlatformPCE::tick() { } } if (chan[i].active) { - if (chan[i].ws.tick()) { + if (chan[i].ws.tick() || (chan[i].std.phaseReset.had && chan[i].std.phaseReset.val==1)) { updateWave(i); } } diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 2189eba29..528901f0f 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -84,12 +84,19 @@ void DivPlatformSMS::tick() { chan[i].freqChanged=true; } } - if (i==3) if (chan[i].std.duty.had) { - snNoiseMode=chan[i].std.duty.val; - if (chan[i].std.duty.val<2) { - chan[3].freqChanged=false; + if (i==3) { + if (chan[i].std.duty.had) { + snNoiseMode=chan[i].std.duty.val; + if (chan[i].std.duty.val<2) { + chan[3].freqChanged=false; + } + updateSNMode=true; + } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + updateSNMode=true; + } } - updateSNMode=true; } } for (int i=0; i<3; i++) { diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 7ea634b26..8cbfa039b 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -228,6 +228,12 @@ void DivPlatformTX81Z::tick() { rWrite(0x1b,chan[i].std.wave.val&3); } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].keyOn=true; + } + } + if (chan[i].std.ex1.had) { amDepth=chan[i].std.ex1.val; immWrite(0x19,amDepth); diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index dd7220fa5..3098c935b 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -408,6 +408,12 @@ void DivPlatformYM2610::tick() { } } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].keyOn=true; + } + } + if (chan[i].std.alg.had) { chan[i].state.alg=chan[i].std.alg.val; rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3)); diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index c51f41198..b28852e43 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -472,6 +472,12 @@ void DivPlatformYM2610B::tick() { } } + if (chan[i].std.phaseReset.had) { + if (chan[i].std.phaseReset.val==1) { + chan[i].keyOn=true; + } + } + if (chan[i].std.alg.had) { chan[i].state.alg=chan[i].std.alg.val; rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3)); diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index f91e4c405..50f93de2e 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -2758,7 +2758,6 @@ void FurnaceGUI::drawInsEdit() { ins->type==DIV_INS_GB || ins->type==DIV_INS_AMIGA || ins->type==DIV_INS_OPLL || - ins->type==DIV_INS_FDS || ins->type==DIV_INS_AY || ins->type==DIV_INS_AY8930 || ins->type==DIV_INS_SWAN) {