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