diff --git a/SabreTools.Library/DatFiles/ClrMamePro.cs b/SabreTools.Library/DatFiles/ClrMamePro.cs
index cb75db2b..8df772f0 100644
--- a/SabreTools.Library/DatFiles/ClrMamePro.cs
+++ b/SabreTools.Library/DatFiles/ClrMamePro.cs
@@ -377,21 +377,6 @@ namespace SabreTools.Library.DatFiles
if (item.ItemType == ItemType.Release)
(item as Release).Language = attrVal;
- break;
- case "tag":
- if (item.ItemType == ItemType.Chip)
- (item as Chip).Tag = attrVal;
-
- break;
- case "type":
- if (item.ItemType == ItemType.Chip)
- (item as Chip).ChipType = attrVal;
-
- break;
- case "clock":
- if (item.ItemType == ItemType.Chip)
- (item as Chip).Clock = attrVal;
-
break;
}
}
@@ -631,16 +616,6 @@ namespace SabreTools.Library.DatFiles
cmpw.WriteEndElement();
break;
- case ItemType.Chip:
- var chip = datItem as Chip;
- cmpw.WriteStartElement("chip");
- cmpw.WriteRequiredAttributeString("name", chip.Name);
- cmpw.WriteOptionalAttributeString("tag", chip.Tag);
- cmpw.WriteOptionalAttributeString("type", chip.ChipType);
- cmpw.WriteOptionalAttributeString("clock", chip.Clock);
- cmpw.WriteEndElement();
- break;
-
case ItemType.DeviceReference:
cmpw.WriteStartElement("device_ref");
cmpw.WriteRequiredAttributeString("name", datItem.Name);
diff --git a/SabreTools.Library/DatFiles/ItemDictionary.cs b/SabreTools.Library/DatFiles/ItemDictionary.cs
index b24db227..a1204992 100644
--- a/SabreTools.Library/DatFiles/ItemDictionary.cs
+++ b/SabreTools.Library/DatFiles/ItemDictionary.cs
@@ -131,6 +131,12 @@ namespace SabreTools.Library.DatFiles
[JsonIgnore]
public long SampleCount { get; private set; } = 0;
+ ///
+ /// Number of SoftwareList items
+ ///
+ [JsonIgnore]
+ public long SoftwareListCount { get; private set; } = 0;
+
///
/// Number of machines
///
@@ -516,6 +522,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Sample:
SampleCount++;
break;
+ case ItemType.SoftwareList:
+ SoftwareListCount++;
+ break;
}
}
@@ -648,6 +657,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Sample:
SampleCount--;
break;
+ case ItemType.SoftwareList:
+ SoftwareListCount--;
+ break;
}
}
diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs
index 91fbc259..99ac0341 100644
--- a/SabreTools.Library/DatFiles/Json.cs
+++ b/SabreTools.Library/DatFiles/Json.cs
@@ -238,6 +238,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.Sample:
datItem = datItemObj.ToObject();
break;
+ case ItemType.SoftwareList:
+ datItem = datItemObj.ToObject();
+ break;
}
}
diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs
index f8995875..69cb3b78 100644
--- a/SabreTools.Library/DatFiles/Listxml.cs
+++ b/SabreTools.Library/DatFiles/Listxml.cs
@@ -497,18 +497,21 @@ namespace SabreTools.Library.DatFiles
break;
case "softwarelist":
- var softwareList = new ListXmlSoftwareList();
- softwareList.Name = reader.GetAttribute("name");
- softwareList.Status = reader.GetAttribute("status").AsSoftwareListStatus();
- softwareList.Filter = reader.GetAttribute("filter");
+ datItems.Add(new DatItems.SoftwareList
+ {
+ Name = reader.GetAttribute("name"),
+ Status = reader.GetAttribute("status").AsSoftwareListStatus(),
+ Filter = reader.GetAttribute("filter"),
- // Ensure the list exists
- if (machine.SoftwareLists == null)
- machine.SoftwareLists = new List();
-
- machine.SoftwareLists.Add(softwareList);
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
+ });
reader.Read();
+
break;
case "ramoption":
@@ -1405,20 +1408,6 @@ namespace SabreTools.Library.DatFiles
xtw.WriteEndElement();
}
}
- if (datItem.Machine.SoftwareLists != null)
- {
- foreach (var softwarelist in datItem.Machine.SoftwareLists)
- {
- xtw.WriteStartElement("softwarelist");
-
- xtw.WriteOptionalAttributeString("name", softwarelist.Name);
- xtw.WriteOptionalAttributeString("status", softwarelist.Status.FromSoftwareListStatus());
- xtw.WriteOptionalAttributeString("filter", softwarelist.Filter);
-
- // End softwarelist
- xtw.WriteEndElement();
- }
- }
if (datItem.Machine.RamOptions != null)
{
foreach (var ramOption in datItem.Machine.RamOptions)
@@ -1551,6 +1540,15 @@ namespace SabreTools.Library.DatFiles
xtw.WriteRequiredAttributeString("name", datItem.Name);
xtw.WriteEndElement();
break;
+
+ case ItemType.SoftwareList:
+ var softwareList = datItem as DatItems.SoftwareList;
+ xtw.WriteStartElement("softwarelist");
+ xtw.WriteRequiredAttributeString("name", datItem.Name);
+ xtw.WriteOptionalAttributeString("status", softwareList.Status.FromSoftwareListStatus());
+ xtw.WriteOptionalAttributeString("sha512", softwareList.Filter);
+ xtw.WriteEndElement();
+ break;
}
xtw.Flush();
diff --git a/SabreTools.Library/DatFiles/Logiqx.cs b/SabreTools.Library/DatFiles/Logiqx.cs
index ce42ec57..09b3d780 100644
--- a/SabreTools.Library/DatFiles/Logiqx.cs
+++ b/SabreTools.Library/DatFiles/Logiqx.cs
@@ -412,31 +412,6 @@ namespace SabreTools.Library.DatFiles
reader.Read();
break;
- case "chip":
- containsItems = true;
-
- DatItem chip = new Chip
- {
- Name = reader.GetAttribute("name"),
- Tag = reader.GetAttribute("tag"),
- ChipType = reader.GetAttribute("type"),
- Clock = reader.GetAttribute("clock"),
-
- Source = new Source
- {
- Index = indexId,
- Name = filename,
- },
- };
-
- chip.CopyMachineInformation(machine);
-
- // Now process and add the chip
- key = ParseAddHelper(chip);
-
- reader.Read();
- break;
-
case "disk":
containsItems = true;
@@ -978,16 +953,6 @@ namespace SabreTools.Library.DatFiles
xtw.WriteEndElement();
break;
- case ItemType.Chip:
- var chip = datItem as Chip;
- xtw.WriteStartElement("chip");
- xtw.WriteRequiredAttributeString("name", chip.Name);
- xtw.WriteOptionalAttributeString("tag", chip.Tag);
- xtw.WriteOptionalAttributeString("type", chip.ChipType);
- xtw.WriteOptionalAttributeString("clock", chip.Clock);
- xtw.WriteEndElement();
- break;
-
case ItemType.DeviceReference:
xtw.WriteStartElement("device_ref");
xtw.WriteRequiredAttributeString("name", datItem.Name);
diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs
index 465e8137..452a95a9 100644
--- a/SabreTools.Library/DatFiles/SabreDat.cs
+++ b/SabreTools.Library/DatFiles/SabreDat.cs
@@ -956,6 +956,16 @@ namespace SabreTools.Library.DatFiles
xtw.WriteRequiredAttributeString("name", datItem.Name);
xtw.WriteEndElement();
break;
+
+ case ItemType.SoftwareList:
+ var softwareList = datItem as DatItems.SoftwareList;
+ xtw.WriteStartElement("file");
+ xtw.WriteAttributeString("type", "softwarelist");
+ xtw.WriteRequiredAttributeString("name", datItem.Name);
+ xtw.WriteOptionalAttributeString("status", softwareList.Status.FromSoftwareListStatus());
+ xtw.WriteOptionalAttributeString("sha512", softwareList.Filter);
+ xtw.WriteEndElement();
+ break;
}
xtw.Flush();
diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs
index cf445b18..014c6fd7 100644
--- a/SabreTools.Library/DatItems/Auxiliary.cs
+++ b/SabreTools.Library/DatItems/Auxiliary.cs
@@ -418,23 +418,6 @@ namespace SabreTools.Library.DatItems
public bool? Default { get; set; }
}
- ///
- /// Represents one ListXML softwarelist
- ///
- /// TODO: Promote this to the same level as Sample?
- [JsonObject("softwarelist")]
- public class ListXmlSoftwareList
- {
- [JsonProperty("name")]
- public string Name { get; set; }
-
- [JsonProperty("status")]
- public SoftwareListStatus Status { get; set; }
-
- [JsonProperty("filter")]
- public string Filter { get; set; }
- }
-
///
/// Represents one ListXML sound
///
diff --git a/SabreTools.Library/DatItems/BiosSet.cs b/SabreTools.Library/DatItems/BiosSet.cs
index 63eb72c1..31588f3d 100644
--- a/SabreTools.Library/DatItems/BiosSet.cs
+++ b/SabreTools.Library/DatItems/BiosSet.cs
@@ -53,7 +53,7 @@ namespace SabreTools.Library.DatItems
#region Constructors
///
- /// Create a default, empty Sample object
+ /// Create a default, empty BiosSet object
///
public BiosSet()
{
@@ -106,14 +106,14 @@ namespace SabreTools.Library.DatItems
public override bool Equals(DatItem other)
{
- // If we don't have a biosset, return false
+ // If we don't have a BiosSet, return false
if (ItemType != other.ItemType)
return false;
- // Otherwise, treat it as a biosset
+ // Otherwise, treat it as a BiosSet
BiosSet newOther = other as BiosSet;
- // If the archive information matches
+ // If the BiosSet information matches
return (Name == newOther.Name && Description == newOther.Description && Default == newOther.Default);
}
diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs
index afb1bcc9..adaa2295 100644
--- a/SabreTools.Library/DatItems/DatItem.cs
+++ b/SabreTools.Library/DatItems/DatItem.cs
@@ -470,6 +470,9 @@ namespace SabreTools.Library.DatItems
case ItemType.Sample:
return new Sample();
+ case ItemType.SoftwareList:
+ return new SoftwareList();
+
default:
return new Rom();
}
diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs
index cb09e724..724a4bb1 100644
--- a/SabreTools.Library/DatItems/Enums.cs
+++ b/SabreTools.Library/DatItems/Enums.cs
@@ -275,12 +275,6 @@ namespace SabreTools.Library.DatItems
Machine_Slot_SlotOption_DeviceName,
Machine_Slot_SlotOption_Default,
- // SoftwareLists
- Machine_SoftwareLists,
- Machine_SoftwareList_Name,
- Machine_SoftwareList_Status,
- Machine_SoftwareList_Filter,
-
// RamOptions
Machine_RamOptions,
Machine_RamOption_Default,
@@ -425,6 +419,10 @@ namespace SabreTools.Library.DatItems
// Release
DatItem_Language,
+ // Software List
+ DatItem_SoftwareListStatus,
+ DatItem_Filter,
+
#endregion
#endregion // Item-Specific
@@ -467,6 +465,7 @@ namespace SabreTools.Library.DatItems
DeviceReference,
Release,
Sample,
+ SoftwareList,
Blank = 99, // This is not a real type, only used internally
}
diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs
index dc3dab9d..f5d4bf21 100644
--- a/SabreTools.Library/DatItems/Machine.cs
+++ b/SabreTools.Library/DatItems/Machine.cs
@@ -226,12 +226,6 @@ namespace SabreTools.Library.DatItems
[JsonProperty("slots", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List Slots { get; set; } = null;
- ///
- /// List of software lists
- ///
- [JsonProperty("softwarelists", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public List SoftwareLists { get; set; } = null;
-
///
/// List of ramoptions
///
@@ -602,7 +596,6 @@ namespace SabreTools.Library.DatItems
Features = this.Features,
Devices = this.Devices,
Slots = this.Slots,
- SoftwareLists = this.SoftwareLists,
RamOptions = this.RamOptions,
#endregion
diff --git a/SabreTools.Library/DatItems/SoftwareList.cs b/SabreTools.Library/DatItems/SoftwareList.cs
new file mode 100644
index 00000000..d3045c07
--- /dev/null
+++ b/SabreTools.Library/DatItems/SoftwareList.cs
@@ -0,0 +1,194 @@
+using System.Collections.Generic;
+using System.Linq;
+
+using SabreTools.Library.Filtering;
+using SabreTools.Library.Tools;
+using Newtonsoft.Json;
+
+namespace SabreTools.Library.DatItems
+{
+ ///
+ /// Represents which SoftwareList(s) is associated with a set
+ ///
+ [JsonObject("softwarelist")]
+ public class SoftwareList : DatItem
+ {
+ #region Fields
+
+ [JsonProperty("status", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public SoftwareListStatus Status { get; set; }
+
+ [JsonProperty("filter", DefaultValueHandling = DefaultValueHandling.Ignore)]
+ public string Filter { 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 SoftwareList-specific fields
+ if (mappings.Keys.Contains(Field.DatItem_SoftwareListStatus))
+ Status = mappings[Field.DatItem_Default].AsSoftwareListStatus();
+
+ if (mappings.Keys.Contains(Field.DatItem_Filter))
+ Filter = mappings[Field.DatItem_Filter];
+ }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Create a default, empty SoftwareList object
+ ///
+ public SoftwareList()
+ {
+ Name = string.Empty;
+ ItemType = ItemType.SoftwareList;
+ }
+
+ #endregion
+
+ #region Cloning Methods
+
+ public override object Clone()
+ {
+ return new SoftwareList()
+ {
+ Name = this.Name,
+ 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,
+
+ Status = this.Status,
+ Filter = this.Filter,
+ };
+ }
+
+ #endregion
+
+ #region Comparision Methods
+
+ public override bool Equals(DatItem other)
+ {
+ // If we don't have a sample, return false
+ if (ItemType != other.ItemType)
+ return false;
+
+ // Otherwise, treat it as a SoftwareList
+ SoftwareList newOther = other as SoftwareList;
+
+ // If the SoftwareList information matches
+ return (Name == newOther.Name
+ && Status == newOther.Status
+ && Filter == newOther.Filter);
+ }
+
+ #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 status
+ if (filter.DatItem_SoftwareListStatus.MatchesPositive(SoftwareListStatus.NULL, Status) == false)
+ return false;
+ if (filter.DatItem_SoftwareListStatus.MatchesNegative(SoftwareListStatus.NULL, Status) == true)
+ return false;
+
+ // Filter on filter
+ if (filter.DatItem_Filter.MatchesPositiveSet(Filter) == false)
+ return false;
+ if (filter.DatItem_Filter.MatchesNegativeSet(Filter) == 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_SoftwareListStatus))
+ Status = SoftwareListStatus.NULL;
+
+ if (fields.Contains(Field.DatItem_Filter))
+ Filter = 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 SoftwareList to replace from, ignore specific fields
+ if (item.ItemType != ItemType.SoftwareList)
+ return;
+
+ // Cast for easier access
+ SoftwareList newItem = item as SoftwareList;
+
+ // Replace the fields
+ if (fields.Contains(Field.DatItem_SoftwareListStatus))
+ Status = newItem.Status;
+
+ if (fields.Contains(Field.DatItem_Filter))
+ Filter = newItem.Filter;
+ }
+
+ #endregion
+ }
+}
diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs
index cf8d50f5..f42ec09e 100644
--- a/SabreTools.Library/Filtering/Filter.cs
+++ b/SabreTools.Library/Filtering/Filter.cs
@@ -197,12 +197,6 @@ namespace SabreTools.Library.Filtering
public FilterItem Machine_Slot_SlotOption_DeviceName { get; private set; } = new FilterItem();
public FilterItem Machine_Slot_SlotOption_Default { get; private set; } = new FilterItem() { Neutral = null };
- // SoftwareLists
- public FilterItem Machine_SoftwareLists { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_SoftwareList_Name { get; private set; } = new FilterItem();
- public FilterItem Machine_SoftwareList_Status { get; private set; } = new FilterItem();
- public FilterItem Machine_SoftwareList_Filter { get; private set; } = new FilterItem();
-
// RamOptions
public FilterItem Machine_RamOptions { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_RamOption_Default { get; private set; } = new FilterItem() { Neutral = null };
@@ -347,6 +341,10 @@ namespace SabreTools.Library.Filtering
// Release
public FilterItem DatItem_Language { get; private set; } = new FilterItem();
+ // Software List
+ public FilterItem DatItem_SoftwareListStatus { get; private set; } = new FilterItem() { Positive = SoftwareListStatus.NULL, Negative = SoftwareListStatus.NULL };
+ public FilterItem DatItem_Filter { get; private set; } = new FilterItem();
+
#endregion
#endregion // Item-Specific
@@ -1310,35 +1308,6 @@ namespace SabreTools.Library.Filtering
Machine_Slot_SlotOption_Default.Neutral = true;
break;
- // SoftwareLists
- case Field.Machine_SoftwareLists:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- Machine_SoftwareLists.Neutral = false;
- else
- Machine_SoftwareLists.Neutral = true;
- break;
-
- case Field.Machine_SoftwareList_Name:
- if (negate)
- Machine_SoftwareList_Name.NegativeSet.Add(value);
- else
- Machine_SoftwareList_Name.PositiveSet.Add(value);
- break;
-
- case Field.Machine_SoftwareList_Status:
- if (negate)
- Machine_SoftwareList_Status.NegativeSet.Add(value);
- else
- Machine_SoftwareList_Status.PositiveSet.Add(value);
- break;
-
- case Field.Machine_SoftwareList_Filter:
- if (negate)
- Machine_SoftwareList_Filter.NegativeSet.Add(value);
- else
- Machine_SoftwareList_Filter.PositiveSet.Add(value);
- break;
-
// RamOptions
case Field.Machine_RamOptions:
if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
@@ -1966,11 +1935,26 @@ namespace SabreTools.Library.Filtering
DatItem_Language.PositiveSet.Add(value);
break;
- #endregion
+ // Software List
+ case Field.DatItem_SoftwareListStatus:
+ if (negate)
+ DatItem_SoftwareListStatus.Negative |= value.AsSoftwareListStatus();
+ else
+ DatItem_SoftwareListStatus.Positive |= value.AsSoftwareListStatus();
+ break;
- #endregion // Item-Specific
+ case Field.DatItem_Filter:
+ if (negate)
+ DatItem_Filter.NegativeSet.Add(value);
+ else
+ DatItem_Filter.PositiveSet.Add(value);
+ break;
- #endregion // DatItem Filters
+ #endregion
+
+ #endregion // Item-Specific
+
+ #endregion // DatItem Filters
}
}
diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs
index dd1487b4..16a13062 100644
--- a/SabreTools.Library/Tools/Converters.cs
+++ b/SabreTools.Library/Tools/Converters.cs
@@ -762,18 +762,6 @@ namespace SabreTools.Library.Tools
case "slot_slotoption_default":
return Field.Machine_Slot_SlotOption_Default;
- case "softwarelists":
- return Field.Machine_SoftwareLists;
-
- case "softwarelist_name":
- return Field.Machine_SoftwareList_Name;
-
- case "softwarelist_status":
- return Field.Machine_SoftwareList_Status;
-
- case "softwarelist_filter":
- return Field.Machine_SoftwareList_Filter;
-
case "ramoptions":
return Field.Machine_RamOptions;
@@ -1100,6 +1088,14 @@ namespace SabreTools.Library.Tools
case "language":
return Field.DatItem_Language;
+ // Software List
+ case "softwareliststatus":
+ case "softwarelist_status":
+ return Field.DatItem_SoftwareListStatus;
+
+ case "filter":
+ return Field.DatItem_Filter;
+
#endregion
#endregion // Item-Specific
@@ -1614,6 +1610,8 @@ namespace SabreTools.Library.Tools
return ItemType.Rom;
case "sample":
return ItemType.Sample;
+ case "softwarelist":
+ return ItemType.SoftwareList;
default:
return null;
}
@@ -1630,6 +1628,7 @@ namespace SabreTools.Library.Tools
"release" => ItemType.Release,
"rom" => ItemType.Rom,
"sample" => ItemType.Sample,
+ "softwarelist" => ItemType.SoftwareList,
_ => null,
};
#endif
@@ -2041,6 +2040,8 @@ namespace SabreTools.Library.Tools
return "rom";
case ItemType.Sample:
return "sample";
+ case ItemType.SoftwareList:
+ return "softwarelist";
default:
return null;
}
@@ -2057,6 +2058,7 @@ namespace SabreTools.Library.Tools
ItemType.Release => "release",
ItemType.Rom => "rom",
ItemType.Sample => "sample",
+ ItemType.SoftwareList => "softwarelist",
_ => null,
};
#endif