From 1b3723c895099430ed6138a6664f82df478f2259 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 14:49:52 -0500 Subject: [PATCH 01/17] GUI: how about this --- src/gui/gui.h | 2 ++ src/gui/newSong.cpp | 84 +++++++++++++++++++++++++-------------------- 2 files changed, 49 insertions(+), 37 deletions(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index d54635fa3..17f12671e 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2549,6 +2549,8 @@ class FurnaceGUI { void waveListItem(int index, float* wavePreview, int dir, int asset); void sampleListItem(int index, int dir, int asset); + void drawSysDefs(std::vector& category, bool& accepted); + void toggleMobileUI(bool enable, bool force=false); void pushToggleColors(bool status); diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index a22f5d444..e2eeecb90 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -22,6 +22,52 @@ #include #include +void FurnaceGUI::drawSysDefs(std::vector& category, bool& accepted) { + for (FurnaceGUISysDef& i: category) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + if (!i.subDefs.empty()) { + if (ImGui::TreeNode("##TreeShit")) { + drawSysDefs(i.subDefs,accepted); + ImGui::TreePop(); + } + ImGui::SameLine(); + } + if (ImGui::Selectable(i.name,false,ImGuiSelectableFlags_DontClosePopups)) { + nextDesc=i.definition; + nextDescName=i.name; + accepted=true; + } + if (ImGui::IsItemHovered()) { + if (ImGui::BeginTooltip()) { + std::map chipCounts; + std::vector chips; + for (FurnaceGUISysDefChip chip: i.orig) { + if (chipCounts.find(chip.sys)==chipCounts.end()) { + chipCounts[chip.sys]=1; + chips.push_back(chip.sys); + } else { + chipCounts[chip.sys]+=1; + } + } + for (size_t chipIndex=0; chipIndexgetSystemDef(chip); + ImGui::PushTextWrapPos(MIN(scrW*dpiScale,400.0f*dpiScale)); + ImGui::Text("%s (x%d): ",sysDef->name,chipCounts[chip]); + ImGui::Text("%s",sysDef->description); + ImGui::PopTextWrapPos(); + if (chipIndex+1& category=(newSongQuery.empty())?(sysCategories[newSongCategory].systems):(newSongSearchResults); - for (FurnaceGUISysDef& i: category) { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - if (ImGui::Selectable(i.name,false,ImGuiSelectableFlags_DontClosePopups)) { - nextDesc=i.definition; - nextDescName=i.name; - accepted=true; - } - if (ImGui::IsItemHovered()) { - if (ImGui::BeginTooltip()) { - std::map chipCounts; - std::vector chips; - for (FurnaceGUISysDefChip chip: i.orig) { - if (chipCounts.find(chip.sys)==chipCounts.end()) { - chipCounts[chip.sys]=1; - chips.push_back(chip.sys); - } else { - chipCounts[chip.sys]+=1; - } - } - for (size_t chipIndex=0; chipIndexgetSystemDef(chip); - ImGui::PushTextWrapPos(MIN(scrW*dpiScale,400.0f*dpiScale)); - ImGui::Text("%s (x%d): ",sysDef->name,chipCounts[chip]); - ImGui::Text("%s",sysDef->description); - ImGui::PopTextWrapPos(); - if (chipIndex+1 Date: Wed, 20 Mar 2024 14:59:49 -0500 Subject: [PATCH 02/17] GUI: fix --- src/gui/newSong.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index e2eeecb90..4e19c8011 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -24,13 +24,11 @@ void FurnaceGUI::drawSysDefs(std::vector& category, bool& accepted) { for (FurnaceGUISysDef& i: category) { + bool treeNode=false; ImGui::TableNextRow(); ImGui::TableNextColumn(); if (!i.subDefs.empty()) { - if (ImGui::TreeNode("##TreeShit")) { - drawSysDefs(i.subDefs,accepted); - ImGui::TreePop(); - } + treeNode=ImGui::TreeNode("##TreeShit"); ImGui::SameLine(); } if (ImGui::Selectable(i.name,false,ImGuiSelectableFlags_DontClosePopups)) { @@ -38,6 +36,10 @@ void FurnaceGUI::drawSysDefs(std::vector& category, bool& acce nextDescName=i.name; accepted=true; } + if (treeNode) { + drawSysDefs(i.subDefs,accepted); + ImGui::TreePop(); + } if (ImGui::IsItemHovered()) { if (ImGui::BeginTooltip()) { std::map chipCounts; From d8d3d99b83de7286d6d6bc4a84c0bf67a31bca15 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 15:06:56 -0500 Subject: [PATCH 03/17] GUI: yet another fix --- src/gui/newSong.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index 4e19c8011..341667bf6 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -25,10 +25,12 @@ void FurnaceGUI::drawSysDefs(std::vector& category, bool& accepted) { for (FurnaceGUISysDef& i: category) { bool treeNode=false; + bool isHovered=false; ImGui::TableNextRow(); ImGui::TableNextColumn(); if (!i.subDefs.empty()) { treeNode=ImGui::TreeNode("##TreeShit"); + if (ImGui::IsItemHovered()) isHovered=true; ImGui::SameLine(); } if (ImGui::Selectable(i.name,false,ImGuiSelectableFlags_DontClosePopups)) { @@ -36,11 +38,12 @@ void FurnaceGUI::drawSysDefs(std::vector& category, bool& acce nextDescName=i.name; accepted=true; } + if (ImGui::IsItemHovered()) isHovered=true; if (treeNode) { drawSysDefs(i.subDefs,accepted); ImGui::TreePop(); } - if (ImGui::IsItemHovered()) { + if (isHovered) { if (ImGui::BeginTooltip()) { std::map chipCounts; std::vector chips; From 02bddfb89451d0f0ac26f280e34350daa626507e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 15:10:31 -0500 Subject: [PATCH 04/17] GUI: hovering over the triangle --- src/gui/newSong.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index 341667bf6..3f89f86ed 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -30,7 +30,6 @@ void FurnaceGUI::drawSysDefs(std::vector& category, bool& acce ImGui::TableNextColumn(); if (!i.subDefs.empty()) { treeNode=ImGui::TreeNode("##TreeShit"); - if (ImGui::IsItemHovered()) isHovered=true; ImGui::SameLine(); } if (ImGui::Selectable(i.name,false,ImGuiSelectableFlags_DontClosePopups)) { From db45b0d7d710aba0b8090ced7b3b533810ea1c64 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 16:43:40 -0500 Subject: [PATCH 05/17] GUI: better presets organization to-do: - fix system detection - fix search --- src/gui/gui.h | 2 +- src/gui/newSong.cpp | 42 +- src/gui/pattern.cpp | 5 +- src/gui/presets.cpp | 4371 ++++++++++++++++++++++--------------------- 4 files changed, 2265 insertions(+), 2155 deletions(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index 17f12671e..a7149bc00 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2549,7 +2549,7 @@ class FurnaceGUI { void waveListItem(int index, float* wavePreview, int dir, int asset); void sampleListItem(int index, int dir, int asset); - void drawSysDefs(std::vector& category, bool& accepted); + void drawSysDefs(std::vector& category, bool& accepted, std::vector& sysDefStack); void toggleMobileUI(bool enable, bool force=false); diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index 3f89f86ed..304062d75 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -22,24 +22,44 @@ #include #include -void FurnaceGUI::drawSysDefs(std::vector& category, bool& accepted) { +String sysDefID; + +void FurnaceGUI::drawSysDefs(std::vector& category, bool& accepted, std::vector& sysDefStack) { + int index=0; + String sysDefIDLeader="##NS"; + for (int i: sysDefStack) { + sysDefIDLeader+=fmt::sprintf("/%d",i); + } for (FurnaceGUISysDef& i: category) { bool treeNode=false; bool isHovered=false; ImGui::TableNextRow(); ImGui::TableNextColumn(); if (!i.subDefs.empty()) { - treeNode=ImGui::TreeNode("##TreeShit"); + if (i.orig.empty()) { + sysDefID=fmt::sprintf("%s%s/%dS",i.name,sysDefIDLeader,index); + } else { + sysDefID=fmt::sprintf("%s/%dS",sysDefIDLeader,index); + } + treeNode=ImGui::TreeNode(sysDefID.c_str()); ImGui::SameLine(); } - if (ImGui::Selectable(i.name,false,ImGuiSelectableFlags_DontClosePopups)) { - nextDesc=i.definition; - nextDescName=i.name; - accepted=true; + if (!i.orig.empty()) { + sysDefID=fmt::sprintf("%s%s/%d",i.name,sysDefIDLeader,index); + if (ImGui::Selectable(sysDefID.c_str(),false,ImGuiSelectableFlags_DontClosePopups)) { + nextDesc=i.definition; + nextDescName=i.name; + accepted=true; + } + if (ImGui::IsItemHovered()) isHovered=true; + } else if (i.subDefs.empty()) { + ImGui::TextUnformatted(i.name); + if (ImGui::IsItemHovered()) isHovered=true; } - if (ImGui::IsItemHovered()) isHovered=true; if (treeNode) { - drawSysDefs(i.subDefs,accepted); + sysDefStack.push_back(index); + drawSysDefs(i.subDefs,accepted,sysDefStack); + sysDefStack.erase(sysDefStack.end()-1); ImGui::TreePop(); } if (isHovered) { @@ -69,11 +89,13 @@ void FurnaceGUI::drawSysDefs(std::vector& category, bool& acce ImGui::EndTooltip(); } } + index++; } } void FurnaceGUI::drawNewSong() { bool accepted=false; + std::vector sysDefStack; ImGui::PushFont(bigFont); ImGui::SetCursorPosX((ImGui::GetContentRegionAvail().x-ImGui::CalcTextSize("Choose a System!").x)*0.5); @@ -155,7 +177,9 @@ void FurnaceGUI::drawNewSong() { ImGui::TableNextColumn(); if (ImGui::BeginTable("Systems",1,ImGuiTableFlags_BordersInnerV|ImGuiTableFlags_ScrollY)) { std::vector& category=(newSongQuery.empty())?(sysCategories[newSongCategory].systems):(newSongSearchResults); - drawSysDefs(category,accepted); + sysDefStack.push_back(newSongQuery.empty()?newSongCategory:-1); + drawSysDefs(category,accepted,sysDefStack); + sysDefStack.erase(sysDefStack.end()-1); ImGui::EndTable(); } diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 762d8ceca..8c73b0645 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -469,7 +469,10 @@ void FurnaceGUI::drawPattern() { nextAddScroll=0.0f; } ImDrawList* tdl=NULL; - if (ImGui::BeginTable("PatternView",displayChans+2,ImGuiTableFlags_BordersInnerV|ImGuiTableFlags_ScrollX|ImGuiTableFlags_ScrollY|ImGuiTableFlags_NoPadInnerX|ImGuiTableFlags_NoBordersInFrozenArea|((settings.cursorFollowsWheel || wheelCalmDown)?ImGuiTableFlags_NoScrollWithMouse:0))) { + + if (chans<1) { + ImGui::Text("there aren't any channels to show."); + } else if (ImGui::BeginTable("PatternView",displayChans+2,ImGuiTableFlags_BordersInnerV|ImGuiTableFlags_ScrollX|ImGuiTableFlags_ScrollY|ImGuiTableFlags_NoPadInnerX|ImGuiTableFlags_NoBordersInFrozenArea|((settings.cursorFollowsWheel || wheelCalmDown)?ImGuiTableFlags_NoScrollWithMouse:0))) { ImGui::TableSetupColumn("pos",ImGuiTableColumnFlags_WidthFixed); char chanID[2048]; float lineHeight=(ImGui::GetTextLineHeight()+2*dpiScale); diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index 64fe7c186..c93781e86 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -40,6 +40,8 @@ cat.systems.push_back(FurnaceGUISysDef(__VA_ARGS__)); #define SUB_ENTRY(...) \ cat.systems[cat.systems.size()-1].subDefs.push_back(FurnaceGUISysDef(__VA_ARGS__)); +#define SUB_SUB_ENTRY(...) \ + cat.systems[cat.systems.size()-1].subDefs[cat.systems[cat.systems.size()-1].subDefs.size()-1].subDefs.push_back(FurnaceGUISysDef(__VA_ARGS__)); void FurnaceGUI::initSystemPresets() { sysCategories.clear(); @@ -112,18 +114,18 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_SMS, 1.0f, 0, "") } ); - ENTRY( - "Sega Master System (with FM expansion)", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_OPLL, 1.0f, 0, "") - } - ); - ENTRY( - "Sega Master System (with FM expansion in drums mode)", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Sega Master System (with FM expansion)", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_OPLL, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Sega Master System (with FM expansion in drums mode)", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "") + } + ); ENTRY( "Sega Game Gear", { CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=3") @@ -169,42 +171,42 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_NES, 1.0f, 0, "") } ); - ENTRY( - "Famicom with Konami VRC6", { - CH(DIV_SYSTEM_NES, 1.0f, 0, ""), - CH(DIV_SYSTEM_VRC6, 1.0f, 0, "") - } - ); - ENTRY( - "Famicom with Konami VRC7", { - CH(DIV_SYSTEM_NES, 1.0f, 0, ""), - CH(DIV_SYSTEM_VRC7, 1.0f, 0, "") - } - ); - ENTRY( - "Famicom with MMC5", { - CH(DIV_SYSTEM_NES, 1.0f, 0, ""), - CH(DIV_SYSTEM_MMC5, 1.0f, 0, "") - } - ); - ENTRY( - "Famicom with Sunsoft 5B", { - CH(DIV_SYSTEM_NES, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=2") - } - ); - ENTRY( - "Famicom with Namco 163", { - CH(DIV_SYSTEM_NES, 1.0f, 0, ""), - CH(DIV_SYSTEM_N163, 1.0f, 0, "channels=7") - } - ); - ENTRY( - "Famicom Disk System", { - CH(DIV_SYSTEM_NES, 1.0f, 0, ""), - CH(DIV_SYSTEM_FDS, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Famicom with Konami VRC6", { + CH(DIV_SYSTEM_NES, 1.0f, 0, ""), + CH(DIV_SYSTEM_VRC6, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Famicom with Konami VRC7", { + CH(DIV_SYSTEM_NES, 1.0f, 0, ""), + CH(DIV_SYSTEM_VRC7, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Famicom with MMC5", { + CH(DIV_SYSTEM_NES, 1.0f, 0, ""), + CH(DIV_SYSTEM_MMC5, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Famicom with Sunsoft 5B", { + CH(DIV_SYSTEM_NES, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=2") + } + ); + SUB_ENTRY( + "Famicom with Namco 163", { + CH(DIV_SYSTEM_NES, 1.0f, 0, ""), + CH(DIV_SYSTEM_N163, 1.0f, 0, "channels=7") + } + ); + SUB_ENTRY( + "Famicom Disk System", { + CH(DIV_SYSTEM_NES, 1.0f, 0, ""), + CH(DIV_SYSTEM_FDS, 1.0f, 0, "") + } + ); ENTRY( "SNES", { CH(DIV_SYSTEM_SNES, 1.0f, 0, "") @@ -225,11 +227,11 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_YM2610_FULL, 1.0f, 0, "clockSel=1") } ); - ENTRY( - "Neo Geo AES (extended channel 2)", { - CH(DIV_SYSTEM_YM2610_FULL_EXT, 1.0f, 0, "clockSel=1") - } - ); + SUB_ENTRY( + "Neo Geo AES (extended channel 2)", { + CH(DIV_SYSTEM_YM2610_FULL_EXT, 1.0f, 0, "clockSel=1") + } + ); ENTRY( "Atari 2600/7800", { CH(DIV_SYSTEM_TIA, 1.0f, 0, "") @@ -283,7 +285,7 @@ void FurnaceGUI::initSystemPresets() { } ); ENTRY( - "NDS", { + "Nintendo DS", { CH(DIV_SYSTEM_NDS, 1.0f, 0, "") } ); @@ -308,73 +310,76 @@ void FurnaceGUI::initSystemPresets() { } ); ENTRY( - "Commodore 64 (6581 SID)", { - CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (8580 SID)", { - CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (6581 SID + Sound Expander)", { - CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_OPL, 1.0f, 0, "") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (6581 SID + Sound Expander in drums mode)", { - CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (8580 SID + Sound Expander)", { - CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_OPL, 1.0f, 0, "") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (8580 SID + Sound Expander in drums mode)", { - CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (6581 SID + FM-YAM)", { - CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (6581 SID + FM-YAM in drums mode)", { - CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (8580 SID + FM-YAM)", { - CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "") - }, - "tickRate=50.1245421" - ); - ENTRY( - "Commodore 64 (8580 SID + FM-YAM in drums mode)", { - CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "") - }, - "tickRate=50.1245421" + "Commodore 64 (SID)", {} ); + SUB_ENTRY( + "Commodore 64 (6581 SID)", { + CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1") + }, + "tickRate=50.1245421" + ); + SUB_SUB_ENTRY( + "Commodore 64 (6581 SID + Sound Expander)", { + CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_OPL, 1.0f, 0, "") + }, + "tickRate=50.1245421" + ); + SUB_SUB_ENTRY( + "Commodore 64 (6581 SID + Sound Expander in drums mode)", { + CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "") + }, + "tickRate=50.1245421" + ); + SUB_SUB_ENTRY( + "Commodore 64 (6581 SID + FM-YAM)", { + CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "") + }, + "tickRate=50.1245421" + ); + SUB_SUB_ENTRY( + "Commodore 64 (6581 SID + FM-YAM in drums mode)", { + CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "") + }, + "tickRate=50.1245421" + ); + SUB_ENTRY( + "Commodore 64 (8580 SID)", { + CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1") + }, + "tickRate=50.1245421" + ); + SUB_SUB_ENTRY( + "Commodore 64 (8580 SID + Sound Expander)", { + CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_OPL, 1.0f, 0, "") + }, + "tickRate=50.1245421" + ); + SUB_SUB_ENTRY( + "Commodore 64 (8580 SID + Sound Expander in drums mode)", { + CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "") + }, + "tickRate=50.1245421" + ); + SUB_SUB_ENTRY( + "Commodore 64 (8580 SID + FM-YAM)", { + CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "") + }, + "tickRate=50.1245421" + ); + SUB_SUB_ENTRY( + "Commodore 64 (8580 SID + FM-YAM in drums mode)", { + CH(DIV_SYSTEM_C64_8580, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "") + }, + "tickRate=50.1245421" + ); ENTRY( "Amiga", { CH(DIV_SYSTEM_AMIGA, 1.0f, 0, "clockSel=1") @@ -386,546 +391,555 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=0\nchipType=1") } ); - ENTRY( - "MSX + SFG-01", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + MSX-AUDIO", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + MSX-AUDIO (drums mode)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + MSX-MUSIC", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_OPLL, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + MSX-MUSIC (drums mode)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + Darky", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_AY8930, 1.0f, 0, - "clockSel=11\n" - "halfClock=true\n" - ), // 3.58MHz - CH(DIV_SYSTEM_AY8930, 1.0f, 0, - "clockSel=11\n" - "halfClock=true\n" - ) // 3.58MHz or 3.6MHz selectable via register - // per-channel mixer (soft panning, post processing) isn't emulated at all - } - ); - ENTRY( - "MSX + Playsoniq", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), // Sega VDP - CH(DIV_SYSTEM_C64_8580, 1.0f, 0, ""), - CH(DIV_SYSTEM_SCC_PLUS, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + SCC", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_SCC, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + SCC+", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_SCC_PLUS, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + Neotron", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_YM2610_FULL, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + Neotron (extended channel 2)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_YM2610_FULL_EXT, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + Neotron (with YM2610B)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_YM2610B, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + Neotron (with YM2610B; extended channel 3)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_YM2610B_EXT, 1.0f, 0, "") - } - ); - ENTRY( - "MSX + SIMPL", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=55930\n" - "outDepth=7\n" - ) // variable rate, Mono DAC - } - ); - ENTRY( - "NEC PC-88 (with PC-8801-10)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" - } - ); - ENTRY( - "NEC PC-88 (with PC-8801-11)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-88 (with PC-8801-11; extended channel 3)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-88 (with PC-8801-23)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-88 (with PC-8801-23; extended channel 3)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-88 (with HMB-20 HIBIKI-8800)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-10)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-10; extended channel 3)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-11)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-11; extended channel 3 on internal OPN)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-11; extended channel 3 on external OPN)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-11; extended channel 3 on both OPNs)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-23)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-23; extended channel 3 on internal OPN)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-23; extended channel 3 on external OPN)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-8801mk2SR (with PC-8801-23; extended channel 3 on both OPNs)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-8801mk2SR (with HMB-20 HIBIKI-8800)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz - } - ); - ENTRY( - "NEC PC-8801mk2SR (with HMB-20 HIBIKI-8800; extended channel 3)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-10)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-10; extended channel 3)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=4"), // internal - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-11)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-11; extended channel 3 on internal OPN)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-11; extended channel 3 on external OPN)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-11; extended channel 3 on both OPNs)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-23)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-23; extended channel 3 on internal OPN)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-23; extended channel 3 on external OPN)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-8801FA (with PC-8801-23; extended channel 3 on both OPNs)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external - } - ); - ENTRY( - "NEC PC-8801FA (with HMB-20 HIBIKI-8800)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz - } - ); - ENTRY( - "NEC PC-8801FA (with HMB-20 HIBIKI-8800; extended channel 3)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz - } - ); - ENTRY( - "NEC PC-98 (with PC-9801-26/K)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // 3.9936MHz but some compatible card has 4MHz - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with PC-9801-26/K; extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // 3.9936MHz but some compatible card has 4MHz - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Orchestra)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Orchestra; extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Orchestra in drums mode)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Orchestra in drums mode; extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Orchestra V)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Orchestra V; extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Orchestra V in drums mode)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Orchestra V in drums mode; extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=4"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with PC-9801-86)", { // -73 also has OPNA - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, // 2x 16-bit Burr Brown DAC - "rate=44100\n" - "outDepth=15\n" - ), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with PC-9801-86; extended channel 3)", { // -73 also has OPNA - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - ), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with PC-9801-86) stereo", { // -73 also has OPNA - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, -1.0f, // 2x 16-bit Burr Brown DAC - "rate=44100\n" - "outDepth=15\n" - ), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 1.0f, - "rate=44100\n" - "outDepth=15\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with PC-9801-86; extended channel 3) stereo", { // -73 also has OPNA - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, -1.0f, - "rate=44100\n" - "outDepth=15\n" - ), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 1.0f, - "rate=44100\n" - "outDepth=15\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with PC-9801-73)", { - CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with PC-9801-73; extended channel 3)", { - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Blaster 16 for PC-9800 w/PC-9801-26/K compatible)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - "stereo=true\n" - ), - CH(DIV_SYSTEM_OPL3, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Blaster 16 for PC-9800 w/PC-9801-26/K compatible; extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - "stereo=true\n" - ), - CH(DIV_SYSTEM_OPL3, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Blaster 16 for PC-9800 w/PC-9801-26/K compatible in drums mode)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - "stereo=true\n" - ), - CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "NEC PC-98 (with Sound Blaster 16 for PC-9800 w/PC-9801-26/K compatible in drums mode; extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - "stereo=true\n" - ), - CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "ZX Spectrum (48K, SFX-like engine)", { - CH(DIV_SYSTEM_SFX_BEEPER, 1.0f, 0, "") - } - ); - ENTRY( - "ZX Spectrum (48K, QuadTone engine)", { - CH(DIV_SYSTEM_SFX_BEEPER_QUADTONE, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "MSX + SFG-01", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + MSX-AUDIO", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + MSX-AUDIO (drums mode)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + MSX-MUSIC", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_OPLL, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + MSX-MUSIC (drums mode)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + Darky", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_AY8930, 1.0f, 0, + "clockSel=11\n" + "halfClock=true\n" + ), // 3.58MHz + CH(DIV_SYSTEM_AY8930, 1.0f, 0, + "clockSel=11\n" + "halfClock=true\n" + ) // 3.58MHz or 3.6MHz selectable via register + // per-channel mixer (soft panning, post processing) isn't emulated at all + } + ); + SUB_ENTRY( + "MSX + Playsoniq", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), // Sega VDP + CH(DIV_SYSTEM_C64_8580, 1.0f, 0, ""), + CH(DIV_SYSTEM_SCC_PLUS, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + SCC", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_SCC, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + SCC+", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_SCC_PLUS, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + Neotron", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_YM2610_FULL, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + Neotron (extended channel 2)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_YM2610_FULL_EXT, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + Neotron (with YM2610B)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_YM2610B, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + Neotron (with YM2610B; extended channel 3)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_YM2610B_EXT, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "MSX + SIMPL", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=55930\n" + "outDepth=7\n" + ) // variable rate, Mono DAC + } + ); + ENTRY( + "NEC PC-88", {} + ); + SUB_ENTRY( + "NEC PC-88 (with PC-8801-10)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" + } + ); + SUB_ENTRY( + "NEC PC-88 (with PC-8801-11)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-88 (with PC-8801-11; extended channel 3)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-88 (with PC-8801-23)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-88 (with PC-8801-23; extended channel 3)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-88 (with HMB-20 HIBIKI-8800)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-10)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-10; extended channel 3)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-11)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-11; extended channel 3 on internal OPN)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-11; extended channel 3 on external OPN)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-11; extended channel 3 on both OPNs)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-23)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-23; extended channel 3 on internal OPN)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-23; extended channel 3 on external OPN)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with PC-8801-23; extended channel 3 on both OPNs)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with HMB-20 HIBIKI-8800)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz + } + ); + SUB_ENTRY( + "NEC PC-8801mk2SR (with HMB-20 HIBIKI-8800; extended channel 3)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-10)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-10; extended channel 3)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=4"), // internal + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15"), // external + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=15") // "" + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-11)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-11; extended channel 3 on internal OPN)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-11; extended channel 3 on external OPN)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-11; extended channel 3 on both OPNs)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4") // external + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-23)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-23; extended channel 3 on internal OPN)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-23; extended channel 3 on external OPN)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with PC-8801-23; extended channel 3 on both OPNs)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1") // external + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with HMB-20 HIBIKI-8800)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz + } + ); + SUB_ENTRY( + "NEC PC-8801FA (with HMB-20 HIBIKI-8800; extended channel 3)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), // internal + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") // external; 4.0000MHz + } + ); + ENTRY( + "NEC PC-98", {} + ); + SUB_ENTRY( + "NEC PC-98 (with PC-9801-26/K)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), // 3.9936MHz but some compatible card has 4MHz + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with PC-9801-26/K; extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), // 3.9936MHz but some compatible card has 4MHz + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Orchestra)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Orchestra; extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Orchestra in drums mode)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Orchestra in drums mode; extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Orchestra V)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Orchestra V; extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Orchestra V in drums mode)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Orchestra V in drums mode; extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=4"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with PC-9801-86)", { // -73 also has OPNA + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, // 2x 16-bit Burr Brown DAC + "rate=44100\n" + "outDepth=15\n" + ), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with PC-9801-86; extended channel 3)", { // -73 also has OPNA + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + ), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with PC-9801-86) stereo", { // -73 also has OPNA + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, -1.0f, // 2x 16-bit Burr Brown DAC + "rate=44100\n" + "outDepth=15\n" + ), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 1.0f, + "rate=44100\n" + "outDepth=15\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with PC-9801-86; extended channel 3) stereo", { // -73 also has OPNA + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, -1.0f, + "rate=44100\n" + "outDepth=15\n" + ), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 1.0f, + "rate=44100\n" + "outDepth=15\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with PC-9801-73)", { + CH(DIV_SYSTEM_YM2608, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with PC-9801-73; extended channel 3)", { + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Blaster 16 for PC-9800 w/PC-9801-26/K compatible)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + "stereo=true\n" + ), + CH(DIV_SYSTEM_OPL3, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Blaster 16 for PC-9800 w/PC-9801-26/K compatible; extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + "stereo=true\n" + ), + CH(DIV_SYSTEM_OPL3, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Blaster 16 for PC-9800 w/PC-9801-26/K compatible in drums mode)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + "stereo=true\n" + ), + CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "NEC PC-98 (with Sound Blaster 16 for PC-9800 w/PC-9801-26/K compatible in drums mode; extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + "stereo=true\n" + ), + CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "clockSel=1") + } + ); + ENTRY( + "ZX Spectrum (48K) beeper", {} + ); + SUB_ENTRY( + "ZX Spectrum (48K, SFX-like engine)", { + CH(DIV_SYSTEM_SFX_BEEPER, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "ZX Spectrum (48K, QuadTone engine)", { + CH(DIV_SYSTEM_SFX_BEEPER_QUADTONE, 1.0f, 0, "") + } + ); ENTRY( "ZX Spectrum (128K)", { CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1") //beeper was also included } ); - ENTRY( - "ZX Spectrum (128K) with TurboSound FM", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "ZX Spectrum (128K) with TurboSound FM (extended channel 3 on first OPN)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "ZX Spectrum (128K) with TurboSound FM (extended channel 3 on second OPN)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "ZX Spectrum (128K) with TurboSound FM (extended channel 3 on both OPNs)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "ZX Spectrum (128K) with TurboSound", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), // or YM2149 - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1") // or YM2149 - } - ); + SUB_ENTRY( + "ZX Spectrum (128K) with TurboSound FM", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=1") + } + ); + SUB_SUB_ENTRY( + "ZX Spectrum (128K) with TurboSound FM (extended channel 3 on first OPN)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=1") + } + ); + SUB_SUB_ENTRY( + "ZX Spectrum (128K) with TurboSound FM (extended channel 3 on second OPN)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=1") + } + ); + SUB_SUB_ENTRY( + "ZX Spectrum (128K) with TurboSound FM (extended channel 3 on both OPNs)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=1") + } + ); + SUB_ENTRY( + "ZX Spectrum (128K) with TurboSound", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1"), // or YM2149 + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=1") // or YM2149 + } + ); ENTRY( "Amstrad CPC", { CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=5") @@ -937,13 +951,13 @@ void FurnaceGUI::initSystemPresets() { }, "tickRate=50" ); - ENTRY( - "Atari 800 (stereo)", { - CH(DIV_SYSTEM_POKEY, 1.0f, -1.0f, "clockSel=1"), - CH(DIV_SYSTEM_POKEY, 1.0f, 1.0f, "clockSel=1"), - }, - "tickRate=50" - ); + SUB_ENTRY( + "Atari 800 (stereo)", { + CH(DIV_SYSTEM_POKEY, 1.0f, -1.0f, "clockSel=1"), + CH(DIV_SYSTEM_POKEY, 1.0f, 1.0f, "clockSel=1"), + }, + "tickRate=50" + ); ENTRY( "Atari ST", { CH(DIV_SYSTEM_AY8910, 1.0f, 0, @@ -988,179 +1002,182 @@ void FurnaceGUI::initSystemPresets() { } ); ENTRY( - "PC (barebones)", { - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "IBM PCjr", { - // it can be enable sound output at once - CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=5") // SN76496 - } - ); - ENTRY( - "Tandy 1000", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=5"), // NCR 8496 or SN76496 or Tandy PSSJ(with 8 bit DAC) - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + Covox Sound Master", { - CH(DIV_SYSTEM_AY8930, 1.0f, 0, "clockSel=3"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + SSI 2001", { - CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + Game Blaster", { - CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + AdLib", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + AdLib (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + Sound Blaster", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=22050\n" - "outDepth=7\n" - ) - } - ); - ENTRY( - "PC + Sound Blaster (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=22050\n" - "outDepth=7\n" - ) - } - ); - ENTRY( - "PC + Sound Blaster w/Game Blaster Compatible", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), - CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=22050\n" - "outDepth=7\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + Sound Blaster w/Game Blaster Compatible (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=22050\n" - "outDepth=7\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + Sound Blaster Pro", { - CH(DIV_SYSTEM_OPL2, 1.0f, -1.0f, ""), - CH(DIV_SYSTEM_OPL2, 1.0f, 1.0f, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=22050\n" - "outDepth=7\n" - "stereo=true\n" - ), //alternatively 44.1 khz mono - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + Sound Blaster Pro (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, -1.0f, ""), - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 1.0f, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=22050\n" - "outDepth=7\n" - "stereo=true\n" - ), //alternatively 44.1 khz mono - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + Sound Blaster Pro 2", { - CH(DIV_SYSTEM_OPL3, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - "stereo=true\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + Sound Blaster Pro 2 (drums mode)", { - CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - "stereo=true\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + ESS AudioDrive ES1488 (native ESFM mode)", { - CH(DIV_SYSTEM_ESFM, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=44100\n" - "outDepth=15\n" - "stereo=true\n" - ), - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + PC-FXGA", { - CH(DIV_SYSTEM_PCE, 1.0f, 0, ""), // HuC6230 (WSG from HuC6280 but with built in 2 OKI ADPCM playback engines) - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } - ); - ENTRY( - "PC + SAAYM", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz or 4MHz selectable via jumper - CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), // 7.16MHz or 8MHz selectable via jumper - CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), // "" - CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") - } + "IBM PC", {} ); + SUB_ENTRY( + "PC (barebones)", { + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "IBM PCjr", { + // it can be enable sound output at once + CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=5") // SN76496 + } + ); + SUB_ENTRY( + "Tandy 1000", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=5"), // NCR 8496 or SN76496 or Tandy PSSJ(with 8 bit DAC) + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + Covox Sound Master", { + CH(DIV_SYSTEM_AY8930, 1.0f, 0, "clockSel=3"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + SSI 2001", { + CH(DIV_SYSTEM_C64_6581, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + Game Blaster", { + CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + AdLib", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + AdLib (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + Sound Blaster", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=22050\n" + "outDepth=7\n" + ) + } + ); + SUB_ENTRY( + "PC + Sound Blaster (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=22050\n" + "outDepth=7\n" + ) + } + ); + SUB_ENTRY( + "PC + Sound Blaster w/Game Blaster Compatible", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), + CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=22050\n" + "outDepth=7\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + Sound Blaster w/Game Blaster Compatible (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=22050\n" + "outDepth=7\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + Sound Blaster Pro", { + CH(DIV_SYSTEM_OPL2, 1.0f, -1.0f, ""), + CH(DIV_SYSTEM_OPL2, 1.0f, 1.0f, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=22050\n" + "outDepth=7\n" + "stereo=true\n" + ), //alternatively 44.1 khz mono + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + Sound Blaster Pro (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, -1.0f, ""), + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 1.0f, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=22050\n" + "outDepth=7\n" + "stereo=true\n" + ), //alternatively 44.1 khz mono + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + Sound Blaster Pro 2", { + CH(DIV_SYSTEM_OPL3, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + "stereo=true\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + Sound Blaster Pro 2 (drums mode)", { + CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + "stereo=true\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + ESS AudioDrive ES1488 (native ESFM mode)", { + CH(DIV_SYSTEM_ESFM, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=44100\n" + "outDepth=15\n" + "stereo=true\n" + ), + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + PC-FXGA", { + CH(DIV_SYSTEM_PCE, 1.0f, 0, ""), // HuC6230 (WSG from HuC6280 but with built in 2 OKI ADPCM playback engines) + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "PC + SAAYM", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz or 4MHz selectable via jumper + CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), // 7.16MHz or 8MHz selectable via jumper + CH(DIV_SYSTEM_SAA1099, 1.0f, 0, "clockSel=1"), // "" + CH(DIV_SYSTEM_PCSPKR, 1.0f, 0, "") + } + ); ENTRY( "Sharp X1", { CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3") } ); - ENTRY( - "Sharp X1 + FM Addon", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3"), - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") - } - ); + SUB_ENTRY( + "Sharp X1 + FM Addon", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3"), + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2") + } + ); ENTRY( "Sharp X68000", { CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), @@ -1173,36 +1190,36 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "") } ); + SUB_ENTRY( + "FM Towns (extended channel 3)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // YM3438 + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "FM Towns (CSM)", { + CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "clockSel=2"), // YM3438 + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "") + } + ); ENTRY( - "FM Towns (extended channel 3)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // YM3438 - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "") - } - ); - ENTRY( - "FM Towns (CSM)", { - CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "clockSel=2"), // YM3438 - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "") - } - ); - ENTRY( - "Commander X16 (VERA only)", { - CH(DIV_SYSTEM_VERA, 1.0f, 0, "") - } - ); - ENTRY( - "Commander X16 (with OPM)", { + "Commander X16", { CH(DIV_SYSTEM_VERA, 1.0f, 0, ""), CH(DIV_SYSTEM_YM2151, 1.0f, 0, "") } ); - ENTRY( - "Commander X16 (with Twin OPL3)", { - CH(DIV_SYSTEM_VERA, 1.0f, 0, ""), - CH(DIV_SYSTEM_OPL3, 1.0f, 0, ""), - CH(DIV_SYSTEM_OPL3, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Commander X16 (VERA only)", { + CH(DIV_SYSTEM_VERA, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Commander X16 (with Twin OPL3)", { + CH(DIV_SYSTEM_VERA, 1.0f, 0, ""), + CH(DIV_SYSTEM_OPL3, 1.0f, 0, ""), + CH(DIV_SYSTEM_OPL3, 1.0f, 0, "") + } + ); ENTRY( "TI-99/4A", { CH(DIV_SYSTEM_SMS, 1.0f, 0, @@ -1214,1135 +1231,1201 @@ void FurnaceGUI::initSystemPresets() { CATEGORY_END; CATEGORY_BEGIN("Arcade systems","INSERT COIN"); - ENTRY( - "Pong", { - CH(DIV_SYSTEM_PONG, 1.0f, 0, "") - } - ); - ENTRY( - "Bally Midway MCR", { - // SSIO sound board - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3"), // 2MHz - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3") // 2MHz - // additional sound boards, mostly software controlled DAC - } - ); - ENTRY( - "Williams/Midway Y/T unit w/ADPCM sound board", { - // ADPCM sound board - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=15625\n" - "outDepth=7\n" - ), // variable via OPM timer? - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") - } - ); - ENTRY( - "Konami Gyruss", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "") - // additional discrete sound logics - } - ); - ENTRY( - "Konami Bubble System", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), - CH(DIV_SYSTEM_BUBSYS_WSG, 1.0f, 0, "") - // VLM5030 exists but not used for music at all - } - ); - ENTRY( - "Konami MX5000", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" - } - ); - ENTRY( - "Konami Battlantis", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3") // "" - } - ); - ENTRY( - "Konami Battlantis (drums mode on first OPL2)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3") // "" - } - ); - ENTRY( - "Konami Battlantis (drums mode on second OPL2)", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3") // "" - } - ); - ENTRY( - "Konami Battlantis (drums mode on both OPL2s)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3") // "" - } - ); - ENTRY( - "Konami Fast Lane", { - CH(DIV_SYSTEM_K007232, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" - } - ); - ENTRY( - "Konami Chequered Flag", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K007232, 1.0f, 0, "stereo=true"), // "" - CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" - } - ); - ENTRY( - "Konami Haunted Castle", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_SCC, 1.0f, 0, ""), // "" - CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" - } - ); - ENTRY( - "Konami Haunted Castle (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_SCC, 1.0f, 0, ""), // "" - CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" - } - ); - ENTRY( - "Konami Hot Chase", { - CH(DIV_SYSTEM_K007232, 1.0f, 0, "stereo=true"), // 3.58MHz - CH(DIV_SYSTEM_K007232, 1.0f, 0, "stereo=true"), // "" - CH(DIV_SYSTEM_K007232, 1.0f, 0, "stereo=true") // "" - } - ); - ENTRY( - "Konami S.P.Y.", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K007232, 1.0f, 0, ""), // "" - CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" - } - ); - ENTRY( - "Konami S.P.Y. (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K007232, 1.0f, 0, ""), // "" - CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" - } - ); - ENTRY( - "Konami Rollergames", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" - } - ); - ENTRY( - "Konami Rollergames (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" - } - ); - ENTRY( - "Konami Golfing Greats", { - CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // 3.58MHz - } - ); - ENTRY( - "Konami Lightning Fighters", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" - } - ); - ENTRY( - "Konami Over Drive", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" - CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" - } - ); - ENTRY( - "Konami Asterix", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_K053260, 1.0f, 0, "clockSel=1"), // "" - } - ); - ENTRY( - "Konami Hexion", { - CH(DIV_SYSTEM_SCC, 1.0f, 0, "clockSel=2"), // 1.5MHz (3MHz input) - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=1") - } - ); - ENTRY( - "Sega Kyugo", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=14"), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=14") - } - ); - ENTRY( - "Sega System 1", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, - "clockSel=2\n" - "chipType=4\n" - ), // SN76489A 4MHz - CH(DIV_SYSTEM_SMS, 1.0f, 0, - "clockSel=5\n" - "chipType=4\n" - ) // SN76489A 2MHz - } - ); - ENTRY( - "Sega System E", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_SMS, 1.0f, 0, "") - } - ); - ENTRY( - "Sega System E (with FM expansion)", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_OPLL, 1.0f, 0, "") - } - ); - ENTRY( - "Sega System E (with FM expansion in drums mode)", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "") - } - ); - ENTRY( - "Sega Hang-On", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_SEGAPCM, 1.0f, 0, "") // discrete logics, 62.5KHz output rate - } - ); - ENTRY( - "Sega Hang-On (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_SEGAPCM, 1.0f, 0, "") // discrete logics, 62.5KHz output rate - } - ); - ENTRY( - "Sega OutRun/X Board", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_SEGAPCM, 1.0f, 0, "") // ASIC, 31.25KHz output rate - } - ); - ENTRY( - "Sega System 24", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=61500\n" - "outDepth=7\n" - ) // software controlled, variable rate via configurable timers - } - ); - ENTRY( - "Sega System 18", { - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // discrete 8MHz YM3438 - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=1") // 10MHz - } - ); - ENTRY( - "Sega System 18 (extended channel 3 on first OPN2C)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // discrete 8MHz YM3438 - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=1") // 10MHz - } - ); - ENTRY( - "Sega System 18 (extended channel 3 on second OPN2C)", { - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // discrete 8MHz YM3438 - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=1") // 10MHz - } - ); - ENTRY( - "Sega System 18 (extended channel 3 on both OPN2Cs)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // discrete 8MHz YM3438 - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=1") // 10MHz - } - ); - ENTRY( - "Sega System 32", { - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, - "clockSel=2\n" - "chipType=1\n" - ) // 12.5MHz - } - ); - ENTRY( - "Sega System 32 (extended channel 3 on first OPN2C)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, - "clockSel=2\n" - "chipType=1\n" - ) // 12.5MHz - } - ); - ENTRY( - "Sega System 32 (extended channel 3 on second OPN2C)", { - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, - "clockSel=2\n" - "chipType=1\n" - ) // 12.5MHz - } - ); - ENTRY( - "Sega System 32 (extended channel 3 on both OPN2Cs)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, - "clockSel=2\n" - "chipType=1\n" - ) // 12.5MHz - } - ); - ENTRY( - "Capcom Exed Eyes", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=4"), // 1.5MHz - CH(DIV_SYSTEM_SMS, 1.0f, 0, - "clockSel=4\n" - "chipType=1\n" - ), // SN76489 3MHz - CH(DIV_SYSTEM_SMS, 1.0f, 0, - "clockSel=4\n" - "chipType=1\n" - ) // SN76489 3MHz - } - ); - ENTRY( - "Capcom Arcade", { // 1943, Side arms, etc - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 4 or 1.5MHz; various per games - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5") - } - ); - ENTRY( - "Capcom Arcade (extended channel 3 on first OPN)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5") - } - ); - ENTRY( - "Capcom Arcade (extended channel 3 on second OPN)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5") - } - ); - ENTRY( - "Capcom Arcade (extended channel 3 on both OPNs)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5") - } - ); - ENTRY( - "Capcom CPS-1", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") - } - ); - ENTRY( - "Capcom CPS-2 (QSound)", { - CH(DIV_SYSTEM_QSOUND, 1.0f, 0, "") - } - ); - ENTRY( - "Jaleco Ginga NinkyouDen", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), // 1.79MHz - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "") // 3.58MHz - } - ); - ENTRY( - "Jaleco Ginga NinkyouDen (drums mode)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), // 1.79MHz - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "") // 3.58MHz - } - ); - ENTRY( - "Jaleco Mega System 1", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=1"), // 3.5MHz (7MHz / 2) - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=2") // 4MHz - } - ); - ENTRY( - "NMK 16-bit Arcade", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz; optional - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=2\n" - "rateSel=true\n" - ), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=2\n" - "rateSel=true\n" - ) // ^^ - } - ); - ENTRY( - "NMK 16-bit Arcade (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz; optional - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=2\n" - "rateSel=true\n" - ), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=2\n" - "rateSel=true\n" - ) // ^^ - } - ); - ENTRY( - "NMK 16-bit Arcade (w/NMK112 bankswitching)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz; optional - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=2\n" - "rateSel=true\n" - "isBanked=true\n" - ), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=2\n" - "rateSel=true\n" - "isBanked=true\n" - ) // ^^ - } - ); - ENTRY( - "NMK 16-bit Arcade (w/NMK112 bankswitching, extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz; optional - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=2\n" - "rateSel=true\n" - "isBanked=true\n" - ), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=2\n" - "rateSel=true\n" - "isBanked=true\n" - ) // ^^ - } - ); - ENTRY( - "Atlus Power Instinct 2", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=13\n" - "rateSel=true\n" - "isBanked=true\n" - ), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=13\n" - "rateSel=true\n" - "isBanked=true\n" - ) // ^^ - } - ); - ENTRY( - "Atlus Power Instinct 2 (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=13\n" - "rateSel=true\n" - "isBanked=true\n" - ), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=13\n" - "rateSel=true\n" - "isBanked=true\n" - ) // ^^ - } - ); - ENTRY( - "Raizing/Eighting Battle Garegga", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=8\n" - "isBanked=true\n" - ) // 2MHz - } - ); - ENTRY( - "Raizing/Eighting Batrider", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=15\n" - "isBanked=true\n" - ), // 3.2MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=15\n" - "rateSel=true\n" - "isBanked=true\n" - ) // 3.2MHz - } - ); - ENTRY( - "Kaneko DJ Boy", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, "clockSel=12"), // 1.5MHz, Left output - CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, "clockSel=12"), // 1.5MHz, Right output - } - ); - ENTRY( - "Kaneko DJ Boy (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, "clockSel=12"), // 1.5MHz, Left output - CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, "clockSel=12") // 1.5MHz, Right output - } - ); - ENTRY( - "Kaneko Air Buster", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=13\n" - "rateSel=true\n" - ) // 3MHz - } - ); - ENTRY( - "Kaneko Air Buster (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, - "clockSel=13\n" - "rateSel=true\n" - ) // 3MHz - } - ); - ENTRY( - "Kaneko Toybox System", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, - "clockSel=3\n" - "chipType=1\n" - ), // YM2149 2MHz - CH(DIV_SYSTEM_AY8910, 1.0f, 0, - "clockSel=3\n" - "chipType=1\n" - ), // ^^ - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2MHz - } - ); - ENTRY( - "Kaneko Jackie Chan", { - CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "clockSel=3") // 16MHz - } - ); - ENTRY( - "Super Kaneko Nova System", { - CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "clockSel=4") // 16.67MHz (33.33MHz / 2) - } - ); - ENTRY( - "Tecmo Ninja Gaiden", { // Ninja Gaiden, Raiga, etc - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1MHz - } - ); - ENTRY( - "Tecmo Ninja Gaiden (extended channel 3 on first OPN)", { // Ninja Gaiden, Raiga, etc - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1MHz - } - ); - ENTRY( - "Tecmo Ninja Gaiden (extended channel 3 on second OPN)", { // Ninja Gaiden, Raiga, etc - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1MHz - } - ); - ENTRY( - "Tecmo Ninja Gaiden (extended channel 3 on both OPNs)", { // Ninja Gaiden, Raiga, etc - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1MHz - } - ); - ENTRY( - "Tecmo System", { - CH(DIV_SYSTEM_OPL3, 1.0f, 0, ""), - CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, ""), - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2MHz - } - ); - ENTRY( - "Tecmo System (drums mode)", { - CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, ""), - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2MHz - } - ); - ENTRY( - "Seibu Kaihatsu Raiden", { // Raiden, Seibu cup soccer, Zero team, etc - CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // YM3812 3.58MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 or 1.023MHz (28.636363MHz / 28); various per games - } - ); - ENTRY( - "Seibu Kaihatsu Raiden (drums mode)", { // Raiden, Seibu cup soccer, Zero team, etc - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // YM3812 3.58MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 or 1.023MHz (28.636363MHz / 28); various per games - } - ); - ENTRY( - "Sunsoft Shanghai 3", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, - "clockSel=4\n" - "chipType=1\n" - ), // YM2149 1.5MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=1") // 1.056MHz - } - ); - ENTRY( - "Sunsoft Arcade", { - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // discrete YM3438 8MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=1") // 1.056MHz - } - ); - ENTRY( - "Sunsoft Arcade (extended channel 3)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // discrete YM3438 8MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=1") // 1.056MHz - } - ); - ENTRY( - "Atari Klax", { - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=7") // 0.895MHz (3.579545MHz / 4) - } - ); - ENTRY( - "Atari Rampart", { - CH(DIV_SYSTEM_OPLL, 1.0f, 0, ""), // 3.579545MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=14") // 1.193MHz (3.579545MHz / 3) - } - ); - ENTRY( - "Atari Rampart (drums mode)", { - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, ""), // 3.579545MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=14") // 1.193MHz (3.579545MHz / 3) - } - ); - ENTRY( - "Atari JSA IIIs", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.579545MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, "clockSel=14"), // 1.193MHz (3.579545MHz / 3), Left output - CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, "clockSel=14") // 1.193MHz (3.579545MHz / 3), Right output - } - ); - ENTRY( - "Atari Marble Madness", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_POKEY, 1.0f, 0, "") - } - ); - ENTRY( - "Atari Championship Sprint", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_POKEY, 1.0f, 0, ""), - CH(DIV_SYSTEM_POKEY, 1.0f, 0, "") - } - ); - ENTRY( - "Atari Tetris", { - CH(DIV_SYSTEM_POKEY, 1.0f, 0, ""), - CH(DIV_SYSTEM_POKEY, 1.0f, 0, "") - } - ); - ENTRY( - "Atari I, Robot", { - CH(DIV_SYSTEM_POKEY, 1.0f, 0, "customClock=1512000"), - CH(DIV_SYSTEM_POKEY, 1.0f, 0, "customClock=1512000"), - CH(DIV_SYSTEM_POKEY, 1.0f, 0, "customClock=1512000"), - CH(DIV_SYSTEM_POKEY, 1.0f, 0, "customClock=1512000") - } - ); - ENTRY( - "Data East Karnov", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=3") // 3MHz - } - ); - ENTRY( - "Data East Karnov (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=3") // 3MHz - } - ); - ENTRY( - "Data East Karnov (drums mode)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=3") // 3MHz - } - ); - ENTRY( - "Data East Karnov (extended channel 3; drums mode)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=3") // 3MHz - } - ); - ENTRY( - "Data East Arcade", { // Bad dudes, Robocop, etc - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 to 1.056MHz; various per games or optional - } - ); - ENTRY( - "Data East Arcade (extended channel 3)", { // Bad dudes, Robocop, etc - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 to 1.056MHz; various per games or optional - } - ); - ENTRY( - "Data East Arcade (drums mode)", { // Bad dudes, Robocop, etc - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 to 1.056MHz; various per games or optional - } - ); - ENTRY( - "Data East Arcade (extended channel 3; drums mode)", { // Bad dudes, Robocop, etc - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 to 1.056MHz; various per games or optional - } - ); - ENTRY( - "Data East PCX", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_PCE, 1.0f, 0, "") - // software controlled MSM5205 - } - ); - ENTRY( - "Data East PCX (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz - CH(DIV_SYSTEM_PCE, 1.0f, 0, "") - // software controlled MSM5205 - } - ); - ENTRY( - "Data East Dark Seal", { // Dark Seal, Crude Buster, Vapor Trail, etc - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.580MHz (32.22MHz / 9) - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4.0275MHz (32.22MHz / 8); optional - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, ""), // 1.007MHz (32.22MHz / 32) - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2.014MHz (32.22MHz / 16); optional - // HuC6280 is for control them, internal sound isn't used - } - ); - ENTRY( - "Data East Dark Seal (extended channel 3)", { // Dark Seal, Crude Buster, Vapor Trail, etc - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.580MHz (32.22MHz / 9) - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4.0275MHz (32.22MHz / 8); optional - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, ""), // 1.007MHz (32.22MHz / 32) - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2.014MHz (32.22MHz / 16); optional - // HuC6280 is for control them, internal sound isn't used - } - ); - ENTRY( - "Data East Deco 156", { - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=0"), // 1 or 1.007MHz (32.22MHz / 32); various per games - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 1 or 2 or 2.014MHz (32.22MHz / 16); various per games - } - ); - ENTRY( - "Data East MLC", { - CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "clockSel=5") // 14MHz - } - ); - ENTRY( - "SNK Ikari Warriors", { - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Ikari Warriors (drums mode on first OPL)", { - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Ikari Warriors (drums mode on second OPL)", { - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Ikari Warriors (drums mode on both OPLs)", { - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Triple Z80", { - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Triple Z80 (drums mode on Y8950)", { - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Triple Z80 (drums mode on OPL)", { - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Triple Z80 (drums mode on Y8950 and OPL)", { - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Chopper I", { - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Chopper I (drums mode on Y8950)", { - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Chopper I (drums mode on OPL2)", { - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Chopper I (drums mode on Y8950 and OPL2)", { - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Touchdown Fever", { - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Touchdown Fever (drums mode on OPL)", { - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Touchdown Fever (drums mode on Y8950)", { - CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "SNK Touchdown Fever (drums mode on OPL and Y8950)", { - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2"), - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2") - } - ); - ENTRY( - "Alpha denshi Alpha-68K", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_OPLL, 1.0f, 0, "clockSel=0"), // 3.58MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=7614\n" - "outDepth=7\n" - ) // software controlled 8 bit DAC - } - ); - ENTRY( - "Alpha denshi Alpha-68K (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_OPLL, 1.0f, 0, "clockSel=0"), // 3.58MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=7614\n" - "outDepth=7\n" - ) // software controlled 8 bit DAC - } - ); - ENTRY( - "Alpha denshi Alpha-68K (drums mode)", { - CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "clockSel=0"), // 3.58MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=7614\n" - "outDepth=7\n" - ) // software controlled 8 bit DAC - } - ); - ENTRY( - "Alpha denshi Alpha-68K (extended channel 3; drums mode)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3"), // 3MHz - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "clockSel=0"), // 3.58MHz - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=7614\n" - "outDepth=7\n" - ) // software controlled 8 bit DAC - } - ); - ENTRY( - "Alpha denshi Equites", { - CH(DIV_SYSTEM_MSM5232, 1.0f, 0, "customClock=6144000"), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=14"), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=11025\n" - "outDepth=5\n" - ), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=11025\n" - "outDepth=5\n" - ) // don't know what the actual sample rate is - } - ); - ENTRY( - "Neo Geo MVS", { - CH(DIV_SYSTEM_YM2610_FULL, 1.0f, 0, "") - } - ); - ENTRY( - "Neo Geo MVS (extended channel 2)", { - CH(DIV_SYSTEM_YM2610_FULL_EXT, 1.0f, 0, "") - } - ); - ENTRY( - "Nichibutsu Mag Max", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=13"), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=13"), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=13") - } - ); - ENTRY( - "Namco (3-channel WSG)", { // Pac-Man, Galaga, Xevious, etc - CH(DIV_SYSTEM_NAMCO, 1.0f, 0, "") - } - ); - ENTRY( - "Namco Mappy", { // Mappy, Super Pac-Man, Libble Rabble, etc - CH(DIV_SYSTEM_NAMCO_15XX, 1.0f, 0, "") - } - ); - ENTRY( - "Namco Pac-Land", { // Pac-Land, Baraduke, Sky kid, etc - CH(DIV_SYSTEM_NAMCO_CUS30, 1.0f, 0, "") - } - ); - ENTRY( - "Namco System 86", { // without expansion board case; Hopping Mappy, etc - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_NAMCO_CUS30, 1.0f, 0, "") - } - ); - ENTRY( - "Namco Thunder Ceptor", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_NAMCO_CUS30, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=8000\n" - "outDepth=7\n" - ) // M65C02 software driven, correct sample rate? - } - ); - ENTRY( - "Namco System 1", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_NAMCO_CUS30, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=6000\n" - "outDepth=7\n" - ), // sample rate verified from https://github.com/mamedev/mame/blob/master/src/devices/sound/n63701x.cpp - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=6000\n" - "outDepth=7\n" - ) // "" - } - ); - ENTRY( - "Namco System 2", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_C140, 1.0f, 0, "") - } - ); - ENTRY( - "Namco NA-1/2", { - CH(DIV_SYSTEM_C219, 1.0f, 0, "") - } - ); - ENTRY( - "Taito Arcade", { - CH(DIV_SYSTEM_YM2610B, 1.0f, 0, "") - } - ); - ENTRY( - "Taito Arcade (extended channel 3)", { - CH(DIV_SYSTEM_YM2610B_EXT, 1.0f, 0, "") - } - ); - ENTRY( - "Taito Metal Soldier Isaac II", { - CH(DIV_SYSTEM_MSM5232, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3"), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3") - } - ); - ENTRY( - "Taito The Fairyland Story", { - CH(DIV_SYSTEM_MSM5232, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, - "clockSel=3\n" - "chipType=1\n" - ), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=11025\n" - "outDepth=7\n" - ) // don't know what the actual sample rate is - } - ); - ENTRY( - "Taito Wyvern F-0", { - CH(DIV_SYSTEM_MSM5232, 1.0f, 0, ""), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, - "clockSel=3\n" - "chipType=1\n" - ), - CH(DIV_SYSTEM_AY8910, 1.0f, 0, - "clockSel=3\n" - "chipType=1\n" - ), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=11025\n" - "outDepth=7\n" - ) // don't know what the actual sample rate is - } - ); - ENTRY( - "Seta 1", { - CH(DIV_SYSTEM_X1_010, 1.0f, 0, "") - } - ); - ENTRY( - "Seta 1 + FM addon", { - CH(DIV_SYSTEM_X1_010, 1.0f, 0, ""), - CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2") // Discrete YM3438 - } - ); - ENTRY( - "Seta 1 + FM addon (extended channel 3)", { - CH(DIV_SYSTEM_X1_010, 1.0f, 0, ""), - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2") // Discrete YM3438 - } - ); - ENTRY( - "Seta 2", { - CH(DIV_SYSTEM_X1_010, 1.0f, 0, - "clockSel=1\n" - "isBanked=true\n" - ) - } - ); - ENTRY( - "Sammy/Seta/Visco SSV", { - CH(DIV_SYSTEM_ES5506, 1.0f, 0, "channels=31") - } - ); - ENTRY( - "Cave 68000", { - CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "") - } - ); - ENTRY( - "Coreland Cyber Tank", { - CH(DIV_SYSTEM_Y8950, 1.0f, -1.0f, ""), // 3.58MHz, Left output - CH(DIV_SYSTEM_Y8950, 1.0f, 1.0f, "") // 3.58MHz, Right output - } - ); - ENTRY( - "Coreland Cyber Tank (drums mode)", { - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, -1.0f, ""), // 3.58MHz, Left output - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 1.0f, "") // 3.58MHz, Right output - } - ); - ENTRY( - "ICE Skimaxx", { - CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, - "clockSel=2\n" - "rateSel=true\n" - ), // 4MHz, Left output - CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, - "clockSel=2\n" - "rateSel=true\n" - ), // 4MHz, Right output - CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, "clockSel=8"), // 2MHz, Left output - CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, "clockSel=8") // 2MHz, Right output - } - ); - ENTRY( - "Toaplan 1", { - CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=5") // 3.5MHz - } - ); - ENTRY( - "Toaplan 1 (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=5") // 3.5MHz - } - ); - ENTRY( - "Dynax/Nakanihon 3rd generation hardware", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), // AY or YM, optional - 1.79MHz or 3.58MHz; various per game - CH(DIV_SYSTEM_OPLL, 1.0f, 0, ""), - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=6") // 1.023MHz mostly - } - ); - ENTRY( - "Dynax/Nakanihon 3rd generation hardware (drums mode)", { - CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), // AY or YM, optional - 1.79MHz or 3.58MHz; various per game - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=6") // 1.023MHz mostly - } - ); - ENTRY( - "Dynax/Nakanihon Real Break", { - CH(DIV_SYSTEM_OPLL, 1.0f, 0, ""), - CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "") - } - ); - ENTRY( - "Dynax/Nakanihon Real Break (drums mode)", { - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, ""), - CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "") - } - ); - ENTRY( - "Irem M72", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, - "rate=7812\n" - "outDepth=7\n" - ) - } - ); - ENTRY( - "Irem M92/M107", { - CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), - CH(DIV_SYSTEM_GA20, 1.0f, 0, "") - } - ); + // MANUFACTURERS + ENTRY( + "Alpha Denshi", {} + ); + SUB_ENTRY( + "Alpha denshi Alpha-68K", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_OPLL, 1.0f, 0, "clockSel=0"), // 3.58MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=7614\n" + "outDepth=7\n" + ) // software controlled 8 bit DAC + } + ); + SUB_ENTRY( + "Alpha denshi Alpha-68K (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_OPLL, 1.0f, 0, "clockSel=0"), // 3.58MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=7614\n" + "outDepth=7\n" + ) // software controlled 8 bit DAC + } + ); + SUB_ENTRY( + "Alpha denshi Alpha-68K (drums mode)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "clockSel=0"), // 3.58MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=7614\n" + "outDepth=7\n" + ) // software controlled 8 bit DAC + } + ); + SUB_ENTRY( + "Alpha denshi Alpha-68K (extended channel 3; drums mode)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "clockSel=0"), // 3.58MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=7614\n" + "outDepth=7\n" + ) // software controlled 8 bit DAC + } + ); + SUB_ENTRY( + "Alpha denshi Equites", { + CH(DIV_SYSTEM_MSM5232, 1.0f, 0, "customClock=6144000"), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=14"), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=11025\n" + "outDepth=5\n" + ), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=11025\n" + "outDepth=5\n" + ) // don't know what the actual sample rate is + } + ); + + ENTRY( + "Atari", {} + ); + SUB_ENTRY( + "Pong", { + CH(DIV_SYSTEM_PONG, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Atari Klax", { + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=7") // 0.895MHz (3.579545MHz / 4) + } + ); + SUB_ENTRY( + "Atari Rampart", { + CH(DIV_SYSTEM_OPLL, 1.0f, 0, ""), // 3.579545MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=14") // 1.193MHz (3.579545MHz / 3) + } + ); + SUB_ENTRY( + "Atari Rampart (drums mode)", { + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, ""), // 3.579545MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=14") // 1.193MHz (3.579545MHz / 3) + } + ); + SUB_ENTRY( + "Atari JSA IIIs", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.579545MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, "clockSel=14"), // 1.193MHz (3.579545MHz / 3), Left output + CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, "clockSel=14") // 1.193MHz (3.579545MHz / 3), Right output + } + ); + SUB_ENTRY( + "Atari Marble Madness", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_POKEY, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Atari Championship Sprint", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_POKEY, 1.0f, 0, ""), + CH(DIV_SYSTEM_POKEY, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Atari Tetris", { + CH(DIV_SYSTEM_POKEY, 1.0f, 0, ""), + CH(DIV_SYSTEM_POKEY, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Atari I, Robot", { + CH(DIV_SYSTEM_POKEY, 1.0f, 0, "customClock=1512000"), + CH(DIV_SYSTEM_POKEY, 1.0f, 0, "customClock=1512000"), + CH(DIV_SYSTEM_POKEY, 1.0f, 0, "customClock=1512000"), + CH(DIV_SYSTEM_POKEY, 1.0f, 0, "customClock=1512000") + } + ); + + ENTRY( + "Capcom", {} + ); + SUB_ENTRY( + "Capcom Exed Eyes", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=4"), // 1.5MHz + CH(DIV_SYSTEM_SMS, 1.0f, 0, + "clockSel=4\n" + "chipType=1\n" + ), // SN76489 3MHz + CH(DIV_SYSTEM_SMS, 1.0f, 0, + "clockSel=4\n" + "chipType=1\n" + ) // SN76489 3MHz + } + ); + SUB_ENTRY( + "Capcom Arcade", { // 1943, Side arms, etc + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 4 or 1.5MHz; various per games + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5") + } + ); + SUB_ENTRY( + "Capcom Arcade (extended channel 3 on first OPN)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5") + } + ); + SUB_ENTRY( + "Capcom Arcade (extended channel 3 on second OPN)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5") + } + ); + SUB_ENTRY( + "Capcom Arcade (extended channel 3 on both OPNs)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5") + } + ); + SUB_ENTRY( + "Capcom CPS-1", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Capcom CPS-2 (QSound)", { + CH(DIV_SYSTEM_QSOUND, 1.0f, 0, "") + } + ); + + ENTRY( + "Data East", {} + ); + SUB_ENTRY( + "Data East Karnov", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=3") // 3MHz + } + ); + SUB_ENTRY( + "Data East Karnov (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=3") // 3MHz + } + ); + SUB_ENTRY( + "Data East Karnov (drums mode)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=3") // 3MHz + } + ); + SUB_ENTRY( + "Data East Karnov (extended channel 3; drums mode)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=3") // 3MHz + } + ); + SUB_ENTRY( + "Data East Arcade", { // Bad dudes, Robocop, etc + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 to 1.056MHz; various per games or optional + } + ); + SUB_ENTRY( + "Data East Arcade (extended channel 3)", { // Bad dudes, Robocop, etc + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 to 1.056MHz; various per games or optional + } + ); + SUB_ENTRY( + "Data East Arcade (drums mode)", { // Bad dudes, Robocop, etc + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 to 1.056MHz; various per games or optional + } + ); + SUB_ENTRY( + "Data East Arcade (extended channel 3; drums mode)", { // Bad dudes, Robocop, etc + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 to 1.056MHz; various per games or optional + } + ); + SUB_ENTRY( + "Data East PCX", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_PCE, 1.0f, 0, "") + // software controlled MSM5205 + } + ); + SUB_ENTRY( + "Data East PCX (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz + CH(DIV_SYSTEM_PCE, 1.0f, 0, "") + // software controlled MSM5205 + } + ); + SUB_ENTRY( + "Data East Dark Seal", { // Dark Seal, Crude Buster, Vapor Trail, etc + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.580MHz (32.22MHz / 9) + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4.0275MHz (32.22MHz / 8); optional + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, ""), // 1.007MHz (32.22MHz / 32) + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2.014MHz (32.22MHz / 16); optional + // HuC6280 is for control them, internal sound isn't used + } + ); + SUB_ENTRY( + "Data East Dark Seal (extended channel 3)", { // Dark Seal, Crude Buster, Vapor Trail, etc + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.580MHz (32.22MHz / 9) + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4.0275MHz (32.22MHz / 8); optional + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, ""), // 1.007MHz (32.22MHz / 32) + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2.014MHz (32.22MHz / 16); optional + // HuC6280 is for control them, internal sound isn't used + } + ); + SUB_ENTRY( + "Data East Deco 156", { + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=0"), // 1 or 1.007MHz (32.22MHz / 32); various per games + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 1 or 2 or 2.014MHz (32.22MHz / 16); various per games + } + ); + SUB_ENTRY( + "Data East MLC", { + CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "clockSel=5") // 14MHz + } + ); + + ENTRY( + "Irem", {} + ); + SUB_ENTRY( + "Irem M72", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=7812\n" + "outDepth=7\n" + ) + } + ); + SUB_ENTRY( + "Irem M92/M107", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_GA20, 1.0f, 0, "") + } + ); + + ENTRY( + "Jaleco", {} + ); + SUB_ENTRY( + "Jaleco Ginga NinkyouDen", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), // 1.79MHz + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "") // 3.58MHz + } + ); + SUB_ENTRY( + "Jaleco Ginga NinkyouDen (drums mode)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "chipType=1"), // 1.79MHz + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "") // 3.58MHz + } + ); + SUB_ENTRY( + "Jaleco Mega System 1", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=1"), // 3.5MHz (7MHz / 2) + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=2") // 4MHz + } + ); + + ENTRY( + "Kaneko", {} + ); + SUB_ENTRY( + "Kaneko DJ Boy", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, "clockSel=12"), // 1.5MHz, Left output + CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, "clockSel=12"), // 1.5MHz, Right output + } + ); + SUB_ENTRY( + "Kaneko DJ Boy (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, "clockSel=12"), // 1.5MHz, Left output + CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, "clockSel=12") // 1.5MHz, Right output + } + ); + SUB_ENTRY( + "Kaneko Air Buster", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=13\n" + "rateSel=true\n" + ) // 3MHz + } + ); + SUB_ENTRY( + "Kaneko Air Buster (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=13\n" + "rateSel=true\n" + ) // 3MHz + } + ); + SUB_ENTRY( + "Kaneko Toybox System", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, + "clockSel=3\n" + "chipType=1\n" + ), // YM2149 2MHz + CH(DIV_SYSTEM_AY8910, 1.0f, 0, + "clockSel=3\n" + "chipType=1\n" + ), // ^^ + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2MHz + } + ); + SUB_ENTRY( + "Kaneko Jackie Chan", { + CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "clockSel=3") // 16MHz + } + ); + SUB_ENTRY( + "Super Kaneko Nova System", { + CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "clockSel=4") // 16.67MHz (33.33MHz / 2) + } + ); + + ENTRY( + "Konami", {} + ); + SUB_ENTRY( + "Konami Gyruss", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "") + // additional discrete sound logics + } + ); + SUB_ENTRY( + "Konami Bubble System", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), + CH(DIV_SYSTEM_BUBSYS_WSG, 1.0f, 0, "") + // VLM5030 exists but not used for music at all + } + ); + SUB_ENTRY( + "Konami MX5000", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" + } + ); + SUB_ENTRY( + "Konami Battlantis", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3") // "" + } + ); + SUB_ENTRY( + "Konami Battlantis (drums mode on first OPL2)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3") // "" + } + ); + SUB_ENTRY( + "Konami Battlantis (drums mode on second OPL2)", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3") // "" + } + ); + SUB_ENTRY( + "Konami Battlantis (drums mode on both OPL2s)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3"), // 3MHz + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=3") // "" + } + ); + SUB_ENTRY( + "Konami Fast Lane", { + CH(DIV_SYSTEM_K007232, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" + } + ); + SUB_ENTRY( + "Konami Chequered Flag", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K007232, 1.0f, 0, "stereo=true"), // "" + CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" + } + ); + SUB_ENTRY( + "Konami Haunted Castle", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_SCC, 1.0f, 0, ""), // "" + CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" + } + ); + SUB_ENTRY( + "Konami Haunted Castle (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_SCC, 1.0f, 0, ""), // "" + CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" + } + ); + SUB_ENTRY( + "Konami Hot Chase", { + CH(DIV_SYSTEM_K007232, 1.0f, 0, "stereo=true"), // 3.58MHz + CH(DIV_SYSTEM_K007232, 1.0f, 0, "stereo=true"), // "" + CH(DIV_SYSTEM_K007232, 1.0f, 0, "stereo=true") // "" + } + ); + SUB_ENTRY( + "Konami S.P.Y.", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K007232, 1.0f, 0, ""), // "" + CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" + } + ); + SUB_ENTRY( + "Konami S.P.Y. (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K007232, 1.0f, 0, ""), // "" + CH(DIV_SYSTEM_K007232, 1.0f, 0, "") // "" + } + ); + SUB_ENTRY( + "Konami Rollergames", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + } + ); + SUB_ENTRY( + "Konami Rollergames (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + } + ); + SUB_ENTRY( + "Konami Golfing Greats", { + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // 3.58MHz + } + ); + SUB_ENTRY( + "Konami Lightning Fighters", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + } + ); + SUB_ENTRY( + "Konami Over Drive", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), // 3.58MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + CH(DIV_SYSTEM_K053260, 1.0f, 0, ""), // "" + } + ); + SUB_ENTRY( + "Konami Asterix", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_K053260, 1.0f, 0, "clockSel=1"), // "" + } + ); + SUB_ENTRY( + "Konami Hexion", { + CH(DIV_SYSTEM_SCC, 1.0f, 0, "clockSel=2"), // 1.5MHz (3MHz input) + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=1") + } + ); + + ENTRY( + "Namco", {} + ); + SUB_ENTRY( + "Namco (3-channel WSG)", { // Pac-Man, Galaga, Xevious, etc + CH(DIV_SYSTEM_NAMCO, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Namco Mappy", { // Mappy, Super Pac-Man, Libble Rabble, etc + CH(DIV_SYSTEM_NAMCO_15XX, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Namco Pac-Land", { // Pac-Land, Baraduke, Sky kid, etc + CH(DIV_SYSTEM_NAMCO_CUS30, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Namco System 86", { // without expansion board case; Hopping Mappy, etc + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_NAMCO_CUS30, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Namco Thunder Ceptor", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_NAMCO_CUS30, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=8000\n" + "outDepth=7\n" + ) // M65C02 software driven, correct sample rate? + } + ); + SUB_ENTRY( + "Namco System 1", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_NAMCO_CUS30, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=6000\n" + "outDepth=7\n" + ), // sample rate verified from https://github.com/mamedev/mame/blob/master/src/devices/sound/n63701x.cpp + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=6000\n" + "outDepth=7\n" + ) // "" + } + ); + SUB_ENTRY( + "Namco System 2", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_C140, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Namco NA-1/2", { + CH(DIV_SYSTEM_C219, 1.0f, 0, "") + } + ); + + ENTRY( + "Sega", {} + ); + SUB_ENTRY( + "Sega Kyugo", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=14"), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=14") + } + ); + SUB_ENTRY( + "Sega System 1", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, + "clockSel=2\n" + "chipType=4\n" + ), // SN76489A 4MHz + CH(DIV_SYSTEM_SMS, 1.0f, 0, + "clockSel=5\n" + "chipType=4\n" + ) // SN76489A 2MHz + } + ); + SUB_ENTRY( + "Sega System E", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_SMS, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Sega System E (with FM expansion)", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_OPLL, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Sega System E (with FM expansion in drums mode)", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Sega Hang-On", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_SEGAPCM, 1.0f, 0, "") // discrete logics, 62.5KHz output rate + } + ); + SUB_ENTRY( + "Sega Hang-On (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_SEGAPCM, 1.0f, 0, "") // discrete logics, 62.5KHz output rate + } + ); + SUB_ENTRY( + "Sega OutRun/X Board", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_SEGAPCM, 1.0f, 0, "") // ASIC, 31.25KHz output rate + } + ); + SUB_ENTRY( + "Sega System 24", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=61500\n" + "outDepth=7\n" + ) // software controlled, variable rate via configurable timers + } + ); + SUB_ENTRY( + "Sega System 18", { + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // discrete 8MHz YM3438 + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // ^^ + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=1") // 10MHz + } + ); + SUB_ENTRY( + "Sega System 18 (extended channel 3 on first OPN2C)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // discrete 8MHz YM3438 + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // ^^ + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=1") // 10MHz + } + ); + SUB_ENTRY( + "Sega System 18 (extended channel 3 on second OPN2C)", { + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // discrete 8MHz YM3438 + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // ^^ + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=1") // 10MHz + } + ); + SUB_ENTRY( + "Sega System 18 (extended channel 3 on both OPN2Cs)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // discrete 8MHz YM3438 + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // ^^ + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=1") // 10MHz + } + ); + SUB_ENTRY( + "Sega System 32", { + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // ^^ + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, + "clockSel=2\n" + "chipType=1\n" + ) // 12.5MHz + } + ); + SUB_ENTRY( + "Sega System 32 (extended channel 3 on first OPN2C)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // ^^ + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, + "clockSel=2\n" + "chipType=1\n" + ) // 12.5MHz + } + ); + SUB_ENTRY( + "Sega System 32 (extended channel 3 on second OPN2C)", { + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // ^^ + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, + "clockSel=2\n" + "chipType=1\n" + ) // 12.5MHz + } + ); + SUB_ENTRY( + "Sega System 32 (extended channel 3 on both OPN2Cs)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // ^^ + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, + "clockSel=2\n" + "chipType=1\n" + ) // 12.5MHz + } + ); + + ENTRY( + "Seta", {} + ); + SUB_ENTRY( + "Seta 1", { + CH(DIV_SYSTEM_X1_010, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Seta 1 + FM addon", { + CH(DIV_SYSTEM_X1_010, 1.0f, 0, ""), + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2") // Discrete YM3438 + } + ); + SUB_ENTRY( + "Seta 1 + FM addon (extended channel 3)", { + CH(DIV_SYSTEM_X1_010, 1.0f, 0, ""), + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2") // Discrete YM3438 + } + ); + SUB_ENTRY( + "Seta 2", { + CH(DIV_SYSTEM_X1_010, 1.0f, 0, + "clockSel=1\n" + "isBanked=true\n" + ) + } + ); + SUB_ENTRY( + "Sammy/Seta/Visco SSV", { + CH(DIV_SYSTEM_ES5506, 1.0f, 0, "channels=31") + } + ); + + ENTRY( + "SNK", {} + ); + SUB_ENTRY( + "Neo Geo MVS", { + CH(DIV_SYSTEM_YM2610_FULL, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Neo Geo MVS (extended channel 2)", { + CH(DIV_SYSTEM_YM2610_FULL_EXT, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "SNK Ikari Warriors", { + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Ikari Warriors (drums mode on first OPL)", { + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Ikari Warriors (drums mode on second OPL)", { + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Ikari Warriors (drums mode on both OPLs)", { + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Triple Z80", { + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Triple Z80 (drums mode on Y8950)", { + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Triple Z80 (drums mode on OPL)", { + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Triple Z80 (drums mode on Y8950 and OPL)", { + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Chopper I", { + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Chopper I (drums mode on Y8950)", { + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Chopper I (drums mode on OPL2)", { + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Chopper I (drums mode on Y8950 and OPL2)", { + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Touchdown Fever", { + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Touchdown Fever (drums mode on OPL)", { + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_Y8950, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Touchdown Fever (drums mode on Y8950)", { + CH(DIV_SYSTEM_OPL, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2") + } + ); + SUB_ENTRY( + "SNK Touchdown Fever (drums mode on OPL and Y8950)", { + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "clockSel=2"), + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "clockSel=2") + } + ); + + ENTRY( + "Sunsoft", {} + ); + SUB_ENTRY( + "Sunsoft Shanghai 3", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, + "clockSel=4\n" + "chipType=1\n" + ), // YM2149 1.5MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=1") // 1.056MHz + } + ); + SUB_ENTRY( + "Sunsoft Arcade", { + CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=2"), // discrete YM3438 8MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=1") // 1.056MHz + } + ); + SUB_ENTRY( + "Sunsoft Arcade (extended channel 3)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=2"), // discrete YM3438 8MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=1") // 1.056MHz + } + ); + + ENTRY( + "Taito", {} + ); + SUB_ENTRY( + "Taito Arcade", { + CH(DIV_SYSTEM_YM2610B, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Taito Arcade (extended channel 3)", { + CH(DIV_SYSTEM_YM2610B_EXT, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Taito Metal Soldier Isaac II", { + CH(DIV_SYSTEM_MSM5232, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3"), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3") + } + ); + SUB_ENTRY( + "Taito The Fairyland Story", { + CH(DIV_SYSTEM_MSM5232, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, + "clockSel=3\n" + "chipType=1\n" + ), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=11025\n" + "outDepth=7\n" + ) // don't know what the actual sample rate is + } + ); + SUB_ENTRY( + "Taito Wyvern F-0", { + CH(DIV_SYSTEM_MSM5232, 1.0f, 0, ""), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, + "clockSel=3\n" + "chipType=1\n" + ), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, + "clockSel=3\n" + "chipType=1\n" + ), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=11025\n" + "outDepth=7\n" + ) // don't know what the actual sample rate is + } + ); + + ENTRY( + "Tecmo", {} + ); + SUB_ENTRY( + "Tecmo Ninja Gaiden", { // Ninja Gaiden, Raiga, etc + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1MHz + } + ); + SUB_ENTRY( + "Tecmo Ninja Gaiden (extended channel 3 on first OPN)", { // Ninja Gaiden, Raiga, etc + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1MHz + } + ); + SUB_ENTRY( + "Tecmo Ninja Gaiden (extended channel 3 on second OPN)", { // Ninja Gaiden, Raiga, etc + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1MHz + } + ); + SUB_ENTRY( + "Tecmo Ninja Gaiden (extended channel 3 on both OPNs)", { // Ninja Gaiden, Raiga, etc + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1MHz + } + ); + SUB_ENTRY( + "Tecmo System", { + CH(DIV_SYSTEM_OPL3, 1.0f, 0, ""), + CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, ""), + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2MHz + } + ); + SUB_ENTRY( + "Tecmo System (drums mode)", { + CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, ""), + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=8") // 2MHz + } + ); + SUB_ENTRY( + "Seibu Kaihatsu Raiden", { // Raiden, Seibu cup soccer, Zero team, etc + CH(DIV_SYSTEM_OPL2, 1.0f, 0, ""), // YM3812 3.58MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 or 1.023MHz (28.636363MHz / 28); various per games + } + ); + SUB_ENTRY( + "Seibu Kaihatsu Raiden (drums mode)", { // Raiden, Seibu cup soccer, Zero team, etc + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, ""), // YM3812 3.58MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") // 1 or 1.023MHz (28.636363MHz / 28); various per games + } + ); + + ENTRY( + "Other", {} + ); + + // UNSORTED + SUB_ENTRY( + "Bally Midway MCR", { + // SSIO sound board + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3"), // 2MHz + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=3") // 2MHz + // additional sound boards, mostly software controlled DAC + } + ); + SUB_ENTRY( + "Williams/Midway Y/T unit w/ADPCM sound board", { + // ADPCM sound board + CH(DIV_SYSTEM_YM2151, 1.0f, 0, ""), + CH(DIV_SYSTEM_PCM_DAC, 1.0f, 0, + "rate=15625\n" + "outDepth=7\n" + ), // variable via OPM timer? + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "NMK 16-bit Arcade", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz; optional + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=2\n" + "rateSel=true\n" + ), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=2\n" + "rateSel=true\n" + ) // ^^ + } + ); + SUB_ENTRY( + "NMK 16-bit Arcade (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz; optional + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=2\n" + "rateSel=true\n" + ), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=2\n" + "rateSel=true\n" + ) // ^^ + } + ); + SUB_ENTRY( + "NMK 16-bit Arcade (w/NMK112 bankswitching)", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=5"), // 1.5MHz; optional + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=2\n" + "rateSel=true\n" + "isBanked=true\n" + ), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=2\n" + "rateSel=true\n" + "isBanked=true\n" + ) // ^^ + } + ); + SUB_ENTRY( + "NMK 16-bit Arcade (w/NMK112 bankswitching, extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=5"), // 1.5MHz; optional + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=2\n" + "rateSel=true\n" + "isBanked=true\n" + ), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=2\n" + "rateSel=true\n" + "isBanked=true\n" + ) // ^^ + } + ); + SUB_ENTRY( + "Atlus Power Instinct 2", { + CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=13\n" + "rateSel=true\n" + "isBanked=true\n" + ), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=13\n" + "rateSel=true\n" + "isBanked=true\n" + ) // ^^ + } + ); + SUB_ENTRY( + "Atlus Power Instinct 2 (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=13\n" + "rateSel=true\n" + "isBanked=true\n" + ), // 3MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=13\n" + "rateSel=true\n" + "isBanked=true\n" + ) // ^^ + } + ); + SUB_ENTRY( + "Raizing/Eighting Battle Garegga", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=8\n" + "isBanked=true\n" + ) // 2MHz + } + ); + SUB_ENTRY( + "Raizing/Eighting Batrider", { + CH(DIV_SYSTEM_YM2151, 1.0f, 0, "clockSel=2"), // 4MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=15\n" + "isBanked=true\n" + ), // 3.2MHz + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, + "clockSel=15\n" + "rateSel=true\n" + "isBanked=true\n" + ) // 3.2MHz + } + ); + SUB_ENTRY( + "Nichibutsu Mag Max", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=13"), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=13"), + CH(DIV_SYSTEM_AY8910, 1.0f, 0, "clockSel=13") + } + ); + SUB_ENTRY( + "Cave 68000", { + CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Coreland Cyber Tank", { + CH(DIV_SYSTEM_Y8950, 1.0f, -1.0f, ""), // 3.58MHz, Left output + CH(DIV_SYSTEM_Y8950, 1.0f, 1.0f, "") // 3.58MHz, Right output + } + ); + SUB_ENTRY( + "Coreland Cyber Tank (drums mode)", { + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, -1.0f, ""), // 3.58MHz, Left output + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 1.0f, "") // 3.58MHz, Right output + } + ); + SUB_ENTRY( + "ICE Skimaxx", { + CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, + "clockSel=2\n" + "rateSel=true\n" + ), // 4MHz, Left output + CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, + "clockSel=2\n" + "rateSel=true\n" + ), // 4MHz, Right output + CH(DIV_SYSTEM_MSM6295, 1.0f, -1.0f, "clockSel=8"), // 2MHz, Left output + CH(DIV_SYSTEM_MSM6295, 1.0f, 1.0f, "clockSel=8") // 2MHz, Right output + } + ); + SUB_ENTRY( + "Toaplan 1", { + CH(DIV_SYSTEM_OPL2, 1.0f, 0, "clockSel=5") // 3.5MHz + } + ); + SUB_ENTRY( + "Toaplan 1 (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "clockSel=5") // 3.5MHz + } + ); + SUB_ENTRY( + "Dynax/Nakanihon 3rd generation hardware", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), // AY or YM, optional - 1.79MHz or 3.58MHz; various per game + CH(DIV_SYSTEM_OPLL, 1.0f, 0, ""), + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=6") // 1.023MHz mostly + } + ); + SUB_ENTRY( + "Dynax/Nakanihon 3rd generation hardware (drums mode)", { + CH(DIV_SYSTEM_AY8910, 1.0f, 0, ""), // AY or YM, optional - 1.79MHz or 3.58MHz; various per game + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_MSM6295, 1.0f, 0, "clockSel=6") // 1.023MHz mostly + } + ); + SUB_ENTRY( + "Dynax/Nakanihon Real Break", { + CH(DIV_SYSTEM_OPLL, 1.0f, 0, ""), + CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Dynax/Nakanihon Real Break (drums mode)", { + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, ""), + CH(DIV_SYSTEM_YMZ280B, 1.0f, 0, "") + } + ); CATEGORY_END; @@ -2357,101 +2440,101 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_YM2203, 1.0f, 0, "clockSel=3") } ); - ENTRY( - "Yamaha YM2203 (extended channel 3)", { - CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3") - } - ); + SUB_ENTRY( + "Yamaha YM2203 (extended channel 3)", { + CH(DIV_SYSTEM_YM2203_EXT, 1.0f, 0, "clockSel=3") + } + ); ENTRY( "Yamaha YM2608 (OPNA)", { CH(DIV_SYSTEM_YM2608, 1.0f, 0, "") } ); - ENTRY( - "Yamaha YM2608 (extended channel 3)", { - CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha YM2608 (extended channel 3)", { + CH(DIV_SYSTEM_YM2608_EXT, 1.0f, 0, "") + } + ); ENTRY( "Yamaha YM2610 (OPNB)", { CH(DIV_SYSTEM_YM2610_FULL, 1.0f, 0, "") } ); - ENTRY( - "Yamaha YM2610 (extended channel 2)", { - CH(DIV_SYSTEM_YM2610_FULL_EXT, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha YM2610 (extended channel 2)", { + CH(DIV_SYSTEM_YM2610_FULL_EXT, 1.0f, 0, "") + } + ); ENTRY( "Yamaha YM2610B (OPNB2)", { CH(DIV_SYSTEM_YM2610B, 1.0f, 0, "") } ); - ENTRY( - "Yamaha YM2610B (extended channel 3)", { - CH(DIV_SYSTEM_YM2610B_EXT, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha YM2610B (extended channel 3)", { + CH(DIV_SYSTEM_YM2610B_EXT, 1.0f, 0, "") + } + ); ENTRY( "Yamaha YM2612 (OPN2)", { CH(DIV_SYSTEM_YM2612, 1.0f, 0, "chipType=1") } ); - ENTRY( - "Yamaha YM2612 (extended channel 3)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "chipType=1") - } - ); - ENTRY( - "Yamaha YM2612 (OPN2) CSM", { - CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "chipType=1") - } - ); - ENTRY( - "Yamaha YM2612 (OPN2) with DualPCM", { - 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, "chipType=1") - } - ); + SUB_ENTRY( + "Yamaha YM2612 (extended channel 3)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "chipType=1") + } + ); + SUB_ENTRY( + "Yamaha YM2612 (OPN2) CSM", { + CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "chipType=1") + } + ); + SUB_ENTRY( + "Yamaha YM2612 (OPN2) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM, 1.0f, 0, "chipType=1") + } + ); + SUB_ENTRY( + "Yamaha YM2612 (extended channel 3) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 1.0f, 0, "chipType=1") + } + ); ENTRY( "Yamaha YMF276 (OPN2)", { CH(DIV_SYSTEM_YM2612, 1.0f, 0, "chipType=2") } ); - ENTRY( - "Yamaha YMF276 (extended channel 3)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "chipType=2") - } - ); - ENTRY( - "Yamaha YMF276 (OPN2) CSM", { - CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "chipType=2") - } - ); - ENTRY( - "Yamaha YMF276 (OPN2) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM, 1.0f, 0, "chipType=2") - } - ); - ENTRY( - "Yamaha YMF276 (extended channel 3) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 1.0f, 0, "chipType=2") - } - ); + SUB_ENTRY( + "Yamaha YMF276 (extended channel 3)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "chipType=2") + } + ); + SUB_ENTRY( + "Yamaha YMF276 (OPN2) CSM", { + CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "chipType=2") + } + ); + SUB_ENTRY( + "Yamaha YMF276 (OPN2) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM, 1.0f, 0, "chipType=2") + } + ); + SUB_ENTRY( + "Yamaha YMF276 (extended channel 3) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 1.0f, 0, "chipType=2") + } + ); ENTRY( "Yamaha YM2413 (OPLL)", { CH(DIV_SYSTEM_OPLL, 1.0f, 0, "") } ); - ENTRY( - "Yamaha YM2413 (drums mode)", { - CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha YM2413 (drums mode)", { + CH(DIV_SYSTEM_OPLL_DRUMS, 1.0f, 0, "") + } + ); ENTRY( "Yamaha YM2414 (OPZ)", { CH(DIV_SYSTEM_OPZ, 1.0f, 0, "") @@ -2462,66 +2545,66 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_YM2612, 1.0f, 0, "") } ); - ENTRY( - "Yamaha YM3438 (extended channel 3)", { - CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "") - } - ); - ENTRY( - "Yamaha YM3438 (OPN2C) CSM", { - CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "") - } - ); - ENTRY( - "Yamaha YM3438 (OPN2C) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM, 1.0f, 0, "") - } - ); - ENTRY( - "Yamaha YM3438 (extended channel 3) with DualPCM", { - CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha YM3438 (extended channel 3)", { + CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Yamaha YM3438 (OPN2C) CSM", { + CH(DIV_SYSTEM_YM2612_CSM, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Yamaha YM3438 (OPN2C) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM, 1.0f, 0, "") + } + ); + SUB_ENTRY( + "Yamaha YM3438 (extended channel 3) with DualPCM", { + CH(DIV_SYSTEM_YM2612_DUALPCM_EXT, 1.0f, 0, "") + } + ); ENTRY( "Yamaha YM3526 (OPL)", { CH(DIV_SYSTEM_OPL, 1.0f, 0, "") } ); - ENTRY( - "Yamaha YM3526 (drums mode)", { - CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha YM3526 (drums mode)", { + CH(DIV_SYSTEM_OPL_DRUMS, 1.0f, 0, "") + } + ); ENTRY( "Yamaha Y8950", { CH(DIV_SYSTEM_Y8950, 1.0f, 0, "") } ); - ENTRY( - "Yamaha Y8950 (drums mode)", { - CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha Y8950 (drums mode)", { + CH(DIV_SYSTEM_Y8950_DRUMS, 1.0f, 0, "") + } + ); ENTRY( "Yamaha YM3812 (OPL2)", { CH(DIV_SYSTEM_OPL2, 1.0f, 0, "") } ); - ENTRY( - "Yamaha YM3812 (drums mode)", { - CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha YM3812 (drums mode)", { + CH(DIV_SYSTEM_OPL2_DRUMS, 1.0f, 0, "") + } + ); ENTRY( "Yamaha YMF262 (OPL3)", { CH(DIV_SYSTEM_OPL3, 1.0f, 0, "") } ); - ENTRY( - "Yamaha YMF262 (drums mode)", { - CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, "") - } - ); + SUB_ENTRY( + "Yamaha YMF262 (drums mode)", { + CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, "") + } + ); ENTRY( "Yamaha YMF289B (OPL3-L)", { CH(DIV_SYSTEM_OPL3, 1.0f, 0, @@ -2530,14 +2613,14 @@ void FurnaceGUI::initSystemPresets() { ) } ); - ENTRY( - "Yamaha YMF289B (drums mode)", { - CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, - "clockSel=5\n" - "chipType=1\n" - ) - } - ); + SUB_ENTRY( + "Yamaha YMF289B (drums mode)", { + CH(DIV_SYSTEM_OPL3_DRUMS, 1.0f, 0, + "clockSel=5\n" + "chipType=1\n" + ) + } + ); ENTRY( "ESS ES1xxx series (ESFM)", { CH(DIV_SYSTEM_ESFM, 1.0f, 0, "") @@ -2558,53 +2641,53 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=1") } ); - ENTRY( - "TI SN76489A", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=4") - } - ); - ENTRY( - "TI SN76496", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=5") - } - ); - ENTRY( - "NCR 8496", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=6") - } - ); - ENTRY( - "Tandy PSSJ 3-voice sound", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=7") - // 8 bit DAC - } - ); - ENTRY( - "Sega PSG (SN76489-like)", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), - } - ); - ENTRY( - "Sega PSG (SN76489-like, Stereo)", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=3") - } - ); - ENTRY( - "TI SN94624", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, - "clockSel=6\n" - "chipType=8\n" - ) - } - ); - ENTRY( - "TI SN76494", { - CH(DIV_SYSTEM_SMS, 1.0f, 0, - "clockSel=6\n" - "chipType=9\n" - ) - } - ); + SUB_ENTRY( + "TI SN76489A", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=4") + } + ); + SUB_ENTRY( + "TI SN76496", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=5") + } + ); + SUB_ENTRY( + "NCR 8496", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=6") + } + ); + SUB_ENTRY( + "Tandy PSSJ 3-voice sound", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=7") + // 8 bit DAC + } + ); + SUB_ENTRY( + "Sega PSG (SN76489-like)", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, ""), + } + ); + SUB_ENTRY( + "Sega PSG (SN76489-like, Stereo)", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, "chipType=3") + } + ); + SUB_ENTRY( + "TI SN94624", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, + "clockSel=6\n" + "chipType=8\n" + ) + } + ); + SUB_ENTRY( + "TI SN76494", { + CH(DIV_SYSTEM_SMS, 1.0f, 0, + "clockSel=6\n" + "chipType=9\n" + ) + } + ); ENTRY( "Toshiba T6W28", { CH(DIV_SYSTEM_T6W28, 1.0f, 0, "") @@ -2925,7 +3008,7 @@ void FurnaceGUI::initSystemPresets() { "tickRate=50" ); ENTRY( - "NDS", { + "Nintendo DS", { CH(DIV_SYSTEM_NDS, 1.0f, 0, "") } ); From 5848c48a763482e326b3e950fa4127e5e1956c36 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 17:39:22 -0500 Subject: [PATCH 06/17] GUI: fix system detection --- src/gui/gui.cpp | 127 ++++++++++++++++++++++++++---------------------- src/gui/gui.h | 1 + 2 files changed, 69 insertions(+), 59 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 925b272c5..d34f7a753 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -635,6 +635,73 @@ void FurnaceGUI::updateWindowTitle() { } } +void FurnaceGUI::autoDetectSystemIter(std::vector& category, bool& isMatch, std::map& defCountMap, std::map& defConfMap, std::map& sysCountMap, std::map& sysConfMap) { + for (FurnaceGUISysDef& j: category) { + if (!j.orig.empty()) { + defCountMap.clear(); + defConfMap.clear(); + for (FurnaceGUISysDefChip& k: j.orig) { + auto it=defCountMap.find(k.sys); + if (it==defCountMap.cend()) { + defCountMap[k.sys]=1; + } else { + it->second++; + } + DivConfig dc; + dc.loadFromMemory(k.flags); + defConfMap[k.sys]=dc; + } + if (defCountMap.size()==sysCountMap.size()) { + isMatch=true; + logV("trying on defCountMap: %s",j.name); + for (std::pair k: defCountMap) { + logV("- %s: %d",e->getSystemName(k.first),k.second); + } + for (std::pair k: defCountMap) { + auto countI=sysCountMap.find(k.first); + if (countI==sysCountMap.cend()) { + isMatch=false; + break; + } else if (countI->second!=k.second) { + isMatch=false; + break; + } + + auto confI=sysConfMap.find(k.first); + if (confI==sysConfMap.cend()) { + isMatch=false; + break; + } + DivConfig& sysDC=confI->second; + auto defConfI=defConfMap.find(k.first); + if (defConfI==defConfMap.cend()) { + isMatch=false; + break; + } + for (std::pair l: defConfI->second.configMap()) { + if (!sysDC.has(l.first)) { + isMatch=false; + break; + } + if (sysDC.getString(l.first,"")!=l.second) { + isMatch=false; + break; + } + } + if (!isMatch) break; + } + if (isMatch) { + logV("match found!"); + e->song.systemName=j.name; + break; + } + } + } + if (!j.subDefs.empty()) autoDetectSystemIter(j.subDefs,isMatch,defCountMap,defConfMap,sysCountMap,sysConfMap); + if (isMatch) break; + } +} + void FurnaceGUI::autoDetectSystem() { std::map sysCountMap; std::map sysConfMap; @@ -657,65 +724,7 @@ void FurnaceGUI::autoDetectSystem() { std::map defCountMap; std::map defConfMap; for (FurnaceGUISysCategory& i: sysCategories) { - for (FurnaceGUISysDef& j: i.systems) { - defCountMap.clear(); - defConfMap.clear(); - for (FurnaceGUISysDefChip& k: j.orig) { - auto it=defCountMap.find(k.sys); - if (it==defCountMap.cend()) { - defCountMap[k.sys]=1; - } else { - it->second++; - } - DivConfig dc; - dc.loadFromMemory(k.flags); - defConfMap[k.sys]=dc; - } - if (defCountMap.size()!=sysCountMap.size()) continue; - isMatch=true; - /*logV("trying on defCountMap: %s",j.name); - for (std::pair k: defCountMap) { - logV("- %s: %d",e->getSystemName(k.first),k.second); - }*/ - for (std::pair k: defCountMap) { - auto countI=sysCountMap.find(k.first); - if (countI==sysCountMap.cend()) { - isMatch=false; - break; - } else if (countI->second!=k.second) { - isMatch=false; - break; - } - - auto confI=sysConfMap.find(k.first); - if (confI==sysConfMap.cend()) { - isMatch=false; - break; - } - DivConfig& sysDC=confI->second; - auto defConfI=defConfMap.find(k.first); - if (defConfI==defConfMap.cend()) { - isMatch=false; - break; - } - for (std::pair l: defConfI->second.configMap()) { - if (!sysDC.has(l.first)) { - isMatch=false; - break; - } - if (sysDC.getString(l.first,"")!=l.second) { - isMatch=false; - break; - } - } - if (!isMatch) break; - } - if (isMatch) { - logV("match found!"); - e->song.systemName=j.name; - break; - } - } + autoDetectSystemIter(i.systems,isMatch,defCountMap,defConfMap,sysCountMap,sysConfMap); if (isMatch) break; } diff --git a/src/gui/gui.h b/src/gui/gui.h index a7149bc00..8983e345a 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2511,6 +2511,7 @@ class FurnaceGUI { void updateWindowTitle(); void autoDetectSystem(); + void autoDetectSystemIter(std::vector& category, bool& isMatch, std::map& defCountMap, std::map& defConfMap, std::map& sysCountMap, std::map& sysConfMap); void prepareLayout(); ImVec4 channelColor(int ch); ImVec4 channelTextColor(int ch); From 04175e82d74d566bee4b350f43a8d99722249902 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 17:47:20 -0500 Subject: [PATCH 07/17] GUI: disable debug message --- src/gui/gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d34f7a753..0bb5093df 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -653,10 +653,10 @@ void FurnaceGUI::autoDetectSystemIter(std::vector& category, b } if (defCountMap.size()==sysCountMap.size()) { isMatch=true; - logV("trying on defCountMap: %s",j.name); + /*logV("trying on defCountMap: %s",j.name); for (std::pair k: defCountMap) { logV("- %s: %d",e->getSystemName(k.first),k.second); - } + }*/ for (std::pair k: defCountMap) { auto countI=sysCountMap.find(k.first); if (countI==sysCountMap.cend()) { From 42583f73412584fcca48932c7141aa8d2f7fdc72 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 17:47:31 -0500 Subject: [PATCH 08/17] speed up IMA ADPCM sample encoding --- src/engine/sample.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/sample.cpp b/src/engine/sample.cpp index 17340f551..eca9da9cd 100644 --- a/src/engine/sample.cpp +++ b/src/engine/sample.cpp @@ -1468,7 +1468,7 @@ void DivSample::render(unsigned int formatMask) { delta[0]=0; delta[1]=0; - void* codec=adpcm_create_context(1,4,NOISE_SHAPING_OFF,delta); + void* codec=adpcm_create_context(1,1,NOISE_SHAPING_OFF,delta); if (codec==NULL) { logE("oh no IMA encoder could not be created!"); } else { From 3b5729eab90eeede7cebbc5ddfd3e576be3bf049 Mon Sep 17 00:00:00 2001 From: Abdullah <111107624+Abdullah-Ajeebi@users.noreply.github.com> Date: Wed, 20 Mar 2024 19:41:33 +0300 Subject: [PATCH 09/17] Update effects.md --- doc/3-pattern/effects.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/3-pattern/effects.md b/doc/3-pattern/effects.md index b416ebb64..dca26d21b 100644 --- a/doc/3-pattern/effects.md +++ b/doc/3-pattern/effects.md @@ -2,7 +2,7 @@ some of the effect numbers are taken from ProTracker / FastTracker 2. -however, effects are continuous, which means you only need to type it once and then stop it with an effect value of `00` or no effect value at all. +however, effects are continuous (unless specified), which means you only need to type it once and then stop it with an effect value of `00` or no effect value at all. ## volume From 36636525e7094cbd29dfe2e75e2db0e6e609e6cb Mon Sep 17 00:00:00 2001 From: Rockyfan75000 <153872220+Rockyfan75000@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:50:57 -0500 Subject: [PATCH 10/17] String --- instruments/C64/string_c64.fui | Bin 0 -> 31 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 instruments/C64/string_c64.fui diff --git a/instruments/C64/string_c64.fui b/instruments/C64/string_c64.fui new file mode 100644 index 0000000000000000000000000000000000000000..c48adabafd3adb84acad7c0915e41d058ea6b728 GIT binary patch literal 31 mcmZ?s^b0<~z|7$1$j%U4Qk0pO&R}N3!63$v$-uzS_y_=ZYzI{U literal 0 HcmV?d00001 From 148e6e653c3da90124e9b0f1873015ea10b982e2 Mon Sep 17 00:00:00 2001 From: Rockyfan75000 <153872220+Rockyfan75000@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:51:22 -0500 Subject: [PATCH 11/17] Hi-Hat --- instruments/ESFM/Hi-Hat_ESFM.fui | Bin 0 -> 86 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 instruments/ESFM/Hi-Hat_ESFM.fui diff --git a/instruments/ESFM/Hi-Hat_ESFM.fui b/instruments/ESFM/Hi-Hat_ESFM.fui new file mode 100644 index 0000000000000000000000000000000000000000..29b31aa4c61e9249f9cc88ce667cf945b4308fb7 GIT binary patch literal 86 zcmZ?s^b0<~V9wy@$jji7sq2wgqM+fdY@*5F=BvW+g@u73o|B*1;WGn!ya|y0!obYm oz|Z8ck%5VyfuG&s4+ER4n;-)dGYbQgH2VuSW_AW9d3J`s04W&|=>Px# literal 0 HcmV?d00001 From fbe5b74cc63a0a745bc2de25c8355ecfc0d307a1 Mon Sep 17 00:00:00 2001 From: Rockyfan75000 <153872220+Rockyfan75000@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:51:43 -0500 Subject: [PATCH 12/17] Fake SNES Bass --- instruments/OPZ/Fake SNES Bass_OPZ.fui | Bin 0 -> 67 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 instruments/OPZ/Fake SNES Bass_OPZ.fui diff --git a/instruments/OPZ/Fake SNES Bass_OPZ.fui b/instruments/OPZ/Fake SNES Bass_OPZ.fui new file mode 100644 index 0000000000000000000000000000000000000000..e449ebb1984058fad8e4f576416d8d9ca4344727 GIT binary patch literal 67 zcmZ?s^b0<~Ak5(B$j{)Gn4PK+?B^P+;FMTg%;4s$!tlj`fx)z1p2LBkfx$pQo&`v= Q88FCm0cj>6%?YF#0R@T-N&o-= literal 0 HcmV?d00001 From 056fd04c95b65170fbf211824d185df5c1470a82 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 17:55:49 -0500 Subject: [PATCH 13/17] GUI: span avail width --- src/gui/newSong.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index 304062d75..21e60166e 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -41,7 +41,7 @@ void FurnaceGUI::drawSysDefs(std::vector& category, bool& acce } else { sysDefID=fmt::sprintf("%s/%dS",sysDefIDLeader,index); } - treeNode=ImGui::TreeNode(sysDefID.c_str()); + treeNode=ImGui::TreeNodeEx(sysDefID.c_str(),i.orig.empty()?ImGuiTreeNodeFlags_SpanAvailWidth:0); ImGui::SameLine(); } if (!i.orig.empty()) { From afed13001a7c5a8a202627e80e49a11e2e651c93 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 18:20:12 -0500 Subject: [PATCH 14/17] GUI: prepare for user presets --- src/gui/newSong.cpp | 17 ++++++++++++++--- src/gui/presets.cpp | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index 21e60166e..08b30d7ae 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -169,6 +169,7 @@ void FurnaceGUI::drawNewSong() { if (ImGui::IsItemHovered()) { ImGui::SetTooltip("%s",i.description); } + if (strcmp(i.name,"User")==0) ImGui::Separator(); index++; } } @@ -177,9 +178,19 @@ void FurnaceGUI::drawNewSong() { ImGui::TableNextColumn(); if (ImGui::BeginTable("Systems",1,ImGuiTableFlags_BordersInnerV|ImGuiTableFlags_ScrollY)) { std::vector& category=(newSongQuery.empty())?(sysCategories[newSongCategory].systems):(newSongSearchResults); - sysDefStack.push_back(newSongQuery.empty()?newSongCategory:-1); - drawSysDefs(category,accepted,sysDefStack); - sysDefStack.erase(sysDefStack.end()-1); + if (category.empty()) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + if (newSongQuery.empty()) { + ImGui::Text("no systems here yet!"); + } else { + ImGui::Text("no results"); + } + } else { + sysDefStack.push_back(newSongQuery.empty()?newSongCategory:-1); + drawSysDefs(category,accepted,sysDefStack); + sysDefStack.erase(sysDefStack.end()-1); + } ImGui::EndTable(); } diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index c93781e86..c5c237e51 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -2428,6 +2428,8 @@ void FurnaceGUI::initSystemPresets() { ); CATEGORY_END; + CATEGORY_BEGIN("User","system presets that you have saved."); + 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( From 94ae06dd6e07bf1eab110d30be308747e1c5cdcc Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 18:29:21 -0500 Subject: [PATCH 15/17] define these two functions --- src/gui/gui.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/gui.h b/src/gui/gui.h index 8983e345a..c7a4c8c05 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2715,6 +2715,9 @@ class FurnaceGUI { void initTutorial(); void activateTutorial(FurnaceGUITutorials which); + bool loadUserPresets(); + bool saveUserPresets(); + void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop, int macroRel, bool hex=false, bool bit30=false); void decodeMMLStr(String& source, int* macro, unsigned char& macroLen, unsigned char& macroLoop, int macroMin, int macroMax, unsigned char& macroRel, bool bit30=false); void decodeMMLStrW(String& source, int* macro, int& macroLen, int macroMin, int macroMax, bool hex=false); From ad49ff1571ee5a0e1914810879fa605d13775375 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 20 Mar 2024 23:07:46 -0500 Subject: [PATCH 16/17] GUI: add option to set amount of cursor follows wh discussion #1811 --- src/gui/gui.h | 2 ++ src/gui/pattern.cpp | 8 +++++++- src/gui/settings.cpp | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index c7a4c8c05..27f9b9527 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1814,6 +1814,7 @@ class FurnaceGUI { int basicColors; int playbackTime; int shaderOsc; + int cursorWheelStep; unsigned int maxUndoSteps; String mainFontPath; String headFontPath; @@ -2018,6 +2019,7 @@ class FurnaceGUI { basicColors(1), playbackTime(1), shaderOsc(1), + cursorWheelStep(0), maxUndoSteps(100), mainFontPath(""), headFontPath(""), diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index 8c73b0645..f675f8e29 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -1179,7 +1179,13 @@ void FurnaceGUI::drawPattern() { // cursor follows wheel if (settings.cursorFollowsWheel && (!e->isPlaying() || !followPattern) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows)) { if (wheelX!=0 || wheelY!=0) { - moveCursor(wheelX,(settings.cursorFollowsWheel==2)?wheelY:-wheelY,false); + int xAmount=wheelX; + int yAmount=(settings.cursorFollowsWheel==2)?wheelY:-wheelY; + if (settings.cursorWheelStep==1) { + xAmount*=MAX(1,editStep); + yAmount*=MAX(1,editStep); + } + moveCursor(xAmount,yAmount,false); } } diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 33550f62f..ea069044a 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -2423,6 +2423,18 @@ void FurnaceGUI::drawSettings() { } ImGui::Unindent(); + if (settings.cursorFollowsWheel) { + ImGui::Text("How many steps to move with each scroll wheel step?"); + if (ImGui::RadioButton("One##cws0",settings.cursorWheelStep==0)) { + settings.cursorWheelStep=0; + settingsChanged=true; + } + if (ImGui::RadioButton("Edit Step##cws1",settings.cursorWheelStep==1)) { + settings.cursorWheelStep=1; + settingsChanged=true; + } + } + // SUBSECTION ASSETS CONFIG_SUBSECTION("Assets"); @@ -3992,6 +4004,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.insertBehavior=conf.getInt("insertBehavior",1); settings.pullDeleteRow=conf.getInt("pullDeleteRow",1); settings.cursorFollowsWheel=conf.getInt("cursorFollowsWheel",0); + settings.cursorWheelStep=conf.getInt("cursorWheelStep",0); settings.removeInsOff=conf.getInt("removeInsOff",0); settings.removeVolOff=conf.getInt("removeVolOff",0); settings.insTypeMenu=conf.getInt("insTypeMenu",1); @@ -4323,6 +4336,7 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { clampSetting(settings.playbackTime,0,1); clampSetting(settings.shaderOsc,0,1); clampSetting(settings.oscLineSize,0.25f,16.0f); + clampSetting(settings.cursorWheelStep,0,1); if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -4462,6 +4476,7 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("insertBehavior",settings.insertBehavior); conf.set("pullDeleteRow",settings.pullDeleteRow); conf.set("cursorFollowsWheel",settings.cursorFollowsWheel); + conf.set("cursorWheelStep",settings.cursorWheelStep); conf.set("removeInsOff",settings.removeInsOff); conf.set("removeVolOff",settings.removeVolOff); conf.set("insTypeMenu",settings.insTypeMenu); From 1373a66e2be1849e2ac23ec9f9ab15d4fca346c5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 21 Mar 2024 01:13:38 -0500 Subject: [PATCH 17/17] blalbaablabl --- src/gui/gui.h | 4 ++-- src/gui/presets.cpp | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/gui/gui.h b/src/gui/gui.h index 27f9b9527..6bf282eaf 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -2717,8 +2717,8 @@ class FurnaceGUI { void initTutorial(); void activateTutorial(FurnaceGUITutorials which); - bool loadUserPresets(); - bool saveUserPresets(); + bool loadUserPresets(bool redundancy=true); + bool saveUserPresets(bool redundancy=true); void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop, int macroRel, bool hex=false, bool bit30=false); void decodeMMLStr(String& source, int* macro, unsigned char& macroLen, unsigned char& macroLoop, int macroMin, int macroMax, unsigned char& macroRel, bool bit30=false); diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index c5c237e51..5157957f3 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -3121,3 +3121,12 @@ FurnaceGUISysDef::FurnaceGUISysDef(const char* n, std::initializer_list