summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2026-02-07 23:08:37 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2026-02-15 20:14:15 -0600
commita4fd5f8343a1007f46aff877a71cb853a2c6ecee (patch)
tree3d6d896127c63fbfba65fb517fd985765ea4d737 /Source
parent3681cade416a025ca24c35b4d176537c53b48a4f (diff)
Triforce: Lazily load the game into memory using CachedBlobReader.
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/Boot/Boot_BS2Emu.cpp11
-rw-r--r--Source/Core/Core/HW/DVD/AMMediaboard.cpp36
-rw-r--r--Source/Core/Core/HW/DVD/AMMediaboard.h4
3 files changed, 18 insertions, 33 deletions
diff --git a/Source/Core/Core/Boot/Boot_BS2Emu.cpp b/Source/Core/Core/Boot/Boot_BS2Emu.cpp
index b462e89edc..a44796dd4f 100644
--- a/Source/Core/Core/Boot/Boot_BS2Emu.cpp
+++ b/Source/Core/Core/Boot/Boot_BS2Emu.cpp
@@ -233,17 +233,8 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard
if (system.IsTriforce())
{
auto& memory = system.GetMemory();
- const u32 disc_size = volume.GetDataSize();
- // Load game into RAM, like on the actual Triforce
- u8* dimm = AMMediaboard::InitDIMM(disc_size);
- if (!dimm)
- {
- ERROR_LOG_FMT(BOOT, "AMMediaboard::InitDIMM failed");
- return false;
- }
-
- volume.Read(0, disc_size, dimm, DiscIO::PARTITION_NONE);
+ AMMediaboard::InitDIMM(volume);
// Triforce disc register obfuscation
AMMediaboard::InitKeys(memory.Read_U32(0), memory.Read_U32(4), memory.Read_U32(8));
diff --git a/Source/Core/Core/HW/DVD/AMMediaboard.cpp b/Source/Core/Core/HW/DVD/AMMediaboard.cpp
index 0c2260628c..4ceca81925 100644
--- a/Source/Core/Core/HW/DVD/AMMediaboard.cpp
+++ b/Source/Core/Core/HW/DVD/AMMediaboard.cpp
@@ -11,7 +11,6 @@
#include <fmt/format.h>
-#include "Common/Buffer.h"
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/IOFile.h"
@@ -37,6 +36,8 @@
#include "Core/Movie.h"
#include "Core/System.h"
+#include "DiscIO/CachedBlob.h"
+
#if defined(__linux__) or defined(__APPLE__) or defined(__FreeBSD__) or defined(__NetBSD__) or \
defined(__HAIKU__)
@@ -142,7 +143,7 @@ static File::IOFile s_extra;
static File::IOFile s_backup;
static File::IOFile s_dimm;
-static Common::UniqueBuffer<u8> s_dimm_disc;
+static std::unique_ptr<DiscIO::BlobReader> s_dimm_disc;
static u8 s_firmware[2 * 1024 * 1024];
static u32 s_media_buffer_32[192];
@@ -499,20 +500,10 @@ void Init()
s_test_menu = true;
}
-u8* InitDIMM(u32 size)
+void InitDIMM(const DiscIO::Volume& volume)
{
- if (size == 0)
- return nullptr;
-
- s_dimm_disc.reset(size);
- if (s_dimm_disc.empty())
- {
- PanicAlertFmt("Failed to allocate DIMM memory.");
- return nullptr;
- }
-
- s_firmware_map = false;
- return s_dimm_disc.data();
+ // Load game into RAM, like on the actual Triforce.
+ s_dimm_disc = DiscIO::CreateCachedBlobReader(volume.GetBlobReader().CopyReader());
}
static int PlatformPoll(std::span<WSAPOLLFD> pfds, std::chrono::milliseconds timeout)
@@ -1556,13 +1547,13 @@ u32 ExecuteCommand(std::array<u32, 3>& dicmd_buf, u32* diimm_buf, u32 address, u
return 0;
}
- if (s_dimm_disc.size())
+ if (const auto span = memory.GetSpanForAddress(address); span.size() < length)
+ {
+ ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: Invalid DIMM Disc read from: offset={}, length={}",
+ offset, length);
+ }
+ else if (s_dimm_disc->Read(offset, length, span.data()))
{
- if (!SafeCopyToEmu(memory, address, s_dimm_disc.data(), s_dimm_disc.size(), offset, length))
- {
- ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: Invalid DIMM Disc read from: offset={}, length={}",
- offset, length);
- }
return 0;
}
@@ -1996,7 +1987,8 @@ void Shutdown()
s_extra.Close();
s_backup.Close();
s_dimm.Close();
- s_dimm_disc.clear();
+
+ s_dimm_disc.reset();
CloseAllSockets();
}
diff --git a/Source/Core/Core/HW/DVD/AMMediaboard.h b/Source/Core/Core/HW/DVD/AMMediaboard.h
index f5d19662ea..8ca7c7d9fd 100644
--- a/Source/Core/Core/HW/DVD/AMMediaboard.h
+++ b/Source/Core/Core/HW/DVD/AMMediaboard.h
@@ -11,6 +11,8 @@
#include "Common/ChunkFile.h"
#include "Common/CommonTypes.h"
+#include "DiscIO/Volume.h"
+
enum GameType
{
FZeroAX = 1,
@@ -230,7 +232,7 @@ enum SocketStatusCodes
void Init();
void FirmwareMap(bool on);
-u8* InitDIMM(u32 size);
+void InitDIMM(const DiscIO::Volume& volume);
void InitKeys(u32 key_a, u32 key_b, u32 key_c);
u32 ExecuteCommand(std::array<u32, 3>& dicmd_buf, u32* diimm_buf, u32 address, u32 length);
u32 GetGameType();