From e5d81bd694724f487522a6a4f3e9c20122b16b1c Mon Sep 17 00:00:00 2001 From: cam900 Date: Thu, 5 Jan 2023 08:40:44 +0900 Subject: [PATCH] Prepare to YMF289B OPL3-L support --- src/engine/platform/opl.cpp | 20 ++++++++++++++++++-- src/gui/presets.cpp | 10 ++++++++++ src/gui/sysConf.cpp | 15 +++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 5af5de8c6..ecb68bdf2 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1722,13 +1722,29 @@ void DivPlatformOPL::setFlags(const DivConfig& flags) { case 0x04: chipClock=15000000.0; break; + case 0x05: + chipClock=33868800.0; + break; default: chipClock=COLOR_NTSC*4.0; break; } CHECK_CUSTOM_CLOCK; - rate=chipClock/288; - chipRateBase=rate; + switch (flags.getInt("chipType",0)) { + case 1: // YMF289B + chipFreqBase=32768*684; + rate=chipClock/684; + chipRateBase=chipClock/768; + downsample=true; + break; + default: // YMF262 + chipFreqBase=32768*288; + rate=chipClock/288; + chipRateBase=rate; + downsample=false; + break; + } + reset(); break; case 4: switch (flags.getInt("clockSel",0)) { diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index f0e4fe928..c01d2c4e6 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -2248,6 +2248,16 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_OPL3_DRUMS, 64, 0, "") } ); + ENTRY( + "Yamaha YMF289B (OPL3-L)", { + CH(DIV_SYSTEM_OPL3, 64, 0, "chipType=1") + } + ); + ENTRY( + "Yamaha YMF289B (drums mode)", { + CH(DIV_SYSTEM_OPL3_DRUMS, 64, 0, "chipType=1") + } + ); if (settings.hiddenSystems) { ENTRY( "Yamaha YMU759 (MA-2)", { diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 8e41fa00c..ff60b3136 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -1182,6 +1182,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo case DIV_SYSTEM_OPL3: case DIV_SYSTEM_OPL3_DRUMS: { int clockSel=flags.getInt("clockSel",0); + int chipType=flags.getInt("chipType",0); ImGui::Text("Clock rate:"); if (ImGui::RadioButton("14.32MHz (NTSC)",clockSel==0)) { @@ -1204,10 +1205,24 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo clockSel=4; altered=true; } + if (ImGui::RadioButton("33.8688MHz (OPL3-L)",clockSel==5)) { + clockSel=5; + altered=true; + } + ImGui::Text("Chip type:"); + if (ImGui::RadioButton("OPL3 (YMF262)",chipType==0)) { + chipType=0; + altered=true; + } + if (ImGui::RadioButton("OPL3-L (YMF289B)",chipType==1)) { + chipType=1; + altered=true; + } if (altered) { e->lockSave([&]() { flags.set("clockSel",clockSel); + flags.set("chipType",chipType); }); } break;