Prevent annoying waits when using firmware manager with DSi NANDs present

This commit is contained in:
CasualPokePlayer 2023-05-03 02:19:56 -07:00
parent 5f6d70ac46
commit 36fae775d4
2 changed files with 16 additions and 6 deletions

View File

@ -15,6 +15,7 @@ namespace BizHawk.Client.Common
public sealed class FirmwareManager
{
private static readonly FirmwareID NDS_FIRMWARE = new("NDS", "firmware");
private const int DSI_NAND_LENGTH = 251658240 + 64;
public static (byte[] Patched, string ActualHash) PerformPatchInMemory(byte[] @base, in FirmwarePatchOption patchOption)
{
@ -101,6 +102,15 @@ namespace BizHawk.Client.Common
public RealFirmwareFile Read(FileInfo fi)
{
using var fs = fi.OpenRead();
// DSi NAND is huge, and the hash is useless (can't use it to identify a good dump)
// Not sure how well the system can handle a dummy hash, so let's just hash the nocash footer (which should be unique for each NAND)
if (fs.Length == DSI_NAND_LENGTH)
{
fs.Seek(-64, SeekOrigin.End);
// we can let it fall through here, as ReadAllBytes just reads all bytes starting from the stream position :)
}
var hash = SHA1Checksum.ComputeDigestHex(fs.ReadAllBytes());
return _dict![hash] = new RealFirmwareFile(fi, hash);
}

View File

@ -158,12 +158,12 @@ namespace BizHawk.Emulation.Common
FirmwareAndOption(SHA1Checksum.Dummy, 131072, "NDS", "firmwarei", "DSi_Firmware.bin", "DSi Firmware");
// options for each region due to region locking of the DSi
// also, the sizes include the "nocash footer" which contains the eMMC CID and CPU/Console ID
FirmwareAndOption(SHA1Checksum.Dummy, 251658264 + 40, "NDS", "NAND (JPN)", "DSi_Nand_JPN.bin", "DSi NAND (Japan)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658264 + 40, "NDS", "NAND (EUR)", "DSi_Nand_EUR.bin", "DSi NAND (Europe)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658264 + 40, "NDS", "NAND (USA)", "DSi_Nand_USA.bin", "DSi NAND (USA)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658264 + 40, "NDS", "NAND (AUS)", "DSi_Nand_AUS.bin", "DSi NAND (Australia)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658264 + 40, "NDS", "NAND (CHN)", "DSi_Nand_CHN.bin", "DSi NAND (China)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658264 + 40, "NDS", "NAND (KOR)", "DSi_Nand_KOR.bin", "DSi NAND (Korea)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658240 + 64, "NDS", "NAND (JPN)", "DSi_Nand_JPN.bin", "DSi NAND (Japan)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658240 + 64, "NDS", "NAND (EUR)", "DSi_Nand_EUR.bin", "DSi NAND (Europe)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658240 + 64, "NDS", "NAND (USA)", "DSi_Nand_USA.bin", "DSi NAND (USA)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658240 + 64, "NDS", "NAND (AUS)", "DSi_Nand_AUS.bin", "DSi NAND (Australia)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658240 + 64, "NDS", "NAND (CHN)", "DSi_Nand_CHN.bin", "DSi NAND (China)");
FirmwareAndOption(SHA1Checksum.Dummy, 251658240 + 64, "NDS", "NAND (KOR)", "DSi_Nand_KOR.bin", "DSi NAND (Korea)");
FirmwareAndOption("E4ED47FAE31693E016B081C6BDA48DA5B70D7CCB", 512, "Lynx", "Boot", "LYNX_boot.img", "Boot Rom");