Simplify the SRAM's representation in `NDSCartArgs` (#1914)
* Simplify the SRAM's representation in `NDSCartArgs` - I overthought this one. - I could've just checked `args && args->SRAM`, but then some other poor bastard might make this mistake. - Don't mix `pair`, `optional`, and `unique_ptr` all at once, kids. * Fix a `nullptr` read
This commit is contained in:
parent
24c402af51
commit
e1821d0023
|
@ -404,7 +404,11 @@ CartRetail::CartRetail(std::unique_ptr<u8[]>&& rom, u32 len, u32 chipid, bool ba
|
||||||
{ // Copy in what we can, truncate the rest.
|
{ // Copy in what we can, truncate the rest.
|
||||||
SRAM = std::make_unique<u8[]>(SRAMLength);
|
SRAM = std::make_unique<u8[]>(SRAMLength);
|
||||||
memset(SRAM.get(), 0xFF, SRAMLength);
|
memset(SRAM.get(), 0xFF, SRAMLength);
|
||||||
memcpy(SRAM.get(), sram.get(), std::min(sramlen, SRAMLength));
|
|
||||||
|
if (sram)
|
||||||
|
{ // If we have anything to copy, that is.
|
||||||
|
memcpy(SRAM.get(), sram.get(), std::min(sramlen, SRAMLength));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1650,7 +1654,8 @@ std::unique_ptr<CartCommon> ParseROM(std::unique_ptr<u8[]>&& romdata, u32 romlen
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<CartCommon> cart;
|
std::unique_ptr<CartCommon> cart;
|
||||||
auto [sram, sramlen] = args ? std::move(*args->SRAM) : std::make_pair(nullptr, 0);
|
std::unique_ptr<u8[]> sram = args ? std::move(args->SRAM) : nullptr;
|
||||||
|
u32 sramlen = args ? args->SRAMLength : 0;
|
||||||
if (homebrew)
|
if (homebrew)
|
||||||
cart = std::make_unique<CartHomebrew>(std::move(cartrom), cartromsize, cartid, romparams, args ? std::move(args->SDCard) : std::nullopt);
|
cart = std::make_unique<CartHomebrew>(std::move(cartrom), cartromsize, cartid, romparams, args ? std::move(args->SDCard) : std::nullopt);
|
||||||
else if (gametitle[0] == 0 && !strncmp("SD/TF-NDS", gametitle + 1, 9) && gamecode == 0x414D5341)
|
else if (gametitle[0] == 0 && !strncmp("SD/TF-NDS", gametitle + 1, 9) && gamecode == 0x414D5341)
|
||||||
|
|
|
@ -62,9 +62,14 @@ struct NDSCartArgs
|
||||||
std::optional<FATStorageArgs> SDCard = std::nullopt;
|
std::optional<FATStorageArgs> SDCard = std::nullopt;
|
||||||
|
|
||||||
/// Save RAM to load into the cartridge.
|
/// Save RAM to load into the cartridge.
|
||||||
/// If \c nullopt, then the cart's SRAM buffer will be empty.
|
/// If \c nullptr, then the cart's SRAM buffer will be empty.
|
||||||
/// Ignored for homebrew ROMs.
|
/// Ignored for homebrew ROMs.
|
||||||
std::optional<std::pair<std::unique_ptr<u8[]>, u32>> SRAM = std::nullopt;
|
std::unique_ptr<u8[]> SRAM = nullptr;
|
||||||
|
|
||||||
|
/// The length of the buffer in SRAM.
|
||||||
|
/// If 0, then the cart's SRAM buffer will be empty.
|
||||||
|
/// Ignored for homebrew ROMs.
|
||||||
|
u32 SRAMLength = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// CartCommon -- base code shared by all cart types
|
// CartCommon -- base code shared by all cart types
|
||||||
|
|
|
@ -1316,8 +1316,8 @@ bool LoadROM(EmuThread* emuthread, QStringList filepath, bool reset)
|
||||||
// the ROM is homebrew or not.
|
// the ROM is homebrew or not.
|
||||||
// So this is the card we *would* load if the ROM were homebrew.
|
// So this is the card we *would* load if the ROM were homebrew.
|
||||||
.SDCard = GetDLDISDCardArgs(),
|
.SDCard = GetDLDISDCardArgs(),
|
||||||
|
.SRAM = std::move(savedata),
|
||||||
.SRAM = std::make_pair(std::move(savedata), savelen),
|
.SRAMLength = savelen,
|
||||||
};
|
};
|
||||||
|
|
||||||
auto cart = NDSCart::ParseROM(std::move(filedata), filelen, std::move(cartargs));
|
auto cart = NDSCart::ParseROM(std::move(filedata), filelen, std::move(cartargs));
|
||||||
|
|
Loading…
Reference in New Issue