diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 082cebc3..6c75c8e4 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ diff --git a/papers/format.md b/papers/format.md index a192f138..ab8cacd6 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: +- 133: Furnace 0.6pre3 - 132: Furnace 0.6pre2 - 131: Furnace dev131 - 130: Furnace dev130 diff --git a/res/Info.plist b/res/Info.plist index d7f0f98d..86477d15 100644 --- a/res/Info.plist +++ b/res/Info.plist @@ -15,17 +15,17 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 0.6pre2 + 0.6pre3 CFBundleName Furnace CFBundlePackageType APPL CFBundleShortVersionString - 0.6pre2 + 0.6pre3 CFBundleSignature ???? CFBundleVersion - 0.6pre2 + 0.6pre3 NSHumanReadableCopyright NSHighResolutionCapable diff --git a/src/engine/engine.h b/src/engine/engine.h index faca57d9..7eb5c00c 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 "0.6pre2" -#define DIV_ENGINE_VERSION 132 +#define DIV_VERSION "0.6pre3" +#define DIV_ENGINE_VERSION 133 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index d56836bf..d5180c80 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -2511,17 +2511,25 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { } // ExtCh compat flag - if (ds.version<125) { - for (int i=0; ifm.alg; - chan[2].state.fb=ins->fm.fb; + if (ch==0 || fbAllOps) { + chan[2].state.fb=ins->fm.fb; + } chan[2].state.fms=ins->fm.fms; chan[2].state.ams=ins->fm.ams; chan[2].state.op[ordch]=ins->fm.op[ordch]; diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index 00df4edb..95ab537f 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -1041,6 +1041,7 @@ void DivPlatformYM2203::setFlags(const DivConfig& flags) { } CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); + fbAllOps=flags.getBool("fbAllOps",false); rate=fm->sample_rate(chipClock); for (int i=0; i<6; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index d19276be..701ae9e5 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -44,7 +44,9 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { if (opChan[ch].insChanged) { chan[2].state.alg=ins->fm.alg; - chan[2].state.fb=ins->fm.fb; + if (ch==0 || fbAllOps) { + chan[2].state.fb=ins->fm.fb; + } chan[2].state.op[ordch]=ins->fm.op[ordch]; } diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 0ec5cb48..b5dba5f5 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1538,6 +1538,7 @@ void DivPlatformYM2608::setFlags(const DivConfig& flags) { } CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); + fbAllOps=flags.getBool("fbAllOps",false); rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { oscBuf[i]->rate=rate; diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index b38e1a26..0a6abe7a 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -44,7 +44,9 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { if (opChan[ch].insChanged) { chan[2].state.alg=ins->fm.alg; - chan[2].state.fb=ins->fm.fb; + if (ch==0 || fbAllOps) { + chan[2].state.fb=ins->fm.fb; + } chan[2].state.fms=ins->fm.fms; chan[2].state.ams=ins->fm.ams; chan[2].state.op[ordch]=ins->fm.op[ordch]; diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index a5845461..c8d0b645 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -40,7 +40,9 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { if (opChan[ch].insChanged) { chan[extChanOffs].state.alg=ins->fm.alg; - chan[extChanOffs].state.fb=ins->fm.fb; + if (ch==0 || fbAllOps) { + chan[extChanOffs].state.fb=ins->fm.fb; + } chan[extChanOffs].state.fms=ins->fm.fms; chan[extChanOffs].state.ams=ins->fm.ams; chan[extChanOffs].state.op[ordch]=ins->fm.op[ordch]; diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index 206c904d..54bbd2b7 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -40,7 +40,9 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { if (opChan[ch].insChanged) { chan[extChanOffs].state.alg=ins->fm.alg; - chan[extChanOffs].state.fb=ins->fm.fb; + if (ch==0 || fbAllOps) { + chan[extChanOffs].state.fb=ins->fm.fb; + } chan[extChanOffs].state.fms=ins->fm.fms; chan[extChanOffs].state.ams=ins->fm.ams; chan[extChanOffs].state.op[ordch]=ins->fm.op[ordch]; diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index 9671c157..ab1bd052 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -221,6 +221,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN { } CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); + fbAllOps=flags.getBool("fbAllOps",false); rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { oscBuf[i]->rate=rate; diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index 44d1176e..f0e4fe92 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -1114,474 +1114,6 @@ void FurnaceGUI::initSystemPresets() { ); CATEGORY_END; - CATEGORY_BEGIN("FM","chips which use frequency modulation (FM) to generate sound.\nsome of these also pack more (like square and sample channels)."); - ENTRY( - "Yamaha YM2151 (OPM)", { - CH(DIV_SYSTEM_YM2151, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2203 (OPN)", { - CH(DIV_SYSTEM_YM2203, 64, 0, "clockSel=3") - } - ); - ENTRY( - "Yamaha YM2203 (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 64, 0, "clockSel=3") - } - ); - ENTRY( - "Yamaha YM2608 (OPNA)", { - CH(DIV_SYSTEM_YM2608, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2608 (extended channel 3)", { - CH(DIV_SYSTEM_YM2608_EXT, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2610 (OPNB)", { - CH(DIV_SYSTEM_YM2610_FULL, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2610 (extended channel 2)", { - CH(DIV_SYSTEM_YM2610_FULL_EXT, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2610B (OPNB2)", { - CH(DIV_SYSTEM_YM2610B, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2610B (extended channel 3)", { - CH(DIV_SYSTEM_YM2610B_EXT, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2612 (OPN2)", { - CH(DIV_SYSTEM_YM2612, 64, 0, "ladderEffect=true") - } - ); - ENTRY( - "Yamaha YM2612 (extended channel 3)", { - CH(DIV_SYSTEM_YM2612_EXT, 64, 0, "ladderEffect=true") - } - ); - ENTRY( - "Yamaha YM2612 (OPN2) CSM", { - CH(DIV_SYSTEM_YM2612_CSM, 64, 0, "ladderEffect=true") - } - ); - ENTRY( - "Yamaha YM2612 (OPN2) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM, 64, 0, "ladderEffect=true") - } - ); - ENTRY( - "Yamaha YM2612 (extended channel 3) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 64, 0, "ladderEffect=true") - } - ); - ENTRY( - "Yamaha YM2413 (OPLL)", { - CH(DIV_SYSTEM_OPLL, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2413 (drums mode)", { - CH(DIV_SYSTEM_OPLL_DRUMS, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM2414 (OPZ)", { - CH(DIV_SYSTEM_OPZ, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3438 (OPN2C)", { - CH(DIV_SYSTEM_YM2612, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3438 (extended channel 3)", { - CH(DIV_SYSTEM_YM2612_EXT, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3438 (OPN2C) CSM", { - CH(DIV_SYSTEM_YM2612_CSM, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3438 (OPN2C) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3438 (extended channel 3) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3526 (OPL)", { - CH(DIV_SYSTEM_OPL, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3526 (drums mode)", { - CH(DIV_SYSTEM_OPL_DRUMS, 64, 0, "") - } - ); - ENTRY( - "Yamaha Y8950", { - CH(DIV_SYSTEM_Y8950, 64, 0, "") - } - ); - ENTRY( - "Yamaha Y8950 (drums mode)", { - CH(DIV_SYSTEM_Y8950_DRUMS, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3812 (OPL2)", { - CH(DIV_SYSTEM_OPL2, 64, 0, "") - } - ); - ENTRY( - "Yamaha YM3812 (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 64, 0, "") - } - ); - ENTRY( - "Yamaha YMF262 (OPL3)", { - CH(DIV_SYSTEM_OPL3, 64, 0, "") - } - ); - ENTRY( - "Yamaha YMF262 (drums mode)", { - CH(DIV_SYSTEM_OPL3_DRUMS, 64, 0, "") - } - ); - if (settings.hiddenSystems) { - ENTRY( - "Yamaha YMU759 (MA-2)", { - CH(DIV_SYSTEM_YMU759, 64, 0, "") - } - ); - } - CATEGORY_END; - - CATEGORY_BEGIN("Square","these chips generate square/pulse tones only (but may include noise)."); - ENTRY( - "TI SN76489", { - CH(DIV_SYSTEM_SMS, 64, 0, "chipType=1") - } - ); - ENTRY( - "TI SN76489A", { - CH(DIV_SYSTEM_SMS, 64, 0, "chipType=4") - } - ); - ENTRY( - "TI SN76496", { - CH(DIV_SYSTEM_SMS, 64, 0, "chipType=5") - } - ); - ENTRY( - "NCR 8496", { - CH(DIV_SYSTEM_SMS, 64, 0, "chipType=6") - } - ); - ENTRY( - "Tandy PSSJ 3-voice sound", { - CH(DIV_SYSTEM_SMS, 64, 0, "chipType=7") - // 8 bit DAC - } - ); - ENTRY( - "Sega PSG (SN76489-like)", { - CH(DIV_SYSTEM_SMS, 64, 0, ""), - } - ); - ENTRY( - "Sega PSG (SN76489-like, Stereo)", { - CH(DIV_SYSTEM_SMS, 64, 0, "chipType=3") - } - ); - ENTRY( - "TI SN94624", { - CH(DIV_SYSTEM_SMS, 64, 0, - "clockSel=6\n" - "chipType=8\n" - ) - } - ); - ENTRY( - "TI SN76494", { - CH(DIV_SYSTEM_SMS, 64, 0, - "clockSel=6\n" - "chipType=9\n" - ) - } - ); - ENTRY( - "Toshiba T6W28", { - CH(DIV_SYSTEM_T6W28, 64, 0, "") - } - ); - ENTRY( - "AY-3-8910", { - CH(DIV_SYSTEM_AY8910, 64, 0, "") - } - ); - ENTRY( - "AY-3-8914", { - CH(DIV_SYSTEM_AY8910, 64, 0, "chipType=3") - } - ); - ENTRY( - "Yamaha YM2149(F)", { - CH(DIV_SYSTEM_AY8910, 64, 0, "chipType=1") - } - ); - ENTRY( - "Philips SAA1099", { - CH(DIV_SYSTEM_SAA1099, 64, 0, "") - } - ); - ENTRY( - "PC Speaker", { - CH(DIV_SYSTEM_PCSPKR, 32, 0, "") - } - ); - ENTRY( - "Pokémon Mini", { - CH(DIV_SYSTEM_POKEMINI, 32, 0, "") - } - ); - ENTRY( - "Commodore VIC", { - CH(DIV_SYSTEM_VIC20, 64, 0, "clockSel=1") - } - ); - ENTRY( - "OKI MSM5232", { - CH(DIV_SYSTEM_MSM5232, 64, 0, "") - } - ); - ENTRY( - "Pong", { - CH(DIV_SYSTEM_PONG, 64, 0, "") - } - ); - CATEGORY_END; - - CATEGORY_BEGIN("Sample","chips/systems which use PCM or ADPCM samples for sound synthesis."); - ENTRY( - "Amiga", { - CH(DIV_SYSTEM_AMIGA, 64, 0, "clockSel=1") - }, - "tickRate=50" - ); - ENTRY( - "SegaPCM", { - CH(DIV_SYSTEM_SEGAPCM, 64, 0, "") - } - ); - ENTRY( - "Capcom QSound", { - CH(DIV_SYSTEM_QSOUND, 64, 0, "") - } - ); - ENTRY( - "Seta/Allumer X1-010", { - CH(DIV_SYSTEM_X1_010, 64, 0, "") - } - ); - ENTRY( - "Yamaha YMZ280B (PCMD8)", { - CH(DIV_SYSTEM_YMZ280B, 64, 0, "") - } - ); - ENTRY( - "Ricoh RF5C68", { - CH(DIV_SYSTEM_RF5C68, 64, 0, "") - } - ); - ENTRY( - "OKI MSM6258", { - CH(DIV_SYSTEM_MSM6258, 64, 0, "") - } - ); - ENTRY( - "OKI MSM6295", { - CH(DIV_SYSTEM_MSM6295, 64, 0, "") - } - ); - ENTRY( - "SNES", { - CH(DIV_SYSTEM_SNES, 64, 0, "") - } - ); - ENTRY( - "Konami K007232", { - CH(DIV_SYSTEM_K007232, 64, 0, "") - } - ); - ENTRY( - "Irem GA20", { - CH(DIV_SYSTEM_GA20, 64, 0, "") - } - ); - ENTRY( - "Generic PCM DAC", { - CH(DIV_SYSTEM_PCM_DAC, 64, 0, "") - } - ); - CATEGORY_END; - - CATEGORY_BEGIN("Wavetable","chips which use user-specified waveforms to generate sound."); - ENTRY( - "PC Engine", { - CH(DIV_SYSTEM_PCE, 64, 0, "") - } - ); - ENTRY( - "Commodore PET (pseudo-wavetable)", { - CH(DIV_SYSTEM_PET, 64, 0, "") - }, - "tickRate=50" - ); - ENTRY( - "Konami Bubble System WSG", { - CH(DIV_SYSTEM_BUBSYS_WSG, 64, 0, "") - } - ); - ENTRY( - "Konami SCC", { - CH(DIV_SYSTEM_SCC, 64, 0, "") - } - ); - ENTRY( - "Konami SCC+", { - CH(DIV_SYSTEM_SCC_PLUS, 64, 0, "") - } - ); - ENTRY( - "Namco WSG", { - CH(DIV_SYSTEM_NAMCO, 64, 0, "") - } - ); - ENTRY( - "Namco C15 (8-channel mono)", { - CH(DIV_SYSTEM_NAMCO_15XX, 64, 0, "") - } - ); - ENTRY( - "Namco C30 (8-channel stereo)", { - CH(DIV_SYSTEM_NAMCO_CUS30, 64, 0, "") - } - ); - ENTRY( - "Namco 163", { - CH(DIV_SYSTEM_N163, 64, 0, "") - } - ); - ENTRY( - "Famicom Disk System (chip)", { - CH(DIV_SYSTEM_FDS, 64, 0, "") - } - ); - ENTRY( - "WonderSwan", { - CH(DIV_SYSTEM_SWAN, 64, 0, "") - }, - "tickRate=75.47169811320754716981" - ); - ENTRY( - "Virtual Boy", { - CH(DIV_SYSTEM_VBOY, 64, 0, "") - }, - "tickRate=50.2734877734878" - ); - ENTRY( - "Seta/Allumer X1-010", { - CH(DIV_SYSTEM_X1_010, 64, 0, "") - } - ); - CATEGORY_END; - - CATEGORY_BEGIN("Specialized","chips/systems with unique sound synthesis methods."); - ENTRY( - "MOS Technology SID (6581)", { - CH(DIV_SYSTEM_C64_6581, 64, 0, "clockSel=1") - }, - "tickRate=50.1245421" - ); - ENTRY( - "MOS Technology SID (8580)", { - CH(DIV_SYSTEM_C64_8580, 64, 0, "clockSel=1") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Microchip AY8930", { - CH(DIV_SYSTEM_AY8930, 64, 0, "") - } - ); - ENTRY( - "Game Boy", { - CH(DIV_SYSTEM_GB, 64, 0, "") - } - ); - ENTRY( - "Atari Lynx", { - CH(DIV_SYSTEM_LYNX, 64, 0, "") - } - ); - ENTRY( - "POKEY", { - CH(DIV_SYSTEM_POKEY, 64, 0, "clockSel=1") - }, - "tickRate=50" - ); - ENTRY( - "Atari TIA", { - CH(DIV_SYSTEM_TIA, 64, 0, "") - } - ); - ENTRY( - "NES (Ricoh 2A03)", { - CH(DIV_SYSTEM_NES, 64, 0, "") - } - ); - ENTRY( - "Commander X16 (VERA only)", { - CH(DIV_SYSTEM_VERA, 64, 0, "") - } - ); - ENTRY( - "ZX Spectrum (beeper only)", { - CH(DIV_SYSTEM_SFX_BEEPER, 64, 0, "") - } - ); - if (settings.hiddenSystems) { - ENTRY( - "Dummy System", { - CH(DIV_SYSTEM_DUMMY, 64, 0, "") - } - ); - } - ENTRY( - "tildearrow Sound Unit", { - CH(DIV_SYSTEM_SOUND_UNIT, 64, 0, "") - } - ); - CATEGORY_END; - CATEGORY_BEGIN("Arcade systems","INSERT COIN"); ENTRY( "Pong", { @@ -2564,6 +2096,475 @@ void FurnaceGUI::initSystemPresets() { ); CATEGORY_END; + + CATEGORY_BEGIN("FM","chips which use frequency modulation (FM) to generate sound.\nsome of these also pack more (like square and sample channels)."); + ENTRY( + "Yamaha YM2151 (OPM)", { + CH(DIV_SYSTEM_YM2151, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2203 (OPN)", { + CH(DIV_SYSTEM_YM2203, 64, 0, "clockSel=3") + } + ); + ENTRY( + "Yamaha YM2203 (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 64, 0, "clockSel=3") + } + ); + ENTRY( + "Yamaha YM2608 (OPNA)", { + CH(DIV_SYSTEM_YM2608, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2608 (extended channel 3)", { + CH(DIV_SYSTEM_YM2608_EXT, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2610 (OPNB)", { + CH(DIV_SYSTEM_YM2610_FULL, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2610 (extended channel 2)", { + CH(DIV_SYSTEM_YM2610_FULL_EXT, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2610B (OPNB2)", { + CH(DIV_SYSTEM_YM2610B, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2610B (extended channel 3)", { + CH(DIV_SYSTEM_YM2610B_EXT, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2612 (OPN2)", { + CH(DIV_SYSTEM_YM2612, 64, 0, "ladderEffect=true") + } + ); + ENTRY( + "Yamaha YM2612 (extended channel 3)", { + CH(DIV_SYSTEM_YM2612_EXT, 64, 0, "ladderEffect=true") + } + ); + ENTRY( + "Yamaha YM2612 (OPN2) CSM", { + CH(DIV_SYSTEM_YM2612_CSM, 64, 0, "ladderEffect=true") + } + ); + ENTRY( + "Yamaha YM2612 (OPN2) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM, 64, 0, "ladderEffect=true") + } + ); + ENTRY( + "Yamaha YM2612 (extended channel 3) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 64, 0, "ladderEffect=true") + } + ); + ENTRY( + "Yamaha YM2413 (OPLL)", { + CH(DIV_SYSTEM_OPLL, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2413 (drums mode)", { + CH(DIV_SYSTEM_OPLL_DRUMS, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM2414 (OPZ)", { + CH(DIV_SYSTEM_OPZ, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3438 (OPN2C)", { + CH(DIV_SYSTEM_YM2612, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3438 (extended channel 3)", { + CH(DIV_SYSTEM_YM2612_EXT, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3438 (OPN2C) CSM", { + CH(DIV_SYSTEM_YM2612_CSM, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3438 (OPN2C) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3438 (extended channel 3) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3526 (OPL)", { + CH(DIV_SYSTEM_OPL, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3526 (drums mode)", { + CH(DIV_SYSTEM_OPL_DRUMS, 64, 0, "") + } + ); + ENTRY( + "Yamaha Y8950", { + CH(DIV_SYSTEM_Y8950, 64, 0, "") + } + ); + ENTRY( + "Yamaha Y8950 (drums mode)", { + CH(DIV_SYSTEM_Y8950_DRUMS, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3812 (OPL2)", { + CH(DIV_SYSTEM_OPL2, 64, 0, "") + } + ); + ENTRY( + "Yamaha YM3812 (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 64, 0, "") + } + ); + ENTRY( + "Yamaha YMF262 (OPL3)", { + CH(DIV_SYSTEM_OPL3, 64, 0, "") + } + ); + ENTRY( + "Yamaha YMF262 (drums mode)", { + CH(DIV_SYSTEM_OPL3_DRUMS, 64, 0, "") + } + ); + if (settings.hiddenSystems) { + ENTRY( + "Yamaha YMU759 (MA-2)", { + CH(DIV_SYSTEM_YMU759, 64, 0, "") + } + ); + } + CATEGORY_END; + + CATEGORY_BEGIN("Square","these chips generate square/pulse tones only (but may include noise)."); + ENTRY( + "TI SN76489", { + CH(DIV_SYSTEM_SMS, 64, 0, "chipType=1") + } + ); + ENTRY( + "TI SN76489A", { + CH(DIV_SYSTEM_SMS, 64, 0, "chipType=4") + } + ); + ENTRY( + "TI SN76496", { + CH(DIV_SYSTEM_SMS, 64, 0, "chipType=5") + } + ); + ENTRY( + "NCR 8496", { + CH(DIV_SYSTEM_SMS, 64, 0, "chipType=6") + } + ); + ENTRY( + "Tandy PSSJ 3-voice sound", { + CH(DIV_SYSTEM_SMS, 64, 0, "chipType=7") + // 8 bit DAC + } + ); + ENTRY( + "Sega PSG (SN76489-like)", { + CH(DIV_SYSTEM_SMS, 64, 0, ""), + } + ); + ENTRY( + "Sega PSG (SN76489-like, Stereo)", { + CH(DIV_SYSTEM_SMS, 64, 0, "chipType=3") + } + ); + ENTRY( + "TI SN94624", { + CH(DIV_SYSTEM_SMS, 64, 0, + "clockSel=6\n" + "chipType=8\n" + ) + } + ); + ENTRY( + "TI SN76494", { + CH(DIV_SYSTEM_SMS, 64, 0, + "clockSel=6\n" + "chipType=9\n" + ) + } + ); + ENTRY( + "Toshiba T6W28", { + CH(DIV_SYSTEM_T6W28, 64, 0, "") + } + ); + ENTRY( + "AY-3-8910", { + CH(DIV_SYSTEM_AY8910, 64, 0, "") + } + ); + ENTRY( + "AY-3-8914", { + CH(DIV_SYSTEM_AY8910, 64, 0, "chipType=3") + } + ); + ENTRY( + "Yamaha YM2149(F)", { + CH(DIV_SYSTEM_AY8910, 64, 0, "chipType=1") + } + ); + ENTRY( + "Philips SAA1099", { + CH(DIV_SYSTEM_SAA1099, 64, 0, "") + } + ); + ENTRY( + "PC Speaker", { + CH(DIV_SYSTEM_PCSPKR, 32, 0, "") + } + ); + ENTRY( + "Pokémon Mini", { + CH(DIV_SYSTEM_POKEMINI, 32, 0, "") + } + ); + ENTRY( + "Commodore VIC", { + CH(DIV_SYSTEM_VIC20, 64, 0, "clockSel=1") + } + ); + ENTRY( + "OKI MSM5232", { + CH(DIV_SYSTEM_MSM5232, 64, 0, "") + } + ); + ENTRY( + "Pong", { + CH(DIV_SYSTEM_PONG, 64, 0, "") + } + ); + CATEGORY_END; + + CATEGORY_BEGIN("Sample","chips/systems which use PCM or ADPCM samples for sound synthesis."); + ENTRY( + "Amiga", { + CH(DIV_SYSTEM_AMIGA, 64, 0, "clockSel=1") + }, + "tickRate=50" + ); + ENTRY( + "SegaPCM", { + CH(DIV_SYSTEM_SEGAPCM, 64, 0, "") + } + ); + ENTRY( + "Capcom QSound", { + CH(DIV_SYSTEM_QSOUND, 64, 0, "") + } + ); + ENTRY( + "Seta/Allumer X1-010", { + CH(DIV_SYSTEM_X1_010, 64, 0, "") + } + ); + ENTRY( + "Yamaha YMZ280B (PCMD8)", { + CH(DIV_SYSTEM_YMZ280B, 64, 0, "") + } + ); + ENTRY( + "Ricoh RF5C68", { + CH(DIV_SYSTEM_RF5C68, 64, 0, "") + } + ); + ENTRY( + "OKI MSM6258", { + CH(DIV_SYSTEM_MSM6258, 64, 0, "") + } + ); + ENTRY( + "OKI MSM6295", { + CH(DIV_SYSTEM_MSM6295, 64, 0, "") + } + ); + ENTRY( + "SNES", { + CH(DIV_SYSTEM_SNES, 64, 0, "") + } + ); + ENTRY( + "Konami K007232", { + CH(DIV_SYSTEM_K007232, 64, 0, "") + } + ); + ENTRY( + "Irem GA20", { + CH(DIV_SYSTEM_GA20, 64, 0, "") + } + ); + ENTRY( + "Generic PCM DAC", { + CH(DIV_SYSTEM_PCM_DAC, 64, 0, "") + } + ); + CATEGORY_END; + + CATEGORY_BEGIN("Wavetable","chips which use user-specified waveforms to generate sound."); + ENTRY( + "PC Engine", { + CH(DIV_SYSTEM_PCE, 64, 0, "") + } + ); + ENTRY( + "Commodore PET (pseudo-wavetable)", { + CH(DIV_SYSTEM_PET, 64, 0, "") + }, + "tickRate=50" + ); + ENTRY( + "Konami Bubble System WSG", { + CH(DIV_SYSTEM_BUBSYS_WSG, 64, 0, "") + } + ); + ENTRY( + "Konami SCC", { + CH(DIV_SYSTEM_SCC, 64, 0, "") + } + ); + ENTRY( + "Konami SCC+", { + CH(DIV_SYSTEM_SCC_PLUS, 64, 0, "") + } + ); + ENTRY( + "Namco WSG", { + CH(DIV_SYSTEM_NAMCO, 64, 0, "") + } + ); + ENTRY( + "Namco C15 (8-channel mono)", { + CH(DIV_SYSTEM_NAMCO_15XX, 64, 0, "") + } + ); + ENTRY( + "Namco C30 (8-channel stereo)", { + CH(DIV_SYSTEM_NAMCO_CUS30, 64, 0, "") + } + ); + ENTRY( + "Namco 163", { + CH(DIV_SYSTEM_N163, 64, 0, "") + } + ); + ENTRY( + "Famicom Disk System (chip)", { + CH(DIV_SYSTEM_FDS, 64, 0, "") + } + ); + ENTRY( + "WonderSwan", { + CH(DIV_SYSTEM_SWAN, 64, 0, "") + }, + "tickRate=75.47169811320754716981" + ); + ENTRY( + "Virtual Boy", { + CH(DIV_SYSTEM_VBOY, 64, 0, "") + }, + "tickRate=50.2734877734878" + ); + ENTRY( + "Seta/Allumer X1-010", { + CH(DIV_SYSTEM_X1_010, 64, 0, "") + } + ); + CATEGORY_END; + + CATEGORY_BEGIN("Specialized","chips/systems with unique sound synthesis methods."); + ENTRY( + "MOS Technology SID (6581)", { + CH(DIV_SYSTEM_C64_6581, 64, 0, "clockSel=1") + }, + "tickRate=50.1245421" + ); + ENTRY( + "MOS Technology SID (8580)", { + CH(DIV_SYSTEM_C64_8580, 64, 0, "clockSel=1") + }, + "tickRate=50.1245421" + ); + ENTRY( + "Microchip AY8930", { + CH(DIV_SYSTEM_AY8930, 64, 0, "") + } + ); + ENTRY( + "Game Boy", { + CH(DIV_SYSTEM_GB, 64, 0, "") + } + ); + ENTRY( + "Atari Lynx", { + CH(DIV_SYSTEM_LYNX, 64, 0, "") + } + ); + ENTRY( + "POKEY", { + CH(DIV_SYSTEM_POKEY, 64, 0, "clockSel=1") + }, + "tickRate=50" + ); + ENTRY( + "Atari TIA", { + CH(DIV_SYSTEM_TIA, 64, 0, "") + } + ); + ENTRY( + "NES (Ricoh 2A03)", { + CH(DIV_SYSTEM_NES, 64, 0, "") + } + ); + ENTRY( + "Commander X16 (VERA only)", { + CH(DIV_SYSTEM_VERA, 64, 0, "") + } + ); + ENTRY( + "ZX Spectrum (beeper only)", { + CH(DIV_SYSTEM_SFX_BEEPER, 64, 0, "") + } + ); + if (settings.hiddenSystems) { + ENTRY( + "Dummy System", { + CH(DIV_SYSTEM_DUMMY, 64, 0, "") + } + ); + } + ENTRY( + "tildearrow Sound Unit", { + CH(DIV_SYSTEM_SOUND_UNIT, 64, 0, "") + } + ); + CATEGORY_END; + CATEGORY_BEGIN("DefleMask-compatible","these configurations are compatible with DefleMask.\nselect this if you need to save as .dmf or work with that program."); ENTRY( "Sega Genesis", { diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 9ebe7ec0..8e41fa00 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -31,10 +31,12 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo case DIV_SYSTEM_YM2612: case DIV_SYSTEM_YM2612_EXT: case DIV_SYSTEM_YM2612_DUALPCM: - case DIV_SYSTEM_YM2612_DUALPCM_EXT: { + case DIV_SYSTEM_YM2612_DUALPCM_EXT: + case DIV_SYSTEM_YM2612_CSM: { int clockSel=flags.getInt("clockSel",0); bool ladder=flags.getBool("ladderEffect",0); bool noExtMacros=flags.getBool("noExtMacros",false); + bool fbAllOps=flags.getBool("fbAllOps",false); if (ImGui::RadioButton("NTSC (7.67MHz)",clockSel==0)) { clockSel=0; @@ -59,10 +61,13 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo if (ImGui::Checkbox("Enable DAC distortion",&ladder)) { altered=true; } - if (type==DIV_SYSTEM_YM2612_EXT || type==DIV_SYSTEM_YM2612_DUALPCM_EXT) { + 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; } + if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) { + altered=true; + } } if (altered) { @@ -70,6 +75,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo flags.set("clockSel",clockSel); flags.set("ladderEffect",ladder); flags.set("noExtMacros",noExtMacros); + flags.set("fbAllOps",fbAllOps); }); } break; @@ -457,12 +463,15 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo } case DIV_SYSTEM_YM2610: case DIV_SYSTEM_YM2610_EXT: + case DIV_SYSTEM_YM2610_CSM: case DIV_SYSTEM_YM2610_FULL: case DIV_SYSTEM_YM2610_FULL_EXT: case DIV_SYSTEM_YM2610B: - case DIV_SYSTEM_YM2610B_EXT: { + case DIV_SYSTEM_YM2610B_EXT: + case DIV_SYSTEM_YM2610B_CSM: { int clockSel=flags.getInt("clockSel",0); bool noExtMacros=flags.getBool("noExtMacros",false); + bool fbAllOps=flags.getBool("fbAllOps",false); if (ImGui::RadioButton("8MHz (Neo Geo MVS)",clockSel==0)) { clockSel=0; @@ -473,16 +482,20 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo altered=true; } - if (type==DIV_SYSTEM_YM2610_EXT || type==DIV_SYSTEM_YM2610_FULL_EXT || type==DIV_SYSTEM_YM2610B_EXT) { + if (type==DIV_SYSTEM_YM2610_EXT || type==DIV_SYSTEM_YM2610_FULL_EXT || type==DIV_SYSTEM_YM2610B_EXT || type==DIV_SYSTEM_YM2610_CSM || type==DIV_SYSTEM_YM2610B_CSM) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) { altered=true; } + if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) { + altered=true; + } } if (altered) { e->lockSave([&]() { flags.set("clockSel",clockSel); flags.set("noExtMacros",noExtMacros); + flags.set("fbAllOps",fbAllOps); }); } break; @@ -835,10 +848,12 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo break; } case DIV_SYSTEM_YM2203: - case DIV_SYSTEM_YM2203_EXT: { + case DIV_SYSTEM_YM2203_EXT: + case DIV_SYSTEM_YM2203_CSM: { int clockSel=flags.getInt("clockSel",0); int prescale=flags.getInt("prescale",0); bool noExtMacros=flags.getBool("noExtMacros",false); + bool fbAllOps=flags.getBool("fbAllOps",false); ImGui::Text("Clock rate:"); if (ImGui::RadioButton("3.58MHz (NTSC)",clockSel==0)) { @@ -879,10 +894,13 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo altered=true; } - if (type==DIV_SYSTEM_YM2203_EXT) { + if (type==DIV_SYSTEM_YM2203_EXT || type==DIV_SYSTEM_YM2203_CSM) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) { altered=true; } + if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) { + altered=true; + } } if (altered) { @@ -890,15 +908,18 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo flags.set("clockSel",clockSel); flags.set("prescale",prescale); flags.set("noExtMacros",noExtMacros); + flags.set("fbAllOps",fbAllOps); }); } break; } case DIV_SYSTEM_YM2608: - case DIV_SYSTEM_YM2608_EXT: { + case DIV_SYSTEM_YM2608_EXT: + case DIV_SYSTEM_YM2608_CSM: { int clockSel=flags.getInt("clockSel",0); int prescale=flags.getInt("prescale",0); bool noExtMacros=flags.getBool("noExtMacros",false); + bool fbAllOps=flags.getBool("fbAllOps",false); ImGui::Text("Clock rate:"); if (ImGui::RadioButton("8MHz (Arcade)",clockSel==0)) { @@ -923,10 +944,13 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo altered=true; } - if (type==DIV_SYSTEM_YM2608_EXT) { + if (type==DIV_SYSTEM_YM2608_EXT || type==DIV_SYSTEM_YM2608_CSM) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) { altered=true; } + if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) { + altered=true; + } } if (altered) { @@ -934,6 +958,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo flags.set("clockSel",clockSel); flags.set("prescale",prescale); flags.set("noExtMacros",noExtMacros); + flags.set("fbAllOps",fbAllOps); }); } break;