From 52a4588ad9cbdfcb7f287b7a216e6927ad8125d0 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 9 Dec 2024 01:57:30 -0500 Subject: [PATCH] OPN: fix out of bounds when using some FM effects on non-FM channels issue #2286 --- src/engine/platform/ym2203.cpp | 9 +++++++++ src/engine/platform/ym2608.cpp | 9 +++++++++ src/engine/platform/ym2610.cpp | 9 +++++++++ src/engine/platform/ym2610b.cpp | 9 +++++++++ 4 files changed, 36 insertions(+) diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 17f742b02..58044e12d 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -938,6 +938,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_FM_RS: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -954,6 +955,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_FM_AM: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -970,6 +972,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_FM_DR: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -986,6 +989,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_FM_SL: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1002,6 +1006,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_FM_RR: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1018,6 +1023,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_FM_D2R: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1034,6 +1040,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_FM_DT: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1050,6 +1057,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { break; } case DIV_CMD_FM_SSG: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1086,6 +1094,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { } break; case DIV_CMD_FM_HARD_RESET: + if (c.chan>=psgChanOffs) break; chan[c.chan].hardReset=c.value; break; case DIV_CMD_MACRO_OFF: diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 8cf053e94..7e027db29 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1460,6 +1460,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } case DIV_CMD_FM_RS: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1476,6 +1477,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } case DIV_CMD_FM_AM: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1492,6 +1494,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } case DIV_CMD_FM_DR: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1508,6 +1511,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } case DIV_CMD_FM_SL: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1524,6 +1528,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } case DIV_CMD_FM_RR: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1540,6 +1545,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } case DIV_CMD_FM_D2R: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1556,6 +1562,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } case DIV_CMD_FM_DT: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1572,6 +1579,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { break; } case DIV_CMD_FM_SSG: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1608,6 +1616,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) { } break; case DIV_CMD_FM_HARD_RESET: + if (c.chan>=psgChanOffs) break; chan[c.chan].hardReset=c.value; break; case DIV_CMD_MACRO_OFF: diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 6676a33a6..afad156ce 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1427,6 +1427,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; } case DIV_CMD_FM_RS: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1443,6 +1444,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; } case DIV_CMD_FM_AM: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1459,6 +1461,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; } case DIV_CMD_FM_DR: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1475,6 +1478,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; } case DIV_CMD_FM_SL: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1491,6 +1495,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; } case DIV_CMD_FM_RR: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1507,6 +1512,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; } case DIV_CMD_FM_D2R: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1523,6 +1529,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; } case DIV_CMD_FM_DT: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1539,6 +1546,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { break; } case DIV_CMD_FM_SSG: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1575,6 +1583,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) { } break; case DIV_CMD_FM_HARD_RESET: + if (c.chan>=psgChanOffs) break; chan[c.chan].hardReset=c.value; break; case DIV_CMD_MACRO_OFF: diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 634432ace..9874e7da1 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1495,6 +1495,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; } case DIV_CMD_FM_RS: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1511,6 +1512,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; } case DIV_CMD_FM_AM: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1527,6 +1529,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; } case DIV_CMD_FM_DR: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1543,6 +1546,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; } case DIV_CMD_FM_SL: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1559,6 +1563,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; } case DIV_CMD_FM_RR: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1575,6 +1580,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; } case DIV_CMD_FM_D2R: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1591,6 +1597,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; } case DIV_CMD_FM_DT: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1607,6 +1614,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { break; } case DIV_CMD_FM_SSG: { + if (c.chan>=psgChanOffs) break; if (c.value<0) { for (int i=0; i<4; i++) { DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; @@ -1643,6 +1651,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { } break; case DIV_CMD_FM_HARD_RESET: + if (c.chan>=psgChanOffs) break; chan[c.chan].hardReset=c.value; break; case DIV_CMD_MACRO_OFF: