Core: Add Volume::GetSimulatedMemorySize().

The data structure of the `bi2.bin` file in which the simulated memory
size is set:

> **13.2  Disk header Information**
>
> this is loaded to the Address in `0x800000f4` when a disc is initialized by the IPL
>
> |  offset  | end | size | Description           |
> | :------: | --- | :--: | --------------------- |
> | `0x0000` |     |   4  | Debug-monitor Size    |
> | `0x0004` |     |   4  | Simulated Memory Size |
> | `0x0008` |     |   4  | Argument offset       |
> | `0x000c` |     |   4  | Debug flag            |
> | `0x0010` |     |   4  | Track Location        |
> | `0x0014` |     |   4  | Track size            |
> | `0x0018` |     |   4  | Countrycode           |
> | `0x001c` |     |   4  | ?                     |

See https://hitmen.c02.at/files/yagcd/yagcd/chap13.html#sec13.2.

Most GameCube games set the value to `24 MiB`, which matches the
physical memory size. Most Wii games set the value to `0 MiB` (unset).
The debug build of _Mario Kart: Double Dash!!_ is one game that sets the
value to `48 MiB`.
This commit is contained in:
cristian64
2026-03-27 11:30:52 +00:00
parent 6de526c684
commit 24ad562871
4 changed files with 11 additions and 0 deletions
+1
View File
@@ -126,6 +126,7 @@ public:
}
virtual Region GetRegion() const = 0;
virtual Country GetCountry(const Partition& partition = PARTITION_NONE) const = 0;
virtual u32 GetSimulatedMemorySize() const = 0;
virtual BlobType GetBlobType() const = 0;
// Size of virtual disc (may be inaccurate depending on the blob type)
virtual u64 GetDataSize() const = 0;
+8
View File
@@ -179,6 +179,14 @@ std::optional<u8> VolumeDisc::GetDiscNumber(const Partition& partition) const
return ReadSwapped<u8>(6, partition);
}
u32 VolumeDisc::GetSimulatedMemorySize() const
{
// Simulated memory size is a 32-bit unsigned integer in the `bi2.bin` file at offset `0x04`.
// Apploader reads this and "simulates" a smaller memory size. Originally useful for simulating
// 24 MiB of memory on devkits with 48 MiB.
return ReadSwapped<u32>(BI2_ADDRESS + 0x04, GetGamePartition()).value_or(0);
}
bool VolumeDisc::IsNKit() const
{
constexpr u32 NKIT_MAGIC = 0x4E4B4954; // "NKIT"
+1
View File
@@ -47,6 +47,7 @@ public:
std::string GetInternalName(const Partition& partition = PARTITION_NONE) const override;
std::string GetApploaderDate(const Partition& partition) const override;
std::optional<u8> GetDiscNumber(const Partition& partition = PARTITION_NONE) const override;
u32 GetSimulatedMemorySize() const override;
bool IsNKit() const override;
protected:
+1
View File
@@ -61,6 +61,7 @@ public:
bool IsNKit() const override;
Region GetRegion() const override;
Country GetCountry(const Partition& partition = PARTITION_NONE) const override;
u32 GetSimulatedMemorySize() const override { return 0; }
BlobType GetBlobType() const override;
u64 GetDataSize() const override;