Move init_gba_save to sram.cpp

This commit is contained in:
Jesse Talavera-Greenberg 2023-08-16 21:13:17 -04:00
parent 178a0c3dfc
commit 673c0684c3
3 changed files with 76 additions and 73 deletions

View File

@ -93,7 +93,6 @@ namespace melonds {
);
static void parse_nds_rom(const struct retro_game_info &info);
static void parse_gba_rom(const struct retro_game_info &info);
static void init_gba_save(GbaCart &gba_cart, const struct retro_game_info& gba_save_info);
static void init_rendering();
static void load_games_deferred(
const optional<retro_game_info>& nds_info,
@ -563,77 +562,6 @@ static void melonds::parse_gba_rom(const struct retro_game_info &info) {
retro::log(RETRO_LOG_DEBUG, "Loaded GBA ROM: \"%s\"", info.path);
}
// Loads the GBA SRAM
static void melonds::init_gba_save(GbaCart& gba_cart, const struct retro_game_info& gba_save_info) {
ZoneScopedN("melonds::init_gba_save");
// We load the GBA SRAM file ourselves (rather than letting the frontend do it)
// because we'll overwrite it later and don't want the frontend to hold open any file handles.
if (path_contains_compressed_file(gba_save_info.path)) {
// If this save file is in an archive (e.g. /path/to/file.7z#mygame.srm)...
// We don't support GBA SRAM files in archives right now;
// libretro-common has APIs for extracting and re-inserting them,
// but I just can't be bothered.
retro::set_error_message(
"melonDS DS does not support archived GBA save data right now. "
"Please extract it and try again. "
"Continuing without using the save data."
);
return;
}
// rzipstream opens the file as-is if it's not rzip-formatted
rzipstream_t* gba_save_file = rzipstream_open(gba_save_info.path, RETRO_VFS_FILE_ACCESS_READ);
if (!gba_save_file) {
throw std::runtime_error("Failed to open GBA save file");
}
if (rzipstream_is_compressed(gba_save_file)) {
// If this save data is compressed in libretro's rzip format...
// (not to be confused with a standard archive format like zip or 7z)
// We don't support rzip-compressed GBA save files right now;
// I can't be bothered.
retro::set_error_message(
"melonDS DS does not support compressed GBA save data right now. "
"Please disable save data compression in the frontend and try again. "
"Continuing without using the save data."
);
rzipstream_close(gba_save_file);
return;
}
int64_t gba_save_file_size = rzipstream_get_size(gba_save_file);
if (gba_save_file_size < 0) {
// If we couldn't get the uncompressed size of the GBA save file...
rzipstream_close(gba_save_file);
throw std::runtime_error("Failed to get GBA save file size");
}
void* gba_save_data = malloc(gba_save_file_size);
if (!gba_save_data) {
rzipstream_close(gba_save_file);
throw std::runtime_error("Failed to allocate memory for GBA save file");
}
if (rzipstream_read(gba_save_file, gba_save_data, gba_save_file_size) != gba_save_file_size) {
rzipstream_close(gba_save_file);
free(gba_save_data);
throw std::runtime_error("Failed to read GBA save file");
}
sram::GbaSaveManager->SetSaveSize(gba_save_file_size);
gba_cart.SetupSave(gba_save_file_size);
gba_cart.LoadSave(static_cast<const u8*>(gba_save_data), gba_save_file_size);
retro::debug("Allocated %u-byte GBA SRAM", gba_cart.GetSaveMemoryLength());
// Actually installing the SRAM will be done later, after NDS::Reset is called
free(gba_save_data);
rzipstream_close(gba_save_file);
retro::task::push(sram::FlushGbaSramTask());
}
static void melonds::load_games(
const optional<struct retro_game_info> &nds_info,
@ -688,7 +616,7 @@ static void melonds::load_games(
parse_gba_rom(*gba_info);
if (gba_save_info) {
init_gba_save(*_loaded_gba_cart, *gba_save_info);
sram::InitGbaSram(*_loaded_gba_cart, *gba_save_info);
}
else {
retro::info("No GBA SRAM was provided.");

View File

@ -23,6 +23,7 @@
#include <file/file_path.h>
#include <retro_assert.h>
#include <streams/file_stream.h>
#include <streams/rzip_stream.h>
#include <NDS.h>
#include <Platform.h>
@ -189,6 +190,79 @@ void melonds::sram::InitNdsSram(const NdsCart &nds_cart) {
}
}
// Loads the GBA SRAM
void melonds::sram::InitGbaSram(GbaCart& gba_cart, const struct retro_game_info& gba_save_info) {
ZoneScopedN("melonds::sram::InitGbaSram");
// We load the GBA SRAM file ourselves (rather than letting the frontend do it)
// because we'll overwrite it later and don't want the frontend to hold open any file handles.
// Due to libretro limitations, we can't use retro_get_memory_data to load the GBA SRAM
// without asking the user to move their SRAM into the melonDS DS save folder.
if (path_contains_compressed_file(gba_save_info.path)) {
// If this save file is in an archive (e.g. /path/to/file.7z#mygame.srm)...
// We don't support GBA SRAM files in archives right now;
// libretro-common has APIs for extracting and re-inserting them,
// but I just can't be bothered.
retro::set_error_message(
"melonDS DS does not support archived GBA save data right now. "
"Please extract it and try again. "
"Continuing without using the save data."
);
return;
}
// rzipstream opens the file as-is if it's not rzip-formatted
rzipstream_t* gba_save_file = rzipstream_open(gba_save_info.path, RETRO_VFS_FILE_ACCESS_READ);
if (!gba_save_file) {
throw std::runtime_error("Failed to open GBA save file");
}
if (rzipstream_is_compressed(gba_save_file)) {
// If this save data is compressed in libretro's rzip format...
// (not to be confused with a standard archive format like zip or 7z)
// We don't support rzip-compressed GBA save files right now;
// I can't be bothered.
retro::set_error_message(
"melonDS DS does not support compressed GBA save data right now. "
"Please disable save data compression in the frontend and try again. "
"Continuing without using the save data."
);
rzipstream_close(gba_save_file);
return;
}
int64_t gba_save_file_size = rzipstream_get_size(gba_save_file);
if (gba_save_file_size < 0) {
// If we couldn't get the uncompressed size of the GBA save file...
rzipstream_close(gba_save_file);
throw std::runtime_error("Failed to get GBA save file size");
}
void* gba_save_data = malloc(gba_save_file_size);
if (!gba_save_data) {
rzipstream_close(gba_save_file);
throw std::runtime_error("Failed to allocate memory for GBA save file");
}
if (rzipstream_read(gba_save_file, gba_save_data, gba_save_file_size) != gba_save_file_size) {
rzipstream_close(gba_save_file);
free(gba_save_data);
throw std::runtime_error("Failed to read GBA save file");
}
sram::GbaSaveManager->SetSaveSize(gba_save_file_size);
gba_cart.SetupSave(gba_save_file_size);
gba_cart.LoadSave(static_cast<const u8*>(gba_save_data), gba_save_file_size);
retro::debug("Allocated %u-byte GBA SRAM", gba_cart.GetSaveMemoryLength());
// Actually installing the SRAM will be done later, after NDS::Reset is called
free(gba_save_data);
rzipstream_close(gba_save_file);
retro::task::push(sram::FlushGbaSramTask());
}
void Platform::WriteNDSSave(const u8 *savedata, u32 savelen, u32 writeoffset, u32 writelen) {
// TODO: Implement a Fast SRAM mode where the frontend is given direct access to the SRAM buffer
ZoneScopedN("Platform::WriteNDSSave");

View File

@ -35,6 +35,7 @@ namespace melonds::sram {
void init();
void deinit() noexcept;
void InitNdsSram(const NdsCart &nds_cart);
void InitGbaSram(GbaCart& gba_cart, const struct retro_game_info& gba_save_info);
void FlushGbaSram(const retro_game_info& gba_save_info) noexcept;
retro::task::TaskSpec FlushGbaSramTask() noexcept;