diff --git a/SabreTools.DatFiles/DatFile.FromMetadata.cs b/SabreTools.DatFiles/DatFile.FromMetadata.cs index 9fd8efdd..b8a5161c 100644 --- a/SabreTools.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.DatFiles/DatFile.FromMetadata.cs @@ -1064,20 +1064,21 @@ namespace SabreTools.DatFiles var item = new DatItems.Formats.Rom(); item.SetName(name); - item.SetFieldValue(Models.Metadata.Rom.OffsetKey, rom.ReadString(Models.Metadata.Rom.OffsetKey)); + item.SetFieldValue(Models.Metadata.Rom.OffsetKey, rom.ReadString(Models.Metadata.Rom.StartKey)); item.SetFieldValue(Models.Metadata.Rom.OpenMSXMediaType, subType.AsStringValue()); - item.SetFieldValue(Models.Metadata.Rom.OpenMSXType, rom.ReadString(Models.Metadata.Rom.OpenMSXType)); + item.SetFieldValue(Models.Metadata.Rom.OpenMSXType, rom.ReadString(Models.Metadata.Rom.OpenMSXType) ?? rom.ReadString(Models.Metadata.Rom.TypeKey)); item.SetFieldValue(Models.Metadata.Rom.RemarkKey, rom.ReadString(Models.Metadata.Rom.RemarkKey)); item.SetFieldValue(Models.Metadata.Rom.SHA1Key, rom.ReadString(Models.Metadata.Rom.SHA1Key)); + item.SetFieldValue(Models.Metadata.Rom.StartKey, rom.ReadString(Models.Metadata.Rom.StartKey)); item.SetFieldValue(DatItems.DatItem.SourceKey, new DatItems.Source { Index = indexId, Name = filename }); - if (dump.Read(Models.Metadata.Dump.OriginalKey) != null) + if (dump.Read(Models.Metadata.Dump.OriginalKey) != null) { - var original = dump.Read(Models.Metadata.Dump.OriginalKey)!; + var original = dump.Read(Models.Metadata.Dump.OriginalKey)!; item.SetFieldValue("ORIGINAL", new DatItems.Formats.Original { - Value = original.Value.AsYesNo(), - Content = original.Content, + Value = original.ReadBool(Models.Metadata.Original.ValueKey), + Content = original.ReadString(Models.Metadata.Original.ContentKey), }); } diff --git a/SabreTools.DatFiles/DatFile.ToMetadata.cs b/SabreTools.DatFiles/DatFile.ToMetadata.cs index 21578d40..f7c72c88 100644 --- a/SabreTools.DatFiles/DatFile.ToMetadata.cs +++ b/SabreTools.DatFiles/DatFile.ToMetadata.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using SabreTools.Core; using SabreTools.Core.Tools; namespace SabreTools.DatFiles @@ -557,6 +558,94 @@ namespace SabreTools.DatFiles { var romItem = item.GetInternalClone(); + // Create a Dump for every Rom that has a subtype + switch (romItem.ReadString(Models.Metadata.Rom.OpenMSXMediaType).AsEnumValue()) + { + case OpenMSXSubType.Rom: + var dumpRom = new Models.Metadata.Dump(); + var rom = new Models.Metadata.Rom(); + + rom[Models.Metadata.Rom.NameKey] = romItem.ReadString(Models.Metadata.Rom.NameKey); + rom[Models.Metadata.Rom.OffsetKey] = romItem.ReadString(Models.Metadata.Rom.StartKey) ?? romItem.ReadString(Models.Metadata.Rom.OffsetKey); + rom[Models.Metadata.Rom.OpenMSXType] = romItem.ReadString(Models.Metadata.Rom.OpenMSXType); + rom[Models.Metadata.Rom.RemarkKey] = romItem.ReadString(Models.Metadata.Rom.RemarkKey); + rom[Models.Metadata.Rom.SHA1Key] = romItem.ReadString(Models.Metadata.Rom.SHA1Key); + rom[Models.Metadata.Rom.StartKey] = romItem.ReadString(Models.Metadata.Rom.StartKey) ?? romItem.ReadString(Models.Metadata.Rom.OffsetKey); + + dumpRom[Models.Metadata.Dump.RomKey] = rom; + + var romOriginal = romItem.Read("ORIGINAL"); + if (romOriginal != null) + { + var newOriginal = new Models.Metadata.Original + { + [Models.Metadata.Original.ValueKey] = romOriginal.Value.FromYesNo(), + [Models.Metadata.Original.ContentKey] = romOriginal.Content, + }; + dumpRom[Models.Metadata.Dump.OriginalKey] = newOriginal; + } + + EnsureMachineKey(machine, Models.Metadata.Machine.DumpKey); + AppendToMachineKey(machine, Models.Metadata.Machine.DumpKey, dumpRom); + break; + + case OpenMSXSubType.MegaRom: + var dumpMegaRom = new Models.Metadata.Dump(); + var megaRom = new Models.Metadata.Rom(); + + megaRom[Models.Metadata.Rom.NameKey] = romItem.ReadString(Models.Metadata.Rom.NameKey); + megaRom[Models.Metadata.Rom.OffsetKey] = romItem.ReadString(Models.Metadata.Rom.StartKey) ?? romItem.ReadString(Models.Metadata.Rom.OffsetKey); + megaRom[Models.Metadata.Rom.OpenMSXType] = romItem.ReadString(Models.Metadata.Rom.OpenMSXType); + megaRom[Models.Metadata.Rom.RemarkKey] = romItem.ReadString(Models.Metadata.Rom.RemarkKey); + megaRom[Models.Metadata.Rom.SHA1Key] = romItem.ReadString(Models.Metadata.Rom.SHA1Key); + megaRom[Models.Metadata.Rom.StartKey] = romItem.ReadString(Models.Metadata.Rom.StartKey) ?? romItem.ReadString(Models.Metadata.Rom.OffsetKey); + + dumpMegaRom[Models.Metadata.Dump.MegaRomKey] = megaRom; + + var megaRomOriginal = romItem.Read("ORIGINAL"); + if (megaRomOriginal != null) + { + var newOriginal = new Models.Metadata.Original + { + [Models.Metadata.Original.ValueKey] = megaRomOriginal.Value.FromYesNo(), + [Models.Metadata.Original.ContentKey] = megaRomOriginal.Content, + }; + dumpMegaRom[Models.Metadata.Dump.OriginalKey] = newOriginal; + } + + EnsureMachineKey(machine, Models.Metadata.Machine.DumpKey); + AppendToMachineKey(machine, Models.Metadata.Machine.DumpKey, dumpMegaRom); + break; + + case OpenMSXSubType.SCCPlusCart: + var dumpSccPlusCart = new Models.Metadata.Dump(); + var sccPlusCart = new Models.Metadata.Rom(); + + sccPlusCart[Models.Metadata.Rom.NameKey] = romItem.ReadString(Models.Metadata.Rom.NameKey); + sccPlusCart[Models.Metadata.Rom.OffsetKey] = romItem.ReadString(Models.Metadata.Rom.StartKey) ?? romItem.ReadString(Models.Metadata.Rom.OffsetKey); + sccPlusCart[Models.Metadata.Rom.OpenMSXType] = romItem.ReadString(Models.Metadata.Rom.OpenMSXType); + sccPlusCart[Models.Metadata.Rom.RemarkKey] = romItem.ReadString(Models.Metadata.Rom.RemarkKey); + sccPlusCart[Models.Metadata.Rom.SHA1Key] = romItem.ReadString(Models.Metadata.Rom.SHA1Key); + sccPlusCart[Models.Metadata.Rom.StartKey] = romItem.ReadString(Models.Metadata.Rom.StartKey) ?? romItem.ReadString(Models.Metadata.Rom.OffsetKey); + + dumpSccPlusCart[Models.Metadata.Dump.RomKey] = sccPlusCart; + + var sccPlusCartOriginal = romItem.Read("ORIGINAL"); + if (sccPlusCartOriginal != null) + { + var newOriginal = new Models.Metadata.Original + { + [Models.Metadata.Original.ValueKey] = sccPlusCartOriginal.Value.FromYesNo(), + [Models.Metadata.Original.ContentKey] = sccPlusCartOriginal.Content, + }; + dumpSccPlusCart[Models.Metadata.Dump.OriginalKey] = newOriginal; + } + + EnsureMachineKey(machine, Models.Metadata.Machine.DumpKey); + AppendToMachineKey(machine, Models.Metadata.Machine.DumpKey, dumpSccPlusCart); + break; + } + // TODO: Handle DipSwitch in Part inversion // TODO: Handle DipSwitch in DataArea inversion diff --git a/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs b/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs index 5977eba1..f555e4b1 100644 --- a/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs +++ b/SabreTools.DatFiles/Formats/OpenMSX.Writer.cs @@ -50,8 +50,12 @@ namespace SabreTools.DatFiles.Formats logger.User($"Writing to '{outfile}'..."); // TODO: Write out comment prefix somehow - var softwaredb = CreateSoftwareDb(ignoreblanks); - if (!(new Serialization.Files.OpenMSX().SerializeToFileWithDocType(softwaredb, outfile))) + //var softwaredb = CreateSoftwareDb(ignoreblanks); + + // Serialize the input file + var metadata = ConvertMetadata(ignoreblanks); + var softwaredb = new Serialization.CrossModel.OpenMSX().Deserialize(metadata); + if (!(new Serialization.Files.OpenMSX().SerializeToFileWithDocType(softwaredb!, outfile))) { logger.Warning($"File '{outfile}' could not be written! See the log for more details."); return false; @@ -166,7 +170,7 @@ namespace SabreTools.DatFiles.Formats _ => new Models.OpenMSX.Rom(), }; - rom.Start = item.GetStringFieldValue(Models.Metadata.Rom.OffsetKey); + rom.Start = item.GetStringFieldValue(Models.Metadata.Rom.StartKey); rom.Type = item.GetStringFieldValue(Models.Metadata.Rom.OpenMSXType); rom.Hash = item.GetStringFieldValue(Models.Metadata.Rom.SHA1Key); rom.Remark = item.GetStringFieldValue(Models.Metadata.Rom.RemarkKey);