Rename NES cart models a bit

This commit is contained in:
Matt Nadareski
2026-03-10 17:06:01 -04:00
parent 2b64d34e7a
commit e8394d6665
10 changed files with 53 additions and 53 deletions

View File

@@ -10,7 +10,7 @@ namespace SabreTools.Data.Models.NES
/// <summary>
/// NES 1.0 or 2.0 header
/// </summary>
public Header? Header { get; set; }
public CartHeader? Header { get; set; }
/// <summary>
/// Trainer, if present (0 or 512 bytes)

View File

@@ -5,7 +5,7 @@ namespace SabreTools.Data.Models.NES
/// </summary>
/// <see href="https://www.nesdev.org/wiki/INES"/>
/// <see href="https://www.nesdev.org/wiki/NES_2.0"/>
public abstract class Header
public abstract class CartHeader
{
/// <summary>
/// Constant $4E $45 $53 $1A (ASCII "NES" followed by MS-DOS end-of-file)

View File

@@ -13,7 +13,7 @@ namespace SabreTools.Data.Models.NES
/// not marked for NES 2.0 format, an emulator should either mask off the upper 4 bits
/// of the mapper number or simply refuse to load the ROM.
/// </remarks>
public class Header1 : Header
public class CartHeader1 : CartHeader
{
// All common header parts take up bytes 0-7

View File

@@ -4,7 +4,7 @@ namespace SabreTools.Data.Models.NES
/// NES 2.0 header information
/// </summary>
/// <see href="https://www.nesdev.org/wiki/NES_2.0"/>
public class Header2 : Header
public class CartHeader2 : CartHeader
{
// All common header parts take up bytes 0-7
@@ -109,8 +109,8 @@ namespace SabreTools.Data.Models.NES
/// Reserved byte, unused
/// </summary>
/// <remarks>
/// Valid when <see cref="Header.ConsoleType"/> == <see cref="ConsoleType.StandardSystem"/>.
/// Valid when <see cref="Header.ConsoleType"/> == <see cref="ConsoleType.PlayChoice10"/>.
/// Valid when <see cref="CartHeader.ConsoleType"/> == <see cref="ConsoleType.StandardSystem"/>.
/// Valid when <see cref="CartHeader.ConsoleType"/> == <see cref="ConsoleType.PlayChoice10"/>.
/// </remarks>
public byte Reserved13 { get; set; }
@@ -124,7 +124,7 @@ namespace SabreTools.Data.Models.NES
/// <remarks>
/// Byte 13, Bits 0-3
///
/// Valid when <see cref="Header.ConsoleType"/> == <see cref="ConsoleType.VSUnisystem"/>
/// Valid when <see cref="CartHeader.ConsoleType"/> == <see cref="ConsoleType.VSUnisystem"/>
/// </remarks>
public VsSystemType VsSystemType { get; set; }
@@ -134,7 +134,7 @@ namespace SabreTools.Data.Models.NES
/// <remarks>
/// Byte 13, Bits 4-7
///
/// Valid when <see cref="Header.ConsoleType"/> == <see cref="ConsoleType.VSUnisystem"/>
/// Valid when <see cref="CartHeader.ConsoleType"/> == <see cref="ConsoleType.VSUnisystem"/>
/// </remarks>
public VsHardwareType VsHardwareType { get; set; }
@@ -148,7 +148,7 @@ namespace SabreTools.Data.Models.NES
/// <remarks>
/// Byte 13, Bits 0-3
///
/// Valid when <see cref="Header.ConsoleType"/> == <see cref="ConsoleType.ExtendedConsoleType"/>
/// Valid when <see cref="CartHeader.ConsoleType"/> == <see cref="ConsoleType.ExtendedConsoleType"/>
/// </remarks>
public ExtendedConsoleType ExtendedConsoleType { get; set; }

View File

@@ -5,11 +5,11 @@ namespace SabreTools.Data.Models.NES
/// <summary>
/// NES<EOF>
/// </summary>
public static readonly byte[] SignatureBytes = [0x4E, 0x45, 0x53, 0x1A];
public static readonly byte[] CartSignatureBytes = [0x4E, 0x45, 0x53, 0x1A];
/// <summary>
/// NES<EOF>
/// </summary>
public static readonly string SignatureString = "NES" + (char)0x1A;
public static readonly string CartSignatureString = "NES" + (char)0x1A;
}
}

View File

@@ -42,7 +42,7 @@ namespace SabreTools.Serialization.Readers
// TODO: Make model for PRG-ROM data blocks
int prgRomSize = cart.Header.PrgRomSize * 16384;
int chrRomSize = cart.Header.ChrRomSize * 8192;
if (cart.Header is Header2 header2)
if (cart.Header is CartHeader2 header2)
{
ushort extendedSize = (ushort)((header2.PrgRomSizeMSB << 8)
| header.PrgRomSize);
@@ -83,11 +83,11 @@ namespace SabreTools.Serialization.Readers
/// </summary>
/// <param name="data">Stream to parse</param>
/// <returns>Filled Header on success, null on error</returns>
public static Header? ParseHeader(Stream data)
public static CartHeader? ParseHeader(Stream data)
{
// Cache data until NES 2.0 flag determined
byte[] identificationString = data.ReadBytes(4);
if (!identificationString.EqualsExactly(SignatureBytes))
if (!identificationString.EqualsExactly(CartSignatureBytes))
return null;
byte prgRomSize = data.ReadByteValue();
@@ -108,7 +108,7 @@ namespace SabreTools.Serialization.Readers
// NES 2.0
if (nes20)
{
var obj = new Header2();
var obj = new CartHeader2();
obj.IdentificationString = identificationString;
obj.PrgRomSize = prgRomSize;
@@ -174,7 +174,7 @@ namespace SabreTools.Serialization.Readers
// NES 1.0
else
{
var obj = new Header1();
var obj = new CartHeader1();
obj.IdentificationString = identificationString;
obj.PrgRomSize = prgRomSize;

View File

@@ -477,7 +477,7 @@ namespace SabreTools.Serialization
#region NESCart
// NES 1.0 and 2.0 image with header
if (magic.StartsWith(Data.Models.NES.Constants.SignatureBytes))
if (magic.StartsWith(Data.Models.NES.Constants.CartSignatureBytes))
return WrapperType.NESCart;
// NES 1.0 and 2.0 image

View File

@@ -65,7 +65,7 @@ namespace SabreTools.Serialization.Wrappers
fs.Write(byte7);
fs.Flush();
if (Header is Header1 header1)
if (Header is CartHeader1 header1)
{
// Byte 8
fs.Write(header1.PrgRamSize);
@@ -91,7 +91,7 @@ namespace SabreTools.Serialization.Wrappers
fs.Write(header1.Padding);
fs.Flush();
}
else if (Header is Header2 header2)
else if (Header is CartHeader2 header2)
{
// Byte 8
byte byte8 = 0;

View File

@@ -33,7 +33,7 @@ namespace SabreTools.Serialization.Wrappers
builder.AppendLine(Model.Title, "Title");
}
private static void Print(StringBuilder builder, Header? header)
private static void Print(StringBuilder builder, CartHeader? header)
{
builder.AppendLine(" Common Header Information:");
builder.AppendLine(" -------------------------");
@@ -86,7 +86,7 @@ namespace SabreTools.Serialization.Wrappers
builder.AppendLine(mapperNumber, " Mapper");
builder.AppendLine();
if (header is Header1 header1)
if (header is CartHeader1 header1)
{
builder.AppendLine(" NES 1.0 Header Information:");
builder.AppendLine(" -------------------------");
@@ -125,7 +125,7 @@ namespace SabreTools.Serialization.Wrappers
// Bytes 11-15
builder.AppendLine(header1.Padding, " Padding");
}
else if (header is Header2 header2)
else if (header is CartHeader2 header2)
{
builder.AppendLine(" NES 2.0 Header Information:");
builder.AppendLine(" -------------------------");

View File

@@ -17,12 +17,12 @@ namespace SabreTools.Serialization.Wrappers
#region Common
/// <inheritdoc cref="Cart.Header"/>
public Header? Header => Model.Header;
public CartHeader? Header => Model.Header;
/// <inheritdoc cref="Header.AlternativeNametableLayout"/>
/// <inheritdoc cref="CartHeader.AlternativeNametableLayout"/>
public bool AlternativeNametableLayout => Header?.AlternativeNametableLayout ?? false;
/// <inheritdoc cref="Header.BatteryBackedPrgRam"/>
/// <inheritdoc cref="CartHeader.BatteryBackedPrgRam"/>
public bool BatteryBackedPrgRam => Header?.BatteryBackedPrgRam ?? false;
/// <inheritdoc cref="Cart.ChrRomData"/>
@@ -41,14 +41,14 @@ namespace SabreTools.Serialization.Wrappers
return 0;
int chrRomSize = Header.ChrRomSize * 8192;
if (Header is Header2 header2)
if (Header is CartHeader2 header2)
chrRomSize = (header2.ChrRomSizeMSB << 8) | chrRomSize;
return chrRomSize;
}
}
/// <inheritdoc cref="Header.ConsoleType"/>
/// <inheritdoc cref="CartHeader.ConsoleType"/>
public ConsoleType ConsoleType => Header?.ConsoleType ?? ConsoleType.StandardSystem;
/// <summary>
@@ -64,18 +64,18 @@ namespace SabreTools.Serialization.Wrappers
return 0;
int mapperNumber = (Header.MapperUpperNibble << 4) | Header.MapperLowerNibble;
if (Header is Header2 header2)
if (Header is CartHeader2 header2)
mapperNumber = (header2.MapperMSB << 8) | mapperNumber;
return mapperNumber;
}
}
/// <inheritdoc cref="Header.NametableArrangement"/>
/// <inheritdoc cref="CartHeader.NametableArrangement"/>
public NametableArrangement NametableArrangement
=> Header?.NametableArrangement ?? NametableArrangement.Vertical;
/// <inheritdoc cref="Header.NES20"/>
/// <inheritdoc cref="CartHeader.NES20"/>
public bool NES20 => Header?.NES20 ?? false;
/// <summary>
@@ -90,9 +90,9 @@ namespace SabreTools.Serialization.Wrappers
if (Header is null)
return 0;
if (Header is Header1 header1)
if (Header is CartHeader1 header1)
return header1.PrgRamSize > 0 ? header1.PrgRamSize * 8192 : 8192;
else if (Header is Header2 header2)
else if (Header is CartHeader2 header2)
return header2.PrgRamShiftCount > 0 ? 64 << header2.PrgRamShiftCount : 0;
else
return 0;
@@ -112,7 +112,7 @@ namespace SabreTools.Serialization.Wrappers
return 0;
int prgRomSize = Header.PrgRomSize * 16384;
if (Header is Header2 header2)
if (Header is CartHeader2 header2)
prgRomSize = (header2.PrgRomSizeMSB << 8) | prgRomSize;
return prgRomSize;
@@ -134,63 +134,63 @@ namespace SabreTools.Serialization.Wrappers
/// <inheritdoc cref="Cart.Trainer"/>
public byte[] Trainer => Model.Trainer;
/// <inheritdoc cref="Header.TrainerPresent"/>
/// <inheritdoc cref="CartHeader.TrainerPresent"/>
public bool TrainerPresent => Header?.TrainerPresent ?? false;
#endregion
#region NES 1.0
/// <inheritdoc cref="Header1.HasBusConflicts"/>
/// <inheritdoc cref="CartHeader1.HasBusConflicts"/>
/// <remarks>Defined only for NES 1.0</remarks>
public bool HasBusConflicts
{
get
{
// Missing or invalid header
if (Header is null || Header is not Header1 header1)
if (Header is null || Header is not CartHeader1 header1)
return false;
return header1.HasBusConflicts;
}
}
/// <inheritdoc cref="Header1.PrgRamPresent"/>
/// <inheritdoc cref="CartHeader1.PrgRamPresent"/>
/// <remarks>Defined only for NES 1.0</remarks>
public bool PrgRamPresent
{
get
{
// Missing or invalid header
if (Header is null || Header is not Header1 header1)
if (Header is null || Header is not CartHeader1 header1)
return false;
return header1.PrgRamPresent;
}
}
/// <inheritdoc cref="Header1.TVSystem"/>
/// <inheritdoc cref="CartHeader1.TVSystem"/>
/// <remarks>Defined only for NES 1.0</remarks>
public TVSystem TVSystem
{
get
{
// Missing or invalid header
if (Header is null || Header is not Header1 header1)
if (Header is null || Header is not CartHeader1 header1)
return TVSystem.NTSC;
return header1.TVSystem;
}
}
/// <inheritdoc cref="Header1.TVSystemExtended"/>
/// <inheritdoc cref="CartHeader1.TVSystemExtended"/>
/// <remarks>Defined only for NES 1.0</remarks>
public TVSystemExtended TVSystemExtended
{
get
{
// Missing or invalid header
if (Header is null || Header is not Header1 header1)
if (Header is null || Header is not CartHeader1 header1)
return TVSystemExtended.NTSC;
return header1.TVSystemExtended;
@@ -210,7 +210,7 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return 0;
return header2.ChrNvramShiftCount > 0 ? 64 << header2.ChrNvramShiftCount : 0;
@@ -226,7 +226,7 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return 0;
return header2.ChrRamShiftCount > 0 ? 64 << header2.ChrRamShiftCount : 0;
@@ -242,7 +242,7 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return CPUPPUTiming.RP2C02;
return header2.CPUPPUTiming;
@@ -258,7 +258,7 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return DefaultExpansionDevice.Unspecified;
return header2.DefaultExpansionDevice;
@@ -274,7 +274,7 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return ExtendedConsoleType.RegularSystem;
// Invalid console type
@@ -294,7 +294,7 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return 0;
return header2.MiscellaneousROMs;
@@ -310,21 +310,21 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return 0;
return header2.PrgNvramEepromShiftCount > 0 ? 64 << header2.PrgNvramEepromShiftCount : 0;
}
}
/// <inheritdoc cref="Header2.Submapper"/>
/// <inheritdoc cref="CartHeader2.Submapper"/>
/// <remarks>Defined only for NES 2.0</remarks>
public int Submapper
{
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return 0;
return header2.Submapper;
@@ -340,7 +340,7 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return VsHardwareType.VsUnisystem;
// Invalid console type
@@ -360,7 +360,7 @@ namespace SabreTools.Serialization.Wrappers
get
{
// Missing or invalid header
if (Header is null || Header is not Header2 header2)
if (Header is null || Header is not CartHeader2 header2)
return VsSystemType.AnyRP2C03RC2C03Variant;
// Invalid console type