diff options
Diffstat (limited to 'Source/Core/DiscIO/VolumeDisc.cpp')
| -rw-r--r-- | Source/Core/DiscIO/VolumeDisc.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/Source/Core/DiscIO/VolumeDisc.cpp b/Source/Core/DiscIO/VolumeDisc.cpp new file mode 100644 index 0000000000..bf622bb8fb --- /dev/null +++ b/Source/Core/DiscIO/VolumeDisc.cpp @@ -0,0 +1,87 @@ +// Copyright 2020 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "DiscIO/VolumeDisc.h" + +#include <optional> +#include <string> + +#include "Common/CommonTypes.h" +#include "DiscIO/Enums.h" + +namespace DiscIO +{ +std::string VolumeDisc::GetGameID(const Partition& partition) const +{ + char id[6]; + + if (!Read(0, sizeof(id), reinterpret_cast<u8*>(id), partition)) + return std::string(); + + return DecodeString(id); +} + +Country VolumeDisc::GetCountry(const Partition& partition) const +{ + // The 0 that we use as a default value is mapped to Country::Unknown and Region::Unknown + const u8 country_byte = ReadSwapped<u8>(3, partition).value_or(0); + const Region region = GetRegion(); + const std::optional<u16> revision = GetRevision(); + + if (CountryCodeToRegion(country_byte, GetVolumeType(), region, revision) != region) + return TypicalCountryForRegion(region); + + return CountryCodeToCountry(country_byte, GetVolumeType(), region, revision); +} + +Region VolumeDisc::RegionCodeToRegion(std::optional<u32> region_code) const +{ + if (!region_code) + return Region::Unknown; + + const Region region = static_cast<Region>(*region_code); + return region <= Region::NTSC_K ? region : Region::Unknown; +} + +std::string VolumeDisc::GetMakerID(const Partition& partition) const +{ + char maker_id[2]; + + if (!Read(0x4, sizeof(maker_id), reinterpret_cast<u8*>(&maker_id), partition)) + return std::string(); + + return DecodeString(maker_id); +} + +std::optional<u16> VolumeDisc::GetRevision(const Partition& partition) const +{ + std::optional<u8> revision = ReadSwapped<u8>(7, partition); + return revision ? *revision : std::optional<u16>(); +} + +std::string VolumeDisc::GetInternalName(const Partition& partition) const +{ + char name[0x60]; + if (!Read(0x20, sizeof(name), reinterpret_cast<u8*>(&name), partition)) + return std::string(); + + return DecodeString(name); +} + +std::string VolumeDisc::GetApploaderDate(const Partition& partition) const +{ + char date[16]; + + if (!Read(0x2440, sizeof(date), reinterpret_cast<u8*>(&date), partition)) + return std::string(); + + return DecodeString(date); +} + +std::optional<u8> VolumeDisc::GetDiscNumber(const Partition& partition) const +{ + return ReadSwapped<u8>(6, partition); +} + +} // namespace DiscIO |
