Wow the ROM Header was just completely busted. Game list view works now

This commit is contained in:
2026-06-11 22:58:00 +02:00
parent bad1691ee2
commit fc306967f9
6 changed files with 192 additions and 115 deletions
+24 -28
View File
@@ -91,9 +91,9 @@ FORCE_INLINE void SetROMCIC(u32 checksum, ROM &rom) {
}
ROM Mem::LoadROM(const bool isArchive, const std::string &filename) {
ROM rom;
rom.cart.resize(CART_SIZE);
std::ranges::fill(rom.cart, 0);
ROM res;
res.cart.resize(CART_SIZE);
std::ranges::fill(res.cart, 0);
u32 endianness;
{
size_t sizeAdjusted;
@@ -107,37 +107,33 @@ ROM Mem::LoadROM(const bool isArchive, const std::string &filename) {
endianness = std::byteswap(ircolib::ReadAccess<u32>(buf, 0));
Util::SwapN64Rom<true>(buf, endianness);
std::ranges::copy(buf, rom.cart.begin());
rom.mask = sizeAdjusted - 1;
memcpy(&rom.header, buf.data(), sizeof(ROMHeader));
std::ranges::copy(buf, res.cart.begin());
res.mask = sizeAdjusted - 1;
memcpy(&res.header, buf.data(), sizeof(ROMHeader));
}
memcpy(rom.gameNameCart, rom.header.imageName, sizeof(rom.header.imageName));
memcpy(res.gameNameCart, res.header.imageName, sizeof(res.header.imageName));
rom.header.clockRate = std::byteswap(rom.header.clockRate);
rom.header.programCounter = std::byteswap(rom.header.programCounter);
rom.header.release = std::byteswap(rom.header.release);
rom.header.crc1 = std::byteswap(rom.header.crc1);
rom.header.crc2 = std::byteswap(rom.header.crc2);
rom.header.unknown = std::byteswap(rom.header.unknown);
rom.header.unknown2 = std::byteswap(rom.header.unknown2);
rom.header.manufacturerId = std::byteswap(rom.header.manufacturerId);
rom.header.cartridgeId = std::byteswap(rom.header.cartridgeId);
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);
rom.code[0] = rom.header.manufacturerId & 0xFF;
rom.code[1] = (rom.header.cartridgeId >> 8) & 0xFF;
rom.code[2] = rom.header.cartridgeId & 0xFF;
rom.code[3] = '\0';
res.code[0] = res.header.categoryCode;
res.code[1] = res.header.uniqueCode[0];
res.code[2] = res.header.uniqueCode[1];
res.code[3] = '\0';
for (int i = sizeof(rom.header.imageName) - 1; rom.gameNameCart[i] == ' '; i--) {
rom.gameNameCart[i] = '\0';
for (int i = sizeof(res.header.imageName) - 1; res.gameNameCart[i] == ' '; i--) {
res.gameNameCart[i] = '\0';
}
const u32 checksum = SDL_crc32(0, &rom.cart[0x40], 0x9C0);
SetROMCIC(checksum, rom);
endianness = std::byteswap(ircolib::ReadAccess<u32>(rom.cart, 0));
Util::SwapN64Rom(rom.cart, endianness);
rom.pal = IsROMPAL(rom);
return rom;
const u32 checksum = SDL_crc32(0, &res.cart[0x40], 0x9C0);
SetROMCIC(checksum, res);
endianness = std::byteswap(ircolib::ReadAccess<u32>(res.cart, 0));
Util::SwapN64Rom(res.cart, endianness);
res.pal = IsROMPAL(res);
return res;
}
template <>