diff --git a/SabreTools.Serialization/Models/NES/Enums.cs b/SabreTools.Serialization/Models/NES/Enums.cs
index f3b568cc..7a823384 100644
--- a/SabreTools.Serialization/Models/NES/Enums.cs
+++ b/SabreTools.Serialization/Models/NES/Enums.cs
@@ -464,6 +464,7 @@ namespace SabreTools.Data.Models.NES
///
/// Extended Console Type
///
+ /// Actually only 4 bits (bits 0-3 of flag 13)
public enum ExtendedConsoleType : byte
{
///
@@ -601,7 +602,7 @@ namespace SabreTools.Data.Models.NES
///
/// Vs. Hardware Type
///
- /// Actually only 4 bits
+ /// Actually only 4 bits (bits 4-7 of flag 13)
public enum VsHardwareType : byte
{
///
@@ -643,7 +644,7 @@ namespace SabreTools.Data.Models.NES
///
/// Vs. System Type
///
- /// Actually only 4 bits
+ /// Actually only 4 bits (bits 0-3 of flag 13)
public enum VsSystemType : byte
{
///
diff --git a/SabreTools.Serialization/Models/NES/Header1.cs b/SabreTools.Serialization/Models/NES/Header1.cs
index 90214065..84da3d73 100644
--- a/SabreTools.Serialization/Models/NES/Header1.cs
+++ b/SabreTools.Serialization/Models/NES/Header1.cs
@@ -58,7 +58,7 @@ namespace SabreTools.Data.Models.NES
/// This byte is not part of the official specification, and relatively
/// few emulators honor it.
///
- public byte ReservedBits23 { get; set; }
+ public byte Byte10ReservedBits23 { get; set; }
///
/// PRG RAM ($6000-$7FFF) present
@@ -91,7 +91,7 @@ namespace SabreTools.Data.Models.NES
/// This byte is not part of the official specification, and relatively
/// few emulators honor it.
///
- public byte ReservedBits67 { get; set; }
+ public byte Byte10ReservedBits67 { get; set; }
#endregion
diff --git a/SabreTools.Serialization/Models/NES/Header2.cs b/SabreTools.Serialization/Models/NES/Header2.cs
index 35d63ac2..c7d6b312 100644
--- a/SabreTools.Serialization/Models/NES/Header2.cs
+++ b/SabreTools.Serialization/Models/NES/Header2.cs
@@ -101,14 +101,66 @@ namespace SabreTools.Data.Models.NES
///
public CPUPPUTiming CPUPPUTiming { get; set; }
+ #region Byte 13
+
+ #region Standard System and PlayChoice-10
+
///
- /// Vs. System Type and Extended Console Type
+ /// Reserved byte, unused
///
///
- /// When Byte 7 AND 3 =1: Vs. System Type
- /// When Byte 7 AND 3 =3: Extended Console Type
+ /// Valid when == .
+ /// Valid when == .
///
- public byte ExtendedSystemType { get; set; }
+ public byte Reserved13 { get; set; }
+
+ #endregion
+
+ #region Vs. Unisystem
+
+ ///
+ /// Vs. System Type
+ ///
+ ///
+ /// Byte 13, Bits 0-3
+ ///
+ /// Valid when ==
+ ///
+ public VsSystemType VsSystemType { get; set; }
+
+ ///
+ /// Vs. Hardware Type
+ ///
+ ///
+ /// Byte 13, Bits 4-7
+ ///
+ /// Valid when ==
+ ///
+ public VsHardwareType VsHardwareType { get; set; }
+
+ #endregion
+
+ #region Extended Console Type
+
+ ///
+ /// Extended Console Type
+ ///
+ ///
+ /// Byte 13, Bits 0-3
+ ///
+ /// Valid when ==
+ ///
+ public ExtendedConsoleType ExtendedConsoleType { get; set; }
+
+ ///
+ /// Unknown reserved bits
+ ///
+ /// Byte 13, Bits 4-7
+ public byte Byte13ReservedBits47 { get; set; }
+
+ #endregion
+
+ #endregion
///
/// Number of miscellaneous ROMs present
diff --git a/SabreTools.Serialization/Readers/NESCart.cs b/SabreTools.Serialization/Readers/NESCart.cs
index c0a21b40..ab1b36da 100644
--- a/SabreTools.Serialization/Readers/NESCart.cs
+++ b/SabreTools.Serialization/Readers/NESCart.cs
@@ -147,7 +147,24 @@ namespace SabreTools.Serialization.Readers
obj.ChrNvramShiftCount = (byte)((byte11 >> 4) & 0x0F);
obj.CPUPPUTiming = (CPUPPUTiming)data.ReadByteValue();
- obj.ExtendedSystemType = data.ReadByteValue();
+
+ // Byte 13
+ byte byte13 = data.ReadByteValue();
+ if (obj.ConsoleType == ConsoleType.VSUnisystem)
+ {
+ obj.VsSystemType = (VsSystemType)(byte13 & 0x0F);
+ obj.VsHardwareType = (VsHardwareType)((byte13 >> 4) & 0x0F);
+ }
+ else if (obj.ConsoleType == ConsoleType.ExtendedConsoleType)
+ {
+ obj.ExtendedConsoleType = (ExtendedConsoleType)(byte13 & 0x0F);
+ obj.Byte13ReservedBits47 = (byte)((byte13 >> 4) & 0x0F);
+ }
+ else
+ {
+ obj.Reserved13 = byte13;
+ }
+
obj.MiscellaneousROMs = data.ReadByteValue();
obj.DefaultExpansionDevice = (DefaultExpansionDevice)data.ReadByteValue();
@@ -181,10 +198,10 @@ namespace SabreTools.Serialization.Readers
// Byte 10
byte byte10 = data.ReadByteValue();
obj.TVSystemExtended = (TVSystemExtended)(byte10 & 0x03);
- obj.ReservedBits23 = (byte)((byte10 >> 2) & 0x03);
+ obj.Byte10ReservedBits23 = (byte)((byte10 >> 2) & 0x03);
obj.PrgRamPresent = ((byte10 >> 4) & 0x01) == 0x01;
obj.HasBusConflicts = ((byte10 >> 5) & 0x01) == 0x01;
- obj.ReservedBits67 = (byte)((byte10 >> 6) & 0x03);
+ obj.Byte10ReservedBits67 = (byte)((byte10 >> 6) & 0x03);
obj.Padding = data.ReadBytes(5);
diff --git a/SabreTools.Serialization/Wrappers/NESCart.Printing.cs b/SabreTools.Serialization/Wrappers/NESCart.Printing.cs
index 3afd50e0..4a0889ee 100644
--- a/SabreTools.Serialization/Wrappers/NESCart.Printing.cs
+++ b/SabreTools.Serialization/Wrappers/NESCart.Printing.cs
@@ -104,7 +104,7 @@ namespace SabreTools.Serialization.Wrappers
builder.AppendLine(tvSystemExtended, " TV System Extended");
// Bits 2-3
- builder.AppendLine(header1.ReservedBits23, " Reserved bits 1-2");
+ builder.AppendLine(header1.Byte10ReservedBits23, " Reserved bits 1-2");
// Bit 4
string prgRamPresent = header1.PrgRamPresent ? "Present" : "Not present";
@@ -114,7 +114,7 @@ namespace SabreTools.Serialization.Wrappers
builder.AppendLine(header1.HasBusConflicts, " Has Bus Conflicts");
// Bits 6-7
- builder.AppendLine(header1.ReservedBits67, " Reserved bits 6-7");
+ builder.AppendLine(header1.Byte10ReservedBits67, " Reserved bits 6-7");
#endregion
@@ -166,20 +166,23 @@ namespace SabreTools.Serialization.Wrappers
// Byte 13
if (header.ConsoleType == ConsoleType.ExtendedConsoleType)
{
- ExtendedConsoleType extendedConsoleType = (ExtendedConsoleType)(header2.ExtendedSystemType & 0x0F);
- string extendedConsoleTypeString = extendedConsoleType.FromExtendedConsoleType();
+ string extendedConsoleTypeString = header2.ExtendedConsoleType.FromExtendedConsoleType();
builder.AppendLine(extendedConsoleTypeString, " Extended console type");
+
+ builder.AppendLine(extendedConsoleTypeString, " Reserved bits");
}
else if (header.ConsoleType == ConsoleType.VSUnisystem)
{
- VsSystemType vsSystemType = (VsSystemType)(header2.ExtendedSystemType & 0x0F);
- string vsSystemTypeString = vsSystemType.FromVsSystemType();
+ string vsSystemTypeString = header2.VsSystemType.FromVsSystemType();
builder.AppendLine(vsSystemTypeString, " Vs. system type");
- VsHardwareType vsHardwareType = (VsHardwareType)(header2.ExtendedSystemType >> 4);
- string vsHardwareTypeString = vsHardwareType.FromVsHardwareType();
+ string vsHardwareTypeString = header2.VsHardwareType.FromVsHardwareType();
builder.AppendLine(vsHardwareTypeString, " Vs. hardware type");
}
+ else
+ {
+ builder.AppendLine(header2.Reserved13, " Reserved");
+ }
// Byte 14
builder.AppendLine(header2.MiscellaneousROMs, " Number of miscellaneous ROMs");
diff --git a/SabreTools.Serialization/Wrappers/NESCart.cs b/SabreTools.Serialization/Wrappers/NESCart.cs
index fb511ca1..1f8e674a 100644
--- a/SabreTools.Serialization/Wrappers/NESCart.cs
+++ b/SabreTools.Serialization/Wrappers/NESCart.cs
@@ -281,7 +281,7 @@ namespace SabreTools.Serialization.Wrappers
if (ConsoleType != ConsoleType.ExtendedConsoleType)
return ExtendedConsoleType.RegularSystem;
- return (ExtendedConsoleType)(header2.ExtendedSystemType & 0x0F);
+ return header2.ExtendedConsoleType;
}
}
@@ -347,7 +347,7 @@ namespace SabreTools.Serialization.Wrappers
if (ConsoleType != ConsoleType.VSUnisystem)
return VsHardwareType.VsUnisystem;
- return (VsHardwareType)(header2.ExtendedSystemType >> 4);
+ return header2.VsHardwareType;
}
}
@@ -367,7 +367,7 @@ namespace SabreTools.Serialization.Wrappers
if (ConsoleType != ConsoleType.VSUnisystem)
return VsSystemType.AnyRP2C03RC2C03Variant;
- return (VsSystemType)(header2.ExtendedSystemType & 0x0F);
+ return header2.VsSystemType;
}
}