From 6c2098c5d2d1290edaaa6bedf319341911b0034f Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 18 Apr 2026 20:53:18 -0400 Subject: [PATCH] Add "boot" element for OpenMSX, fix missing skip --- SabreTools.Data.Models/Metadata/Dump.cs | 8 ++++++++ SabreTools.Data.Models/OpenMSX/Dump.cs | 3 +++ SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs | 1 + SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs | 6 +++++- SabreTools.Serialization.CrossModel.Test/OpenMSXTests.cs | 5 +++++ .../OpenMSX.Deserializer.cs | 2 ++ SabreTools.Serialization.CrossModel/OpenMSX.Serializer.cs | 2 ++ SabreTools.Serialization.Readers.Test/OpenMSXTests.cs | 5 +++++ SabreTools.Serialization.Readers/OpenMSX.cs | 7 +++++++ SabreTools.Serialization.Writers/OpenMSX.cs | 2 ++ 10 files changed, 40 insertions(+), 1 deletion(-) diff --git a/SabreTools.Data.Models/Metadata/Dump.cs b/SabreTools.Data.Models/Metadata/Dump.cs index 69a39c6a..9eb209a8 100644 --- a/SabreTools.Data.Models/Metadata/Dump.cs +++ b/SabreTools.Data.Models/Metadata/Dump.cs @@ -9,6 +9,8 @@ namespace SabreTools.Data.Models.Metadata { #region Properties + public string? Boot { get; set; } + public Rom? MegaRom { get; set; } public Original? Original { get; set; } @@ -26,6 +28,7 @@ namespace SabreTools.Data.Models.Metadata { var obj = new Dump(); + obj.Boot = Boot; if (MegaRom is not null) obj.MegaRom = MegaRom.Clone() as Rom; if (Original is not null) @@ -45,6 +48,11 @@ namespace SabreTools.Data.Models.Metadata if (other is null) return false; + if ((Boot is null) ^ (other.Boot is null)) + return false; + else if (Boot is not null && !Boot.Equals(other.Boot, StringComparison.OrdinalIgnoreCase)) + return false; + // Sub-items if ((MegaRom is null) ^ (other.MegaRom is null)) return false; diff --git a/SabreTools.Data.Models/OpenMSX/Dump.cs b/SabreTools.Data.Models/OpenMSX/Dump.cs index 945d5f24..a2f65a50 100644 --- a/SabreTools.Data.Models/OpenMSX/Dump.cs +++ b/SabreTools.Data.Models/OpenMSX/Dump.cs @@ -6,6 +6,9 @@ namespace SabreTools.Data.Models.OpenMSX [XmlRoot("dump")] public class Dump { + [XmlElement("boot")] + public string? Boot { get; set; } + [XmlElement("original")] public Original? Original { get; set; } diff --git a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs index 8fff6429..3ef30659 100644 --- a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs @@ -428,6 +428,7 @@ namespace SabreTools.Metadata.DatFiles { MachineIndex = machineIndex, SourceIndex = sourceIndex, + Comment = items[i].Boot, }; var original = items[i].Original; diff --git a/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs index 12abd742..3f294af6 100644 --- a/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles/DatFile.ToMetadata.cs @@ -816,7 +816,11 @@ namespace SabreTools.Metadata.DatFiles Start = romItem.Start ?? romItem.Offset, }; - var dumpRom = new Data.Models.Metadata.Dump { Rom = rom }; + var dumpRom = new Data.Models.Metadata.Dump + { + Boot = romItem.Comment, + Rom = rom, + }; if (original is not null) { var newOriginal = new Data.Models.Metadata.Original diff --git a/SabreTools.Serialization.CrossModel.Test/OpenMSXTests.cs b/SabreTools.Serialization.CrossModel.Test/OpenMSXTests.cs index 1c1a96a0..99abe6e8 100644 --- a/SabreTools.Serialization.CrossModel.Test/OpenMSXTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/OpenMSXTests.cs @@ -51,6 +51,7 @@ namespace SabreTools.Serialization.CrossModel.Test var dump_rom = new Data.Models.OpenMSX.Dump { Original = original, + Boot = "boot", Rom = rom, }; @@ -65,6 +66,7 @@ namespace SabreTools.Serialization.CrossModel.Test var dump_megarom = new Data.Models.OpenMSX.Dump { Original = original, + Boot = "boot", Rom = megarom, }; @@ -79,6 +81,7 @@ namespace SabreTools.Serialization.CrossModel.Test var dump_sccpluscart = new Data.Models.OpenMSX.Dump { Original = original, + Boot = "boot", Rom = sccpluscart, }; @@ -127,6 +130,8 @@ namespace SabreTools.Serialization.CrossModel.Test private static void Validate(Data.Models.OpenMSX.Dump? dump) { Assert.NotNull(dump); + Assert.Equal("boot", dump.Boot); + Validate(dump.Original); Validate(dump.Rom); } diff --git a/SabreTools.Serialization.CrossModel/OpenMSX.Deserializer.cs b/SabreTools.Serialization.CrossModel/OpenMSX.Deserializer.cs index 2ac846be..26ccc553 100644 --- a/SabreTools.Serialization.CrossModel/OpenMSX.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/OpenMSX.Deserializer.cs @@ -66,6 +66,8 @@ namespace SabreTools.Serialization.CrossModel if (original is not null) dump.Original = ConvertFromInternalModel(original); + dump.Boot = item.Boot; + var rom = item.Rom; if (rom is not null) dump.Rom = ConvertRomFromInternalModel(rom); diff --git a/SabreTools.Serialization.CrossModel/OpenMSX.Serializer.cs b/SabreTools.Serialization.CrossModel/OpenMSX.Serializer.cs index d3c5b8ef..1575fcf4 100644 --- a/SabreTools.Serialization.CrossModel/OpenMSX.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/OpenMSX.Serializer.cs @@ -65,6 +65,8 @@ namespace SabreTools.Serialization.CrossModel if (item.Original is not null) dump.Original = ConvertToInternalModel(item.Original); + dump.Boot = item.Boot; + if (item.Rom is not null) { switch (item.Rom) diff --git a/SabreTools.Serialization.Readers.Test/OpenMSXTests.cs b/SabreTools.Serialization.Readers.Test/OpenMSXTests.cs index 9e7e61eb..704e6a75 100644 --- a/SabreTools.Serialization.Readers.Test/OpenMSXTests.cs +++ b/SabreTools.Serialization.Readers.Test/OpenMSXTests.cs @@ -117,6 +117,7 @@ namespace SabreTools.Serialization.Readers.Test var dump_rom = new Data.Models.OpenMSX.Dump { Original = original, + Boot = "boot", Rom = rom, }; @@ -131,6 +132,7 @@ namespace SabreTools.Serialization.Readers.Test var dump_megarom = new Data.Models.OpenMSX.Dump { Original = original, + Boot = "boot", Rom = megarom, }; @@ -145,6 +147,7 @@ namespace SabreTools.Serialization.Readers.Test var dump_sccpluscart = new Data.Models.OpenMSX.Dump { Original = original, + Boot = "boot", Rom = sccpluscart, }; @@ -193,6 +196,8 @@ namespace SabreTools.Serialization.Readers.Test private static void Validate(Data.Models.OpenMSX.Dump? dump) { Assert.NotNull(dump); + Assert.Equal("boot", dump.Boot); + Validate(dump.Original); Validate(dump.Rom); } diff --git a/SabreTools.Serialization.Readers/OpenMSX.cs b/SabreTools.Serialization.Readers/OpenMSX.cs index 80f09f5a..cce1f4bf 100644 --- a/SabreTools.Serialization.Readers/OpenMSX.cs +++ b/SabreTools.Serialization.Readers/OpenMSX.cs @@ -136,6 +136,12 @@ namespace SabreTools.Serialization.Readers switch (reader.Name) { + case "boot": + if (obj.Boot is not null && Debug) + Console.WriteLine($"'{reader.Name}' element already found, overwriting"); + + obj.Boot = reader.ReadElementContentAsString(); + break; case "original": if (obj.Original is not null && Debug) Console.WriteLine($"'{reader.Name}' element already found, overwriting"); @@ -154,6 +160,7 @@ namespace SabreTools.Serialization.Readers default: if (Debug) Console.Error.WriteLine($"Element '{reader.Name}' is not recognized"); + reader.Skip(); break; } } diff --git a/SabreTools.Serialization.Writers/OpenMSX.cs b/SabreTools.Serialization.Writers/OpenMSX.cs index 95a6d699..be72ecb9 100644 --- a/SabreTools.Serialization.Writers/OpenMSX.cs +++ b/SabreTools.Serialization.Writers/OpenMSX.cs @@ -100,6 +100,8 @@ namespace SabreTools.Serialization.Writers if (obj.Original is not null) WriteOriginal(obj.Original, writer); + writer.WriteOptionalElementString("boot", obj.Boot); + if (obj.Rom is not null) WriteRomBase(obj.Rom, writer);