From e051f7150457b1fa893f1512c53b01efddc652c3 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 9 Dec 2020 14:07:46 -0800 Subject: [PATCH] Add internal skipper generation (not hooked up) --- SabreTools.Skippers/SkipperMatch.cs | 680 ++++++++++++++++++++++++++ SabreTools.Skippers/Skippers/psid.xml | 4 +- 2 files changed, 682 insertions(+), 2 deletions(-) diff --git a/SabreTools.Skippers/SkipperMatch.cs b/SabreTools.Skippers/SkipperMatch.cs index 9dec3e03..da03a4f8 100644 --- a/SabreTools.Skippers/SkipperMatch.cs +++ b/SabreTools.Skippers/SkipperMatch.cs @@ -59,15 +59,42 @@ namespace SabreTools.Skippers /// private static void PopulateSkippers() { + // Ensure the list exists if (List == null) List = new List(); + // Get skippers for each known header type foreach (string skipperFile in Directory.EnumerateFiles(LocalPath, "*", SearchOption.AllDirectories)) { List.Add(new SkipperFile(Path.GetFullPath(skipperFile))); } } + /// + /// Populate the entire list of header skippers + /// + /// + /// http://mamedev.emulab.it/clrmamepro/docs/xmlheaders.txt + /// http://www.emulab.it/forum/index.php?topic=127.0 + /// + private static void PopulateSkippersInternal() + { + // Ensure the list exists + if (List == null) + List = new List(); + + // Get skippers for each known header type + List.Add(GetAtari7800()); + List.Add(GetAtariLynx()); + List.Add(GetCommodorePSID()); + List.Add(GetNECPCEngine()); + List.Add(GetNintendo64()); + List.Add(GetNintendoEntertainmentSystem()); + List.Add(GetNintendoFamicomDiskSystem()); + List.Add(GetSuperNintendoEntertainmentSystem()); + List.Add(GetSuperFamicomSPC()); + } + /// /// Get the SkipperRule associated with a given file /// @@ -131,5 +158,658 @@ namespace SabreTools.Skippers return skipperRule; } + + // These are hardcoded versions of the XML files that get parsed in + // TODO: Should these be in their own derived classes? + #region Skipper Generation + + /// + /// Generate a SkipperFile for Atari 7800 headers + /// + /// Originally from a7800.xml + private static SkipperFile GetAtari7800() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x01, + Value = new byte[] { 0x41, 0x54, 0x41, 0x52, 0x49, 0x37, 0x38, 0x30, 0x30 }, + Result = true, + }; + + var rule2Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x64, + Value = new byte[] { 0x41, 0x43, 0x54, 0x55, 0x41, 0x4C, 0x20, 0x43, 0x41, 0x52, 0x54, 0x20, 0x44, 0x41, 0x54, 0x41, 0x20, 0x53, 0x54, 0x41, 0x52, 0x54, 0x53, 0x20, 0x48, 0x45, 0x52, 0x45 }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x80, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + var rule2 = new SkipperRule + { + StartOffset = 0x80, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule2Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "Atari 7800", + Author = "Roman Scherzer", + Version = "1.0", + SourceFile = "a7800.xml", + Rules = new List + { + rule1, + rule2, + }, + }; + + return skipperFile; + } + + /// + /// Generate a SkipperFile for Atari Lynx headers + /// + /// Originally from lynx.xml + private static SkipperFile GetAtariLynx() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x4C, 0x59, 0x4E, 0x58 }, + Result = true, + }; + + var rule2Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x06, + Value = new byte[] { 0x42, 0x53, 0x39 }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x40, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + var rule2 = new SkipperRule + { + StartOffset = 0x40, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule2Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "Atari Lynx", + Author = "Roman Scherzer", + Version = "1.0", + SourceFile = "lynx.xml", + Rules = new List + { + rule1, + rule2, + }, + }; + + return skipperFile; + } + + /// + /// Generate a SkipperFile for Commodore PSID headers + /// + /// Originally from psid.xml + private static SkipperFile GetCommodorePSID() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x50, 0x53, 0x49, 0x44, 0x00, 0x01, 0x00, 0x76 }, + Result = true, + }; + + var rule2Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x50, 0x53, 0x49, 0x44, 0x00, 0x03, 0x00, 0x7c }, + Result = true, + }; + + var rule3Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x50, 0x53, 0x49, 0x44, 0x00, 0x02, 0x00, 0x7c }, + Result = true, + }; + + var rule4Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x50, 0x53, 0x49, 0x44, 0x00, 0x01, 0x00, 0x7c }, + Result = true, + }; + + var rule5Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x52, 0x53, 0x49, 0x44, 0x00, 0x02, 0x00, 0x7c }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x76, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + var rule2 = new SkipperRule + { + StartOffset = 0x76, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule2Test1, + } + }; + + var rule3 = new SkipperRule + { + StartOffset = 0x7c, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule3Test1, + } + }; + + var rule4 = new SkipperRule + { + StartOffset = 0x7c, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule4Test1, + } + }; + + var rule5 = new SkipperRule + { + StartOffset = 0x7c, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule5Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "psid", + Author = "Yori Yoshizuki", + Version = "1.2", + SourceFile = "psid.xml", + Rules = new List + { + rule1, + rule2, + rule3, + rule4, + rule5, + }, + }; + + return skipperFile; + } + + /// + /// Generate a SkipperFile for NEC PC-Engine / TurboGrafx 16 headers + /// + /// Originally from pce.xml + private static SkipperFile GetNECPCEngine() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xBB, 0x02 }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x200, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "NEC TurboGrafx-16/PC-Engine", + Author = "Matt Nadareski (darksabre76)", + Version = "1.0", + SourceFile = "pce.xml", + Rules = new List + { + rule1, + }, + }; + + return skipperFile; + } + + /// + /// Generate a SkipperFile for Nintendo 64 headers + /// + /// Originally from n64.xml + private static SkipperFile GetNintendo64() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x80, 0x37, 0x12, 0x40 }, + Result = true, + }; + + var rule2Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x37, 0x80, 0x40, 0x12 }, + Result = true, + }; + + var rule3Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x40, 0x12, 0x37, 0x80 }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x00, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + var rule2 = new SkipperRule + { + StartOffset = 0x00, + EndOffset = null, + Operation = HeaderSkipOperation.Byteswap, + Tests = new List + { + rule2Test1, + } + }; + + var rule3 = new SkipperRule + { + StartOffset = 0x00, + EndOffset = null, + Operation = HeaderSkipOperation.Wordswap, + Tests = new List + { + rule3Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "Nintendo 64 - ABCD", + Author = "CUE", + Version = "1.1", + SourceFile = "n64.xml", + Rules = new List + { + rule1, // V64 + rule2, // Z64 + rule3, // N64 + }, + }; + + return skipperFile; + } + + /// + /// Generate a SkipperFile for Nintendo Entertainment System headers + /// + /// Originally from nes.xml + private static SkipperFile GetNintendoEntertainmentSystem() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x4E, 0x45, 0x53, 0x1A }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x10, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "Nintendo Famicon/NES", + Author = "Roman Scherzer", + Version = "1.1", + SourceFile = "nes.xml", + Rules = new List + { + rule1, + }, + }; + + return skipperFile; + } + + /// + /// Generate a SkipperFile for Nintendo Famicom Disk System headers + /// + /// Originally from fds.xml + private static SkipperFile GetNintendoFamicomDiskSystem() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x46, 0x44, 0x53, 0x1A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + Result = true, + }; + + var rule2Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x46, 0x44, 0x53, 0x1A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + Result = true, + }; + + var rule3Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x46, 0x44, 0x53, 0x1A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + Result = true, + }; + + var rule4Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x46, 0x44, 0x53, 0x1A, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x10, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + var rule2 = new SkipperRule + { + StartOffset = 0x10, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule2Test1, + } + }; + + var rule3 = new SkipperRule + { + StartOffset = 0x10, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule3Test1, + } + }; + + var rule4 = new SkipperRule + { + StartOffset = 0x10, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule4Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "fds", + Author = "Yori Yoshizuki", + Version = "1.0", + SourceFile = "fds.xml", + Rules = new List + { + rule1, + rule2, + rule3, + rule4, + }, + }; + + return skipperFile; + } + + /// + /// Generate a SkipperFile for Super Nintendo Entertainment System headers + /// + /// Originally from snes.xml + private static SkipperFile GetSuperNintendoEntertainmentSystem() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x16, + Value = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + Result = true, + }; + + var rule2Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x16, + Value = new byte[] { 0xAA, 0xBB, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00 }, + Result = true, + }; + + var rule3Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x16, + Value = new byte[] { 0x53, 0x55, 0x50, 0x45, 0x52, 0x55, 0x46, 0x4F }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x200, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + var rule2 = new SkipperRule + { + StartOffset = 0x200, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule2Test1, + } + }; + + var rule3 = new SkipperRule + { + StartOffset = 0x200, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule3Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "Nintendo Super Famicom/SNES", + Author = "Matt Nadareski (darksabre76)", + Version = "1.0", + SourceFile = "snes.xml", + Rules = new List + { + rule1, // FIG + rule2, // SMC + rule3, // UFO + }, + }; + + return skipperFile; + } + + /// + /// Generate a SkipperFile for Super Famicom SPC headers + /// + /// Originally from spc.xml + private static SkipperFile GetSuperFamicomSPC() + { + // Create tests + var rule1Test1 = new SkipperTest + { + Type = HeaderSkipTest.Data, + Offset = 0x00, + Value = new byte[] { 0x53, 0x4E, 0x45, 0x53, 0x2D, 0x53, 0x50, 0x43 }, + Result = true, + }; + + // Create rules + var rule1 = new SkipperRule + { + StartOffset = 0x100, + EndOffset = null, + Operation = HeaderSkipOperation.None, + Tests = new List + { + rule1Test1, + } + }; + + // Create file + var skipperFile = new SkipperFile + { + Name = "Nintendo Super Famicon SPC", + Author = "Yori Yoshizuki", + Version = "1.0", + SourceFile = "spc.xml", + Rules = new List + { + rule1, + }, + }; + + return skipperFile; + } + + #endregion } } \ No newline at end of file diff --git a/SabreTools.Skippers/Skippers/psid.xml b/SabreTools.Skippers/Skippers/psid.xml index 93143a0c..1a5586d2 100644 --- a/SabreTools.Skippers/Skippers/psid.xml +++ b/SabreTools.Skippers/Skippers/psid.xml @@ -18,11 +18,11 @@ - + - +