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;
}
}