diff options
| author | GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> | 2022-10-21 23:22:49 +0200 |
|---|---|---|
| committer | GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> | 2022-10-22 13:36:55 +0200 |
| commit | 88c57a00a351148c7c66787dc3af1c2e5e641305 (patch) | |
| tree | 8ad36558cb020734631d9f5d33028390b957e8d4 /Source/Core | |
| parent | 82d20ce352f51d05fbdc998cc1abd4514d5623cc (diff) | |
Show vWii System Menu version in Menu Bar
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/IOS/ES/Formats.cpp | 5 | ||||
| -rw-r--r-- | Source/Core/Core/IOS/ES/Formats.h | 4 | ||||
| -rw-r--r-- | Source/Core/DiscIO/Enums.cpp | 114 | ||||
| -rw-r--r-- | Source/Core/DiscIO/Enums.h | 2 | ||||
| -rw-r--r-- | Source/Core/DolphinQt/MenuBar.cpp | 12 |
5 files changed, 86 insertions, 51 deletions
diff --git a/Source/Core/Core/IOS/ES/Formats.cpp b/Source/Core/Core/IOS/ES/Formats.cpp index 7adb86e772..f091cf1769 100644 --- a/Source/Core/Core/IOS/ES/Formats.cpp +++ b/Source/Core/Core/IOS/ES/Formats.cpp @@ -291,6 +291,11 @@ DiscIO::Region TMDReader::GetRegion() const return region <= DiscIO::Region::NTSC_K ? region : DiscIO::Region::Unknown; } +bool TMDReader::IsvWii() const +{ + return *(m_bytes.data() + offsetof(TMDHeader, is_vwii)); +} + std::string TMDReader::GetGameID() const { char game_id[6]; diff --git a/Source/Core/Core/IOS/ES/Formats.h b/Source/Core/Core/IOS/ES/Formats.h index 5918a04a0e..d1c19ce75c 100644 --- a/Source/Core/Core/IOS/ES/Formats.h +++ b/Source/Core/Core/IOS/ES/Formats.h @@ -68,6 +68,8 @@ struct TMDHeader u8 tmd_version; u8 ca_crl_version; u8 signer_crl_version; + // This is usually an always 0 padding byte, which is set to 1 on vWii TMDs + u8 is_vwii; u64 ios_id; u64 title_id; u32 title_flags; @@ -85,6 +87,7 @@ struct TMDHeader u16 fill2; }; static_assert(sizeof(TMDHeader) == 0x1e4, "TMDHeader has the wrong size"); +static_assert(offsetof(TMDHeader, ios_id) == 0x184); struct Content { @@ -200,6 +203,7 @@ public: u16 GetTitleVersion() const; u16 GetGroupId() const; DiscIO::Region GetRegion() const; + bool IsvWii() const; // Constructs a 6-character game ID in the format typically used by Dolphin. // If the 6-character game ID would contain unprintable characters, diff --git a/Source/Core/DiscIO/Enums.cpp b/Source/Core/DiscIO/Enums.cpp index 0594e3161a..393f30076f 100644 --- a/Source/Core/DiscIO/Enums.cpp +++ b/Source/Core/DiscIO/Enums.cpp @@ -362,7 +362,7 @@ Region GetSysMenuRegion(u16 title_version) } } -std::string GetSysMenuVersionString(u16 title_version) +std::string GetSysMenuVersionString(u16 title_version, bool is_vwii) { std::string version; char region_letter = '\0'; @@ -386,52 +386,74 @@ std::string GetSysMenuVersionString(u16 title_version) break; } - switch (title_version & 0xff0) + if (is_vwii) { - case 32: - version = "1.0"; - break; - case 96: - case 128: - version = "2.0"; - break; - case 160: - version = "2.1"; - break; - case 192: - version = "2.2"; - break; - case 224: - version = "3.0"; - break; - case 256: - version = "3.1"; - break; - case 288: - version = "3.2"; - break; - case 320: - case 352: - version = "3.3"; - break; - case 384: - version = (region_letter != 'K' ? "3.4" : "3.5"); - break; - case 416: - version = "4.0"; - break; - case 448: - version = "4.1"; - break; - case 480: - version = "4.2"; - break; - case 512: - version = "4.3"; - break; - default: - version = "?.?"; - break; + // For vWii return the Wii U version which installed the menu + switch (title_version & 0xff0) + { + case 512: + version = "1.0.0"; + break; + case 544: + version = "4.0.0"; + break; + case 608: + version = "5.2.0"; + break; + default: + version = "?.?.?"; + break; + } + } + else + { + switch (title_version & 0xff0) + { + case 32: + version = "1.0"; + break; + case 96: + case 128: + version = "2.0"; + break; + case 160: + version = "2.1"; + break; + case 192: + version = "2.2"; + break; + case 224: + version = "3.0"; + break; + case 256: + version = "3.1"; + break; + case 288: + version = "3.2"; + break; + case 320: + case 352: + version = "3.3"; + break; + case 384: + version = (region_letter != 'K' ? "3.4" : "3.5"); + break; + case 416: + version = "4.0"; + break; + case 448: + version = "4.1"; + break; + case 480: + version = "4.2"; + break; + case 512: + version = "4.3"; + break; + default: + version = "?.?"; + break; + } } if (region_letter != '\0') diff --git a/Source/Core/DiscIO/Enums.h b/Source/Core/DiscIO/Enums.h index 087234b59d..ebbef8cd42 100644 --- a/Source/Core/DiscIO/Enums.h +++ b/Source/Core/DiscIO/Enums.h @@ -88,7 +88,7 @@ Country CountryCodeToCountry(u8 country_code, Platform platform, Region region = std::optional<u16> revision = {}); Region GetSysMenuRegion(u16 title_version); -std::string GetSysMenuVersionString(u16 title_version); +std::string GetSysMenuVersionString(u16 title_version, bool is_vwii); const std::string& GetCompanyFromID(const std::string& company_id); } // namespace DiscIO diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp index f901f3e726..f36a1d9a1d 100644 --- a/Source/Core/DolphinQt/MenuBar.cpp +++ b/Source/Core/DolphinQt/MenuBar.cpp @@ -1010,10 +1010,14 @@ void MenuBar::UpdateToolsMenu(bool emulation_started) const auto tmd = ios.GetES()->FindInstalledTMD(Titles::SYSTEM_MENU); const QString sysmenu_version = - tmd.IsValid() ? - QString::fromStdString(DiscIO::GetSysMenuVersionString(tmd.GetTitleVersion())) : - QString{}; - m_boot_sysmenu->setText(tr("Load Wii System Menu %1").arg(sysmenu_version)); + tmd.IsValid() ? QString::fromStdString( + DiscIO::GetSysMenuVersionString(tmd.GetTitleVersion(), tmd.IsvWii())) : + QString{}; + + const QString sysmenu_text = (tmd.IsValid() && tmd.IsvWii()) ? tr("Load vWii System Menu %1") : + tr("Load Wii System Menu %1"); + + m_boot_sysmenu->setText(sysmenu_text.arg(sysmenu_version)); m_boot_sysmenu->setEnabled(tmd.IsValid()); |
