diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 9a8bafc94..3ce422991 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -972,6 +972,7 @@ int DivPlatformGenesis::dispatch(DivCommand c) { } case DIV_CMD_FM_EXTCH: { if (extSys) { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); } diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index 56ae1ceaf..b901e2518 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -144,6 +144,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { opChan[ch].insChanged=true; } opChan[ch].ins=c.value; + chan[extChanOffs].ins=opChan[ch].ins; break; case DIV_CMD_PANNING: { if (c.value==0 && c.value2==0) { @@ -219,8 +220,15 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { break; } case DIV_CMD_FM_EXTCH: { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); + if (!extMode) { + for (int i=0; i<4; i++) { + opChan[i].insChanged=true; + } + chan[extChanOffs].insChanged=true; + } break; } case DIV_CMD_FM_LFO: { diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 68cccca45..02e92e191 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -670,6 +670,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { } case DIV_CMD_FM_EXTCH: { if (extSys) { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); } diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index 8bad13d48..675e85500 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -138,6 +138,7 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { opChan[ch].insChanged=true; } opChan[ch].ins=c.value; + chan[extChanOffs].ins=opChan[ch].ins; break; case DIV_CMD_PITCH: { opChan[ch].pitch=c.value; @@ -182,8 +183,15 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { break; } case DIV_CMD_FM_EXTCH: { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); + if (!extMode) { + for (int i=0; i<4; i++) { + opChan[i].insChanged=true; + } + chan[extChanOffs].insChanged=true; + } break; } case DIV_CMD_FM_FB: { diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 02a5ffa08..183533f81 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1153,6 +1153,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { } case DIV_CMD_FM_EXTCH: { if (extSys) { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); } diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index 0801f0885..fae3a9157 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -141,6 +141,7 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { opChan[ch].insChanged=true; } opChan[ch].ins=c.value; + chan[extChanOffs].ins=opChan[ch].ins; break; case DIV_CMD_PANNING: { if (c.value==0 && c.value2==0) { @@ -200,8 +201,15 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { break; } case DIV_CMD_FM_EXTCH: { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); + if (!extMode) { + for (int i=0; i<4; i++) { + opChan[i].insChanged=true; + } + chan[extChanOffs].insChanged=true; + } break; } case DIV_CMD_FM_LFO: { diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 4fbf78595..5a1d80b58 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1125,6 +1125,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { } case DIV_CMD_FM_EXTCH: { if (extSys) { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); } diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 4fff47279..d65e50140 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1192,6 +1192,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { } case DIV_CMD_FM_EXTCH: { if (extSys) { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); } diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index 99727b734..98584f803 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -137,6 +137,7 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { opChan[ch].insChanged=true; } opChan[ch].ins=c.value; + chan[extChanOffs].ins=opChan[ch].ins; break; case DIV_CMD_PANNING: { if (c.value==0 && c.value2==0) { @@ -196,8 +197,15 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { break; } case DIV_CMD_FM_EXTCH: { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); + if (!extMode) { + for (int i=0; i<4; i++) { + opChan[i].insChanged=true; + } + chan[extChanOffs].insChanged=true; + } break; } case DIV_CMD_FM_LFO: { diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index c35599fdd..979431d6b 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -137,6 +137,7 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { opChan[ch].insChanged=true; } opChan[ch].ins=c.value; + chan[extChanOffs].ins=opChan[ch].ins; break; case DIV_CMD_PANNING: { if (c.value==0 && c.value2==0) { @@ -196,8 +197,15 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { break; } case DIV_CMD_FM_EXTCH: { + if (extMode==(bool)c.value) break; extMode=c.value; immWrite(0x27,extMode?0x40:0); + if (!extMode) { + for (int i=0; i<4; i++) { + opChan[i].insChanged=true; + } + chan[extChanOffs].insChanged=true; + } break; } case DIV_CMD_FM_LFO: {