From 7dfb015dd550cc93f6951d815122b0134d650ced Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Fri, 6 Mar 2026 13:23:17 -0500 Subject: [PATCH] Fix reading PRG and CHR --- SabreTools.Serialization/Readers/NESCart.cs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/SabreTools.Serialization/Readers/NESCart.cs b/SabreTools.Serialization/Readers/NESCart.cs index abd57f35..ccfcb2df 100644 --- a/SabreTools.Serialization/Readers/NESCart.cs +++ b/SabreTools.Serialization/Readers/NESCart.cs @@ -42,16 +42,24 @@ namespace SabreTools.Serialization.Readers #endif cart.Trainer = data.ReadBytes(512); - // Read the PRG-ROM data + // Derive the PRG-ROM and CHR-ROM data sizes // TODO: Make model for PRG-ROM data blocks - // TODO: Use combined size from 2.0 int prgRomSize = cart.Header.PRGROMSize * 16384; + int chrRomSize = cart.Header.CHRROMSize * 8192; + if (cart.Header is Header2 header2) + { + byte msb = (byte)(header2.PRGCHRMSB & 0x0F); + ushort extendedSize = (ushort)((msb << 8) | header.PRGROMSize); + prgRomSize = extendedSize * 16384; + + msb = (byte)(header2.PRGCHRMSB >> 4); + extendedSize = (ushort)((msb << 8) | header.CHRROMSize); + chrRomSize = extendedSize * 8192; + } + + // Read the PRG-ROM and CHR-ROM data if (prgRomSize > 0) cart.PRGROMData = data.ReadBytes(prgRomSize); - - // Read the CHR-ROM data, if necessary - // TODO: Use combined size from 2.0 - int chrRomSize = cart.Header.CHRROMSize * 8192; if (chrRomSize > 0) cart.CHRROMData = data.ReadBytes(chrRomSize);