From 6324a2a9523a8760c3b12b5e055eeb002962149f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 11 Aug 2023 16:14:06 -0500 Subject: [PATCH] OPN/2/A/B: fix ExtCh instrument issue #1053 --- src/engine/platform/genesis.cpp | 1 + src/engine/platform/genesisext.cpp | 8 ++++++++ src/engine/platform/ym2203.cpp | 1 + src/engine/platform/ym2203ext.cpp | 8 ++++++++ src/engine/platform/ym2608.cpp | 1 + src/engine/platform/ym2608ext.cpp | 8 ++++++++ src/engine/platform/ym2610.cpp | 1 + src/engine/platform/ym2610b.cpp | 1 + src/engine/platform/ym2610bext.cpp | 8 ++++++++ src/engine/platform/ym2610ext.cpp | 8 ++++++++ 10 files changed, 45 insertions(+) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 9a8bafc9..3ce42299 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 56ae1cea..b901e251 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 68cccca4..02e92e19 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 8bad13d4..675e8550 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 02a5ffa0..183533f8 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 0801f088..fae3a915 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 4fbf7859..5a1d80b5 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 4fff4727..d65e5014 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 99727b73..98584f80 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 c35599fd..979431d6 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: {