Create function to read just the rom header so the rom list loads up way quicker (instantaneous on my shitty work laptop)

This commit is contained in:
2026-06-16 10:58:12 +02:00
parent 44dea81bf2
commit e6e33eef17
9 changed files with 143 additions and 49 deletions
+26 -12
View File
@@ -90,6 +90,31 @@ FORCE_INLINE void SetROMCIC(u32 checksum, ROM &rom) {
}
}
ROMHeader Mem::ReadROMHeader(bool isArchive, const std::string &filename) {
ROMHeader res;
u32 endianness;
std::vector<u8> buf{};
if (isArchive) {
buf = Util::ExtractROMHeaderFromArchive(filename);
} else {
buf = Util::OpenROMHeader(filename);
}
endianness = std::byteswap(ircolib::read_access<u32>(buf, 0));
Util::SwapN64Rom<true>(buf, endianness);
memcpy(&res, buf.data(), sizeof(ROMHeader));
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);
return res;
}
ROM Mem::LoadROM(const bool isArchive, const std::string &filename) {
ROM res;
res.cart.resize(CART_SIZE);
@@ -99,7 +124,7 @@ ROM Mem::LoadROM(const bool isArchive, const std::string &filename) {
size_t sizeAdjusted;
std::vector<u8> buf{};
if (isArchive) {
buf = Util::OpenArchive(filename, sizeAdjusted);
buf = Util::ExtractROMFromArchive(filename, sizeAdjusted);
} else {
buf = Util::OpenROM(filename, sizeAdjusted);
}
@@ -108,10 +133,8 @@ ROM Mem::LoadROM(const bool isArchive, const std::string &filename) {
Util::SwapN64Rom<true>(buf, endianness);
std::ranges::copy(buf, res.cart.begin());
res.mask = sizeAdjusted - 1;
memcpy(&res.header, buf.data(), sizeof(ROMHeader));
}
memcpy(res.gameNameCart, res.header.imageName, sizeof(res.header.imageName));
res.header.clockRate = std::byteswap(res.header.clockRate);
res.header.programCounter = std::byteswap(res.header.programCounter);
@@ -119,15 +142,6 @@ ROM Mem::LoadROM(const bool isArchive, const std::string &filename) {
res.header.unknown = std::byteswap(res.header.unknown);
res.header.unknown2 = std::byteswap(res.header.unknown2);
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(res.header.imageName) - 1; res.gameNameCart[i] == ' '; i--) {
res.gameNameCart[i] = '\0';
}
const u32 checksum = SDL_crc32(0, &res.cart[0x40], 0x9C0);
SetROMCIC(checksum, res);
endianness = std::byteswap(ircolib::read_access<u32>(res.cart, 0));