diff --git a/src/backend/Core.cpp b/src/backend/Core.cpp index 678b231..134b5c7 100644 --- a/src/backend/Core.cpp +++ b/src/backend/Core.cpp @@ -32,13 +32,9 @@ void Core::LoadROM(const std::string &romFilename) { const bool isArchive = std::ranges::any_of(archive_types, [&extension](const auto &e) { return e == extension; }); auto rom = Mem::LoadROM(isArchive, romPath); - GameDB::match(rom.header); + mem->rom = rom; - if (rom.gameNameDB.empty()) { - rom.gameNameDB = fs::path(romPath).stem().string(); - mem->rom.gameNameDB = rom.gameNameDB; - } - mem->mmio.vi.isPal = Mem::IsROMPAL(rom); + mem->mmio.vi.isPal = Mem::IsROMPAL(rom.header); mem->mmio.si.pif.InitDevices(mem->rom.saveType); mem->mmio.si.pif.mempakPath = romPath; mem->mmio.si.pif.LoadEeprom(mem->rom.saveType, romPath); diff --git a/src/backend/core/Mem.cpp b/src/backend/core/Mem.cpp index 2d41c9e..e106b97 100644 --- a/src/backend/core/Mem.cpp +++ b/src/backend/core/Mem.cpp @@ -109,8 +109,8 @@ ROMHeader Mem::ReadROMHeader(bool isArchive, const std::string &filename) { res.clockRate = std::byteswap(res.clockRate); res.programCounter = std::byteswap(res.programCounter); res.release = std::byteswap(res.release); - res.unknown = std::byteswap(res.unknown); - res.unknown2 = std::byteswap(res.unknown2); + res.checkCode = std::byteswap(res.checkCode); + res.reserved = std::byteswap(res.reserved); return res; } @@ -139,14 +139,21 @@ ROM Mem::LoadROM(const bool isArchive, const std::string &filename) { res.header.clockRate = std::byteswap(res.header.clockRate); res.header.programCounter = std::byteswap(res.header.programCounter); res.header.release = std::byteswap(res.header.release); - res.header.unknown = std::byteswap(res.header.unknown); - res.header.unknown2 = std::byteswap(res.header.unknown2); + res.header.checkCode = std::byteswap(res.header.checkCode); + res.header.reserved = std::byteswap(res.header.reserved); + + auto [saveType, _, gameNameDB] = GameDB::match(res.header); + res.saveType = saveType; + if (gameNameDB.empty()) { + gameNameDB = fs::path(filename).stem().string(); + } + res.gameNameDB = gameNameDB; const u32 checksum = SDL_crc32(0, &res.cart[0x40], 0x9C0); SetROMCIC(checksum, res); endianness = std::byteswap(ircolib::read_access(res.cart, 0)); Util::SwapN64Rom(res.cart, endianness); - res.pal = IsROMPAL(res); + res.pal = IsROMPAL(res.header); return res; } diff --git a/src/backend/core/Mem.hpp b/src/backend/core/Mem.hpp index 71ecd7c..bb486a8 100644 --- a/src/backend/core/Mem.hpp +++ b/src/backend/core/Mem.hpp @@ -10,14 +10,15 @@ namespace n64 { struct ROMHeader { - u8 initialValues[4]; + u8 unused; + u8 initialValues[3]; u32 clockRate; u32 programCounter; u32 release; - u64 unknown; - u64 unknown2; + u64 checkCode; + u64 reserved; char imageName[20]; - char unknown3[7]; + u8 reserved2[7]; u8 categoryCode; char uniqueCode[2]; u8 countryCode; @@ -133,9 +134,9 @@ struct Mem { std::string sramPath{}; mio::mmap_sink saveData{}; - [[nodiscard]] static FORCE_INLINE bool IsROMPAL(ROM &rom) { + [[nodiscard]] static FORCE_INLINE bool IsROMPAL(ROMHeader &header) { return std::ranges::any_of(std::array{'D', 'F', 'I', 'P', 'S', 'U', 'X', 'Y', 'Z'}, - [&rom](uint8_t a) { return rom.header.countryCode == a; }); + [&header](uint8_t a) { return header.countryCode == a; }); } }; } // namespace n64