From fe8f94b2b2db682bdebbf42e58d9bdbc5b32dfa6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 11 Aug 2023 16:35:18 -0500 Subject: [PATCH] OPN/2/A/B: fix ExtCh muting on 18xx --- src/engine/platform/genesisext.cpp | 24 ++++++++++++++---------- src/engine/platform/ym2203ext.cpp | 18 +++++++++++------- src/engine/platform/ym2608ext.cpp | 22 +++++++++++++--------- src/engine/platform/ym2610bext.cpp | 22 +++++++++++++--------- src/engine/platform/ym2610ext.cpp | 22 +++++++++++++--------- 5 files changed, 64 insertions(+), 44 deletions(-) diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index b901e2518..d8760be9a 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -439,17 +439,21 @@ void DivPlatformGenesisExt::muteChannel(int ch, bool mute) { return; } isOpMuted[ch-2]=mute; - - int ordch=orderedOps[ch-2]; - unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; - DivInstrumentFM::Operator op=chan[2].state.op[ordch]; - if (isOpMuted[ch-2] || !op.enable) { - rWrite(baseAddr+0x40,127); - } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].outVol&0x7f,127)); - } - rWrite(chanOffs[2]+0xb4,(IS_EXTCH_MUTED?0:(opChan[ch-2].pan<<6))|(chan[2].state.fms&7)|((chan[2].state.ams&3)<<4)); + DivPlatformGenesis::muteChannel(extChanOffs,IS_EXTCH_MUTED); + + if (extMode) { + int ordch=orderedOps[ch-2]; + unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; + DivInstrumentFM::Operator op=chan[2].state.op[ordch]; + if (isOpMuted[ch-2] || !op.enable) { + rWrite(baseAddr+0x40,127); + } else { + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].outVol&0x7f,127)); + } + + rWrite(chanOffs[2]+0xb4,(IS_EXTCH_MUTED?0:(opChan[ch-2].pan<<6))|(chan[2].state.fms&7)|((chan[2].state.ams&3)<<4)); + } } static int opChanOffsL[4]={ diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index 675e85500..31294bd4f 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -603,13 +603,17 @@ void DivPlatformYM2203Ext::muteChannel(int ch, bool mute) { } isOpMuted[ch-2]=mute; - int ordch=orderedOps[ch-2]; - unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; - DivInstrumentFM::Operator op=chan[2].state.op[ordch]; - if (isOpMuted[ch-2] || !op.enable) { - rWrite(baseAddr+0x40,127); - } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].outVol&0x7f,127)); + DivPlatformYM2203::muteChannel(extChanOffs,IS_EXTCH_MUTED); + + if (extMode) { + int ordch=orderedOps[ch-2]; + unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; + DivInstrumentFM::Operator op=chan[2].state.op[ordch]; + if (isOpMuted[ch-2] || !op.enable) { + rWrite(baseAddr+0x40,127); + } else { + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].outVol&0x7f,127)); + } } } diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index fae3a9157..860c370fe 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -638,16 +638,20 @@ void DivPlatformYM2608Ext::muteChannel(int ch, bool mute) { } isOpMuted[ch-2]=mute; - int ordch=orderedOps[ch-2]; - unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; - DivInstrumentFM::Operator op=chan[2].state.op[ordch]; - if (isOpMuted[ch-2] || !op.enable) { - rWrite(baseAddr+0x40,127); - } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].outVol&0x7f,127)); - } + DivPlatformYM2608::muteChannel(extChanOffs,IS_EXTCH_MUTED); + + if (extMode) { + int ordch=orderedOps[ch-2]; + unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; + DivInstrumentFM::Operator op=chan[2].state.op[ordch]; + if (isOpMuted[ch-2] || !op.enable) { + rWrite(baseAddr+0x40,127); + } else { + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-2].outVol&0x7f,127)); + } - rWrite(chanOffs[2]+0xb4,(IS_EXTCH_MUTED?0:(opChan[ch-2].pan<<6))|(chan[2].state.fms&7)|((chan[2].state.ams&3)<<4)); + rWrite(chanOffs[2]+0xb4,(IS_EXTCH_MUTED?0:(opChan[ch-2].pan<<6))|(chan[2].state.fms&7)|((chan[2].state.ams&3)<<4)); + } } void DivPlatformYM2608Ext::forceIns() { diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index 98584f803..ff2a398fd 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -633,16 +633,20 @@ void DivPlatformYM2610BExt::muteChannel(int ch, bool mute) { } isOpMuted[ch-extChanOffs]=mute; - int ordch=orderedOps[ch-extChanOffs]; - unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; - DivInstrumentFM::Operator op=chan[extChanOffs].state.op[ordch]; - if (isOpMuted[ch-extChanOffs] || !op.enable) { - rWrite(baseAddr+0x40,127); - } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-extChanOffs].outVol&0x7f,127)); - } + DivPlatformYM2610B::muteChannel(extChanOffs,IS_EXTCH_MUTED); + + if (extMode) { + int ordch=orderedOps[ch-extChanOffs]; + unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; + DivInstrumentFM::Operator op=chan[extChanOffs].state.op[ordch]; + if (isOpMuted[ch-extChanOffs] || !op.enable) { + rWrite(baseAddr+0x40,127); + } else { + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-extChanOffs].outVol&0x7f,127)); + } - rWrite(chanOffs[extChanOffs]+0xb4,(IS_EXTCH_MUTED?0:(opChan[ch-extChanOffs].pan<<6))|(chan[extChanOffs].state.fms&7)|((chan[extChanOffs].state.ams&3)<<4)); + rWrite(chanOffs[extChanOffs]+0xb4,(IS_EXTCH_MUTED?0:(opChan[ch-extChanOffs].pan<<6))|(chan[extChanOffs].state.fms&7)|((chan[extChanOffs].state.ams&3)<<4)); + } } void DivPlatformYM2610BExt::forceIns() { diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index 979431d6b..65124f474 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -633,16 +633,20 @@ void DivPlatformYM2610Ext::muteChannel(int ch, bool mute) { } isOpMuted[ch-extChanOffs]=mute; - int ordch=orderedOps[ch-extChanOffs]; - unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; - DivInstrumentFM::Operator op=chan[extChanOffs].state.op[ordch]; - if (isOpMuted[ch-extChanOffs] || !op.enable) { - rWrite(baseAddr+0x40,127); - } else { - rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-extChanOffs].outVol&0x7f,127)); - } + DivPlatformYM2610::muteChannel(extChanOffs,IS_EXTCH_MUTED); + + if (extMode) { + int ordch=orderedOps[ch-extChanOffs]; + unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; + DivInstrumentFM::Operator op=chan[extChanOffs].state.op[ordch]; + if (isOpMuted[ch-extChanOffs] || !op.enable) { + rWrite(baseAddr+0x40,127); + } else { + rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch-extChanOffs].outVol&0x7f,127)); + } - rWrite(chanOffs[extChanOffs]+0xb4,(IS_EXTCH_MUTED?0:(opChan[ch-extChanOffs].pan<<6))|(chan[extChanOffs].state.fms&7)|((chan[extChanOffs].state.ams&3)<<4)); + rWrite(chanOffs[extChanOffs]+0xb4,(IS_EXTCH_MUTED?0:(opChan[ch-extChanOffs].pan<<6))|(chan[extChanOffs].state.fms&7)|((chan[extChanOffs].state.ams&3)<<4)); + } } void DivPlatformYM2610Ext::forceIns() {