diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index 6cea3d38..e83f3d90 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -790,6 +790,10 @@ namespace SabreTools.Library.DatFiles string name = null, altName = null, altTitle = null, + original = null, + msxType = null, + remark = null, + boot = null, partName = null, partInterface = null, areaName = null, @@ -814,6 +818,7 @@ namespace SabreTools.Library.DatFiles bios = null; ItemStatus? itemStatus = null; ItemType? itemType = null; + OpenMSXSubType subType = OpenMSXSubType.NULL; List features = null; jtr.Read(); @@ -831,8 +836,16 @@ namespace SabreTools.Library.DatFiles datItem.Source = new Source { Index = indexId, Name = filename }; datItem.Name = name; + datItem.AltName = altName; datItem.AltTitle = altTitle; + + datItem.Original = new OpenMSXOriginal(original, null); + datItem.OpenMSXSubType = subType; + datItem.OpenMSXType = msxType; + datItem.Remark = remark; + datItem.Boot = boot; + datItem.PartName = partName; datItem.PartInterface = partInterface; datItem.Features = features; @@ -908,6 +921,8 @@ namespace SabreTools.Library.DatFiles switch (jtr.Value) { + #region Common + case "type": itemType = jtr.ReadAsString().AsItemType(); break; @@ -916,6 +931,10 @@ namespace SabreTools.Library.DatFiles name = jtr.ReadAsString(); break; + #endregion + + #region AttractMode + case "alt_romname": altName = jtr.ReadAsString(); break; @@ -924,6 +943,34 @@ namespace SabreTools.Library.DatFiles altTitle = jtr.ReadAsString(); break; + #endregion + + #region OpenMSX + + case "original": + original = jtr.ReadAsString(); + break; + + case "openmsx_subtype": + subType = jtr.ReadAsString().AsOpenMSXSubType(); + break; + + case "openmsx_type": + msxType = jtr.ReadAsString(); + break; + + case "remark": + remark = jtr.ReadAsString(); + break; + + case "boot": + boot = jtr.ReadAsString(); + break; + + #endregion + + #region SoftwareList + case "partname": partName = jtr.ReadAsString(); break; @@ -979,6 +1026,8 @@ namespace SabreTools.Library.DatFiles loadFlag = jtr.ReadAsString(); break; + #endregion + case "description": biosDescription = jtr.ReadAsString(); break; @@ -2142,6 +2191,8 @@ namespace SabreTools.Library.DatFiles break; } + #region AttractMode + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.AltName, Header.ExcludeFields))) { jtw.WritePropertyName("alt_romname"); @@ -2152,6 +2203,41 @@ namespace SabreTools.Library.DatFiles jtw.WritePropertyName("alt_title"); jtw.WriteValue(datItem.AltTitle); } + + #endregion + + #region OpenMSX + + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Original, Header.ExcludeFields))) + { + jtw.WritePropertyName("original"); + jtw.WriteValue(datItem.Original.Original); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.OpenMSXSubType, Header.ExcludeFields))) + { + jtw.WritePropertyName("openmsx_subtype"); + jtw.WriteValue(datItem.OpenMSXSubType); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.OpenMSXType, Header.ExcludeFields))) + { + jtw.WritePropertyName("openmsx_type"); + jtw.WriteValue(datItem.OpenMSXType); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Remark, Header.ExcludeFields))) + { + jtw.WritePropertyName("remark"); + jtw.WriteValue(datItem.Remark); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Boot, Header.ExcludeFields))) + { + jtw.WritePropertyName("boot"); + jtw.WriteValue(datItem.Boot); + } + + #endregion + + #region SoftwareList + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.PartName, Header.ExcludeFields))) { jtw.WritePropertyName("partname"); @@ -2207,6 +2293,8 @@ namespace SabreTools.Library.DatFiles jtw.WriteValue(datItem.LoadFlag); } + #endregion + // End item jtw.WriteEndObject(); diff --git a/SabreTools.Library/DatFiles/OpenMSX.cs b/SabreTools.Library/DatFiles/OpenMSX.cs index 2ff84a44..28be49a6 100644 --- a/SabreTools.Library/DatFiles/OpenMSX.cs +++ b/SabreTools.Library/DatFiles/OpenMSX.cs @@ -7,6 +7,7 @@ using System.Xml; using SabreTools.Library.Data; using SabreTools.Library.DatItems; using SabreTools.Library.IO; +using SabreTools.Library.Tools; namespace SabreTools.Library.DatFiles { @@ -204,7 +205,8 @@ namespace SabreTools.Library.DatFiles string filename, int indexId) { - bool containsItems = false; + List items = new List(); + OpenMSXOriginal original = null; while (!reader.EOF) { @@ -219,30 +221,36 @@ namespace SabreTools.Library.DatFiles switch (reader.Name) { case "rom": - containsItems = ReadRom(reader.ReadSubtree(), machine, diskno, filename, indexId); + DatItem rom = ReadRom(reader.ReadSubtree(), machine, diskno, filename, indexId); + if (rom != null) + items.Add(rom); // Skip the rom now that we've processed it reader.Skip(); break; case "megarom": - containsItems = ReadMegaRom(reader.ReadSubtree(), machine, diskno, filename, indexId); + DatItem megarom = ReadMegaRom(reader.ReadSubtree(), machine, diskno, filename, indexId); + if (megarom != null) + items.Add(megarom); // Skip the megarom now that we've processed it reader.Skip(); break; case "sccpluscart": - containsItems = ReadSccPlusCart(reader.ReadSubtree(), machine, diskno, filename, indexId); + DatItem sccpluscart = ReadSccPlusCart(reader.ReadSubtree(), machine, diskno, filename, indexId); + if (sccpluscart != null) + items.Add(sccpluscart); // Skip the sccpluscart now that we've processed it reader.Skip(); break; case "original": - // bool value = Utilities.GetYesNo(reader.GetAttribute("value"); - // string original = reader.ReadElementContentAsString(); - reader.Read(); + bool? value = reader.GetAttribute("value").AsYesNo(); + string orig = reader.ReadElementContentAsString(); + original = new OpenMSXOriginal(orig, value); break; default: @@ -251,7 +259,15 @@ namespace SabreTools.Library.DatFiles } } - return containsItems; + // If we have any items, loop through and add them + foreach (DatItem item in items) + { + item.CopyMachineInformation(machine); + item.Original = original; + ParseAddHelper(item); + } + + return items.Count > 0; } /// @@ -262,7 +278,7 @@ namespace SabreTools.Library.DatFiles /// Disk number to use when outputting to other DAT formats /// Name of the file to be parsed /// Index ID for the DAT - private bool ReadRom( + private DatItem ReadRom( XmlReader reader, Machine machine, int diskno, @@ -271,8 +287,10 @@ namespace SabreTools.Library.DatFiles string filename, int indexId) { - string hash = string.Empty, offset = string.Empty, remark = string.Empty; - bool containsItems = false; + string hash = string.Empty, + offset = string.Empty, + type = string.Empty, + remark = string.Empty; while (!reader.EOF) { @@ -287,7 +305,6 @@ namespace SabreTools.Library.DatFiles switch (reader.Name) { case "hash": - containsItems = true; hash = reader.ReadElementContentAsString(); break; @@ -296,7 +313,7 @@ namespace SabreTools.Library.DatFiles break; case "type": - reader.ReadElementContentAsString(); + type = reader.ReadElementContentAsString(); break; case "remark": @@ -309,25 +326,30 @@ namespace SabreTools.Library.DatFiles } } - // Create and add the new rom - Rom rom = new Rom + // If we got a hash, then create and return the item + if (!string.IsNullOrWhiteSpace(hash)) { - Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), - Offset = offset, - Size = -1, - SHA1 = hash, - - Source = new Source + return new Rom { - Index = indexId, - Name = filename, - }, - }; + Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), + Offset = offset, + Size = -1, + SHA1 = hash, - rom.CopyMachineInformation(machine); - ParseAddHelper(rom); + Source = new Source + { + Index = indexId, + Name = filename, + }, - return containsItems; + OpenMSXSubType = OpenMSXSubType.Rom, + OpenMSXType = type, + Remark = remark, + }; + } + + // No valid item means returning null + return null; } /// @@ -338,7 +360,7 @@ namespace SabreTools.Library.DatFiles /// Disk number to use when outputting to other DAT formats /// Name of the file to be parsed /// Index ID for the DAT - private bool ReadMegaRom( + private DatItem ReadMegaRom( XmlReader reader, Machine machine, int diskno, @@ -347,8 +369,10 @@ namespace SabreTools.Library.DatFiles string filename, int indexId) { - string hash = string.Empty, offset = string.Empty, remark = string.Empty; - bool containsItems = false; + string hash = string.Empty, + offset = string.Empty, + type = string.Empty, + remark = string.Empty; while (!reader.EOF) { @@ -363,7 +387,6 @@ namespace SabreTools.Library.DatFiles switch (reader.Name) { case "hash": - containsItems = true; hash = reader.ReadElementContentAsString(); break; @@ -385,25 +408,30 @@ namespace SabreTools.Library.DatFiles } } - // Create and add the new rom - Rom rom = new Rom + // If we got a hash, then create and return the item + if (!string.IsNullOrWhiteSpace(hash)) { - Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), - Offset = offset, - Size = -1, - SHA1 = hash, - - Source = new Source + return new Rom { - Index = indexId, - Name = filename, - }, - }; + Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), + Offset = offset, + Size = -1, + SHA1 = hash, - rom.CopyMachineInformation(machine); - ParseAddHelper(rom); + Source = new Source + { + Index = indexId, + Name = filename, + }, - return containsItems; + OpenMSXSubType = OpenMSXSubType.MegaRom, + OpenMSXType = type, + Remark = remark, + }; + } + + // No valid item means returning null + return null; } /// @@ -414,7 +442,7 @@ namespace SabreTools.Library.DatFiles /// Disk number to use when outputting to other DAT formats /// Name of the file to be parsed /// Index ID for the DAT - private bool ReadSccPlusCart( + private DatItem ReadSccPlusCart( XmlReader reader, Machine machine, int diskno, @@ -423,8 +451,9 @@ namespace SabreTools.Library.DatFiles string filename, int indexId) { - string hash = string.Empty, remark = string.Empty; - bool containsItems = false; + string boot = string.Empty, + hash = string.Empty, + remark = string.Empty; while (!reader.EOF) { @@ -439,11 +468,10 @@ namespace SabreTools.Library.DatFiles switch (reader.Name) { case "boot": - reader.ReadElementContentAsString(); + boot = reader.ReadElementContentAsString(); break; case "hash": - containsItems = true; hash = reader.ReadElementContentAsString(); break; @@ -457,24 +485,29 @@ namespace SabreTools.Library.DatFiles } } - // Create and add the new rom - Rom rom = new Rom + // If we got a hash, then create and return the item + if (!string.IsNullOrWhiteSpace(hash)) { - Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), - Size = -1, - SHA1 = hash, - - Source = new Source + return new Rom { - Index = indexId, - Name = filename, - }, - }; + Name = machine.Name + "_" + diskno + (!string.IsNullOrWhiteSpace(remark) ? " " + remark : string.Empty), + Size = -1, + SHA1 = hash, - rom.CopyMachineInformation(machine); - ParseAddHelper(rom); + Source = new Source + { + Index = indexId, + Name = filename, + }, - return containsItems; + OpenMSXSubType = OpenMSXSubType.SCCPlusCart, + Boot = boot, + Remark = remark, + }; + } + + // No valid item means returning null + return null; } /// @@ -689,24 +722,56 @@ namespace SabreTools.Library.DatFiles // Build the state based on excluded fields switch (datItem.ItemType) { - case ItemType.Rom: // Currently this encapsulates rom, megarom, and sccpluscart + case ItemType.Rom: var rom = datItem as Rom; xtw.WriteStartElement("dump"); - //xtw.WriteStartElement("original"); - //xtw.WriteAttributeString("value", "true"); - //xtw.WriteString("GoodMSX"); - //xtw.WriteEndElement(); + if (!Header.ExcludeFields.Contains(Field.Original) && rom.Original != null) + { + xtw.WriteStartElement("original"); + xtw.WriteAttributeString("value", rom.Original.Value == true ? "true" : "false"); + xtw.WriteString(rom.Original.Original); + xtw.WriteEndElement(); + } - xtw.WriteStartElement("rom"); - if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Offset, Header.ExcludeFields))) - xtw.WriteElementString("start", rom.Offset); - //xtw.WriteElementString("type", "Normal"); - xtw.WriteElementString("hash", rom.GetField(Field.SHA1, Header.ExcludeFields).ToLowerInvariant()); - //xtw.WriteElementString("remark", ""); + switch (datItem.OpenMSXSubType) + { + // Default to Rom for converting from other formats + case OpenMSXSubType.Rom: + case OpenMSXSubType.NULL: + xtw.WriteStartElement("rom"); + xtw.WriteElementString("hash", rom.GetField(Field.SHA1, Header.ExcludeFields).ToLowerInvariant()); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Offset, Header.ExcludeFields))) + xtw.WriteElementString("start", rom.Offset); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.OpenMSXType, Header.ExcludeFields))) + xtw.WriteElementString("type", rom.OpenMSXType); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Remark, Header.ExcludeFields))) + xtw.WriteElementString("remark", rom.Remark); + xtw.WriteEndElement(); + break; - // End rom - xtw.WriteEndElement(); + case OpenMSXSubType.MegaRom: + xtw.WriteStartElement("megarom"); + xtw.WriteElementString("hash", rom.GetField(Field.SHA1, Header.ExcludeFields).ToLowerInvariant()); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Offset, Header.ExcludeFields))) + xtw.WriteElementString("start", rom.Offset); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.OpenMSXType, Header.ExcludeFields))) + xtw.WriteElementString("type", rom.OpenMSXType); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Remark, Header.ExcludeFields))) + xtw.WriteElementString("remark", rom.Remark); + xtw.WriteEndElement(); + break; + + case OpenMSXSubType.SCCPlusCart: + xtw.WriteStartElement("sccpluscart"); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Boot, Header.ExcludeFields))) + xtw.WriteElementString("boot", rom.Boot); + xtw.WriteElementString("hash", rom.GetField(Field.SHA1, Header.ExcludeFields).ToLowerInvariant()); + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Remark, Header.ExcludeFields))) + xtw.WriteElementString("remark", rom.Remark); + xtw.WriteEndElement(); + break; + } // End dump xtw.WriteEndElement(); diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs index 8dab7466..7d1a6714 100644 --- a/SabreTools.Library/DatFiles/SeparatedValue.cs +++ b/SabreTools.Library/DatFiles/SeparatedValue.cs @@ -84,6 +84,10 @@ namespace SabreTools.Library.DatFiles string name = null, altName = null, altTitle = null, + original = null, + msxType = null, + remark = null, + boot = null, partName = null, partInterface = null, areaName = null, @@ -112,6 +116,7 @@ namespace SabreTools.Library.DatFiles long size = -1; ItemType itemType = ItemType.Rom; ItemStatus status = ItemStatus.None; + OpenMSXSubType subType = OpenMSXSubType.NULL; List features = null; // Now we loop through and get values for everything @@ -527,6 +532,30 @@ namespace SabreTools.Library.DatFiles #endregion + #region OpenMSX + + case "DatItem.Original": + original = value; + break; + + case "DatItem.OpenMSXSubType": + subType = value.AsOpenMSXSubType(); + break; + + case "DatItem.OpenMSXType": + msxType = value; + break; + + case "DatItem.Remark": + remark = value; + break; + + case "DatItem.Boot": + boot = value; + break; + + #endregion + #region SoftwareList case "DatItem.PartName": @@ -686,6 +715,12 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, + Original = new OpenMSXOriginal(original, null), + OpenMSXSubType = subType, + OpenMSXType = msxType, + Remark = remark, + Boot = boot, + PartName = partName, PartInterface = partInterface, Features = features, @@ -715,6 +750,12 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, + Original = new OpenMSXOriginal(original, null), + OpenMSXSubType = subType, + OpenMSXType = msxType, + Remark = remark, + Boot = boot, + PartName = partName, PartInterface = partInterface, Features = features, @@ -747,6 +788,12 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, + Original = new OpenMSXOriginal(original, null), + OpenMSXSubType = subType, + OpenMSXType = msxType, + Remark = remark, + Boot = boot, + PartName = partName, PartInterface = partInterface, Features = features, @@ -791,6 +838,12 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, + Original = new OpenMSXOriginal(original, null), + OpenMSXSubType = subType, + OpenMSXType = msxType, + Remark = remark, + Boot = boot, + PartName = partName, PartInterface = partInterface, Features = features, @@ -825,6 +878,12 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, + Original = new OpenMSXOriginal(original, null), + OpenMSXSubType = subType, + OpenMSXType = msxType, + Remark = remark, + Boot = boot, + PartName = partName, PartInterface = partInterface, Features = features, @@ -873,6 +932,12 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, + Original = new OpenMSXOriginal(original, null), + OpenMSXSubType = subType, + OpenMSXType = msxType, + Remark = remark, + Boot = boot, + PartName = partName, PartInterface = partInterface, Features = features, @@ -1343,6 +1408,24 @@ namespace SabreTools.Library.DatFiles #endregion + #region OpenMSX + + case "original": + return "DatItem.Original"; + case "subtype": + case "sub type": + case "sub-type": + case "openmsx_subtype": + return "DatItem.OpenMSXSubType"; + case "openmsx_type": + return "DatItem.OpenMSXType"; + case "remark": + return "DatItem.Remark"; + case "boot": + return "DatItem.Boot"; + + #endregion + #region SoftwareList case "partname": diff --git a/SabreTools.Library/DatItems/Archive.cs b/SabreTools.Library/DatItems/Archive.cs index d9b5c74c..f0b2348d 100644 --- a/SabreTools.Library/DatItems/Archive.cs +++ b/SabreTools.Library/DatItems/Archive.cs @@ -31,6 +31,12 @@ AltName = this.AltName, AltTitle = this.AltTitle, + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index 0c35f599..f23fde20 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -26,6 +26,25 @@ namespace SabreTools.Library.DatItems #endregion + #region OpenMSX + + /// + /// Represents the OpenMSX original value + /// + public class OpenMSXOriginal + { + public string Original { get; set; } + public bool? Value { get; set; } + + public OpenMSXOriginal(string original, bool? value) + { + Original = original; + Value = value; + } + } + + #endregion + #region SoftwareList /// diff --git a/SabreTools.Library/DatItems/BiosSet.cs b/SabreTools.Library/DatItems/BiosSet.cs index e0bd14c2..dbfcf877 100644 --- a/SabreTools.Library/DatItems/BiosSet.cs +++ b/SabreTools.Library/DatItems/BiosSet.cs @@ -107,6 +107,12 @@ namespace SabreTools.Library.DatItems AltName = this.AltName, AltTitle = this.AltTitle, + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, @@ -159,7 +165,9 @@ namespace SabreTools.Library.DatItems return false; // Filter on description - if (filter.Description.MatchesNeutral(null, Description) == false) + if (filter.Description.MatchesPositiveSet(Description) == false) + return false; + if (filter.Description.MatchesNegativeSet(Description) == true) return false; // Filter on default diff --git a/SabreTools.Library/DatItems/Blank.cs b/SabreTools.Library/DatItems/Blank.cs index 9d8aa188..cd594d27 100644 --- a/SabreTools.Library/DatItems/Blank.cs +++ b/SabreTools.Library/DatItems/Blank.cs @@ -31,6 +31,12 @@ AltName = this.AltName, AltTitle = this.AltTitle, + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index 61f0beb3..d6fb18cb 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -69,6 +69,41 @@ namespace SabreTools.Library.DatItems #endregion + #region OpenMSX + + /// + /// OpenMSX sub item type + /// + [JsonProperty("original")] + public OpenMSXOriginal Original { get; set; } + + /// + /// OpenMSX sub item type + /// + [JsonProperty("openmsx_subtype")] + public OpenMSXSubType OpenMSXSubType { get; set; } + + /// + /// OpenMSX sub item type + /// + /// Not related to the subtype above + [JsonProperty("openmsx_type")] + public string OpenMSXType { get; set; } + + /// + /// Item remark (like a comment) + /// + [JsonProperty("remark")] + public string Remark { get; set; } + + /// + /// Boot state + /// + [JsonProperty("boot")] + public string Boot { get; set; } + + #endregion + #region SoftwareList Fields /// @@ -160,6 +195,13 @@ namespace SabreTools.Library.DatItems Field.AltName, Field.AltTitle, + // OpenMSX + Field.Original, + Field.OpenMSXSubType, + Field.OpenMSXType, + Field.Remark, + Field.Boot, + //SoftwareList Field.PartName, Field.PartInterface, @@ -286,15 +328,47 @@ namespace SabreTools.Library.DatItems switch (field) { + #region Common + case Field.Name: fieldValue = Name; break; + + #endregion + + #region AttractMode + case Field.AltName: fieldValue = AltName; break; case Field.AltTitle: fieldValue = AltTitle; break; + + #endregion + + #region OpenMSX + + case Field.Original: + fieldValue = Original.Original; + break; + case Field.OpenMSXSubType: + fieldValue = OpenMSXSubType.ToString(); + break; + case Field.OpenMSXType: + fieldValue = OpenMSXType; + break; + case Field.Remark: + fieldValue = Remark; + break; + case Field.Boot: + fieldValue = Boot; + break; + + #endregion + + #region SoftwareList + case Field.PartName: fieldValue = PartName; break; @@ -323,6 +397,8 @@ namespace SabreTools.Library.DatItems fieldValue = LoadFlag; break; + #endregion + case Field.NULL: default: return string.Empty; @@ -361,6 +437,25 @@ namespace SabreTools.Library.DatItems #endregion + #region OpenMSX + + if (mappings.Keys.Contains(Field.Original)) + Original = new OpenMSXOriginal(mappings[Field.Original], null); + + if (mappings.Keys.Contains(Field.OpenMSXSubType)) + OpenMSXSubType = mappings[Field.OpenMSXSubType].AsOpenMSXSubType(); + + if (mappings.Keys.Contains(Field.OpenMSXType)) + OpenMSXType = mappings[Field.OpenMSXType]; + + if (mappings.Keys.Contains(Field.Remark)) + Remark = mappings[Field.Remark]; + + if (mappings.Keys.Contains(Field.Boot)) + Boot = mappings[Field.Boot]; + + #endregion + #region SoftwareList if (mappings.Keys.Contains(Field.PartName)) @@ -625,6 +720,40 @@ namespace SabreTools.Library.DatItems #endregion + #region OpenMSX + + // Filter on original + if (filter.Original.MatchesPositiveSet(Original.Original) == false) + return false; + if (filter.Original.MatchesNegativeSet(Original.Original) == true) + return false; + + // Filter on OpenMSX subtype + if (filter.SubType.MatchesPositiveSet(OpenMSXSubType) == false) + return false; + if (filter.SubType.MatchesNegativeSet(OpenMSXSubType) == true) + return false; + + // Filter on OpenMSX type + if (filter.OpenMSXType.MatchesPositiveSet(OpenMSXType) == false) + return false; + if (filter.OpenMSXType.MatchesNegativeSet(OpenMSXType) == true) + return false; + + // Filter on remark + if (filter.Remark.MatchesPositiveSet(Remark) == false) + return false; + if (filter.Remark.MatchesNegativeSet(Remark) == true) + return false; + + // Filter on boot + if (filter.Boot.MatchesPositiveSet(Boot) == false) + return false; + if (filter.Boot.MatchesNegativeSet(Boot) == true) + return false; + + #endregion + #region SoftwareList // Filter on part name @@ -708,6 +837,25 @@ namespace SabreTools.Library.DatItems #endregion + #region OpenMSX + + if (fields.Contains(Field.Original)) + Original = null; + + if (fields.Contains(Field.OpenMSXSubType)) + OpenMSXSubType = OpenMSXSubType.NULL; + + if (fields.Contains(Field.OpenMSXType)) + OpenMSXType = null; + + if (fields.Contains(Field.Remark)) + Remark = null; + + if (fields.Contains(Field.Boot)) + Boot = null; + + #endregion + #region SoftwareList if (fields.Contains(Field.PartName)) @@ -837,6 +985,25 @@ namespace SabreTools.Library.DatItems #endregion + #region OpenMSX + + if (fields.Contains(Field.Original)) + Original = item.Original; + + if (fields.Contains(Field.OpenMSXSubType)) + OpenMSXSubType = item.OpenMSXSubType; + + if (fields.Contains(Field.OpenMSXType)) + OpenMSXType = item.OpenMSXType; + + if (fields.Contains(Field.Remark)) + Remark = item.Remark; + + if (fields.Contains(Field.Boot)) + Boot = item.Boot; + + #endregion + #region SoftwareList if (fields.Contains(Field.PartName)) diff --git a/SabreTools.Library/DatItems/Disk.cs b/SabreTools.Library/DatItems/Disk.cs index 595da90a..843135d9 100644 --- a/SabreTools.Library/DatItems/Disk.cs +++ b/SabreTools.Library/DatItems/Disk.cs @@ -295,6 +295,12 @@ namespace SabreTools.Library.DatItems AltName = this.AltName, AltTitle = this.AltTitle, + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, @@ -341,6 +347,12 @@ namespace SabreTools.Library.DatItems AltName = this.AltName, AltTitle = this.AltTitle, + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index 060a5da4..aae939a8 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -121,6 +121,16 @@ namespace SabreTools.Library.DatItems #endregion + #region OpenMSX + + Original, + OpenMSXSubType, + OpenMSXType, + Remark, + Boot, + + #endregion + #region SoftwareList PartName, @@ -202,6 +212,18 @@ namespace SabreTools.Library.DatItems Blank = 99, // This is not a real type, only used internally } + /// + /// Determine which OpenMSX subtype an item is + /// + [Flags] + public enum OpenMSXSubType + { + NULL = 0, + Rom = 1, + MegaRom = 2, + SCCPlusCart = 3, + } + /// /// Determine what type of machine it is /// diff --git a/SabreTools.Library/DatItems/Release.cs b/SabreTools.Library/DatItems/Release.cs index 42185b75..6353664a 100644 --- a/SabreTools.Library/DatItems/Release.cs +++ b/SabreTools.Library/DatItems/Release.cs @@ -135,6 +135,12 @@ namespace SabreTools.Library.DatItems AltName = this.AltName, AltTitle = this.AltTitle, + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index 59883223..f5296ef0 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -377,6 +377,12 @@ namespace SabreTools.Library.DatItems AltName = this.AltName, AltTitle = this.AltTitle, + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/DatItems/Sample.cs b/SabreTools.Library/DatItems/Sample.cs index f617885f..d28cca56 100644 --- a/SabreTools.Library/DatItems/Sample.cs +++ b/SabreTools.Library/DatItems/Sample.cs @@ -31,6 +31,12 @@ AltName = this.AltName, AltTitle = this.AltTitle, + Original = this.Original, + OpenMSXSubType = this.OpenMSXSubType, + OpenMSXType = this.OpenMSXType, + Remark = this.Remark, + Boot = this.Boot, + PartName = this.PartName, PartInterface = this.PartInterface, Features = this.Features, diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index 67034fe6..83e98993 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -267,6 +267,35 @@ namespace SabreTools.Library.Filtering #endregion + #region OpenMSX + + /// + /// Include or exclude original value + /// + public FilterItem Original { get; private set; } = new FilterItem(); + + /// + /// Include or exclude items of a certain OpenMSX subtype + /// + public FilterItem SubType { get; private set; } = new FilterItem() { Positive = OpenMSXSubType.NULL, Negative = OpenMSXSubType.NULL }; + + /// + /// Include or exclude OpenMSX type + /// + public FilterItem OpenMSXType { get; private set; } = new FilterItem(); + + /// + /// Include or exclude remarks + /// + public FilterItem Remark { get; private set; } = new FilterItem(); + + /// + /// Include or exclude boots + /// + public FilterItem Boot { get; private set; } = new FilterItem(); + + #endregion + #region SoftwareList /// @@ -860,6 +889,45 @@ namespace SabreTools.Library.Filtering #endregion + #region OpenMSX + + case Field.Original: + if (negate) + Original.NegativeSet.Add(value); + else + Original.PositiveSet.Add(value); + break; + + case Field.OpenMSXSubType: + if (negate) + SubType.Negative |= value.AsOpenMSXSubType(); + else + SubType.Positive |= value.AsOpenMSXSubType(); + break; + + case Field.OpenMSXType: + if (negate) + OpenMSXType.NegativeSet.Add(value); + else + OpenMSXType.PositiveSet.Add(value); + break; + + case Field.Remark: + if (negate) + Remark.NegativeSet.Add(value); + else + Remark.PositiveSet.Add(value); + break; + + case Field.Boot: + if (negate) + Boot.NegativeSet.Add(value); + else + Boot.PositiveSet.Add(value); + break; + + #endregion + #region SoftwareList case Field.PartName: diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index d0e75663..5a5d1b56 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -363,7 +363,6 @@ namespace SabreTools.Library.Tools case "alt romname": case "alt-romname": return Field.AltName; - case "alttitle": case "alt title": case "alt-title": @@ -374,6 +373,24 @@ namespace SabreTools.Library.Tools #endregion + #region OpenMSX + + case "original": + return Field.Original; + case "subtype": + case "sub type": + case "sub-type": + case "openmsx_subtype": + return Field.OpenMSXSubType; + case "openmsx_type": + return Field.OpenMSXType; + case "remark": + return Field.Remark; + case "boot": + return Field.Boot; + + #endregion + #region SoftwareList case "partname": @@ -665,6 +682,36 @@ namespace SabreTools.Library.Tools #endif } + /// + /// Get OpenMSXSubType value from input string + /// + /// String to get value from + /// OpenMSXSubType value corresponding to the string + public static OpenMSXSubType AsOpenMSXSubType(this string itemType) + { +#if NET_FRAMEWORK + switch (itemType?.ToLowerInvariant()) + { + case "rom": + return OpenMSXSubType.Rom; + case "megarom": + return OpenMSXSubType.MegaRom; + case "sccpluscart": + return OpenMSXSubType.SCCPlusCart; + default: + return OpenMSXSubType.NULL; + } +#else + return itemType?.ToLowerInvariant() switch + { + "rom" => OpenMSXSubType.Rom, + "megarom" => OpenMSXSubType.MegaRom, + "sccpluscart" => OpenMSXSubType.SCCPlusCart, + _ => OpenMSXSubType.NULL, + }; +#endif + } + /// /// Get PackingFlag value from input string ///