prepare for 0.6pre3

OPN: add flag to make ExtCh op 1 be the only one controlling FB
GUI: move Arcade presets to top
GUI: fix YM2612 CSM not having flags
This commit is contained in:
tildearrow 2022-12-28 18:11:30 -05:00
parent 72ff7ad11a
commit a09ad00e48
17 changed files with 549 additions and 499 deletions

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.tildearrow.furnace" package="org.tildearrow.furnace"
android:versionCode="132" android:versionCode="133"
android:versionName="0.6pre2" android:versionName="0.6pre3"
android:installLocation="auto"> android:installLocation="auto">
<!-- OpenGL ES 2.0 --> <!-- OpenGL ES 2.0 -->

View file

@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1).
the format versions are: the format versions are:
- 133: Furnace 0.6pre3
- 132: Furnace 0.6pre2 - 132: Furnace 0.6pre2
- 131: Furnace dev131 - 131: Furnace dev131
- 130: Furnace dev130 - 130: Furnace dev130

View file

@ -15,17 +15,17 @@
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleLongVersionString</key> <key>CFBundleLongVersionString</key>
<string>0.6pre2</string> <string>0.6pre3</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Furnace</string> <string>Furnace</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>0.6pre2</string> <string>0.6pre3</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>0.6pre2</string> <string>0.6pre3</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string></string> <string></string>
<key>NSHighResolutionCapable</key> <key>NSHighResolutionCapable</key>

View file

@ -47,8 +47,8 @@
#define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock();
#define BUSY_END isBusy.unlock(); softLocked=false; #define BUSY_END isBusy.unlock(); softLocked=false;
#define DIV_VERSION "0.6pre2" #define DIV_VERSION "0.6pre3"
#define DIV_ENGINE_VERSION 132 #define DIV_ENGINE_VERSION 133
// for imports // for imports
#define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_MOD 0xff01
#define DIV_VERSION_FC 0xff02 #define DIV_VERSION_FC 0xff02

View file

@ -2511,17 +2511,25 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) {
} }
// ExtCh compat flag // ExtCh compat flag
if (ds.version<125) { for (int i=0; i<ds.systemLen; i++) {
for (int i=0; i<ds.systemLen; i++) { if (ds.system[i]==DIV_SYSTEM_YM2612_EXT ||
if (ds.system[i]==DIV_SYSTEM_YM2612_EXT || ds.system[i]==DIV_SYSTEM_YM2612_DUALPCM_EXT ||
ds.system[i]==DIV_SYSTEM_YM2612_DUALPCM_EXT || ds.system[i]==DIV_SYSTEM_YM2610_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610_EXT || ds.system[i]==DIV_SYSTEM_YM2610_FULL_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610_FULL_EXT || ds.system[i]==DIV_SYSTEM_YM2610B_EXT ||
ds.system[i]==DIV_SYSTEM_YM2610B_EXT || ds.system[i]==DIV_SYSTEM_YM2203_EXT ||
ds.system[i]==DIV_SYSTEM_YM2203_EXT || ds.system[i]==DIV_SYSTEM_YM2608_EXT ||
ds.system[i]==DIV_SYSTEM_YM2608_EXT) { ds.system[i]==DIV_SYSTEM_YM2612_CSM ||
ds.system[i]==DIV_SYSTEM_YM2203_CSM ||
ds.system[i]==DIV_SYSTEM_YM2608_CSM ||
ds.system[i]==DIV_SYSTEM_YM2610_CSM ||
ds.system[i]==DIV_SYSTEM_YM2610B_CSM) {
if (ds.version<125) {
ds.systemFlags[i].set("noExtMacros",true); ds.systemFlags[i].set("noExtMacros",true);
} }
if (ds.version<133) {
ds.systemFlags[i].set("fbAllOps",true);
}
} }
} }

View file

@ -154,7 +154,7 @@ class DivPlatformOPN: public DivPlatformFMBase {
unsigned int ayDiv; unsigned int ayDiv;
unsigned char csmChan; unsigned char csmChan;
unsigned char lfoValue; unsigned char lfoValue;
bool extSys, useCombo; bool extSys, useCombo, fbAllOps;
DivConfig ayFlags; DivConfig ayFlags;
@ -173,7 +173,8 @@ class DivPlatformOPN: public DivPlatformFMBase {
csmChan(cc), csmChan(cc),
lfoValue(0), lfoValue(0),
extSys(isExtSys), extSys(isExtSys),
useCombo(false) {} useCombo(false),
fbAllOps(false) {}
public: public:
void setCombo(bool combo) { void setCombo(bool combo) {
useCombo=combo; useCombo=combo;

View file

@ -1250,6 +1250,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) {
} }
ladder=flags.getBool("ladderEffect",false); ladder=flags.getBool("ladderEffect",false);
noExtMacros=flags.getBool("noExtMacros",false); noExtMacros=flags.getBool("noExtMacros",false);
fbAllOps=flags.getBool("fbAllOps",false);
OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0); OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0);
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
if (useYMFM) { if (useYMFM) {

View file

@ -46,7 +46,9 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) {
if (opChan[ch].insChanged) { if (opChan[ch].insChanged) {
chan[2].state.alg=ins->fm.alg; 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.fms=ins->fm.fms;
chan[2].state.ams=ins->fm.ams; chan[2].state.ams=ins->fm.ams;
chan[2].state.op[ordch]=ins->fm.op[ordch]; chan[2].state.op[ordch]=ins->fm.op[ordch];

View file

@ -1041,6 +1041,7 @@ void DivPlatformYM2203::setFlags(const DivConfig& flags) {
} }
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
noExtMacros=flags.getBool("noExtMacros",false); noExtMacros=flags.getBool("noExtMacros",false);
fbAllOps=flags.getBool("fbAllOps",false);
rate=fm->sample_rate(chipClock); rate=fm->sample_rate(chipClock);
for (int i=0; i<6; i++) { for (int i=0; i<6; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->rate=rate;

View file

@ -44,7 +44,9 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) {
if (opChan[ch].insChanged) { if (opChan[ch].insChanged) {
chan[2].state.alg=ins->fm.alg; 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]; chan[2].state.op[ordch]=ins->fm.op[ordch];
} }

View file

@ -1538,6 +1538,7 @@ void DivPlatformYM2608::setFlags(const DivConfig& flags) {
} }
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
noExtMacros=flags.getBool("noExtMacros",false); noExtMacros=flags.getBool("noExtMacros",false);
fbAllOps=flags.getBool("fbAllOps",false);
rate=fm->sample_rate(chipClock); rate=fm->sample_rate(chipClock);
for (int i=0; i<16; i++) { for (int i=0; i<16; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->rate=rate;

View file

@ -44,7 +44,9 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) {
if (opChan[ch].insChanged) { if (opChan[ch].insChanged) {
chan[2].state.alg=ins->fm.alg; 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.fms=ins->fm.fms;
chan[2].state.ams=ins->fm.ams; chan[2].state.ams=ins->fm.ams;
chan[2].state.op[ordch]=ins->fm.op[ordch]; chan[2].state.op[ordch]=ins->fm.op[ordch];

View file

@ -40,7 +40,9 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) {
if (opChan[ch].insChanged) { if (opChan[ch].insChanged) {
chan[extChanOffs].state.alg=ins->fm.alg; 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.fms=ins->fm.fms;
chan[extChanOffs].state.ams=ins->fm.ams; chan[extChanOffs].state.ams=ins->fm.ams;
chan[extChanOffs].state.op[ordch]=ins->fm.op[ordch]; chan[extChanOffs].state.op[ordch]=ins->fm.op[ordch];

View file

@ -40,7 +40,9 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) {
if (opChan[ch].insChanged) { if (opChan[ch].insChanged) {
chan[extChanOffs].state.alg=ins->fm.alg; 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.fms=ins->fm.fms;
chan[extChanOffs].state.ams=ins->fm.ams; chan[extChanOffs].state.ams=ins->fm.ams;
chan[extChanOffs].state.op[ordch]=ins->fm.op[ordch]; chan[extChanOffs].state.op[ordch]=ins->fm.op[ordch];

View file

@ -221,6 +221,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN {
} }
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
noExtMacros=flags.getBool("noExtMacros",false); noExtMacros=flags.getBool("noExtMacros",false);
fbAllOps=flags.getBool("fbAllOps",false);
rate=fm->sample_rate(chipClock); rate=fm->sample_rate(chipClock);
for (int i=0; i<16; i++) { for (int i=0; i<16; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->rate=rate;

View file

@ -1114,474 +1114,6 @@ void FurnaceGUI::initSystemPresets() {
); );
CATEGORY_END; 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"); CATEGORY_BEGIN("Arcade systems","INSERT COIN");
ENTRY( ENTRY(
"Pong", { "Pong", {
@ -2564,6 +2096,475 @@ void FurnaceGUI::initSystemPresets() {
); );
CATEGORY_END; 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."); 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( ENTRY(
"Sega Genesis", { "Sega Genesis", {

View file

@ -31,10 +31,12 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
case DIV_SYSTEM_YM2612: case DIV_SYSTEM_YM2612:
case DIV_SYSTEM_YM2612_EXT: case DIV_SYSTEM_YM2612_EXT:
case DIV_SYSTEM_YM2612_DUALPCM: 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); int clockSel=flags.getInt("clockSel",0);
bool ladder=flags.getBool("ladderEffect",0); bool ladder=flags.getBool("ladderEffect",0);
bool noExtMacros=flags.getBool("noExtMacros",false); bool noExtMacros=flags.getBool("noExtMacros",false);
bool fbAllOps=flags.getBool("fbAllOps",false);
if (ImGui::RadioButton("NTSC (7.67MHz)",clockSel==0)) { if (ImGui::RadioButton("NTSC (7.67MHz)",clockSel==0)) {
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)) { if (ImGui::Checkbox("Enable DAC distortion",&ladder)) {
altered=true; 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)) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) {
altered=true; altered=true;
} }
if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) {
altered=true;
}
} }
if (altered) { if (altered) {
@ -70,6 +75,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
flags.set("clockSel",clockSel); flags.set("clockSel",clockSel);
flags.set("ladderEffect",ladder); flags.set("ladderEffect",ladder);
flags.set("noExtMacros",noExtMacros); flags.set("noExtMacros",noExtMacros);
flags.set("fbAllOps",fbAllOps);
}); });
} }
break; break;
@ -457,12 +463,15 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
} }
case DIV_SYSTEM_YM2610: case DIV_SYSTEM_YM2610:
case DIV_SYSTEM_YM2610_EXT: case DIV_SYSTEM_YM2610_EXT:
case DIV_SYSTEM_YM2610_CSM:
case DIV_SYSTEM_YM2610_FULL: case DIV_SYSTEM_YM2610_FULL:
case DIV_SYSTEM_YM2610_FULL_EXT: case DIV_SYSTEM_YM2610_FULL_EXT:
case DIV_SYSTEM_YM2610B: 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); int clockSel=flags.getInt("clockSel",0);
bool noExtMacros=flags.getBool("noExtMacros",false); bool noExtMacros=flags.getBool("noExtMacros",false);
bool fbAllOps=flags.getBool("fbAllOps",false);
if (ImGui::RadioButton("8MHz (Neo Geo MVS)",clockSel==0)) { if (ImGui::RadioButton("8MHz (Neo Geo MVS)",clockSel==0)) {
clockSel=0; clockSel=0;
@ -473,16 +482,20 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
altered=true; 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)) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) {
altered=true; altered=true;
} }
if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) {
altered=true;
}
} }
if (altered) { if (altered) {
e->lockSave([&]() { e->lockSave([&]() {
flags.set("clockSel",clockSel); flags.set("clockSel",clockSel);
flags.set("noExtMacros",noExtMacros); flags.set("noExtMacros",noExtMacros);
flags.set("fbAllOps",fbAllOps);
}); });
} }
break; break;
@ -835,10 +848,12 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
break; break;
} }
case DIV_SYSTEM_YM2203: 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 clockSel=flags.getInt("clockSel",0);
int prescale=flags.getInt("prescale",0); int prescale=flags.getInt("prescale",0);
bool noExtMacros=flags.getBool("noExtMacros",false); bool noExtMacros=flags.getBool("noExtMacros",false);
bool fbAllOps=flags.getBool("fbAllOps",false);
ImGui::Text("Clock rate:"); ImGui::Text("Clock rate:");
if (ImGui::RadioButton("3.58MHz (NTSC)",clockSel==0)) { 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; 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)) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) {
altered=true; altered=true;
} }
if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) {
altered=true;
}
} }
if (altered) { if (altered) {
@ -890,15 +908,18 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
flags.set("clockSel",clockSel); flags.set("clockSel",clockSel);
flags.set("prescale",prescale); flags.set("prescale",prescale);
flags.set("noExtMacros",noExtMacros); flags.set("noExtMacros",noExtMacros);
flags.set("fbAllOps",fbAllOps);
}); });
} }
break; break;
} }
case DIV_SYSTEM_YM2608: 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 clockSel=flags.getInt("clockSel",0);
int prescale=flags.getInt("prescale",0); int prescale=flags.getInt("prescale",0);
bool noExtMacros=flags.getBool("noExtMacros",false); bool noExtMacros=flags.getBool("noExtMacros",false);
bool fbAllOps=flags.getBool("fbAllOps",false);
ImGui::Text("Clock rate:"); ImGui::Text("Clock rate:");
if (ImGui::RadioButton("8MHz (Arcade)",clockSel==0)) { if (ImGui::RadioButton("8MHz (Arcade)",clockSel==0)) {
@ -923,10 +944,13 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
altered=true; 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)) { if (ImGui::Checkbox("Disable ExtCh FM macros (compatibility)",&noExtMacros)) {
altered=true; altered=true;
} }
if (ImGui::Checkbox("Ins change in ExtCh operator 2-4 affects FB (compatibility)",&fbAllOps)) {
altered=true;
}
} }
if (altered) { if (altered) {
@ -934,6 +958,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo
flags.set("clockSel",clockSel); flags.set("clockSel",clockSel);
flags.set("prescale",prescale); flags.set("prescale",prescale);
flags.set("noExtMacros",noExtMacros); flags.set("noExtMacros",noExtMacros);
flags.set("fbAllOps",fbAllOps);
}); });
} }
break; break;