diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index 11f3e7a51..8d2c6876b 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -2036,8 +2036,24 @@ void CDROM::ExecuteTestCommand(u8 subcommand) { Log_DebugPrintf("Get CDROM BIOS Date/Version"); - static constexpr u8 response[] = {0x95, 0x05, 0x16, 0xC1}; - s_response_fifo.PushRange(response, countof(response)); + static constexpr const u8 version_table[][4] = { + {0x94, 0x09, 0x19, 0xC0}, // PSX (PU-7) 19 Sep 1994, version vC0 (a) + {0x94, 0x11, 0x18, 0xC0}, // PSX (PU-7) 18 Nov 1994, version vC0 (b) + {0x95, 0x05, 0x16, 0xC1}, // PSX (EARLY-PU-8) 16 May 1995, version vC1 (a) + {0x95, 0x07, 0x24, 0xC1}, // PSX (LATE-PU-8) 24 Jul 1995, version vC1 (b) + {0x95, 0x07, 0x24, 0xD1}, // PSX (LATE-PU-8,debug ver)24 Jul 1995, version vD1 (debug) + {0x96, 0x08, 0x15, 0xC2}, // PSX (PU-16, Video CD) 15 Aug 1996, version vC2 (VCD) + {0x96, 0x08, 0x18, 0xC1}, // PSX (LATE-PU-8,yaroze) 18 Aug 1996, version vC1 (yaroze) + {0x96, 0x09, 0x12, 0xC2}, // PSX (PU-18) (japan) 12 Sep 1996, version vC2 (a.jap) + {0x97, 0x01, 0x10, 0xC2}, // PSX (PU-18) (us/eur) 10 Jan 1997, version vC2 (a) + {0x97, 0x08, 0x14, 0xC2}, // PSX (PU-20) 14 Aug 1997, version vC2 (b) + {0x98, 0x06, 0x10, 0xC3}, // PSX (PU-22) 10 Jul 1998, version vC3 (a) + {0x99, 0x02, 0x01, 0xC3}, // PSX/PSone (PU-23, PM-41) 01 Feb 1999, version vC3 (b) + {0xA1, 0x03, 0x06, 0xC3}, // PSone/late (PM-41(2)) 06 Jun 2001, version vC3 (c) + }; + + s_response_fifo.PushRange(version_table[static_cast(g_settings.cdrom_mechacon_version)], + countof(version_table[0])); SetInterrupt(Interrupt::ACK); EndCommand(); return; diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 8aafd57d2..c8cf14e78 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -259,6 +259,10 @@ void Settings::Load(SettingsInterface& si) cdrom_readahead_sectors = static_cast(si.GetIntValue("CDROM", "ReadaheadSectors", DEFAULT_CDROM_READAHEAD_SECTORS)); + cdrom_mechacon_version = + ParseCDROMMechVersionName( + si.GetStringValue("CDROM", "MechaconVersion", GetCDROMMechVersionName(DEFAULT_CDROM_MECHACON_VERSION)).c_str()) + .value_or(DEFAULT_CDROM_MECHACON_VERSION); cdrom_region_check = si.GetBoolValue("CDROM", "RegionCheck", false); cdrom_load_image_to_ram = si.GetBoolValue("CDROM", "LoadImageToRAM", false); cdrom_load_image_patches = si.GetBoolValue("CDROM", "LoadImagePatches", false); @@ -489,6 +493,7 @@ void Settings::Save(SettingsInterface& si) const si.SetFloatValue("Display", "OSDScale", display_osd_scale); si.SetIntValue("CDROM", "ReadaheadSectors", cdrom_readahead_sectors); + si.SetStringValue("CDROM", "MechaconVersion", GetCDROMMechVersionName(cdrom_mechacon_version)); si.SetBoolValue("CDROM", "RegionCheck", cdrom_region_check); si.SetBoolValue("CDROM", "LoadImageToRAM", cdrom_load_image_to_ram); si.SetBoolValue("CDROM", "LoadImagePatches", cdrom_load_image_patches); @@ -1403,6 +1408,37 @@ const char* Settings::GetMultitapModeDisplayName(MultitapMode mode) return Host::TranslateToCString("MultitapMode", s_multitap_enable_mode_display_names[static_cast(mode)]); } +static constexpr const std::array s_mechacon_version_names = {"VC0A", "VC0B", "VC1A", "VC1B", "VD1", "VC2", "VC1", + "VC2J", "VC2A", "VC2B", "VC3A", "VC3B", "VC3C"}; +static constexpr const std::array s_mechacon_version_display_names = { + "94/09/19 (VC0A)", "94/11/18 (VC0B)", "95/05/16 (VC1A)", "95/07/24 (VC1B)", "95/07/24 (VD1)", + "96/08/15 (VC2)", "96/08/18 (VC1)", "96/09/12 (VC2J)", "97/01/10 (VC2A)", "97/08/14 (VC2B)", + "98/06/10 (VC3A)", "99/02/01 (VC3B)", "01/03/06 (VC3C)"}; + +std::optional Settings::ParseCDROMMechVersionName(const char* str) +{ + u32 index = 0; + for (const char* name : s_mechacon_version_names) + { + if (StringUtil::Strcasecmp(name, str) == 0) + return static_cast(index); + + index++; + } + + return std::nullopt; +} + +const char* Settings::GetCDROMMechVersionName(CDROMMechaconVersion mode) +{ + return s_mechacon_version_names[static_cast(mode)]; +} + +const char* Settings::GetCDROMMechVersionDisplayName(CDROMMechaconVersion mode) +{ + return s_mechacon_version_display_names[static_cast(mode)]; +} + std::string EmuFolders::AppRoot; std::string EmuFolders::DataRoot; std::string EmuFolders::Bios; diff --git a/src/core/settings.h b/src/core/settings.h index 40c02f251..427b93922 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -151,6 +151,7 @@ struct Settings float gpu_pgxp_depth_clear_threshold = DEFAULT_GPU_PGXP_DEPTH_THRESHOLD / GPU_PGXP_DEPTH_THRESHOLD_SCALE; u8 cdrom_readahead_sectors = DEFAULT_CDROM_READAHEAD_SECTORS; + CDROMMechaconVersion cdrom_mechacon_version = DEFAULT_CDROM_MECHACON_VERSION; bool cdrom_region_check = false; bool cdrom_load_image_to_ram = false; bool cdrom_load_image_patches = false; @@ -405,6 +406,10 @@ struct Settings static const char* GetMultitapModeName(MultitapMode mode); static const char* GetMultitapModeDisplayName(MultitapMode mode); + static std::optional ParseCDROMMechVersionName(const char* str); + static const char* GetCDROMMechVersionName(CDROMMechaconVersion mode); + static const char* GetCDROMMechVersionDisplayName(CDROMMechaconVersion mode); + static constexpr GPURenderer DEFAULT_GPU_RENDERER = GPURenderer::Automatic; static constexpr GPUTextureFilter DEFAULT_GPU_TEXTURE_FILTER = GPUTextureFilter::Nearest; static constexpr GPUDownsampleMode DEFAULT_GPU_DOWNSAMPLE_MODE = GPUDownsampleMode::Disabled; @@ -447,6 +452,7 @@ struct Settings static constexpr float DEFAULT_OSD_SCALE = 100.0f; static constexpr u8 DEFAULT_CDROM_READAHEAD_SECTORS = 8; + static constexpr CDROMMechaconVersion DEFAULT_CDROM_MECHACON_VERSION = CDROMMechaconVersion::VC1A; static constexpr ControllerType DEFAULT_CONTROLLER_1_TYPE = ControllerType::AnalogController; static constexpr ControllerType DEFAULT_CONTROLLER_2_TYPE = ControllerType::None; diff --git a/src/core/types.h b/src/core/types.h index 506784e11..320d647ea 100644 --- a/src/core/types.h +++ b/src/core/types.h @@ -204,3 +204,22 @@ enum class CPUFastmemMode LUT, Count }; + +enum class CDROMMechaconVersion : u8 +{ + VC0A, + VC0B, + VC1A, + VC1B, + VD1, + VC2, + VC1, + VC2J, + VC2A, + VC2B, + VC3A, + VC3B, + VC3C, + + Count, +}; diff --git a/src/duckstation-qt/advancedsettingswidget.cpp b/src/duckstation-qt/advancedsettingswidget.cpp index 24c56215a..5c3994356 100644 --- a/src/duckstation-qt/advancedsettingswidget.cpp +++ b/src/duckstation-qt/advancedsettingswidget.cpp @@ -347,6 +347,10 @@ void AdvancedSettingsWidget::addTweakOptions() addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Increase Timer Resolution"), "Main", "IncreaseTimerResolution", true); + addChoiceTweakOption(m_dialog, m_ui.tweakOptionTable, tr("CD-ROM Mechacon Version"), "CDROM", "MechaconVersion", + Settings::ParseCDROMMechVersionName, Settings::GetCDROMMechVersionName, + Settings::GetCDROMMechVersionDisplayName, static_cast(CDROMMechaconVersion::Count), + Settings::DEFAULT_CDROM_MECHACON_VERSION); addBooleanTweakOption(m_dialog, m_ui.tweakOptionTable, tr("Allow Booting Without SBI File"), "CDROM", "AllowBootingWithoutSBIFile", false); @@ -399,11 +403,13 @@ void AdvancedSettingsWidget::onResetToDefaultClicked() setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Disable Shader Cache setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Stretch Display Vertically setBooleanTweakOption(m_ui.tweakOptionTable, i++, true); // Increase Timer Resolution - setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Allow booting without SBI file - setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Create save state backups - setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Enable PCDRV - setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Enable PCDRV Writes - setDirectoryOption(m_ui.tweakOptionTable, i++, ""); // PCDrv Root Directory + setChoiceTweakOption(m_ui.tweakOptionTable, i++, + Settings::DEFAULT_CDROM_MECHACON_VERSION); // CDROM Mechacon Version + setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Allow booting without SBI file + setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Create save state backups + setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Enable PCDRV + setBooleanTweakOption(m_ui.tweakOptionTable, i++, false); // Enable PCDRV Writes + setDirectoryOption(m_ui.tweakOptionTable, i++, ""); // PCDrv Root Directory return; } @@ -443,6 +449,7 @@ void AdvancedSettingsWidget::onResetToDefaultClicked() sif->DeleteValue("GPU", "UseDebugDevice"); sif->DeleteValue("Display", "StretchVertically"); sif->DeleteValue("Main", "IncreaseTimerResolution"); + sif->DeleteValue("CDROM", "MechaconVersion"); sif->DeleteValue("CDROM", "AllowBootingWithoutSBIFile"); sif->DeleteValue("General", "CreateSaveStateBackups"); sif->DeleteValue("PCDrv", "Enabled");