Add Triforce platform and preliminary boot.id parsing

This commit is contained in:
Zopolis4 2021-08-10 07:49:34 +10:00
parent 494e2c05c2
commit 71f654cdc4
No known key found for this signature in database
GPG key ID: C1117D56FBC82774
15 changed files with 41 additions and 4 deletions

View file

@ -139,7 +139,8 @@ std::string GetName(Region region, bool translate)
bool IsDisc(Platform volume_type)
{
return volume_type == Platform::GameCubeDisc || volume_type == Platform::WiiDisc;
return volume_type == Platform::GameCubeDisc || volume_type == Platform::Triforce ||
volume_type == Platform::WiiDisc;
}
bool IsWii(Platform volume_type)

View file

@ -15,6 +15,7 @@ namespace DiscIO
enum class Platform
{
GameCubeDisc = 0,
Triforce,
WiiDisc,
WiiWAD,
ELFOrDOL,

View file

@ -29,7 +29,8 @@
namespace DiscIO
{
VolumeGC::VolumeGC(std::unique_ptr<BlobReader> reader) : m_reader(std::move(reader))
VolumeGC::VolumeGC(std::unique_ptr<BlobReader> reader)
: m_reader(std::move(reader)), m_is_triforce(false)
{
ASSERT(m_reader);
@ -39,6 +40,20 @@ VolumeGC::VolumeGC(std::unique_ptr<BlobReader> reader) : m_reader(std::move(read
};
m_converted_banner = [this] { return LoadBannerFile(); };
constexpr u32 BTID_MAGIC = 0x44495442;
auto tmp_fs = GetFileSystem(PARTITION_NONE);
if (tmp_fs)
{
std::unique_ptr<FileInfo> file_info = tmp_fs->FindFileInfo("boot.id");
if (!file_info)
return;
u32 triforce_magic; // "BTID"
const u64 file_size = ReadFile(*this, PARTITION_NONE, file_info.get(),
reinterpret_cast<u8*>(&triforce_magic), sizeof(triforce_magic));
if (file_size >= 4 && triforce_magic == BTID_MAGIC)
m_is_triforce = true;
}
}
VolumeGC::~VolumeGC() = default;
@ -139,7 +154,10 @@ const BlobReader& VolumeGC::GetBlobReader() const
Platform VolumeGC::GetVolumeType() const
{
return Platform::GameCubeDisc;
if (m_is_triforce)
return Platform::Triforce;
else
return Platform::GameCubeDisc;
}
bool VolumeGC::IsDatelDisc() const

View file

@ -103,6 +103,8 @@ private:
Common::Lazy<std::unique_ptr<FileSystem>> m_file_system;
std::unique_ptr<BlobReader> m_reader;
bool m_is_triforce;
};
} // namespace DiscIO

View file

@ -402,6 +402,7 @@ void VolumeVerifier::Start()
m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;
m_is_datel = m_volume.IsDatelDisc();
m_is_triforce = m_volume.GetVolumeType() == Platform::Triforce;
m_is_not_retail = (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.HasWiiHashes()) ||
IsDebugSigned();
@ -1373,6 +1374,13 @@ void VolumeVerifier::Finish()
return;
}
if (m_is_triforce)
{
m_result.summary_text =
Common::GetStringT("Dolphin is currently unable to verify Triforce games.");
return;
}
if (m_result.redump.status == RedumpVerifier::Status::BadDump &&
highest_severity <= Severity::Low)
{

View file

@ -165,6 +165,7 @@ private:
Result m_result;
bool m_is_tgc = false;
bool m_is_datel = false;
bool m_is_triforce = false;
bool m_is_not_retail = false;
bool m_redump_verification;