diff --git a/extern/opn/ym3438.c b/extern/opn/ym3438.c index 72b9cb9b..6a80bd43 100644 --- a/extern/opn/ym3438.c +++ b/extern/opn/ym3438.c @@ -981,6 +981,9 @@ static void OPN2_ChOutput(ym3438_t *chip) { out = (Bit16s)chip->dacdata; out = SIGN_EXTEND(8, out); + if (chip->chip_type & ym3438_mode_opn) { + out <<=5; + } } else { diff --git a/papers/format.md b/papers/format.md index 570fe7fe..895cc41e 100644 --- a/papers/format.md +++ b/papers/format.md @@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1). the format versions are: +- 140: Furnace dev140 - 139: Furnace dev139 - 138: Furnace dev138 - 137: Furnace dev137 diff --git a/src/engine/config.cpp b/src/engine/config.cpp index e7e61daa..3e1f8617 100644 --- a/src/engine/config.cpp +++ b/src/engine/config.cpp @@ -175,7 +175,7 @@ String DivConfig::getString(String key, String fallback) const { return fallback; } -bool DivConfig::has(String key) { +bool DivConfig::has(String key) const { try { String test=conf.at(key); } catch (std::out_of_range& e) { diff --git a/src/engine/config.h b/src/engine/config.h index e59674ce..58ce8370 100644 --- a/src/engine/config.h +++ b/src/engine/config.h @@ -46,7 +46,7 @@ class DivConfig { String getString(String key, String fallback) const; // check for existence - bool has(String key); + bool has(String key) const; // set a config value void set(String key, bool value); diff --git a/src/engine/engine.h b/src/engine/engine.h index b411b6df..e9baa69f 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -47,8 +47,8 @@ #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_END isBusy.unlock(); softLocked=false; -#define DIV_VERSION "dev139" -#define DIV_ENGINE_VERSION 139 +#define DIV_VERSION "dev140" +#define DIV_ENGINE_VERSION 140 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index ca3c1057..c66dc162 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -190,11 +190,11 @@ void DivPlatformGenesis::acquire_nuked(short** buf, size_t len) { } } - os[0]=(os[0]<<5); + if (chipType!=2) os[0]=(os[0]<<5); if (os[0]<-32768) os[0]=-32768; if (os[0]>32767) os[0]=32767; - os[1]=(os[1]<<5); + if (chipType!=2) os[1]=(os[1]<<5); if (os[1]<-32768) os[1]=-32768; if (os[1]>32767) os[1]=32767; @@ -223,7 +223,7 @@ void DivPlatformGenesis::acquire_ymfm(short** buf, size_t len) { flushFirst=false; } - if (ladder) { + if (chipType==1) { fm_ymfm->generate(&out_ymfm); } else { ((ymfm::ym3438*)fm_ymfm)->generate(&out_ymfm); @@ -1225,7 +1225,17 @@ void DivPlatformGenesis::reset() { fm_ymfm->reset(); } OPN2_Reset(&fm); - OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0); + switch (chipType) { + case 1: // YM2612 + OPN2_SetChipType(&fm,ym3438_mode_ym2612); + break; + case 2: // YMF276 + OPN2_SetChipType(&fm,ym3438_mode_opn); + break; + default: // YM3438 + OPN2_SetChipType(&fm,0); + break; + } if (dumpWrites) { addWrite(0xffffffff,0); } @@ -1325,14 +1335,28 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) { chipClock=COLOR_NTSC*15.0/7.0; break; } - ladder=flags.getBool("ladderEffect",false); + if (flags.has("chipType")) { + chipType=flags.getInt("chipType",0); + } else { + chipType=flags.getBool("ladderEffect",false)?1:0; + } noExtMacros=flags.getBool("noExtMacros",false); fbAllOps=flags.getBool("fbAllOps",false); - OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0); + switch (chipType) { + case 1: // YM2612 + OPN2_SetChipType(&fm,ym3438_mode_ym2612); + break; + case 2: // YMF276 + OPN2_SetChipType(&fm,ym3438_mode_opn); + break; + default: // YM3438 + OPN2_SetChipType(&fm,0); + break; + } CHECK_CUSTOM_CLOCK; if (useYMFM) { if (fm_ymfm!=NULL) delete fm_ymfm; - if (ladder) { + if (chipType==1) { fm_ymfm=new ymfm::ym2612(iface); } else { fm_ymfm=new ymfm::ym3438(iface); @@ -1349,7 +1373,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) { int DivPlatformGenesis::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { parent=p; dumpWrites=false; - ladder=false; + chipType=0; skipRegisterWrites=false; flushFirst=false; for (int i=0; i<10; i++) { diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 87b37e84..4c3d5713 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -85,7 +85,7 @@ class DivPlatformGenesis: public DivPlatformOPN { int softPCMTimer; bool extMode, softPCM, noExtMacros, useYMFM; - bool ladder; + unsigned char chipType; unsigned char dacVolTable[128]; diff --git a/src/gui/debug.cpp b/src/gui/debug.cpp index 966ea911..c220feca 100644 --- a/src/gui/debug.cpp +++ b/src/gui/debug.cpp @@ -94,7 +94,6 @@ ImGui::TextColored(ch->extMode?colorOn:colorOff,">> ExtMode"); \ ImGui::TextColored(ch->softPCM?colorOn:colorOff,">> SoftPCM"); \ ImGui::TextColored(ch->useYMFM?colorOn:colorOff,">> UseYMFM"); \ - ImGui::TextColored(ch->ladder?colorOn:colorOff,">> Ladder"); #define OPNB_CHIP_DEBUG \ FM_OPN_CHIP_DEBUG; \ diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index 02f7a2fb..579cf2d3 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -2152,27 +2152,27 @@ void FurnaceGUI::initSystemPresets() { ); ENTRY( "Yamaha YM2612 (OPN2)", { - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "ladderEffect=true") + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "chipType=1") } ); ENTRY( "Yamaha YM2612 (extended channel 3)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "ladderEffect=true") + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "chipType=1") } ); ENTRY( "Yamaha YM2612 (OPN2) CSM", { - CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "ladderEffect=true") + CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "chipType=1") } ); ENTRY( "Yamaha YM2612 (OPN2) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM, 1.0f, 0, "ladderEffect=true") + CH(DIV_SYSTEM_YM2612_DUALPCM, 1.0f, 0, "chipType=1") } ); ENTRY( "Yamaha YM2612 (extended channel 3) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 1.0f, 0, "ladderEffect=true") + CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 1.0f, 0, "chipType=1") } ); ENTRY( diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index c07fcaf0..f76c9ffd 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -34,10 +34,16 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo case DIV_SYSTEM_YM2612_DUALPCM_EXT: case DIV_SYSTEM_YM2612_CSM: { int clockSel=flags.getInt("clockSel",0); - bool ladder=flags.getBool("ladderEffect",0); + int chipType=0; + if (flags.has("chipType")) { + chipType=flags.getInt("chipType",0); + } else { + chipType=flags.getBool("ladderEffect",0)?1:0; + } bool noExtMacros=flags.getBool("noExtMacros",false); bool fbAllOps=flags.getBool("fbAllOps",false); + ImGui::Text("Clock rate:"); if (ImGui::RadioButton("NTSC (7.67MHz)",clockSel==0)) { clockSel=0; altered=true; @@ -58,9 +64,21 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo clockSel=4; altered=true; } - if (ImGui::Checkbox("Enable DAC distortion",&ladder)) { + + ImGui::Text("Chip type:"); + if (ImGui::RadioButton("YM3438 (9-bit DAC)",chipType==0)) { + chipType=0; altered=true; } + if (ImGui::RadioButton("YM2612 (9-bit DAC with distortion)",chipType==1)) { + chipType=1; + altered=true; + } + if (ImGui::RadioButton("YMF276 (external DAC)",chipType==2)) { + chipType=2; + altered=true; + } + if (type==DIV_SYSTEM_YM2612_EXT || type==DIV_SYSTEM_YM2612_DUALPCM_EXT || type==DIV_SYSTEM_YM2612_CSM) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) { altered=true; @@ -73,7 +91,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo if (altered) { e->lockSave([&]() { flags.set("clockSel",clockSel); - flags.set("ladderEffect",ladder); + flags.set("chipType",chipType); flags.set("noExtMacros",noExtMacros); flags.set("fbAllOps",fbAllOps); });