mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-09-22 06:45:11 +00:00
Rename NES cart models a bit
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(" -------------------------");
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user