Wire up area width, endianness for SL

This commit is contained in:
Matt Nadareski
2020-08-21 13:31:22 -07:00
parent 6004bbaad9
commit e9ca2658bb
14 changed files with 232 additions and 26 deletions

View File

@@ -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();

View File

@@ -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":

View File

@@ -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<KeyValuePair<string, string>>();
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
/// </summary>
/// <param name="reader">XmlReader representing a dataarea block</param>
/// <param name="machine">Machine information to pass to contained items</param>
/// <param name="partName">Name of the containing part</param>
/// <param name="partInterface">Interface of the containing part</param>
/// <param name="features">List of features from the parent part</param>
/// <param name="areaname">Name of the containing area</param>
/// <param name="areasize">Size of the containing area</param>
/// <param name="partname">Name of the containing part</param>
/// <param name="partinterface">Interface of the containing part</param>
/// <param name="areaName">Name of the containing area</param>
/// <param name="areaSize">Size of the containing area</param>
/// <param name="areaWidth">Byte width of the containing area</param>
/// <param name="areaEndianness">Endianness of the containing area</param>
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="indexId">Index ID for the DAT</param>
/// <param name="keep">True if full pathnames are to be kept, false otherwise (default)</param>
private bool ReadDataArea(
XmlReader reader,
Machine machine,
string partName,
string partInterface,
List<KeyValuePair<string, string>> 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
/// </summary>
/// <param name="reader">XmlReader representing a diskarea block</param>
/// <param name="machine">Machine information to pass to contained items</param>
/// <param name="partname">Name of the containing part</param>
/// <param name="partinterface">Interface of the containing part</param>
/// <param name="features">List of features from the parent part</param>
/// <param name="areaname">Name of the containing area</param>
/// <param name="areasize">Size of the containing area</param>
/// <param name="partname">Name of the containing part</param>
/// <param name="partinterface">Interface of the containing part</param>
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="indexId">Index ID for the DAT</param>
/// <param name="keep">True if full pathnames are to be kept, false otherwise (default)</param>
private bool ReadDiskArea(
XmlReader reader,
Machine machine,
string partname,
string partinterface,
List<KeyValuePair<string, string>> 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));

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -101,6 +101,20 @@ namespace SabreTools.Library.DatItems
[JsonProperty("areasize")]
public long? AreaSize { get; set; }
/// <summary>
/// Width of the data area in bytes
/// </summary>
/// TODO: Convert to Int32
[JsonProperty("width")]
public string AreaWidth { get; set; } // (8|16|32|64) "8"
/// <summary>
/// Endianness of the data area
/// </summary>
/// 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
}

View File

@@ -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,

View File

@@ -119,6 +119,8 @@ namespace SabreTools.Library.DatItems
Features,
AreaName,
AreaSize,
AreaWidth,
AreaEndianness,
#endregion

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -273,6 +273,16 @@ namespace SabreTools.Library.Filtering
/// <remarks>Positive means "Greater than or equal", Negative means "Less than or equal", Neutral means "Equal"</remarks>
public FilterItem<long?> AreaSize { get; private set; } = new FilterItem<long?>() { Positive = null, Negative = null, Neutral = null };
/// <summary>
/// Include or exclude area byte widths
/// </summary>
public FilterItem<string> AreaWidth { get; private set; } = new FilterItem<string>();
/// <summary>
/// Include or exclude area endianness
/// </summary>
public FilterItem<string> AreaEndianness { get; private set; } = new FilterItem<string>();
#endregion
/// <summary>
@@ -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:

View File

@@ -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