From e9ca2658bb965a8a44ffebcc0329a999e481fdfd Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Fri, 21 Aug 2020 13:31:22 -0700 Subject: [PATCH] Wire up area width, endianness for SL --- SabreTools.Library/DatFiles/Json.cs | 22 +++++ SabreTools.Library/DatFiles/SeparatedValue.cs | 48 +++++++++++ SabreTools.Library/DatFiles/SoftwareList.cs | 86 +++++++++++++------ SabreTools.Library/DatItems/Archive.cs | 2 + SabreTools.Library/DatItems/BiosSet.cs | 2 + SabreTools.Library/DatItems/Blank.cs | 2 + SabreTools.Library/DatItems/DatItem.cs | 52 +++++++++++ SabreTools.Library/DatItems/Disk.cs | 4 + SabreTools.Library/DatItems/Enums.cs | 2 + SabreTools.Library/DatItems/Release.cs | 2 + SabreTools.Library/DatItems/Rom.cs | 2 + SabreTools.Library/DatItems/Sample.cs | 2 + SabreTools.Library/Filtering/Filter.cs | 24 ++++++ SabreTools.Library/Tools/Converters.cs | 8 ++ 14 files changed, 232 insertions(+), 26 deletions(-) diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index c7161b06..6423bc49 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -736,6 +736,8 @@ namespace SabreTools.Library.DatFiles partName = null, partInterface = null, areaName = null, + areaWidth = null, + areaEndianness = null, biosDescription = null, region = null, language = null, @@ -777,6 +779,8 @@ namespace SabreTools.Library.DatFiles datItem.Features = features; datItem.AreaName = areaName; datItem.AreaSize = areaSize; + datItem.AreaWidth = areaWidth; + datItem.AreaEndianness = areaEndianness; if (itemType == ItemType.BiosSet) { @@ -898,6 +902,14 @@ namespace SabreTools.Library.DatFiles break; + case "areawidth": + areaWidth = jtr.ReadAsString(); + break; + + case "areaendianness": + areaEndianness = jtr.ReadAsString(); + break; + case "description": biosDescription = jtr.ReadAsString(); break; @@ -2050,6 +2062,16 @@ namespace SabreTools.Library.DatFiles jtw.WritePropertyName("areasize"); jtw.WriteValue(datItem.AreaSize); } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.AreaWidth, Header.ExcludeFields))) + { + jtw.WritePropertyName("areawidth"); + jtw.WriteValue(datItem.AreaWidth); + } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.AreaEndianness, Header.ExcludeFields))) + { + jtw.WritePropertyName("areaendianness"); + jtw.WriteValue(datItem.AreaEndianness); + } // End item jtw.WriteEndObject(); diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs index d3779a33..5fafe75f 100644 --- a/SabreTools.Library/DatFiles/SeparatedValue.cs +++ b/SabreTools.Library/DatFiles/SeparatedValue.cs @@ -87,6 +87,8 @@ namespace SabreTools.Library.DatFiles partName = null, partInterface = null, areaName = null, + areaWidth = null, + areaEndianness = null, biosDescription = null, crc = null, md5 = null, @@ -535,6 +537,14 @@ namespace SabreTools.Library.DatFiles break; + case "DatItem.AreaWidth": + areaWidth = value; + break; + + case "DatItem.AreaEndianness": + areaEndianness = value; + break; + #endregion case "DatItem.Default": @@ -641,13 +651,17 @@ namespace SabreTools.Library.DatFiles Archive archive = new Archive() { Name = name, + AltName = altName, AltTitle = altTitle, + PartName = partName, PartInterface = partInterface, Features = features, AreaName = areaName, AreaSize = areaSize, + AreaWidth = areaWidth, + AreaEndianness = areaEndianness, Source = new Source { @@ -664,13 +678,17 @@ namespace SabreTools.Library.DatFiles BiosSet biosset = new BiosSet() { Name = name, + AltName = altName, AltTitle = altTitle, + PartName = partName, PartInterface = partInterface, Features = features, AreaName = areaName, AreaSize = areaSize, + AreaWidth = areaWidth, + AreaEndianness = areaEndianness, Description = biosDescription, Default = def, @@ -690,13 +708,17 @@ namespace SabreTools.Library.DatFiles Disk disk = new Disk() { Name = name, + AltName = altName, AltTitle = altTitle, + PartName = partName, PartInterface = partInterface, Features = features, AreaName = areaName, AreaSize = areaSize, + AreaWidth = areaWidth, + AreaEndianness = areaEndianness, MD5 = md5, #if NET_FRAMEWORK @@ -728,13 +750,17 @@ namespace SabreTools.Library.DatFiles Release release = new Release() { Name = name, + AltName = altName, AltTitle = altTitle, + PartName = partName, PartInterface = partInterface, Features = features, AreaName = areaName, AreaSize = areaSize, + AreaWidth = areaWidth, + AreaEndianness = areaEndianness, Region = region, Language = language, @@ -756,13 +782,17 @@ namespace SabreTools.Library.DatFiles Rom rom = new Rom() { Name = name, + AltName = altName, AltTitle = altTitle, + PartName = partName, PartInterface = partInterface, Features = features, AreaName = areaName, AreaSize = areaSize, + AreaWidth = areaWidth, + AreaEndianness = areaEndianness, Bios = bios, Size = size, @@ -798,13 +828,17 @@ namespace SabreTools.Library.DatFiles Sample sample = new Sample() { Name = name, + AltName = altName, AltTitle = altTitle, + PartName = partName, PartInterface = partInterface, Features = features, AreaName = areaName, AreaSize = areaSize, + AreaWidth = areaWidth, + AreaEndianness = areaEndianness, Source = new Source { @@ -1244,10 +1278,12 @@ namespace SabreTools.Library.DatFiles case "partname": case "part name": + case "part-name": return "DatItem.PartName"; case "partinterface": case "part interface": + case "part-interface": return "DatItem.PartInterface"; case "features": @@ -1255,12 +1291,24 @@ namespace SabreTools.Library.DatFiles case "areaname": case "area name": + case "area-name": return "DatItem.AreaName"; case "areasize": case "area size": + case "area-size": return "DatItem.AreaSize"; + case "areawidth": + case "area width": + case "area-width": + return "DatItem.AreaWidth"; + + case "areaendinanness": + case "area endianness": + case "area-endianness": + return "DatItem.AreaEndianness"; + #endregion case "default": diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs index e0ab5845..314c8083 100644 --- a/SabreTools.Library/DatFiles/SoftwareList.cs +++ b/SabreTools.Library/DatFiles/SoftwareList.cs @@ -240,7 +240,11 @@ namespace SabreTools.Library.DatFiles // Miscellaneous bool keep) { - string areaname, partname = string.Empty, partinterface = string.Empty; + string areaname, + partname = string.Empty, + partinterface = string.Empty, + areaWidth = string.Empty, + areaEndinaness = string.Empty; long? areasize = null; var features = new List>(); bool containsItems = false; @@ -286,11 +290,22 @@ namespace SabreTools.Library.DatFiles areasize = tempas; } - // string dataarea_width = reader.GetAttribute("width"); // (8|16|32|64) "8" - // string dataarea_endianness = reader.GetAttribute("endianness"); // endianness (big|little) "little" + areaWidth = reader.GetAttribute("width"); + areaEndinaness = reader.GetAttribute("endianness"); - containsItems = ReadDataArea(reader.ReadSubtree(), machine, features, areaname, areasize, - partname, partinterface, filename, indexId, keep); + containsItems = ReadDataArea( + reader.ReadSubtree(), + machine, + partname, + partinterface, + features, + areaname, + areasize, + areaWidth, + areaEndinaness, + filename, + indexId, + keep); // Skip the dataarea now that we've processed it reader.Skip(); @@ -299,8 +314,17 @@ namespace SabreTools.Library.DatFiles case "diskarea": areaname = reader.GetAttribute("name"); - containsItems = ReadDiskArea(reader.ReadSubtree(), machine, features, areaname, areasize, - partname, partinterface, filename, indexId, keep); + containsItems = ReadDiskArea( + reader.ReadSubtree(), + machine, + partname, + partinterface, + features, + areaname, + areasize, + filename, + indexId, + keep); // Skip the diskarea now that we've processed it reader.Skip(); @@ -333,22 +357,26 @@ namespace SabreTools.Library.DatFiles /// /// XmlReader representing a dataarea block /// Machine information to pass to contained items + /// Name of the containing part + /// Interface of the containing part /// List of features from the parent part - /// Name of the containing area - /// Size of the containing area - /// Name of the containing part - /// Interface of the containing part + /// Name of the containing area + /// Size of the containing area + /// Byte width of the containing area + /// Endianness of the containing area /// Name of the file to be parsed /// Index ID for the DAT /// True if full pathnames are to be kept, false otherwise (default) private bool ReadDataArea( XmlReader reader, Machine machine, + string partName, + string partInterface, List> features, - string areaname, - long? areasize, - string partname, - string partinterface, + string areaName, + long? areaSize, + string areaWidth, + string areaEndianness, // Standard Dat parsing string filename, @@ -409,11 +437,13 @@ namespace SabreTools.Library.DatFiles ItemStatus = reader.GetAttribute("status").AsItemStatus(), // LoadFlag = reader.GetAttribute("loadflag"), // (load16_byte|load16_word|load16_word_swap|load32_byte|load32_word|load32_word_swap|load32_dword|load64_word|load64_word_swap|reload|fill|continue|reload_plain|ignore) - AreaName = areaname, - AreaSize = areasize, + PartName = partName, + PartInterface = partInterface, Features = features, - PartName = partname, - PartInterface = partinterface, + AreaName = areaName, + AreaSize = areaSize, + AreaWidth = areaWidth, + AreaEndianness = areaEndianness, Source = new Source { @@ -444,22 +474,22 @@ namespace SabreTools.Library.DatFiles /// /// XmlReader representing a diskarea block /// Machine information to pass to contained items + /// Name of the containing part + /// Interface of the containing part /// List of features from the parent part /// Name of the containing area /// Size of the containing area - /// Name of the containing part - /// Interface of the containing part /// Name of the file to be parsed /// Index ID for the DAT /// True if full pathnames are to be kept, false otherwise (default) private bool ReadDiskArea( XmlReader reader, Machine machine, + string partname, + string partinterface, List> features, string areaname, long? areasize, - string partname, - string partinterface, // Standard Dat parsing string filename, @@ -501,11 +531,11 @@ namespace SabreTools.Library.DatFiles ItemStatus = reader.GetAttribute("status").AsItemStatus(), Writable = reader.GetAttribute("writable").AsYesNo(), - AreaName = areaname, - AreaSize = areasize, - Features = features, PartName = partname, PartInterface = partinterface, + Features = features, + AreaName = areaname, + AreaSize = areasize, Source = new Source { @@ -869,6 +899,10 @@ namespace SabreTools.Library.DatFiles xtw.WriteAttributeString("name", areaName); if (!Header.ExcludeFields.Contains(Field.AreaSize) && rom.AreaSize != null) xtw.WriteAttributeString("size", rom.AreaSize.ToString()); + if (!Header.ExcludeFields.Contains(Field.AreaWidth) && rom.AreaWidth != null) + xtw.WriteAttributeString("width", rom.AreaWidth); + if (!Header.ExcludeFields.Contains(Field.AreaEndianness) && rom.AreaEndianness != null) + xtw.WriteAttributeString("endianness", rom.AreaEndianness); xtw.WriteStartElement("rom"); xtw.WriteAttributeString("name", rom.GetField(Field.Name, Header.ExcludeFields)); diff --git a/SabreTools.Library/DatItems/Archive.cs b/SabreTools.Library/DatItems/Archive.cs index 2f4df73b..6a53fa6d 100644 --- a/SabreTools.Library/DatItems/Archive.cs +++ b/SabreTools.Library/DatItems/Archive.cs @@ -36,6 +36,8 @@ Features = this.Features, AreaName = this.AreaName, AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, Machine = this.Machine.Clone() as Machine, Source = this.Source.Clone() as Source, diff --git a/SabreTools.Library/DatItems/BiosSet.cs b/SabreTools.Library/DatItems/BiosSet.cs index 9ddc6635..346bc8cf 100644 --- a/SabreTools.Library/DatItems/BiosSet.cs +++ b/SabreTools.Library/DatItems/BiosSet.cs @@ -112,6 +112,8 @@ namespace SabreTools.Library.DatItems Features = this.Features, AreaName = this.AreaName, AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, Machine = this.Machine.Clone() as Machine, Source = this.Source.Clone() as Source, diff --git a/SabreTools.Library/DatItems/Blank.cs b/SabreTools.Library/DatItems/Blank.cs index ef89de04..cf6d3d8c 100644 --- a/SabreTools.Library/DatItems/Blank.cs +++ b/SabreTools.Library/DatItems/Blank.cs @@ -36,6 +36,8 @@ Features = this.Features, AreaName = this.AreaName, AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, Machine = this.Machine.Clone() as Machine, Source = this.Source.Clone() as Source, diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index 038d7dc9..024913bf 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -101,6 +101,20 @@ namespace SabreTools.Library.DatItems [JsonProperty("areasize")] public long? AreaSize { get; set; } + /// + /// Width of the data area in bytes + /// + /// TODO: Convert to Int32 + [JsonProperty("width")] + public string AreaWidth { get; set; } // (8|16|32|64) "8" + + /// + /// Endianness of the data area + /// + /// TODO: Convert to Enum? + [JsonProperty("endianness")] + public string AreaEndianness { get; set; } // (big|little) "little" + #endregion #region Metadata information @@ -139,6 +153,8 @@ namespace SabreTools.Library.DatItems Field.Features, Field.AreaName, Field.AreaSize, + Field.AreaWidth, + Field.AreaEndianness, // BiosSet Field.BiosDescription, @@ -273,6 +289,12 @@ namespace SabreTools.Library.DatItems case Field.AreaSize: fieldValue = AreaSize?.ToString(); break; + case Field.AreaWidth: + fieldValue = AreaWidth; + break; + case Field.AreaEndianness: + fieldValue = AreaEndianness; + break; case Field.NULL: default: @@ -342,6 +364,12 @@ namespace SabreTools.Library.DatItems AreaSize = areaSize; } + if (mappings.Keys.Contains(Field.AreaWidth)) + AreaWidth = mappings[Field.AreaWidth]; + + if (mappings.Keys.Contains(Field.AreaEndianness)) + AreaEndianness = mappings[Field.AreaEndianness]; + #endregion } @@ -592,6 +620,18 @@ namespace SabreTools.Library.DatItems else if (filter.AreaSize.MatchesNegative(null, AreaSize) == false) return false; + // Filter on area byte width + if (filter.AreaWidth.MatchesPositiveSet(AreaWidth) == false) + return false; + if (filter.AreaWidth.MatchesNegativeSet(AreaWidth) == true) + return false; + + // Filter on area endianness + if (filter.AreaEndianness.MatchesPositiveSet(AreaEndianness) == false) + return false; + if (filter.AreaEndianness.MatchesNegativeSet(AreaEndianness) == true) + return false; + #endregion return true; @@ -640,6 +680,12 @@ namespace SabreTools.Library.DatItems if (fields.Contains(Field.AreaSize)) AreaSize = null; + if (fields.Contains(Field.AreaWidth)) + AreaWidth = null; + + if (fields.Contains(Field.AreaEndianness)) + AreaEndianness = null; + #endregion } @@ -757,6 +803,12 @@ namespace SabreTools.Library.DatItems if (fields.Contains(Field.AreaSize)) AreaSize = item.AreaSize; + if (fields.Contains(Field.AreaWidth)) + AreaWidth = item.AreaWidth; + + if (fields.Contains(Field.AreaEndianness)) + AreaEndianness = item.AreaEndianness; + #endregion } diff --git a/SabreTools.Library/DatItems/Disk.cs b/SabreTools.Library/DatItems/Disk.cs index 01841dd0..4e61e4b7 100644 --- a/SabreTools.Library/DatItems/Disk.cs +++ b/SabreTools.Library/DatItems/Disk.cs @@ -300,6 +300,8 @@ namespace SabreTools.Library.DatItems Features = this.Features, AreaName = this.AreaName, AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, Machine = this.Machine.Clone() as Machine, Source = this.Source.Clone() as Source, @@ -342,6 +344,8 @@ namespace SabreTools.Library.DatItems Features = this.Features, AreaName = this.AreaName, AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, Machine = this.Machine.Clone() as Machine, Source = this.Source.Clone() as Source, diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index e61139da..0f6e9600 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -119,6 +119,8 @@ namespace SabreTools.Library.DatItems Features, AreaName, AreaSize, + AreaWidth, + AreaEndianness, #endregion diff --git a/SabreTools.Library/DatItems/Release.cs b/SabreTools.Library/DatItems/Release.cs index 9bd703be..13143063 100644 --- a/SabreTools.Library/DatItems/Release.cs +++ b/SabreTools.Library/DatItems/Release.cs @@ -140,6 +140,8 @@ namespace SabreTools.Library.DatItems Features = this.Features, AreaName = this.AreaName, AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, Machine = this.Machine.Clone() as Machine, Source = this.Source.Clone() as Source, diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index f93e5cf2..9e6802ce 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -382,6 +382,8 @@ namespace SabreTools.Library.DatItems Features = this.Features, AreaName = this.AreaName, AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, Machine = this.Machine.Clone() as Machine, Source = this.Source.Clone() as Source, diff --git a/SabreTools.Library/DatItems/Sample.cs b/SabreTools.Library/DatItems/Sample.cs index a8e0d7eb..df331d6c 100644 --- a/SabreTools.Library/DatItems/Sample.cs +++ b/SabreTools.Library/DatItems/Sample.cs @@ -36,6 +36,8 @@ Features = this.Features, AreaName = this.AreaName, AreaSize = this.AreaSize, + AreaWidth = this.AreaWidth, + AreaEndianness = this.AreaEndianness, Machine = this.Machine.Clone() as Machine, Source = this.Source.Clone() as Source, diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index 0c26759d..a6ae64c7 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -273,6 +273,16 @@ namespace SabreTools.Library.Filtering /// Positive means "Greater than or equal", Negative means "Less than or equal", Neutral means "Equal" public FilterItem AreaSize { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null }; + /// + /// Include or exclude area byte widths + /// + public FilterItem AreaWidth { get; private set; } = new FilterItem(); + + /// + /// Include or exclude area endianness + /// + public FilterItem AreaEndianness { get; private set; } = new FilterItem(); + #endregion /// @@ -871,6 +881,20 @@ namespace SabreTools.Library.Filtering break; + case Field.AreaWidth: + if (negate) + AreaWidth.NegativeSet.Add(value); + else + AreaWidth.PositiveSet.Add(value); + break; + + case Field.AreaEndianness: + if (negate) + AreaEndianness.NegativeSet.Add(value); + else + AreaEndianness.PositiveSet.Add(value); + break; + #endregion case Field.Default: diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index a64d1b61..11103f6d 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -367,6 +367,14 @@ namespace SabreTools.Library.Tools case "area size": case "area-size": return Field.AreaSize; + case "areawidth": + case "area width": + case "area-width": + return Field.AreaWidth; + case "areaendinanness": + case "area endianness": + case "area-endianness": + return Field.AreaEndianness; #endregion