diff --git a/SabreTools.Library/DatFiles/ItemDictionary.cs b/SabreTools.Library/DatFiles/ItemDictionary.cs
index 7e95495f..5530773a 100644
--- a/SabreTools.Library/DatFiles/ItemDictionary.cs
+++ b/SabreTools.Library/DatFiles/ItemDictionary.cs
@@ -83,6 +83,12 @@ namespace SabreTools.Library.DatFiles
[JsonIgnore]
public long AdjusterCount { get; private set; } = 0;
+ ///
+ /// Number of Analog items
+ ///
+ [JsonIgnore]
+ public long AnalogCount { get; private set; } = 0;
+
///
/// Number of Archive items
///
@@ -101,6 +107,12 @@ namespace SabreTools.Library.DatFiles
[JsonIgnore]
public long ChipCount { get; private set; } = 0;
+ ///
+ /// Number of top-level Condition items
+ ///
+ [JsonIgnore]
+ public long ConditionCount { get; private set; } = 0;
+
///
/// Number of Configuration items
///
@@ -514,6 +526,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Adjuster:
AdjusterCount++;
break;
+ case ItemType.Analog:
+ AnalogCount++;
+ break;
case ItemType.Archive:
ArchiveCount++;
break;
@@ -523,6 +538,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Chip:
ChipCount++;
break;
+ case ItemType.Condition:
+ ConditionCount++;
+ break;
case ItemType.Configuration:
ConfigurationCount++;
break;
@@ -673,6 +691,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Adjuster:
AdjusterCount--;
break;
+ case ItemType.Analog:
+ AnalogCount--;
+ break;
case ItemType.Archive:
ArchiveCount--;
break;
@@ -682,6 +703,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Chip:
ChipCount--;
break;
+ case ItemType.Condition:
+ ConditionCount--;
+ break;
case ItemType.Configuration:
ConfigurationCount--;
break;
diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs
index 79ef1ae7..05102544 100644
--- a/SabreTools.Library/DatFiles/Json.cs
+++ b/SabreTools.Library/DatFiles/Json.cs
@@ -211,6 +211,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Adjuster:
datItem = datItemObj.ToObject();
break;
+ case ItemType.Analog:
+ datItem = datItemObj.ToObject();
+ break;
case ItemType.Archive:
datItem = datItemObj.ToObject();
break;
@@ -223,6 +226,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Chip:
datItem = datItemObj.ToObject();
break;
+ case ItemType.Condition:
+ datItem = datItemObj.ToObject();
+ break;
case ItemType.Configuration:
datItem = datItemObj.ToObject();
break;
diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs
index 167497f1..7769de95 100644
--- a/SabreTools.Library/DatFiles/Listxml.cs
+++ b/SabreTools.Library/DatFiles/Listxml.cs
@@ -172,6 +172,12 @@ namespace SabreTools.Library.DatFiles
Name = reader.GetAttribute("name"),
Default = reader.GetAttribute("default").AsYesNo(),
Conditions = new List(),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
};
// Now read the internal tags
@@ -218,6 +224,24 @@ namespace SabreTools.Library.DatFiles
reader.Read();
break;
+ case "condition":
+ datItems.Add(new Condition
+ {
+ Tag = reader.GetAttribute("tag"),
+ Mask = reader.GetAttribute("mask"),
+ Relation = reader.GetAttribute("relation"),
+ ConditionValue = reader.GetAttribute("value"),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
+ });
+
+ reader.Read();
+ break;
+
case "configuration":
var configuration = new Configuration
{
@@ -227,6 +251,12 @@ namespace SabreTools.Library.DatFiles
Conditions = new List(),
Locations = new List(),
Settings = new List(),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
};
// Now read the internal tags
@@ -242,6 +272,12 @@ namespace SabreTools.Library.DatFiles
datItems.Add(new DeviceReference
{
Name = reader.GetAttribute("name"),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
});
reader.Read();
@@ -256,6 +292,12 @@ namespace SabreTools.Library.DatFiles
Conditions = new List(),
Locations = new List(),
Values = new List(),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
};
// Now read the internal tags
@@ -296,6 +338,12 @@ namespace SabreTools.Library.DatFiles
Emulation = reader.GetAttribute("emulation").AsSupportStatus(),
Cocktail = reader.GetAttribute("cocktail").AsSupportStatus(),
SaveState = reader.GetAttribute("savestate").AsSupported(),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
});
reader.Read();
@@ -307,6 +355,12 @@ namespace SabreTools.Library.DatFiles
Type = reader.GetAttribute("type").AsFeatureType(),
Status = reader.GetAttribute("status").AsFeatureStatus(),
Overall = reader.GetAttribute("overall").AsFeatureStatus(),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
});
reader.Read();
@@ -342,6 +396,12 @@ namespace SabreTools.Library.DatFiles
Name = reader.GetAttribute("name"),
Default = reader.GetAttribute("default").AsYesNo(),
Content = reader.ReadElementContentAsString(),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
});
break;
@@ -366,6 +426,12 @@ namespace SabreTools.Library.DatFiles
{
Name = reader.GetAttribute("name"),
SlotOptions = new List(),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
};
// Now read the internal tags
@@ -435,22 +501,6 @@ namespace SabreTools.Library.DatFiles
reader.Read();
break;
- case "condition":
- var condition = new Condition();
- condition.Tag = reader.GetAttribute("tag");
- condition.Mask = reader.GetAttribute("mask");
- condition.Relation = reader.GetAttribute("relation");
- condition.Value = reader.GetAttribute("value");
-
- // Ensure the list exists
- if (machine.Conditions == null)
- machine.Conditions = new List();
-
- machine.Conditions.Add(condition);
-
- reader.Read();
- break;
-
case "input":
var input = new Input();
input.Service = reader.GetAttribute("service").AsYesNo();
@@ -1190,13 +1240,12 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalElementString("year", datItem.Machine.Year);
xtw.WriteOptionalElementString("manufacturer", datItem.Machine.Manufacturer);
- // TODO: These should go *after* the datitems
+ // TODO: These are all going away due to promotions
if (datItem.Machine.Displays != null)
{
foreach (var display in datItem.Machine.Displays)
{
xtw.WriteStartElement("display");
-
xtw.WriteOptionalAttributeString("tag", display.Tag);
xtw.WriteOptionalAttributeString("type", display.Type);
xtw.WriteOptionalAttributeString("rotate", display.Rotate);
@@ -1211,23 +1260,6 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("vtotal", display.VTotal);
xtw.WriteOptionalAttributeString("vbend", display.VBEnd);
xtw.WriteOptionalAttributeString("vbstart", display.VBStart);
-
- // End display
- xtw.WriteEndElement();
- }
- }
- if (datItem.Machine.Conditions != null)
- {
- foreach (var condition in datItem.Machine.Conditions)
- {
- xtw.WriteStartElement("condition");
-
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
-
- // End condition
xtw.WriteEndElement();
}
}
@@ -1236,18 +1268,15 @@ namespace SabreTools.Library.DatFiles
foreach (var input in datItem.Machine.Inputs)
{
xtw.WriteStartElement("input");
-
xtw.WriteOptionalAttributeString("service", input.Service.FromYesNo());
xtw.WriteOptionalAttributeString("tilt", input.Tilt.FromYesNo());
xtw.WriteOptionalAttributeString("players", input.Players);
xtw.WriteOptionalAttributeString("coins", input.Coins);
-
if (input.Controls != null)
{
foreach (var control in input.Controls)
{
xtw.WriteStartElement("control");
-
xtw.WriteOptionalAttributeString("type", control.Type);
xtw.WriteOptionalAttributeString("player", control.Player);
xtw.WriteOptionalAttributeString("buttons", control.Buttons);
@@ -1260,13 +1289,9 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("ways", control.Ways);
xtw.WriteOptionalAttributeString("ways2", control.Ways2);
xtw.WriteOptionalAttributeString("ways3", control.Ways3);
-
- // End control
xtw.WriteEndElement();
}
}
-
- // End input
xtw.WriteEndElement();
}
}
@@ -1275,23 +1300,16 @@ namespace SabreTools.Library.DatFiles
foreach (var port in datItem.Machine.Ports)
{
xtw.WriteStartElement("port");
-
xtw.WriteOptionalAttributeString("tag", port.Tag);
-
if (port.Analogs != null)
{
foreach (var analog in port.Analogs)
{
xtw.WriteStartElement("analog");
-
xtw.WriteOptionalAttributeString("mask", analog.Mask);
-
- // End analog
xtw.WriteEndElement();
}
}
-
- // End port
xtw.WriteEndElement();
}
}
@@ -1300,23 +1318,18 @@ namespace SabreTools.Library.DatFiles
foreach (var device in datItem.Machine.Devices)
{
xtw.WriteStartElement("device");
-
xtw.WriteOptionalAttributeString("type", device.Type);
xtw.WriteOptionalAttributeString("tag", device.Tag);
xtw.WriteOptionalAttributeString("fixed_image", device.FixedImage);
xtw.WriteOptionalAttributeString("mandatory", device.Mandatory);
xtw.WriteOptionalAttributeString("interface", device.Interface);
-
if (device.Instances != null)
{
foreach (var instance in device.Instances)
{
xtw.WriteStartElement("instance");
-
xtw.WriteOptionalAttributeString("name", instance.Name);
xtw.WriteOptionalAttributeString("briefname", instance.BriefName);
-
- // End instance
xtw.WriteEndElement();
}
}
@@ -1325,15 +1338,10 @@ namespace SabreTools.Library.DatFiles
foreach (var extension in device.Extensions)
{
xtw.WriteStartElement("extension");
-
xtw.WriteOptionalAttributeString("name", extension.Name);
-
- // End extension
xtw.WriteEndElement();
}
}
-
- // End device
xtw.WriteEndElement();
}
}
@@ -1395,13 +1403,13 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("default", adjuster.Default.FromYesNo());
if (adjuster.Conditions != null)
{
- foreach (var condition in adjuster.Conditions)
+ foreach (var adjusterCondition in adjuster.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteOptionalAttributeString("tag", adjusterCondition.Tag);
+ xtw.WriteOptionalAttributeString("mask", adjusterCondition.Mask);
+ xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation);
+ xtw.WriteOptionalAttributeString("value", adjusterCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1427,6 +1435,16 @@ namespace SabreTools.Library.DatFiles
xtw.WriteEndElement();
break;
+ case ItemType.Condition:
+ var condition = datItem as Condition;
+ xtw.WriteStartElement("condition");
+ xtw.WriteOptionalAttributeString("tag", condition.Tag);
+ xtw.WriteOptionalAttributeString("mask", condition.Mask);
+ xtw.WriteOptionalAttributeString("relation", condition.Relation);
+ xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteEndElement();
+ break;
+
case ItemType.Configuration:
var configuration = datItem as Configuration;
xtw.WriteStartElement("configuration");
@@ -1436,13 +1454,13 @@ namespace SabreTools.Library.DatFiles
if (configuration.Conditions != null)
{
- foreach (var condition in configuration.Conditions)
+ foreach (var configurationCondition in configuration.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteOptionalAttributeString("tag", configurationCondition.Tag);
+ xtw.WriteOptionalAttributeString("mask", configurationCondition.Mask);
+ xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation);
+ xtw.WriteOptionalAttributeString("value", configurationCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1486,13 +1504,13 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("mask", dipSwitch.Mask);
if (dipSwitch.Conditions != null)
{
- foreach (var condition in dipSwitch.Conditions)
+ foreach (var dipSwitchCondition in dipSwitch.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteOptionalAttributeString("tag", dipSwitchCondition.Tag);
+ xtw.WriteOptionalAttributeString("mask", dipSwitchCondition.Mask);
+ xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation);
+ xtw.WriteOptionalAttributeString("value", dipSwitchCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1517,13 +1535,13 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("default", value.Default.FromYesNo());
if (value.Conditions != null)
{
- foreach (var condition in value.Conditions)
+ foreach (var dipValueCondition in value.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteOptionalAttributeString("tag", dipValueCondition.Tag);
+ xtw.WriteOptionalAttributeString("mask", dipValueCondition.Mask);
+ xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation);
+ xtw.WriteOptionalAttributeString("value", dipValueCondition.Value);
xtw.WriteEndElement();
}
}
diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs
index e26b38f1..75c9c9cc 100644
--- a/SabreTools.Library/DatFiles/SabreDat.cs
+++ b/SabreTools.Library/DatFiles/SabreDat.cs
@@ -1216,19 +1216,27 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("default", adjuster.Default.FromYesNo());
if (adjuster.Conditions != null)
{
- foreach (var condition in adjuster.Conditions)
+ foreach (var adjusterCondition in adjuster.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteOptionalAttributeString("tag", adjusterCondition.Tag);
+ xtw.WriteOptionalAttributeString("mask", adjusterCondition.Mask);
+ xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation);
+ xtw.WriteOptionalAttributeString("value", adjusterCondition.Value);
xtw.WriteEndElement();
}
}
xtw.WriteEndElement();
break;
+ case ItemType.Analog:
+ var analog = datItem as Analog;
+ xtw.WriteStartElement("file");
+ xtw.WriteAttributeString("type", "analog");
+ xtw.WriteOptionalAttributeString("mask", analog.Mask);
+ xtw.WriteEndElement();
+ break;
+
case ItemType.Archive:
var archive = datItem as Archive;
xtw.WriteStartElement("file");
@@ -1258,6 +1266,17 @@ namespace SabreTools.Library.DatFiles
xtw.WriteEndElement();
break;
+ case ItemType.Condition:
+ var condition = datItem as Condition;
+ xtw.WriteStartElement("file");
+ xtw.WriteAttributeString("type", "condition");
+ xtw.WriteOptionalAttributeString("tag", condition.Tag);
+ xtw.WriteOptionalAttributeString("mask", condition.Mask);
+ xtw.WriteOptionalAttributeString("relation", condition.Relation);
+ xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteEndElement();
+ break;
+
case ItemType.Configuration:
var configuration = datItem as Configuration;
xtw.WriteStartElement("file");
@@ -1268,13 +1287,13 @@ namespace SabreTools.Library.DatFiles
if (configuration.Conditions != null)
{
- foreach (var condition in configuration.Conditions)
+ foreach (var configurationCondition in configuration.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteOptionalAttributeString("tag", configurationCondition.Tag);
+ xtw.WriteOptionalAttributeString("mask", configurationCondition.Mask);
+ xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation);
+ xtw.WriteOptionalAttributeString("value", configurationCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1320,13 +1339,13 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("mask", dipSwitch.Mask);
if (dipSwitch.Conditions != null)
{
- foreach (var condition in dipSwitch.Conditions)
+ foreach (var dipSwitchCondition in dipSwitch.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteOptionalAttributeString("tag", dipSwitchCondition.Tag);
+ xtw.WriteOptionalAttributeString("mask", dipSwitchCondition.Mask);
+ xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation);
+ xtw.WriteOptionalAttributeString("value", dipSwitchCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1351,13 +1370,13 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("default", value.Default.FromYesNo());
if (value.Conditions != null)
{
- foreach (var condition in value.Conditions)
+ foreach (var dipValueCondition in value.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", condition.Tag);
- xtw.WriteOptionalAttributeString("mask", condition.Mask);
- xtw.WriteOptionalAttributeString("relation", condition.Relation);
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteOptionalAttributeString("tag", dipValueCondition.Tag);
+ xtw.WriteOptionalAttributeString("mask", dipValueCondition.Mask);
+ xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation);
+ xtw.WriteOptionalAttributeString("value", dipValueCondition.Value);
xtw.WriteEndElement();
}
}
diff --git a/SabreTools.Library/DatItems/Analog.cs b/SabreTools.Library/DatItems/Analog.cs
new file mode 100644
index 00000000..04338144
--- /dev/null
+++ b/SabreTools.Library/DatItems/Analog.cs
@@ -0,0 +1,173 @@
+using System.Collections.Generic;
+using System.Linq;
+
+using SabreTools.Library.Filtering;
+using Newtonsoft.Json;
+
+namespace SabreTools.Library.DatItems
+{
+ ///
+ /// Represents a single analog item
+ ///
+ [JsonObject("analog")]
+ public class Analog : DatItem
+ {
+ #region Fields
+
+ ///
+ /// Analog mask value
+ ///
+ [JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public string Mask { get; set; }
+
+ #endregion
+
+ #region Accessors
+
+ ///
+ /// Set fields with given values
+ ///
+ /// Mappings dictionary
+ public override void SetFields(Dictionary mappings)
+ {
+ // Set base fields
+ base.SetFields(mappings);
+
+ // Handle Analog-specific fields
+ if (mappings.Keys.Contains(Field.DatItem_Mask))
+ Mask = mappings[Field.DatItem_Mask];
+ }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Create a default, empty Analog object
+ ///
+ public Analog()
+ {
+ ItemType = ItemType.Analog;
+ }
+
+ #endregion
+
+ #region Cloning Methods
+
+ public override object Clone()
+ {
+ return new Analog()
+ {
+ ItemType = this.ItemType,
+ DupeType = this.DupeType,
+
+ AltName = this.AltName,
+ AltTitle = this.AltTitle,
+
+ Original = this.Original,
+ OpenMSXSubType = this.OpenMSXSubType,
+ OpenMSXType = this.OpenMSXType,
+ Remark = this.Remark,
+ Boot = this.Boot,
+
+ Part = this.Part,
+ Features = this.Features,
+ AreaName = this.AreaName,
+ AreaSize = this.AreaSize,
+ AreaWidth = this.AreaWidth,
+ AreaEndianness = this.AreaEndianness,
+ Value = this.Value,
+ LoadFlag = this.LoadFlag,
+
+ Machine = this.Machine.Clone() as Machine,
+ Source = this.Source.Clone() as Source,
+ Remove = this.Remove,
+
+ Mask = this.Mask,
+ };
+ }
+
+ #endregion
+
+ #region Comparision Methods
+
+ public override bool Equals(DatItem other)
+ {
+ // If we don't have a Analog, return false
+ if (ItemType != other.ItemType)
+ return false;
+
+ // Otherwise, treat it as a Analog
+ Analog newOther = other as Analog;
+
+ // If the Feature information matches
+ return (Mask == newOther.Mask);
+ }
+
+ #endregion
+
+ #region Filtering
+
+ ///
+ /// Check to see if a DatItem passes the filter
+ ///
+ /// Filter to check against
+ /// True if the item passed the filter, false otherwise
+ public override bool PassesFilter(Filter filter)
+ {
+ // Check common fields first
+ if (!base.PassesFilter(filter))
+ return false;
+
+ // Filter on mask
+ if (filter.DatItem_Mask.MatchesPositiveSet(Mask) == false)
+ return false;
+ if (filter.DatItem_Mask.MatchesNegativeSet(Mask) == true)
+ return false;
+
+ return true;
+ }
+
+ ///
+ /// Remove fields from the DatItem
+ ///
+ /// List of Fields to remove
+ public override void RemoveFields(List fields)
+ {
+ // Remove common fields first
+ base.RemoveFields(fields);
+
+ // Remove the fields
+ if (fields.Contains(Field.DatItem_Mask))
+ Mask = null;
+ }
+
+ #endregion
+
+ #region Sorting and Merging
+
+ ///
+ /// Replace fields from another item
+ ///
+ /// DatItem to pull new information from
+ /// List of Fields representing what should be updated
+ public override void ReplaceFields(DatItem item, List fields)
+ {
+ // Replace common fields first
+ base.ReplaceFields(item, fields);
+
+ // If we don't have a Analog to replace from, ignore specific fields
+ if (item.ItemType != ItemType.Analog)
+ return;
+
+ // Cast for easier access
+ Analog newItem = item as Analog;
+
+ // Replace the fields
+ if (fields.Contains(Field.DatItem_Mask))
+ Mask = newItem.Mask;
+ }
+
+ #endregion
+ }
+}
diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs
index 3e49a094..9a7eb7f8 100644
--- a/SabreTools.Library/DatItems/Auxiliary.cs
+++ b/SabreTools.Library/DatItems/Auxiliary.cs
@@ -1,5 +1,8 @@
using System.Collections.Generic;
+using System.Linq;
+using SabreTools.Library.DatItems;
+using SabreTools.Library.Filtering;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
@@ -12,77 +15,87 @@ namespace SabreTools.Library.DatItems
#region ListXML
- ///
- /// Represents one ListXML analog
- ///
- [JsonObject("analog")]
- public class Analog
- {
- [JsonProperty("mask")]
- public string Mask { get; set; }
- }
-
- ///
- /// Represents one ListXML condition
- ///
- /// TODO: Promote to DatItem level (Both used at ListXML level AND under a lot of stuff)
- [JsonObject("condition")]
- public class Condition
- {
- [JsonProperty("tag")]
- public string Tag { get; set; }
-
- [JsonProperty("mask")]
- public string Mask { get; set; }
-
- [JsonProperty("relation")]
- public string Relation { get; set; } // TODO: (eq|ne|gt|le|lt|ge)
-
- [JsonProperty("value")]
- public string Value { get; set; }
- }
-
///
/// Represents one ListXML control
///
[JsonObject("control")]
public class Control
{
- [JsonProperty("type")]
+ #region Fields
+
+ ///
+ /// Control type
+ ///
+ [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Type { get; set; }
- [JsonProperty("player")]
+ ///
+ /// Player ID
+ ///
+ [JsonProperty("player", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Player { get; set; } // TODO: Int32?
- [JsonProperty("buttons")]
+ ///
+ /// Button count
+ ///
+ [JsonProperty("buttons", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Buttons { get; set; } // TODO: Int32?
- [JsonProperty("regbuttons")]
+ ///
+ /// Regular button count
+ ///
+ [JsonProperty("regbuttons", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string RegButtons { get; set; } // TODO: Int32?
- [JsonProperty("minimum")]
+ ///
+ /// Minimum value
+ ///
+ [JsonProperty("minimum", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Minimum { get; set; } // TODO: Int32? Float?
- [JsonProperty("maximum")]
+ ///
+ /// Maximum value
+ ///
+ [JsonProperty("maximum", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Maximum { get; set; } // TODO: Int32? Float?
- [JsonProperty("sensitivity")]
+ ///
+ /// Sensitivity value
+ ///
+ [JsonProperty("sensitivity", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Sensitivity { get; set; } // TODO: Int32? Float?
- [JsonProperty("keydelta")]
+ ///
+ /// Keypress delta
+ ///
+ [JsonProperty("keydelta", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string KeyDelta { get; set; } // TODO: Int32? Float?
- [JsonProperty("reverse")]
+ ///
+ /// Determines if the control is reversed
+ ///
+ [JsonProperty("reverse", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? Reverse { get; set; }
- [JsonProperty("ways")]
+ ///
+ /// First set of ways
+ ///
+ [JsonProperty("ways", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Ways { get; set; } // TODO: Int32? Float?
- [JsonProperty("ways2")]
+ ///
+ /// Second set of ways
+ ///
+ [JsonProperty("ways2", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Ways2 { get; set; } // TODO: Int32? Float?
- [JsonProperty("ways3")]
+ ///
+ /// Third set of ways
+ ///
+ [JsonProperty("ways3", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Ways3 { get; set; } // TODO: Int32? Float?
+
+ #endregion
}
///
@@ -92,26 +105,51 @@ namespace SabreTools.Library.DatItems
[JsonObject("device")]
public class Device
{
- [JsonProperty("type")]
+ #region Fields
+
+ ///
+ /// Device type
+ ///
+ [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Type { get; set; }
- [JsonProperty("tag")]
+ ///
+ /// Device tag
+ ///
+ [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Tag { get; set; }
- [JsonProperty("fixed_image")]
+ ///
+ /// Fixed image format
+ ///
+ [JsonProperty("fixed_image", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string FixedImage { get; set; }
- [JsonProperty("mandatory")]
+ ///
+ /// Determines if the devices is mandatory
+ ///
+ [JsonProperty("mandatory", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Mandatory { get; set; } // TODO: bool?
- [JsonProperty("interface")]
+ ///
+ /// Device interface
+ ///
+ [JsonProperty("interface", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Interface { get; set; }
- [JsonProperty("instances")]
+ ///
+ /// Device instances
+ ///
+ [JsonProperty("instances", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List Instances { get; set; }
- [JsonProperty("extensions")]
+ ///
+ /// Device extensions
+ ///
+ [JsonProperty("extensions", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List Extensions { get; set; }
+
+ #endregion
}
///
@@ -121,47 +159,93 @@ namespace SabreTools.Library.DatItems
[JsonObject("display")]
public class Display
{
- [JsonProperty("tag")]
+ #region Fields
+
+ ///
+ /// Display tag
+ ///
+ [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Tag { get; set; }
- [JsonProperty("type")]
+ ///
+ /// Display type
+ ///
+ [JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Type { get; set; } // TODO: (raster|vector|lcd|svg|unknown)
- [JsonProperty("rotate")]
+ ///
+ /// Display rotation
+ ///
+ [JsonProperty("rotate", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Rotate { get; set; } // TODO: (0|90|180|270) Int32?
- [JsonProperty("flipx")]
+ ///
+ /// Determines if display is flipped in the X-coordinates
+ ///
+ [JsonProperty("flipx", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? FlipX { get; set; }
- [JsonProperty("width")]
+ ///
+ /// Display width
+ ///
+ [JsonProperty("width", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Width { get; set; } // TODO: Int32?
- [JsonProperty("height")]
+ ///
+ /// Display height
+ ///
+ [JsonProperty("height", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Height { get; set; } // TODO: Int32?
- [JsonProperty("refresh")]
+ ///
+ /// Refresh rate
+ ///
+ [JsonProperty("refresh", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Refresh { get; set; } // TODO: Int32? Float?
- [JsonProperty("pixclock")]
+ ///
+ /// Pixel clock timer
+ ///
+ [JsonProperty("pixclock", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string PixClock { get; set; } // TODO: Int32? Float?
- [JsonProperty("htotal")]
+ ///
+ /// Total horizontal lines
+ ///
+ [JsonProperty("htotal", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string HTotal { get; set; } // TODO: Int32? Float?
- [JsonProperty("hbend")]
+ ///
+ /// Horizontal blank end
+ ///
+ [JsonProperty("hbend", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string HBEnd { get; set; } // TODO: Int32? Float?
- [JsonProperty("hbstart")]
+ ///
+ /// Horizontal blank start
+ ///
+ [JsonProperty("hbstart", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string HBStart { get; set; } // TODO: Int32? Float?
- [JsonProperty("vtotal")]
+ ///
+ /// Total vertical lines
+ ///
+ [JsonProperty("vtotal", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string VTotal { get; set; } // TODO: Int32? Float?
- [JsonProperty("vbend")]
+ ///
+ /// Vertical blank end
+ ///
+ [JsonProperty("vbend", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string VBEnd { get; set; } // TODO: Int32? Float?
- [JsonProperty("vbstart")]
+ ///
+ /// Vertical blank start
+ ///
+ [JsonProperty("vbstart", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string VBStart { get; set; } // TODO: Int32? Float?
+
+ #endregion
}
///
@@ -170,8 +254,15 @@ namespace SabreTools.Library.DatItems
[JsonObject("extension")]
public class Extension
{
- [JsonProperty("name")]
+ #region Fields
+
+ ///
+ /// Extension name
+ ///
+ [JsonProperty("name", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Name { get; set; }
+
+ #endregion
}
///
@@ -181,20 +272,39 @@ namespace SabreTools.Library.DatItems
[JsonObject("input")]
public class Input
{
- [JsonProperty("service")]
+ #region Fields
+
+ ///
+ /// Input service ID
+ ///
+ [JsonProperty("service", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? Service { get; set; }
- [JsonProperty("tilt")]
+ ///
+ /// Determins if this has a tilt sensor
+ ///
+ [JsonProperty("tilt", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? Tilt { get; set; }
- [JsonProperty("players")]
+ ///
+ /// Number of players on the input
+ ///
+ [JsonProperty("players", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Players { get; set; } // TODO: Int32?
- [JsonProperty("coins")]
+ ///
+ /// Number of coins required
+ ///
+ [JsonProperty("coins", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Coins { get; set; } // TODO: Int32?
- [JsonProperty("controls")]
+ ///
+ /// Set of controls for the input
+ ///
+ [JsonProperty("controls", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List Controls { get; set; }
+
+ #endregion
}
///
@@ -203,11 +313,21 @@ namespace SabreTools.Library.DatItems
[JsonObject("instance")]
public class Instance
{
+ #region Fields
+
+ ///
+ /// Name of the instance
+ ///
[JsonProperty("name")]
public string Name { get; set; }
- [JsonProperty("briefname")]
+ ///
+ /// Short name for the instance
+ ///
+ [JsonProperty("briefname", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string BriefName { get; set; }
+
+ #endregion
}
///
@@ -216,14 +336,27 @@ namespace SabreTools.Library.DatItems
[JsonObject("location")]
public class Location
{
+ #region Fields
+
+ ///
+ /// Location name
+ ///
[JsonProperty("name")]
public string Name { get; set; }
- [JsonProperty("number")]
+ ///
+ /// Location ID
+ ///
+ [JsonProperty("number", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Number { get; set; }
- [JsonProperty("inverted")]
+ ///
+ /// Determines if location is inverted or not
+ ///
+ [JsonProperty("inverted", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? Inverted { get; set; }
+
+ #endregion
}
///
@@ -233,11 +366,21 @@ namespace SabreTools.Library.DatItems
[JsonObject("port")]
public class Port
{
- [JsonProperty("tag")]
+ #region Fields
+
+ ///
+ /// Tag for the port
+ ///
+ [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Tag { get; set; }
- [JsonProperty("analogs")]
+ ///
+ /// List of analogs on the port
+ ///
+ [JsonProperty("analogs", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List Analogs { get; set; }
+
+ #endregion
}
///
@@ -246,17 +389,33 @@ namespace SabreTools.Library.DatItems
[JsonObject("setting")]
public class Setting
{
+ #region Fields
+
+ ///
+ /// Setting name
+ ///
[JsonProperty("name")]
public string Name { get; set; }
- [JsonProperty("value")]
+ ///
+ /// Setting value
+ ///
+ [JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Value { get; set; }
- [JsonProperty("default")]
+ ///
+ /// Determines if the setting is default or not
+ ///
+ [JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? Default { get; set; }
- [JsonProperty("conditions")]
+ ///
+ /// List of conditions on the setting
+ ///
+ [JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List Conditions { get; set; }
+
+ #endregion
}
///
@@ -265,14 +424,27 @@ namespace SabreTools.Library.DatItems
[JsonObject("slotoption")]
public class SlotOption
{
+ #region Fields
+
+ ///
+ /// Slot option name
+ ///
[JsonProperty("name")]
public string Name { get; set; }
+ ///
+ /// Referenced device name
+ ///
[JsonProperty("devname")]
public string DeviceName { get; set; }
- [JsonProperty("default")]
+ ///
+ /// Determines if this slot option is default or not
+ ///
+ [JsonProperty("default", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? Default { get; set; }
+
+ #endregion
}
#endregion
diff --git a/SabreTools.Library/DatItems/Condition.cs b/SabreTools.Library/DatItems/Condition.cs
new file mode 100644
index 00000000..97c4c820
--- /dev/null
+++ b/SabreTools.Library/DatItems/Condition.cs
@@ -0,0 +1,246 @@
+using System.Collections.Generic;
+using System.Linq;
+
+using SabreTools.Library.Filtering;
+using Newtonsoft.Json;
+
+///
+/// This holds all of the auxiliary types needed for proper parsing
+///
+namespace SabreTools.Library.DatItems
+{
+ ///
+ /// Represents a condition on a machine or other item
+ ///
+ [JsonObject("condition")]
+ public class Condition : DatItem
+ {
+ // TODO: Handle obscure field mappings due to this being used *under* other items as well
+ #region Fields
+
+ ///
+ /// Condition tag value
+ ///
+ [JsonProperty("tag", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public string Tag { get; set; }
+
+ ///
+ /// Condition mask
+ ///
+ [JsonProperty("mask", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public string Mask { get; set; }
+
+ ///
+ /// Condition relationship
+ ///
+ [JsonProperty("relation", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public string Relation { get; set; } // TODO: (eq|ne|gt|le|lt|ge)
+
+ ///
+ /// Condition value
+ ///
+ [JsonProperty("value", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public string ConditionValue { get; set; }
+
+ #endregion
+
+ #region Accessors
+
+ ///
+ /// Set fields with given values
+ ///
+ /// Mappings dictionary
+ public override void SetFields(Dictionary mappings)
+ {
+ // Set base fields
+ base.SetFields(mappings);
+
+ // Handle Condition-specific fields
+ if (mappings.Keys.Contains(Field.DatItem_Tag))
+ Tag = mappings[Field.DatItem_Tag];
+
+ if (mappings.Keys.Contains(Field.DatItem_Mask))
+ Mask = mappings[Field.DatItem_Mask];
+
+ if (mappings.Keys.Contains(Field.DatItem_Relation))
+ Relation = mappings[Field.DatItem_Relation];
+
+ if (mappings.Keys.Contains(Field.DatItem_ConditionValue))
+ ConditionValue = mappings[Field.DatItem_ConditionValue];
+ }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Create a default, empty Condition object
+ ///
+ public Condition()
+ {
+ ItemType = ItemType.Condition;
+ }
+
+ #endregion
+
+ #region Cloning Methods
+
+ public override object Clone()
+ {
+ return new Condition()
+ {
+ ItemType = this.ItemType,
+ DupeType = this.DupeType,
+
+ AltName = this.AltName,
+ AltTitle = this.AltTitle,
+
+ Original = this.Original,
+ OpenMSXSubType = this.OpenMSXSubType,
+ OpenMSXType = this.OpenMSXType,
+ Remark = this.Remark,
+ Boot = this.Boot,
+
+ Part = this.Part,
+ Features = this.Features,
+ AreaName = this.AreaName,
+ AreaSize = this.AreaSize,
+ AreaWidth = this.AreaWidth,
+ AreaEndianness = this.AreaEndianness,
+ Value = this.Value,
+ LoadFlag = this.LoadFlag,
+
+ Machine = this.Machine.Clone() as Machine,
+ Source = this.Source.Clone() as Source,
+ Remove = this.Remove,
+
+ Tag = this.Tag,
+ Mask = this.Mask,
+ Relation = this.Relation,
+ ConditionValue = this.ConditionValue,
+ };
+ }
+
+ #endregion
+
+ #region Comparision Methods
+
+ public override bool Equals(DatItem other)
+ {
+ // If we don't have a Condition, return false
+ if (ItemType != other.ItemType)
+ return false;
+
+ // Otherwise, treat it as a Condition
+ Condition newOther = other as Condition;
+
+ // If the Feature information matches
+ return (Tag == newOther.Tag
+ && Mask == newOther.Mask
+ && Relation == newOther.Relation
+ && ConditionValue == newOther.ConditionValue);
+ }
+
+ #endregion
+
+ #region Filtering
+
+ ///
+ /// Check to see if a DatItem passes the filter
+ ///
+ /// Filter to check against
+ /// True if the item passed the filter, false otherwise
+ public override bool PassesFilter(Filter filter)
+ {
+ // Check common fields first
+ if (!base.PassesFilter(filter))
+ return false;
+
+ // Filter on tag
+ if (filter.DatItem_Tag.MatchesPositiveSet(Tag) == false)
+ return false;
+ if (filter.DatItem_Tag.MatchesNegativeSet(Tag) == true)
+ return false;
+
+ // Filter on mask
+ if (filter.DatItem_Mask.MatchesPositiveSet(Mask) == false)
+ return false;
+ if (filter.DatItem_Mask.MatchesNegativeSet(Mask) == true)
+ return false;
+
+ // Filter on mask
+ if (filter.DatItem_Relation.MatchesPositiveSet(Relation) == false)
+ return false;
+ if (filter.DatItem_Relation.MatchesNegativeSet(Relation) == true)
+ return false;
+
+ // Filter on value
+ if (filter.DatItem_ConditionValue.MatchesPositiveSet(ConditionValue) == false)
+ return false;
+ if (filter.DatItem_ConditionValue.MatchesNegativeSet(ConditionValue) == true)
+ return false;
+
+ return true;
+ }
+
+ ///
+ /// Remove fields from the DatItem
+ ///
+ /// List of Fields to remove
+ public override void RemoveFields(List fields)
+ {
+ // Remove common fields first
+ base.RemoveFields(fields);
+
+ // Remove the fields
+ if (fields.Contains(Field.DatItem_Tag))
+ Tag = null;
+
+ if (fields.Contains(Field.DatItem_Mask))
+ Mask = null;
+
+ if (fields.Contains(Field.DatItem_Relation))
+ Relation = null;
+
+ if (fields.Contains(Field.DatItem_ConditionValue))
+ ConditionValue = null;
+ }
+
+ #endregion
+
+ #region Sorting and Merging
+
+ ///
+ /// Replace fields from another item
+ ///
+ /// DatItem to pull new information from
+ /// List of Fields representing what should be updated
+ public override void ReplaceFields(DatItem item, List fields)
+ {
+ // Replace common fields first
+ base.ReplaceFields(item, fields);
+
+ // If we don't have a Condition to replace from, ignore specific fields
+ if (item.ItemType != ItemType.Condition)
+ return;
+
+ // Cast for easier access
+ Condition newItem = item as Condition;
+
+ // Replace the fields
+ if (fields.Contains(Field.DatItem_Tag))
+ Tag = newItem.Tag;
+
+ if (fields.Contains(Field.DatItem_Mask))
+ Mask = newItem.Mask;
+
+ if (fields.Contains(Field.DatItem_Relation))
+ Relation = newItem.Relation;
+
+ if (fields.Contains(Field.DatItem_ConditionValue))
+ ConditionValue = newItem.ConditionValue;
+ }
+
+ #endregion
+ }
+}
diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs
index d5f56c14..5fea2620 100644
--- a/SabreTools.Library/DatItems/DatItem.cs
+++ b/SabreTools.Library/DatItems/DatItem.cs
@@ -458,6 +458,9 @@ namespace SabreTools.Library.DatItems
case ItemType.Adjuster:
return new Adjuster();
+ case ItemType.Analog:
+ return new Analog();
+
case ItemType.Archive:
return new Archive();
@@ -470,6 +473,9 @@ namespace SabreTools.Library.DatItems
case ItemType.Chip:
return new Chip();
+ case ItemType.Condition:
+ return new Condition();
+
case ItemType.Configuration:
return new Configuration();
@@ -519,10 +525,12 @@ namespace SabreTools.Library.DatItems
return itemType switch
{
ItemType.Adjuster => new Adjuster(),
+ ItemType.Analog => new Analog(),
ItemType.Archive => new Archive(),
ItemType.BiosSet => new BiosSet(),
ItemType.Blank => new Blank(),
ItemType.Chip => new Chip(),
+ ItemType.Condition => new Condition(),
ItemType.Configuration => new Configuration(),
ItemType.DeviceReference => new DeviceReference(),
ItemType.DipSwitch => new DipSwitch(),
diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs
index 71d4f4c7..6c5b61e0 100644
--- a/SabreTools.Library/DatItems/Enums.cs
+++ b/SabreTools.Library/DatItems/Enums.cs
@@ -203,13 +203,6 @@ namespace SabreTools.Library.DatItems
Machine_Display_VBEnd,
Machine_Display_VBStart,
- // Conditions
- Machine_Conditions,
- Machine_Condition_Tag,
- Machine_Condition_Mask,
- Machine_Condition_Relation,
- Machine_Condition_Value,
-
// Inputs
Machine_Inputs,
Machine_Input_Service,
@@ -393,6 +386,9 @@ namespace SabreTools.Library.DatItems
DatItem_Condition_Relation,
DatItem_Condition_Value,
+ // Analog
+ DatItem_Mask,
+
// BiosSet
DatItem_Description,
@@ -401,8 +397,9 @@ namespace SabreTools.Library.DatItems
DatItem_ChipType,
DatItem_Clock,
- // Configuration
- DatItem_Mask,
+ // Condition
+ DatItem_ConditionValue,
+ DatItem_Relation,
// Configuration.Locations
DatItem_Locations,
@@ -489,9 +486,11 @@ namespace SabreTools.Library.DatItems
// "Auxiliary" item types
Adjuster,
+ Analog,
Archive,
BiosSet,
Chip,
+ Condition,
Configuration,
DeviceReference,
DipSwitch,
diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs
index a477d1d8..b57f260b 100644
--- a/SabreTools.Library/DatItems/Machine.cs
+++ b/SabreTools.Library/DatItems/Machine.cs
@@ -158,12 +158,6 @@ namespace SabreTools.Library.DatItems
[JsonProperty("displays", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List Displays { get; set; } = null;
- ///
- /// List of associated conditions
- ///
- [JsonProperty("conditions", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public List Conditions { get; set; } = null;
-
///
/// List of associated inputs
///
@@ -535,7 +529,6 @@ namespace SabreTools.Library.DatItems
SourceFile = this.SourceFile,
Runnable = this.Runnable,
Displays = this.Displays,
- Conditions = this.Conditions,
Inputs = this.Inputs,
Ports = this.Ports,
Devices = this.Devices,
@@ -1018,105 +1011,13 @@ namespace SabreTools.Library.DatItems
#endregion
- #region Conditions
-
- // Machine_Conditions
- if (filter.Machine_Conditions.MatchesNeutral(null, Conditions?.Any() ?? null) == false)
- return false;
-
- // Machine_Condition_Tag
- if (Conditions?.Any() == true)
- {
- bool anyPositive = false;
- bool anyNegative = false;
-
- foreach (var condition in Conditions)
- {
- if (filter.Machine_Condition_Tag.MatchesPositiveSet(condition?.Tag) != false)
- anyPositive = true;
- if (filter.Machine_Condition_Tag.MatchesNegativeSet(condition?.Tag) == true)
- anyNegative = true;
- }
-
- if (!anyPositive)
- return false;
- if (anyNegative)
- return false;
- }
-
- // Machine_Condition_Mask
- if (Conditions?.Any() == true)
- {
- bool anyPositive = false;
- bool anyNegative = false;
-
- foreach (var condition in Conditions)
- {
- if (filter.Machine_Condition_Mask.MatchesPositiveSet(condition?.Mask) != false)
- anyPositive = true;
- if (filter.Machine_Condition_Mask.MatchesNegativeSet(condition?.Mask) == true)
- anyNegative = true;
- }
-
- if (!anyPositive)
- return false;
- if (anyNegative)
- return false;
- }
-
- // Machine_Condition_Relation
- if (Conditions?.Any() == true)
- {
- bool anyPositive = false;
- bool anyNegative = false;
-
- foreach (var condition in Conditions)
- {
- if (filter.Machine_Condition_Relation.MatchesPositiveSet(condition?.Relation) != false)
- anyPositive = true;
- if (filter.Machine_Condition_Relation.MatchesNegativeSet(condition?.Relation) == true)
- anyNegative = true;
- }
-
- if (!anyPositive)
- return false;
- if (anyNegative)
- return false;
- }
-
- // Machine_Condition_Value
- if (Conditions?.Any() == true)
- {
- bool anyPositive = false;
- bool anyNegative = false;
-
- foreach (var condition in Conditions)
- {
- if (filter.Machine_Condition_Value.MatchesPositiveSet(condition?.Value) != false)
- anyPositive = true;
- if (filter.Machine_Condition_Value.MatchesNegativeSet(condition?.Value) == true)
- anyNegative = true;
- }
-
- if (!anyPositive)
- return false;
- if (anyNegative)
- return false;
- }
-
- #endregion
-
// TODO: Inputs
// TODO: Inputs.Controls
// TODO: Ports
// TODO: Ports.Analogs
- // TODO: Drivers
- // TODO: Features
// TODO: Devices
// TODO: Devices.Instances
// TODO: Devices.Extensions
- // TODO: Slots
- // TODO: Slots.SlotOptions
#endregion // ListXML
diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs
index 5946ceb2..72803432 100644
--- a/SabreTools.Library/Filtering/Filter.cs
+++ b/SabreTools.Library/Filtering/Filter.cs
@@ -68,13 +68,6 @@ namespace SabreTools.Library.Filtering
public FilterItem Machine_Display_VBEnd { get; private set; } = new FilterItem();
public FilterItem Machine_Display_VBStart { get; private set; } = new FilterItem();
- // Conditions
- public FilterItem Machine_Conditions { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_Condition_Tag { get; private set; } = new FilterItem();
- public FilterItem Machine_Condition_Mask { get; private set; } = new FilterItem();
- public FilterItem Machine_Condition_Relation { get; private set; } = new FilterItem();
- public FilterItem Machine_Condition_Value { get; private set; } = new FilterItem();
-
// Inputs
public FilterItem Machine_Inputs { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Input_Service { get; private set; } = new FilterItem() { Neutral = null };
@@ -257,6 +250,9 @@ namespace SabreTools.Library.Filtering
public FilterItem DatItem_Condition_Relation { get; private set; } = new FilterItem();
public FilterItem DatItem_Condition_Value { get; private set; } = new FilterItem();
+ // Analog
+ public FilterItem DatItem_Mask { get; private set; } = new FilterItem();
+
// BiosSet
public FilterItem DatItem_Description { get; private set; } = new FilterItem();
public FilterItem DatItem_Default { get; private set; } = new FilterItem() { Neutral = null };
@@ -266,8 +262,9 @@ namespace SabreTools.Library.Filtering
public FilterItem DatItem_ChipType { get; private set; } = new FilterItem() { Positive = ChipType.NULL, Negative = ChipType.NULL };
public FilterItem DatItem_Clock { get; private set; } = new FilterItem();
- // Configuration
- public FilterItem DatItem_Mask { get; private set; } = new FilterItem();
+ // Condition
+ public FilterItem DatItem_Relation { get; private set; } = new FilterItem();
+ public FilterItem DatItem_ConditionValue { get; private set; } = new FilterItem();
// Configuration.Locations
public FilterItem DatItem_Locations { get; private set; } = new FilterItem() { Neutral = null };
@@ -650,42 +647,6 @@ namespace SabreTools.Library.Filtering
Machine_Display_VBStart.PositiveSet.Add(value);
break;
- // Conditions
- case Field.Machine_Conditions:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- Machine_Conditions.Neutral = false;
- else
- Machine_Conditions.Neutral = true;
- break;
-
- case Field.Machine_Condition_Tag:
- if (negate)
- Machine_Condition_Tag.NegativeSet.Add(value);
- else
- Machine_Condition_Tag.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Condition_Mask:
- if (negate)
- Machine_Condition_Mask.NegativeSet.Add(value);
- else
- Machine_Condition_Mask.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Condition_Relation:
- if (negate)
- Machine_Condition_Relation.NegativeSet.Add(value);
- else
- Machine_Condition_Relation.PositiveSet.Add(value);
- break;
-
- case Field.Machine_Condition_Value:
- if (negate)
- Machine_Condition_Value.NegativeSet.Add(value);
- else
- Machine_Condition_Value.PositiveSet.Add(value);
- break;
-
// Inputs
case Field.Machine_Inputs:
if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
@@ -1534,6 +1495,14 @@ namespace SabreTools.Library.Filtering
DatItem_Condition_Value.PositiveSet.Add(value);
break;
+ // Analog
+ case Field.DatItem_Mask:
+ if (negate)
+ DatItem_Mask.NegativeSet.Add(value);
+ else
+ DatItem_Mask.PositiveSet.Add(value);
+ break;
+
// BiosSet
case Field.DatItem_Description:
if (negate)
@@ -1564,12 +1533,19 @@ namespace SabreTools.Library.Filtering
DatItem_Clock.PositiveSet.Add(value);
break;
- // Configuration
- case Field.DatItem_Mask:
+ // Condition
+ case Field.DatItem_Relation:
if (negate)
- DatItem_Mask.NegativeSet.Add(value);
+ DatItem_Relation.NegativeSet.Add(value);
else
- DatItem_Mask.PositiveSet.Add(value);
+ DatItem_Relation.PositiveSet.Add(value);
+ break;
+
+ case Field.DatItem_ConditionValue:
+ if (negate)
+ DatItem_ConditionValue.NegativeSet.Add(value);
+ else
+ DatItem_ConditionValue.PositiveSet.Add(value);
break;
// Configurations.Locations
diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs
index 635ba3f8..2c20cdcf 100644
--- a/SabreTools.Library/Tools/Converters.cs
+++ b/SabreTools.Library/Tools/Converters.cs
@@ -617,21 +617,6 @@ namespace SabreTools.Library.Tools
case "display_vbstart":
return Field.Machine_Display_VBStart;
- case "conditions":
- return Field.Machine_Conditions;
-
- case "condition_tag":
- return Field.Machine_Condition_Tag;
-
- case "condition_mask":
- return Field.Machine_Condition_Mask;
-
- case "condition_relation":
- return Field.Machine_Condition_Relation;
-
- case "condition_value":
- return Field.Machine_Condition_Value;
-
case "inputs":
return Field.Machine_Inputs;
@@ -1046,6 +1031,10 @@ namespace SabreTools.Library.Tools
case "condition_value":
return Field.DatItem_Condition_Value;
+ // Analog
+ case "mask":
+ return Field.DatItem_Mask;
+
// BiosSet
case "description":
case "biosdescription":
@@ -1063,10 +1052,14 @@ namespace SabreTools.Library.Tools
case "clock":
return Field.DatItem_Clock;
- // Configuration
- case "mask":
- return Field.DatItem_Mask;
+ // Condition
+ case "relation":
+ return Field.DatItem_Relation;
+ case "conditionvalue":
+ return Field.DatItem_ConditionValue;
+
+ // Configuration
case "locations":
return Field.DatItem_Locations;
@@ -1665,6 +1658,8 @@ namespace SabreTools.Library.Tools
{
case "adjuster":
return ItemType.Adjuster;
+ case "analog":
+ return ItemType.Analog;
case "archive":
return ItemType.Archive;
case "biosset":
@@ -1673,6 +1668,8 @@ namespace SabreTools.Library.Tools
return ItemType.Blank;
case "chip":
return ItemType.Chip;
+ case "condition":
+ return ItemType.Condition;
case "configuration":
return ItemType.Configuration;
case "device_ref":
@@ -1708,10 +1705,12 @@ namespace SabreTools.Library.Tools
return itemType?.ToLowerInvariant() switch
{
"adjuster" => ItemType.Adjuster,
+ "analog" => ItemType.Analog,
"archive" => ItemType.Archive,
"biosset" => ItemType.BiosSet,
"blank" => ItemType.Blank,
"chip" => ItemType.Chip,
+ "condition" => ItemType.Condition,
"configuration" => ItemType.Configuration,
"device_ref" => ItemType.DeviceReference,
"dipswitch" => ItemType.DipSwitch,
@@ -2270,6 +2269,8 @@ namespace SabreTools.Library.Tools
{
case ItemType.Adjuster:
return "adjuster";
+ case ItemType.Analog:
+ return "analog";
case ItemType.Archive:
return "archive";
case ItemType.BiosSet:
@@ -2278,6 +2279,8 @@ namespace SabreTools.Library.Tools
return "blank";
case ItemType.Chip:
return "chip";
+ case ItemType.Condition:
+ return "condition";
case ItemType.Configuration:
return "configuration";
case ItemType.DeviceReference:
@@ -2313,10 +2316,12 @@ namespace SabreTools.Library.Tools
return itemType switch
{
ItemType.Adjuster => "adjuster",
+ ItemType.Analog => "analog",
ItemType.Archive => "archive",
ItemType.BiosSet => "biosset",
ItemType.Blank => "blank",
ItemType.Chip => "chip",
+ ItemType.Condition => "condition",
ItemType.Configuration => "configuration",
ItemType.DeviceReference => "device_ref",
ItemType.DipSwitch => "dipswitch",