diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 6452aeef..5c100490 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -586,6 +586,16 @@ int DivPlatformArcade::dispatch(DivCommand c) { rWrite(0x1b,c.value&3); break; } + case DIV_CMD_FM_FB: { + if (c.chan>7) break; + chan[c.chan].state.fb=c.value&7; + if (isMuted[c.chan]) { + rWrite(chanOffs[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); + } else { + rWrite(chanOffs[c.chan]+ADDR_LR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)|((chan[c.chan].chVolL&1)<<6)|((chan[c.chan].chVolR&1)<<7)); + } + break; + } case DIV_CMD_FM_MULT: { if (c.chan>7) break; unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]]; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 96df861a..33fef29d 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -483,6 +483,11 @@ int DivPlatformGenesis::dispatch(DivCommand c) { rWrite(0x22,lfoValue); break; } + case DIV_CMD_FM_FB: { + chan[c.chan].state.fb=c.value&7; + rWrite(chanOffs[c.chan]+ADDR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); + break; + } case DIV_CMD_FM_MULT: { unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index eac1c908..d52229cb 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -552,6 +552,12 @@ int DivPlatformYM2610::dispatch(DivCommand c) { rWrite(0x22,(c.value&7)|((c.value>>4)<<3)); break; } + case DIV_CMD_FM_FB: { + if (c.chan>3) break; + chan[c.chan].state.fb=c.value&7; + rWrite(chanOffs[c.chan]+ADDR_FB_ALG,(chan[c.chan].state.alg&7)|(chan[c.chan].state.fb<<3)); + break; + } case DIV_CMD_FM_MULT: { if (c.chan>3) break; unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]];