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:
+26
-12
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user