From d102e2fc0bb9437489bc0ea30d6be6f099416373 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 11 Mar 2026 11:47:39 -0400 Subject: [PATCH] Add SNES models --- SabreTools.Serialization/Models/README.MD | 1 + SabreTools.Serialization/Models/SNES/Cart.cs | 19 ++ .../Models/SNES/Constants.cs | 11 ++ SabreTools.Serialization/Models/SNES/Enums.cs | 174 ++++++++++++++++++ .../Models/SNES/Header.cs | 7 + .../Models/SNES/ProFighterHeader.cs | 41 +++++ .../Models/SNES/SuperWildCardHeader.cs | 37 ++++ 7 files changed, 290 insertions(+) create mode 100644 SabreTools.Serialization/Models/SNES/Cart.cs create mode 100644 SabreTools.Serialization/Models/SNES/Constants.cs create mode 100644 SabreTools.Serialization/Models/SNES/Enums.cs create mode 100644 SabreTools.Serialization/Models/SNES/Header.cs create mode 100644 SabreTools.Serialization/Models/SNES/ProFighterHeader.cs create mode 100644 SabreTools.Serialization/Models/SNES/SuperWildCardHeader.cs diff --git a/SabreTools.Serialization/Models/README.MD b/SabreTools.Serialization/Models/README.MD index 54acc200..f9bb537c 100644 --- a/SabreTools.Serialization/Models/README.MD +++ b/SabreTools.Serialization/Models/README.MD @@ -44,6 +44,7 @@ Not all of this information was able to be gathered directly from the files in q | [PKWARE(?)](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) | PKZIP | | [PS3 Developer Wiki](https://www.psdevwiki.com/ps3/) | IRD, PlayStation3 | | [RanseiLink](https://github.com/Deijin27/RanseiLink) | Nitro | +| [raphnet](https://www.raphnet.net/divers/documentation/Sneskart.txt) | SNES | | [Reverse Engineering Wise](https://codeberg.org/CYBERDEV/REWise) | WiseInstaller | | [SharpCompress](https://github.com/adamhathcock/sharpcompress) | PKZIP | | [Source SDK 2013](https://github.com/ValveSoftware/source-sdk-2013) | BSP | diff --git a/SabreTools.Serialization/Models/SNES/Cart.cs b/SabreTools.Serialization/Models/SNES/Cart.cs new file mode 100644 index 00000000..0409b3a7 --- /dev/null +++ b/SabreTools.Serialization/Models/SNES/Cart.cs @@ -0,0 +1,19 @@ +namespace SabreTools.Data.Models.SNES +{ + /// + /// SNES cart image + /// + /// + public class Cart + { + /// + /// Copier header + /// + public Header? Header { get; set; } + + /// + /// Cartridge data + /// + public byte[] Data { get; set; } = []; + } +} diff --git a/SabreTools.Serialization/Models/SNES/Constants.cs b/SabreTools.Serialization/Models/SNES/Constants.cs new file mode 100644 index 00000000..e129d696 --- /dev/null +++ b/SabreTools.Serialization/Models/SNES/Constants.cs @@ -0,0 +1,11 @@ +namespace SabreTools.Data.Models.SNES +{ + public static class Constants + { + /// + /// Super Wild Card header identifier + /// + /// + public static readonly byte[] SuperWildCardHeaderIdentifier = [0xAA, 0xBB, 0x04]; + } +} diff --git a/SabreTools.Serialization/Models/SNES/Enums.cs b/SabreTools.Serialization/Models/SNES/Enums.cs new file mode 100644 index 00000000..1da6e257 --- /dev/null +++ b/SabreTools.Serialization/Models/SNES/Enums.cs @@ -0,0 +1,174 @@ +using System; + +namespace SabreTools.Data.Models.SNES +{ + /// + /// Pro Fighter first SRAM mode + /// + /// + public enum FIGDSPMode1 : byte + { + /// + /// If using DSP1 microchip and if no SRAM (SRAM size=0) + /// + DSP1WithNoSRAM = 0x47, + + /// + /// If not using DSP1 and no SRAM (SRAM size=0) + /// + NoDSP1WithNoSRAM = 0x77, + + /// + /// If using DSP1 microchip and if using SRAM (SRAM size>0) + /// + DSP1WithSRAM = 0xFD, + } + + /// + /// Pro Fighter second SRAM mode + /// + /// + public enum FIGDSPMode2 : byte + { + /// + /// If using DSP1 microchip and if using SRAM (SRAM size>0) + /// + DSP1WithSRAM = 0x82, + + /// + /// If using DSP1 microchip and if no SRAM (SRAM size=0) + /// + DSP1WithNoSRAM = 0x83, + + /// + /// If not using DSP1 and no SRAM (SRAM size=0) + /// + NoDSP1WithNoSRAM = 0x83, + } + + /// + /// Pro Fighter image mode + /// + /// + public enum FIGImageMode : byte + { + /// + /// Last image in set (or single image) + /// + SingleImage = 0x00, + + /// + /// Multi image + /// + MultiImage = 0x40, + } + + /// + /// Pro Fighter ROM mode + /// + /// + public enum FIGRomMode : byte + { + LoROM = 0x00, + + HiROM = 0x80, + } + + /// + /// Super Wild Card image information + /// + /// + [Flags] + public enum SWCImageInformation : byte + { + /// + /// Reserved + /// + Reserved0 = 0b00000001, + + /// + /// Reserved + /// + Reserved1 = 0b00000010, + + #region SRAM size + + /// + /// 256kbit SRAM + /// + SRAM256kbit = 0b00000000, + + /// + /// 65kbit SRAM + /// + SRAM65kbit = 0b00000100, + + /// + /// 16kbit SRAM + /// + SRAM16kbit = 0b00001000, + + /// + /// no SRAM + /// + SRAMNone = 0b00001100, + + #endregion + + #region DRAM mode + + /// + /// DRAM memory mapping Mode 20 + /// + DRAMMappingMode20 = 0b00000000, + + /// + /// DRAM memory mapping Mode 21 (HiROM) + /// + DRAMMappingMode21 = 0b00010000, + + #endregion + + #region SRAM mode + + /// + /// SRAM memory mapping Mode 20 + /// + SRAMMappingMode20 = 0b00000000, + + /// + /// SRAM memory mapping Mode 21 (HiROM) + /// + SRAMMappingMode21 = 0b00100000, + + #endregion + + #region Multi-image + + /// + /// Not multi image (no more split files to follow) + /// + NotMultiImage = 0b00000000, + + /// + /// Multi image (there is another split file to follow) + /// + MultiImage = 0b01000000, + + #endregion + + #region Run program mode + + /// + /// Run program in Mode 1 (JMP RESET Vector) + /// + RunProgramInMode1 = 0b00000000, + + /// + /// Run program in Mode 0 (JMP $8000) + /// + RunProgramInMode0 = 0b10000000, + + #endregion + } +} diff --git a/SabreTools.Serialization/Models/SNES/Header.cs b/SabreTools.Serialization/Models/SNES/Header.cs new file mode 100644 index 00000000..c10a3421 --- /dev/null +++ b/SabreTools.Serialization/Models/SNES/Header.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Data.Models.SNES +{ + /// + /// SNES copier header + /// + public abstract class Header { } +} diff --git a/SabreTools.Serialization/Models/SNES/ProFighterHeader.cs b/SabreTools.Serialization/Models/SNES/ProFighterHeader.cs new file mode 100644 index 00000000..8c9a5175 --- /dev/null +++ b/SabreTools.Serialization/Models/SNES/ProFighterHeader.cs @@ -0,0 +1,41 @@ +namespace SabreTools.Data.Models.SNES +{ + /// + /// Pro Fighter (FIG) header + /// + /// + public class ProFighterHeader : Header + { + /// + /// Size word + /// + /// Little-endian + public ushort Size { get; set; } + + /// + /// Single- or multi-image + /// + public FIGImageMode ImageMode { get; set; } + + /// + /// ROM mode + /// + public FIGRomMode RomMode { get; set; } + + /// + /// First DSP1 SRAM flag + /// + public FIGDSPMode1 DSPMode1 { get; set; } + + /// + /// Second DSP1 SRAM flag + /// + public FIGDSPMode2 DSPMode2 { get; set; } + + /// + /// Padding to get to 512 bytes + /// + /// 506 bytes + public byte[] Padding { get; set; } = new byte[506]; + } +} diff --git a/SabreTools.Serialization/Models/SNES/SuperWildCardHeader.cs b/SabreTools.Serialization/Models/SNES/SuperWildCardHeader.cs new file mode 100644 index 00000000..1a838797 --- /dev/null +++ b/SabreTools.Serialization/Models/SNES/SuperWildCardHeader.cs @@ -0,0 +1,37 @@ +namespace SabreTools.Data.Models.SNES +{ + /// + /// Super Wild Card (SWC) header + /// + /// + public class SuperWildCardHeader : Header + { + /// + /// Size word + /// + /// Little-endian + public ushort Size { get; set; } + + /// + /// Image information byte + /// + public SWCImageInformation ImageInformation { get; set; } + + /// + /// Reserved + /// + /// 4 bytes + public byte[] Reserved1 { get; set; } = new byte[4]; + + /// + /// SWC header identifier (0xAA, 0xBB, 0x04) + /// + public byte[] HeaderIdentifier { get; set; } = new byte[3]; + + /// + /// Padding to get to 512 bytes + /// + /// 502 bytes + public byte[] Padding { get; set; } = new byte[502]; + } +}