diff --git a/SabreTools.Serialization/Models/NES/Header2.cs b/SabreTools.Serialization/Models/NES/Header2.cs index 782e2401..53324c4d 100644 --- a/SabreTools.Serialization/Models/NES/Header2.cs +++ b/SabreTools.Serialization/Models/NES/Header2.cs @@ -8,49 +8,93 @@ namespace SabreTools.Data.Models.NES { // All common header parts take up bytes 0-7 - /// - /// Mapper MSB/Submapper - /// - /// - /// Bits 0-3 - Mapper number bits 8-11 - /// Bits 4-7 - Submapper number - /// - public byte MapperMSBSubmapper { get; set; } + #region Byte 8 /// - /// PRG-ROM/CHR-ROM size MSB + /// Mapper MSB bits 8-11 /// - /// - /// Bits 0-3 - PRG-ROM size MSB - /// Bits 4-7 - CHR-ROM size MSB - /// - public byte PRGCHRMSB { get; set; } + /// Byte 8, Bits 0-3 + public byte MapperMSB { get; set; } /// - /// PRG-RAM/EEPROM size + /// Submapper + /// + /// Byte 8, Bits 4-7 + public byte Submapper { get; set; } + + #endregion + + #region Byte 9 + + /// + /// PRG-ROM size MSB bits 8-11 + /// + /// Byte 9, Bits 0-3 + public byte PRGROMSizeMSB { get; set; } + + /// + /// CHR-ROM size MSB bits 8-11 + /// + /// Byte 9, Bits 4-7 + public byte CHRROMSizeMSB { get; set; } + + #endregion + + #region Byte 10 + + /// + /// PRG-RAM (volatile) shift count /// /// - /// Bits 0-3 - PRG-RAM (volatile) shift count - /// Bits 4-7 - PRG-NVRAM/EEPROM (non-volatile) shift count + /// Byte 10, Bits 0-3 /// - /// If the shift count is zero, there is no CHR-(NV)RAM. + /// If the shift count is zero, there is no RAM. /// If the shift count is non-zero, the actual size is /// "64 << shift count" bytes, i.e. 8192 bytes for a shift count of 7. /// - public byte PRGRAMEEPROMSize { get; set; } + public byte PRGRAMShiftCount { get; set; } /// - /// CHR-RAM size + /// PRG-NVRAM/EEPROM (non-volatile) shift count /// /// - /// Bits 0-3 - CHR-RAM size (volatile) shift count - /// Bits 4-7 - CHR-NVRAM size (non-volatile) shift count + /// Byte 10, Bits 4-7 /// - /// If the shift count is zero, there is no CHR-(NV)RAM. + /// If the shift count is zero, there is no NVRAM. /// If the shift count is non-zero, the actual size is /// "64 << shift count" bytes, i.e. 8192 bytes for a shift count of 7. /// - public byte CHRRAMSize { get; set; } + public byte PRGNVRAMEEPROMShiftCount { get; set; } + + #endregion + + #region Byte 11 + + /// + /// CHR-RAM size (volatile) shift count + /// + /// + /// Byte 11, Bits 0-3 + /// + /// If the shift count is zero, there is no RAM. + /// If the shift count is non-zero, the actual size is + /// "64 << shift count" bytes, i.e. 8192 bytes for a shift count of 7. + /// + public byte CHRRAMShiftCount { get; set; } + + /// + /// CHR-NVRAM size (non-volatile) shift count + /// + /// + /// Byte 11, Bits 4-7 + /// + /// If the shift count is zero, there is no NVRAM. + /// If the shift count is non-zero, the actual size is + /// "64 << shift count" bytes, i.e. 8192 bytes for a shift count of 7. + /// + public byte CHRNVRAMShiftCount { get; set; } + + #endregion /// /// CPU/PPU timing mode diff --git a/SabreTools.Serialization/Readers/NESCart.cs b/SabreTools.Serialization/Readers/NESCart.cs index cc513d7b..dcdd3404 100644 --- a/SabreTools.Serialization/Readers/NESCart.cs +++ b/SabreTools.Serialization/Readers/NESCart.cs @@ -44,12 +44,12 @@ namespace SabreTools.Serialization.Readers 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); + ushort extendedSize = (ushort)((header2.PRGROMSizeMSB << 8) + | header.PRGROMSize); prgRomSize = extendedSize * 16384; - msb = (byte)(header2.PRGCHRMSB >> 4); - extendedSize = (ushort)((msb << 8) | header.CHRROMSize); + extendedSize = (ushort)((header2.CHRROMSizeMSB << 8) + | header.CHRROMSize); chrRomSize = extendedSize * 8192; } @@ -114,22 +114,38 @@ namespace SabreTools.Serialization.Readers obj.PRGROMSize = prgRomSize; obj.CHRROMSize = chrRomSize; - // Flag 6 + // Byte 6 obj.NametableArrangement = nametableArrangement; obj.BatteryBackedPRGRAM = batteryBackedPrgRam; obj.TrainerPresent = trainerPresent; obj.AlternativeNametableLayout = alternativeNametableLayout; obj.MapperLowerNibble = mapperLowerNibble; - // Flag 7 + // Byte 7 obj.ConsoleType = consoleType; obj.NES20 = nes20; obj.MapperUpperNibble = mapperUpperNibble; - obj.MapperMSBSubmapper = data.ReadByteValue(); - obj.PRGCHRMSB = data.ReadByteValue(); - obj.PRGRAMEEPROMSize = data.ReadByteValue(); - obj.CHRRAMSize = data.ReadByteValue(); + // Byte 8 + byte byte8 = data.ReadByteValue(); + obj.MapperMSB = (byte)(byte8 & 0x0F); + obj.Submapper = (byte)((byte8 >> 4) & 0x0F); + + // Byte 9 + byte byte9 = data.ReadByteValue(); + obj.PRGROMSizeMSB = (byte)(byte9 & 0x0F); + obj.CHRROMSizeMSB = (byte)((byte9 >> 4) & 0x0F); + + // Byte 10 + byte byte10 = data.ReadByteValue(); + obj.PRGRAMShiftCount = (byte)(byte10 & 0x0F); + obj.PRGNVRAMEEPROMShiftCount = (byte)((byte10 >> 4) & 0x0F); + + // Byte 11 + byte byte11 = data.ReadByteValue(); + obj.CHRRAMShiftCount = (byte)(byte11 & 0x0F); + obj.CHRNVRAMShiftCount = (byte)((byte11 >> 4) & 0x0F); + obj.CPUPPUTiming = (CPUPPUTiming)data.ReadByteValue(); obj.ExtendedSystemType = data.ReadByteValue(); obj.MiscellaneousROMs = data.ReadByteValue(); diff --git a/SabreTools.Serialization/Wrappers/NESCart.Printing.cs b/SabreTools.Serialization/Wrappers/NESCart.Printing.cs index 40a6eeed..a00bb8d2 100644 --- a/SabreTools.Serialization/Wrappers/NESCart.Printing.cs +++ b/SabreTools.Serialization/Wrappers/NESCart.Printing.cs @@ -124,47 +124,39 @@ namespace SabreTools.Serialization.Wrappers else if (header is Header2 header2) { // Byte 8 - byte mapperMsb = (byte)(header2.MapperMSBSubmapper & 0x0F); - ushort extendedMapperNumber = (ushort)((mapperMsb << 8) + ushort extendedMapperNumber = (ushort)((header2.MapperMSB << 8) | (byte)((header.MapperUpperNibble << 4) | header.MapperLowerNibble)); - byte submapperNumber = (byte)(header2.MapperMSBSubmapper >> 4); - builder.AppendLine(mapperMsb, " Mapper MSB"); + builder.AppendLine(header2.MapperMSB, " Mapper MSB"); builder.AppendLine(extendedMapperNumber, " Extended mapper number"); - builder.AppendLine(submapperNumber, " Submapper number"); + builder.AppendLine(header2.Submapper, " Submapper"); // Byte 9 - byte prgRomMsb = (byte)(header2.PRGCHRMSB & 0x0F); - ushort extendedPrgRomSize = (ushort)((prgRomMsb << 8) | header.PRGROMSize); - byte chrRomMsb = (byte)(header2.PRGCHRMSB >> 4); - ushort extendedChrRomSize = (ushort)((chrRomMsb << 8) | header.CHRROMSize); + ushort extendedPrgRomSize = (ushort)((header2.PRGROMSizeMSB << 8) | header.PRGROMSize); + ushort extendedChrRomSize = (ushort)((header2.CHRROMSizeMSB << 8) | header.CHRROMSize); - builder.AppendLine(prgRomMsb, " PRG-ROM size MSB"); + builder.AppendLine(header2.PRGROMSizeMSB, " PRG-ROM size MSB"); builder.AppendLine(extendedPrgRomSize, " Extended PRG-ROM size"); - builder.AppendLine(chrRomMsb, " CHR-ROM size MSB"); + builder.AppendLine(header2.CHRROMSizeMSB, " CHR-ROM size MSB"); builder.AppendLine(extendedChrRomSize, " Extended CHR-ROM size"); // Byte 10 - byte prgRamShiftCount = (byte)(header2.PRGRAMEEPROMSize & 0x0F); - int prgRamSize = prgRamShiftCount > 0 ? 64 << prgRamShiftCount : 0; - byte eepromShiftCount = (byte)(header2.PRGRAMEEPROMSize >> 4); - int eepromSize = eepromShiftCount > 0 ? 64 << eepromShiftCount : 0; + int prgRamSize = header2.PRGRAMShiftCount > 0 ? 64 << header2.PRGRAMShiftCount : 0; + int eepromSize = header2.PRGNVRAMEEPROMShiftCount > 0 ? 64 << header2.PRGNVRAMEEPROMShiftCount : 0; - builder.AppendLine(prgRamShiftCount, " PRG-RAM shift count"); + builder.AppendLine(header2.PRGRAMShiftCount, " PRG-RAM shift count"); builder.AppendLine(prgRamSize, " PRG-RAM size"); - builder.AppendLine(eepromShiftCount, " PRG-NVRAM/EEPROM shift count"); + builder.AppendLine(header2.PRGNVRAMEEPROMShiftCount, " PRG-NVRAM/EEPROM shift count"); builder.AppendLine(eepromSize, " PRG-NVRAM/EEPROM size"); // Byte 11 - byte chrRamShiftCount = (byte)(header2.CHRRAMSize & 0x0F); - int chrRamSize = chrRamShiftCount > 0 ? 64 << chrRamShiftCount : 0; - byte chrNvramShiftCount = (byte)(header2.CHRRAMSize >> 4); - int chrNvramSize = chrNvramShiftCount > 0 ? 64 << chrNvramShiftCount : 0; + int chrRamSize = header2.CHRRAMShiftCount > 0 ? 64 << header2.CHRRAMShiftCount : 0; + int chrNvramSize = header2.CHRNVRAMShiftCount > 0 ? 64 << header2.CHRNVRAMShiftCount : 0; - builder.AppendLine(chrRamShiftCount, " CHR-RAM shift count"); + builder.AppendLine(header2.CHRRAMShiftCount, " CHR-RAM shift count"); builder.AppendLine(chrRamSize, " CHR-RAM size"); - builder.AppendLine(chrNvramShiftCount, " CHR-NVRAM shift count"); + builder.AppendLine(header2.CHRNVRAMShiftCount, " CHR-NVRAM shift count"); builder.AppendLine(chrNvramSize, " CHR-NVRAM size"); // Byte 12 diff --git a/SabreTools.Serialization/Wrappers/NESCart.cs b/SabreTools.Serialization/Wrappers/NESCart.cs index d7046889..1f3ed44e 100644 --- a/SabreTools.Serialization/Wrappers/NESCart.cs +++ b/SabreTools.Serialization/Wrappers/NESCart.cs @@ -42,7 +42,7 @@ namespace SabreTools.Serialization.Wrappers int chrRomSize = Header.CHRROMSize * 8192; if (Header is Header2 header2) - chrRomSize = ((header2.PRGCHRMSB >> 4) << 8) | chrRomSize; + chrRomSize = (header2.CHRROMSizeMSB << 8) | chrRomSize; return chrRomSize; } @@ -65,7 +65,7 @@ namespace SabreTools.Serialization.Wrappers int mapperNumber = (Header.MapperUpperNibble << 4) | Header.MapperLowerNibble; if (Header is Header2 header2) - mapperNumber = ((header2.MapperMSBSubmapper & 0x0F) << 8) | mapperNumber; + mapperNumber = (header2.MapperMSB << 8) | mapperNumber; return mapperNumber; } @@ -90,18 +90,11 @@ namespace SabreTools.Serialization.Wrappers return 0; if (Header is Header1 header1) - { return header1.PRGRAMSize > 0 ? header1.PRGRAMSize * 8192 : 8192; - } else if (Header is Header2 header2) - { - byte shift = (byte)(header2.PRGRAMEEPROMSize & 0x0F); - return shift > 0 ? 64 << shift : 0; - } + return header2.PRGRAMShiftCount > 0 ? 64 << header2.PRGRAMShiftCount : 0; else - { return 0; - } } } @@ -119,7 +112,7 @@ namespace SabreTools.Serialization.Wrappers int prgRomSize = Header.PRGROMSize * 16384; if (Header is Header2 header2) - prgRomSize = ((header2.PRGCHRMSB & 0x0F) << 8) | prgRomSize; + prgRomSize = (header2.PRGROMSizeMSB << 8) | prgRomSize; return prgRomSize; } @@ -219,8 +212,7 @@ namespace SabreTools.Serialization.Wrappers if (Header is null || Header is not Header2 header2) return 0; - byte shift = (byte)(header2.CHRRAMSize >> 4); - return shift > 0 ? 64 << shift : 0; + return header2.CHRNVRAMShiftCount > 0 ? 64 << header2.CHRNVRAMShiftCount : 0; } } @@ -236,8 +228,7 @@ namespace SabreTools.Serialization.Wrappers if (Header is null || Header is not Header2 header2) return 0; - byte shift = (byte)(header2.CHRRAMSize & 0x0F); - return shift > 0 ? 64 << shift : 0; + return header2.CHRRAMShiftCount > 0 ? 64 << header2.CHRRAMShiftCount : 0; } } @@ -322,8 +313,7 @@ namespace SabreTools.Serialization.Wrappers if (Header is null || Header is not Header2 header2) return 0; - byte shift = (byte)(header2.PRGRAMEEPROMSize >> 4); - return shift > 0 ? 64 << shift : 0; + return header2.PRGNVRAMEEPROMShiftCount > 0 ? 64 << header2.PRGNVRAMEEPROMShiftCount : 0; } } @@ -339,7 +329,7 @@ namespace SabreTools.Serialization.Wrappers if (Header is null || Header is not Header2 header2) return 0; - return header2.MapperMSBSubmapper >> 4; + return header2.Submapper; } }