diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index 214ccfc7..e6d259f1 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -480,6 +480,7 @@ namespace SabreTools.Library.DatFiles Field.Writable, Field.Optional, Field.Status, + Field.Inverted, Field.CRC, Field.MD5, @@ -682,6 +683,12 @@ namespace SabreTools.Library.DatFiles rom.ItemStatus = romDupe.ItemStatus; } + if (updateFields.Contains(Field.Inverted)) + { + if (newDatItem.ItemType == ItemType.Rom) + rom.Inverted = romDupe.Inverted; + } + #endregion #region Hash fields diff --git a/SabreTools.Library/DatFiles/Filter.cs b/SabreTools.Library/DatFiles/Filter.cs index 8f2f3f2c..f2c7d6da 100644 --- a/SabreTools.Library/DatFiles/Filter.cs +++ b/SabreTools.Library/DatFiles/Filter.cs @@ -254,6 +254,11 @@ namespace SabreTools.Library.DatFiles /// private FilterItem Offset = new FilterItem(); + /// + /// Include or exclude offsets + /// + private FilterItem Inverted = new FilterItem(); + #endregion #endregion // Private instance variables @@ -779,6 +784,13 @@ namespace SabreTools.Library.DatFiles Offset.PositiveSet.Add(value); break; + case Field.Inverted: + if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase)) + Inverted.Neutral = false; + else + Inverted.Neutral = true; + break; + #endregion } } @@ -1318,6 +1330,10 @@ namespace SabreTools.Library.DatFiles if (this.Optional.MatchesNeutral(null, rom.Optional) == false) return false; + // Filter on inverted + if (this.Inverted.MatchesNeutral(null, rom.Inverted) == false) + return false; + break; case ItemType.Sample: @@ -2268,6 +2284,11 @@ namespace SabreTools.Library.DatFiles if (item.ItemType == ItemType.Rom) (item as Rom).Offset = null; } + if (field == Field.Inverted) + { + if (item.ItemType == ItemType.Rom) + (item as Rom).Inverted = null; + } } items[j] = item; diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index 0a763558..3b48c092 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -492,7 +492,8 @@ namespace SabreTools.Library.DatFiles // Prepare internal variables bool? def = null, writable = null, - optional = null; + optional = null, + inverted = null; long size = -1; long? areaSize = null; string name = null, @@ -588,6 +589,7 @@ namespace SabreTools.Library.DatFiles (datItem as Rom).Date = date; (datItem as Rom).ItemStatus = itemStatus ?? ItemStatus.None; (datItem as Rom).Optional = optional; + (datItem as Rom).Inverted = inverted; } ParseAddHelper(datItem); @@ -733,6 +735,10 @@ namespace SabreTools.Library.DatFiles bios = jtr.ReadAsString(); break; + case "inverted": + inverted = jtr.ReadAsBoolean(); + break; + default: break; } @@ -1408,6 +1414,11 @@ namespace SabreTools.Library.DatFiles jtw.WritePropertyName("optional"); jtw.WriteValue(rom.Optional); } + if (!string.IsNullOrWhiteSpace(rom.GetField(Field.Inverted, Header.ExcludeFields))) + { + jtw.WritePropertyName("inverted"); + jtw.WriteValue(rom.Inverted); + } break; case ItemType.Sample: diff --git a/SabreTools.Library/DatFiles/Logiqx.cs b/SabreTools.Library/DatFiles/Logiqx.cs index 3f2c9805..297e5643 100644 --- a/SabreTools.Library/DatFiles/Logiqx.cs +++ b/SabreTools.Library/DatFiles/Logiqx.cs @@ -447,6 +447,7 @@ namespace SabreTools.Library.DatFiles MergeTag = reader.GetAttribute("merge"), ItemStatus = reader.GetAttribute("status").AsItemStatus(), Date = Sanitizer.CleanDate(reader.GetAttribute("date")), + Inverted = reader.GetAttribute("inverted").AsYesNo(), IndexId = indexId, IndexSource = filename, @@ -1033,6 +1034,8 @@ namespace SabreTools.Library.DatFiles xtw.WriteAttributeString("date", rom.Date); if (!Header.ExcludeFields.Contains(Field.Status) && rom.ItemStatus != ItemStatus.None) xtw.WriteAttributeString("status", rom.ItemStatus.ToString().ToLowerInvariant()); + if (!Header.ExcludeFields.Contains(Field.Inverted) && rom.Inverted != null) + xtw.WriteAttributeString("inverted", rom.Inverted.ToString().ToLowerInvariant()); xtw.WriteEndElement(); break; diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs index 21f2b2f5..76d35f0a 100644 --- a/SabreTools.Library/DatFiles/SeparatedValue.cs +++ b/SabreTools.Library/DatFiles/SeparatedValue.cs @@ -80,7 +80,8 @@ namespace SabreTools.Library.DatFiles bool? def = null, writable = null, - optional = null; + optional = null, + inverted = null; string name = null, partName = null, partInterface = null, @@ -410,6 +411,10 @@ namespace SabreTools.Library.DatFiles offset = string.IsNullOrWhiteSpace(value) ? offset : value; break; + case "DatItem.Inverted": + offset = string.IsNullOrWhiteSpace(value) ? inverted : value; + break; + #endregion case "INVALID": @@ -544,6 +549,7 @@ namespace SabreTools.Library.DatFiles Date = date, ItemStatus = status, Optional = optional, + Inverted = inverted, IndexId = indexId, IndexSource = filename, @@ -844,6 +850,9 @@ namespace SabreTools.Library.DatFiles case "offset": return "DatItem.Offset"; + case "inverted": + return "DatItem.Inverted"; + #endregion default: diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index 2411722c..cd343983 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -810,6 +810,10 @@ namespace SabreTools.Library.DatItems if (ItemType == ItemType.Rom) fieldValue = (this as Rom).Offset; break; + case Field.Inverted: + if (ItemType == ItemType.Rom) + fieldValue = (this as Rom).Inverted?.ToString(); + break; case Field.NULL: default: diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index dd5d8752..9be93b55 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -148,6 +148,12 @@ namespace SabreTools.Library.DatItems [JsonProperty("optional")] public bool? Optional { get; set; } + /// + /// Determine if the CRC32 hash is inverted + /// + [JsonProperty("inverted")] + public bool? Inverted { get; set; } + #endregion #region Constructors diff --git a/SabreTools.Library/Data/Enums.cs b/SabreTools.Library/Data/Enums.cs index 42a4e3e9..a7f06aea 100644 --- a/SabreTools.Library/Data/Enums.cs +++ b/SabreTools.Library/Data/Enums.cs @@ -408,6 +408,7 @@ Size, CRC, Offset, + Inverted, } /// diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index 14fcde20..02db62bc 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -182,6 +182,8 @@ namespace SabreTools.Library.Tools return Field.Index; case "infos": return Field.Infos; + case "inverted": + return Field.Inverted; case "itemname": case "item-name": case "name": @@ -561,8 +563,10 @@ namespace SabreTools.Library.Tools switch (yesno?.ToLowerInvariant()) { case "yes": + case "true": return true; case "no": + case "false": return false; case "partial": default: @@ -572,7 +576,9 @@ namespace SabreTools.Library.Tools return yesno?.ToLowerInvariant() switch { "yes" => true, + "true" => true, "no" => false, + "false" => false, "partial" => null, _ => null, };