aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Talavera <jesse@jesse.tg>2023-12-15 08:56:10 -0500
committerGitHub <noreply@github.com>2023-12-15 14:56:10 +0100
commite1821d00235d33b2fe384fffa7e34b00b7af3ec9 (patch)
treed3d02ec34f90c72dbe50805e94923af7337f2966
parent24c402af51fe9c0537582173fc48d1ad3daff459 (diff)
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
-rw-r--r--src/NDSCart.cpp9
-rw-r--r--src/NDSCart.h9
-rw-r--r--src/frontend/qt_sdl/ROMManager.cpp4
3 files changed, 16 insertions, 6 deletions
diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp
index 1f2fe69..a5fe318 100644
--- a/src/NDSCart.cpp
+++ b/src/NDSCart.cpp
@@ -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.
SRAM = std::make_unique<u8[]>(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;
- 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)
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)
diff --git a/src/NDSCart.h b/src/NDSCart.h
index 7d482ab..78439a2 100644
--- a/src/NDSCart.h
+++ b/src/NDSCart.h
@@ -62,9 +62,14 @@ struct NDSCartArgs
std::optional<FATStorageArgs> SDCard = std::nullopt;
/// 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.
- 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
diff --git a/src/frontend/qt_sdl/ROMManager.cpp b/src/frontend/qt_sdl/ROMManager.cpp
index b065ad1..a20af20 100644
--- a/src/frontend/qt_sdl/ROMManager.cpp
+++ b/src/frontend/qt_sdl/ROMManager.cpp
@@ -1316,8 +1316,8 @@ bool LoadROM(EmuThread* emuthread, QStringList filepath, bool reset)
// the ROM is homebrew or not.
// So this is the card we *would* load if the ROM were homebrew.
.SDCard = GetDLDISDCardArgs(),
-
- .SRAM = std::make_pair(std::move(savedata), savelen),
+ .SRAM = std::move(savedata),
+ .SRAMLength = savelen,
};
auto cart = NDSCart::ParseROM(std::move(filedata), filelen, std::move(cartargs));