From 4b990662df14eda3891b63b123df9167abfc77a3 Mon Sep 17 00:00:00 2001 From: scawful Date: Wed, 14 Aug 2024 18:28:12 -0400 Subject: [PATCH] Add Rom::LoadZelda3 for loading game data across Load fns --- src/app/rom.cc | 56 ++++++++++++++++++++------------------------------ src/app/rom.h | 5 ++--- 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/src/app/rom.cc b/src/app/rom.cc index 744804a2..1614b6c7 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -142,12 +142,11 @@ absl::Status Rom::LoadAllGraphicsData() { } absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) { - std::string full_filename = std::filesystem::absolute(filename).string(); if (filename.empty()) { return absl::InvalidArgumentError( "Could not load ROM: parameter `filename` is empty."); } - // Set filename + std::string full_filename = std::filesystem::absolute(filename).string(); filename_ = full_filename; // Open file @@ -177,10 +176,7 @@ absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) { // Check if the sROM has a header constexpr size_t baseROMSize = 1048576; // 1MB constexpr size_t headerSize = 0x200; // 512 bytes - if (size_ % baseROMSize == headerSize) { - std::cout << "ROM has a header" << std::endl; - has_header_ = true; - } + has_header_ = (size_ % baseROMSize == headerSize); // Remove header if present if (has_header_) { @@ -193,21 +189,8 @@ absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) { // Close file file.close(); - // Load Zelda 3 specific data if requested if (z3_load) { - // Copy ROM title - constexpr uint32_t kTitleStringOffset = 0x7FC0; - constexpr uint32_t kTitleStringLength = 20; - std::copy(rom_data_.begin() + kTitleStringOffset, - rom_data_.begin() + kTitleStringOffset + kTitleStringLength, - title_.begin()); - if (rom_data_[kTitleStringOffset + 0x19] == 0) { - version_ = Z3_Version::JP; - } else { - version_ = Z3_Version::US; - } - RETURN_IF_ERROR(gfx::LoadAllPalettes(rom_data_, palette_groups_)); - LoadGfxGroups(); + RETURN_IF_ERROR(LoadZelda3()); } // Expand the ROM data to 2MB without changing the data in the first 1MB @@ -235,19 +218,7 @@ absl::Status Rom::LoadFromPointer(uchar* data, size_t length, bool z3_load) { size_ = length; if (z3_load) { - // Copy ROM title - constexpr uint32_t kTitleStringOffset = 0x7FC0; - constexpr uint32_t kTitleStringLength = 20; - std::copy(rom_data_.begin() + kTitleStringOffset, - rom_data_.begin() + kTitleStringOffset + kTitleStringLength, - title_.begin()); - if (rom_data_[kTitleStringOffset + 0x19] == 0) { - version_ = Z3_Version::JP; - } else { - version_ = Z3_Version::US; - } - RETURN_IF_ERROR(gfx::LoadAllPalettes(rom_data_, palette_groups_)); - LoadGfxGroups(); + RETURN_IF_ERROR(LoadZelda3()); } // Set is_loaded_ flag and return success @@ -256,6 +227,23 @@ absl::Status Rom::LoadFromPointer(uchar* data, size_t length, bool z3_load) { return absl::OkStatus(); } +absl::Status Rom::LoadZelda3() { + constexpr uint32_t kTitleStringOffset = 0x7FC0; + constexpr uint32_t kTitleStringLength = 20; + // Copy ROM title + std::copy(rom_data_.begin() + kTitleStringOffset, + rom_data_.begin() + kTitleStringOffset + kTitleStringLength, + title_.begin()); + if (rom_data_[kTitleStringOffset + 0x19] == 0) { + version_ = Z3_Version::JP; + } else { + version_ = Z3_Version::US; + } + RETURN_IF_ERROR(gfx::LoadAllPalettes(rom_data_, palette_groups_)); + RETURN_IF_ERROR(LoadGfxGroups()); + return absl::OkStatus(); +} + absl::Status Rom::LoadFromBytes(const Bytes& data) { if (data.empty()) { return absl::InvalidArgumentError( @@ -310,7 +298,7 @@ absl::Status Rom::SaveToFile(bool backup, bool save_new, std::string filename) { } if (flags()->kSaveGfxGroups) { - SaveGroupsToRom(); + RETURN_IF_ERROR(SaveGroupsToRom()); } if (save_new) { diff --git a/src/app/rom.h b/src/app/rom.h index 963402cd..1d094b5c 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -473,9 +473,6 @@ class Rom : public core::ExperimentFlags { std::vector> spriteset_ids; std::vector> paletteset_ids; - void LoadGfxGroups(); - void SaveGroupsToRom(); - struct WriteAction { int address; std::variant, @@ -520,6 +517,8 @@ class Rom : public core::ExperimentFlags { } return absl::OkStatus(); } + + absl::Status LoadZelda3(); absl::Status LoadGfxGroups(); absl::Status SaveGroupsToRom();