diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs
index 71dbc33e..6f68c7bf 100644
--- a/SabreTools.Library/DatFiles/Listxml.cs
+++ b/SabreTools.Library/DatFiles/Listxml.cs
@@ -360,7 +360,7 @@ namespace SabreTools.Library.DatFiles
datItems.Add(new Display
{
Tag = reader.GetAttribute("tag"),
- DisplayType = reader.GetAttribute("type"),
+ DisplayType = reader.GetAttribute("type").AsDisplayType(),
Rotate = reader.GetAttribute("rotate"),
FlipX = reader.GetAttribute("flipx").AsYesNo(),
Width = reader.GetAttribute("width"),
@@ -1511,7 +1511,7 @@ namespace SabreTools.Library.DatFiles
var display = datItem as Display;
xtw.WriteStartElement("display");
xtw.WriteOptionalAttributeString("tag", display.Tag);
- xtw.WriteOptionalAttributeString("type", display.DisplayType);
+ xtw.WriteOptionalAttributeString("type", display.DisplayType.FromDisplayType());
xtw.WriteOptionalAttributeString("rotate", display.Rotate);
xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo());
xtw.WriteOptionalAttributeString("width", display.Width);
diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs
index c705fe72..747a3bd2 100644
--- a/SabreTools.Library/DatFiles/SabreDat.cs
+++ b/SabreTools.Library/DatFiles/SabreDat.cs
@@ -1436,7 +1436,7 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("file");
xtw.WriteAttributeString("type", "display");
xtw.WriteOptionalAttributeString("tag", display.Tag);
- xtw.WriteOptionalAttributeString("type", display.DisplayType);
+ xtw.WriteOptionalAttributeString("type", display.DisplayType.FromDisplayType());
xtw.WriteOptionalAttributeString("rotate", display.Rotate);
xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo());
xtw.WriteOptionalAttributeString("width", display.Width);
diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs
index 184faee3..5baf228c 100644
--- a/SabreTools.Library/DatFiles/SoftwareList.cs
+++ b/SabreTools.Library/DatFiles/SoftwareList.cs
@@ -384,7 +384,7 @@ namespace SabreTools.Library.DatFiles
Offset = reader.GetAttribute("offset"),
Value = reader.GetAttribute("value"),
ItemStatus = reader.GetAttribute("status").AsItemStatus(),
- LoadFlag = reader.GetAttribute("loadflag"),
+ LoadFlag = reader.GetAttribute("loadflag").AsLoadFlag(),
DataArea = dataArea,
};
@@ -787,7 +787,7 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("offset", rom.Offset);
xtw.WriteOptionalAttributeString("value", rom.Value);
xtw.WriteOptionalAttributeString("status", rom.ItemStatus.FromItemStatus(false));
- xtw.WriteOptionalAttributeString("loadflag", rom.LoadFlag);
+ xtw.WriteOptionalAttributeString("loadflag", rom.LoadFlag.FromLoadFlag());
xtw.WriteEndElement();
// End dataarea
diff --git a/SabreTools.Library/DatItems/Display.cs b/SabreTools.Library/DatItems/Display.cs
index d184a3cb..e68d62e2 100644
--- a/SabreTools.Library/DatItems/Display.cs
+++ b/SabreTools.Library/DatItems/Display.cs
@@ -4,6 +4,7 @@ using System.Linq;
using SabreTools.Library.Filtering;
using SabreTools.Library.Tools;
using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
namespace SabreTools.Library.DatItems
{
@@ -25,7 +26,8 @@ namespace SabreTools.Library.DatItems
/// Display type
///
[JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public string DisplayType { get; set; } // TODO: (raster|vector|lcd|svg|unknown)
+ [JsonConverter(typeof(StringEnumConverter))]
+ public DisplayType DisplayType { get; set; }
///
/// Display rotation
@@ -117,7 +119,7 @@ namespace SabreTools.Library.DatItems
Tag = mappings[Field.DatItem_Tag];
if (mappings.Keys.Contains(Field.DatItem_DisplayType))
- DisplayType = mappings[Field.DatItem_DisplayType];
+ DisplayType = mappings[Field.DatItem_DisplayType].AsDisplayType();
if (mappings.Keys.Contains(Field.DatItem_Rotate))
Rotate = mappings[Field.DatItem_Rotate];
@@ -252,9 +254,9 @@ namespace SabreTools.Library.DatItems
return false;
// Filter on display type
- if (filter.DatItem_DisplayType.MatchesPositiveSet(DisplayType) == false)
+ if (filter.DatItem_DisplayType.MatchesPositive(DisplayType.NULL, DisplayType) == false)
return false;
- if (filter.DatItem_DisplayType.MatchesNegativeSet(DisplayType) == true)
+ if (filter.DatItem_DisplayType.MatchesNegative(DisplayType.NULL, DisplayType) == true)
return false;
// Filter on rotation
@@ -344,7 +346,7 @@ namespace SabreTools.Library.DatItems
Tag = null;
if (fields.Contains(Field.DatItem_DisplayType))
- DisplayType = null;
+ DisplayType = DisplayType.NULL;
if (fields.Contains(Field.DatItem_Rotate))
Rotate = null;
diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs
index 21ba5dbe..b3cd3e3a 100644
--- a/SabreTools.Library/DatItems/Enums.cs
+++ b/SabreTools.Library/DatItems/Enums.cs
@@ -17,6 +17,24 @@ namespace SabreTools.Library.DatItems
Audio = 1 << 1,
}
+ ///
+ /// Determine the display type
+ ///
+ [Flags]
+ public enum DisplayType
+ {
+ ///
+ /// This is a fake flag that is used for filter only
+ ///
+ NULL = 0,
+
+ Raster = 1 << 0,
+ Vector = 1 << 1,
+ LCD = 1 << 2,
+ SVG = 1 << 3,
+ Unknown = 1 << 4,
+ }
+
///
/// Determines which type of duplicate a file is
///
@@ -78,7 +96,6 @@ namespace SabreTools.Library.DatItems
/// List of valid field types within a DatItem/Machine
///
/// TODO: Move this to a more common location
- /// TODO: Ensure the order of these after all shuffling
public enum Field : int
{
NULL = 0,
@@ -469,19 +486,30 @@ namespace SabreTools.Library.DatItems
}
///
- /// Determine which OpenMSX subtype an item is
+ /// Determine the loadflag value
///
[Flags]
- public enum OpenMSXSubType
+ public enum LoadFlag
{
///
/// This is a fake flag that is used for filter only
///
NULL = 0,
- Rom = 1 << 0,
- MegaRom = 1 << 1,
- SCCPlusCart = 1 << 2,
+ Load16Byte = 1 << 0,
+ Load16Word = 1 << 1,
+ Load16WordSwap = 1 << 2,
+ Load32Byte = 1 << 3,
+ Load32Word = 1 << 4,
+ Load32WordSwap = 1 << 5,
+ Load32DWord = 1 << 6,
+ Load64Word = 1 << 7,
+ Load64WordSwap = 1 << 8,
+ Reload = 1 << 9,
+ Fill = 1 << 10,
+ Continue = 1 << 11,
+ ReloadPlain = 1 << 12,
+ Ignore = 1 << 13,
}
///
@@ -500,6 +528,22 @@ namespace SabreTools.Library.DatItems
Mechanical = 1 << 3,
}
+ ///
+ /// Determine which OpenMSX subtype an item is
+ ///
+ [Flags]
+ public enum OpenMSXSubType
+ {
+ ///
+ /// This is a fake flag that is used for filter only
+ ///
+ NULL = 0,
+
+ Rom = 1 << 0,
+ MegaRom = 1 << 1,
+ SCCPlusCart = 1 << 2,
+ }
+
///
/// Determine machine runnable status
///
diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs
index 2aba8150..f10b85fd 100644
--- a/SabreTools.Library/DatItems/Machine.cs
+++ b/SabreTools.Library/DatItems/Machine.cs
@@ -402,9 +402,6 @@ namespace SabreTools.Library.DatItems
if (mappings.Keys.Contains(Field.Machine_Supported))
Supported = mappings[Field.Machine_Supported].AsSupported();
- // TODO: Add Machine_Info*
- // TODO: Add Machine_SharedFeature*
-
#endregion
}
diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs
index cb28b6c7..5a552a11 100644
--- a/SabreTools.Library/DatItems/Rom.cs
+++ b/SabreTools.Library/DatItems/Rom.cs
@@ -235,8 +235,8 @@ namespace SabreTools.Library.DatItems
/// Loading flag
///
[JsonProperty("loadflag", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public string LoadFlag { get; set; } // TODO: (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)
-
+ [JsonConverter(typeof(StringEnumConverter))]
+ public LoadFlag LoadFlag { get; set; }
///
/// Original hardware part associated with the item
@@ -401,7 +401,7 @@ namespace SabreTools.Library.DatItems
}
if (mappings.Keys.Contains(Field.DatItem_LoadFlag))
- LoadFlag = mappings[Field.DatItem_LoadFlag];
+ LoadFlag = mappings[Field.DatItem_LoadFlag].AsLoadFlag();
if (mappings.Keys.Contains(Field.DatItem_Part_Name))
{
@@ -919,9 +919,9 @@ namespace SabreTools.Library.DatItems
return false;
// Filter on load flag
- if (filter.DatItem_LoadFlag.MatchesPositiveSet(LoadFlag) == false)
+ if (filter.DatItem_LoadFlag.MatchesPositive(LoadFlag.NULL, LoadFlag) == false)
return false;
- if (filter.DatItem_LoadFlag.MatchesNegativeSet(LoadFlag) == true)
+ if (filter.DatItem_LoadFlag.MatchesNegative(LoadFlag.NULL, LoadFlag) == true)
return false;
// Filter on part name
@@ -942,7 +942,7 @@ namespace SabreTools.Library.DatItems
if (filter.DatItem_Value.MatchesNegativeSet(Value) == true)
return false;
- // TODO: Handle DatItem_Feature*
+ // TODO: Handle DatItem_Part_Feature*
#endregion
@@ -1073,7 +1073,7 @@ namespace SabreTools.Library.DatItems
}
if (fields.Contains(Field.DatItem_LoadFlag))
- LoadFlag = null;
+ LoadFlag = LoadFlag.NULL;
if (fields.Contains(Field.DatItem_Part_Name) && Part != null)
Part.Name = null;
@@ -1081,7 +1081,7 @@ namespace SabreTools.Library.DatItems
if (fields.Contains(Field.DatItem_Part_Interface) && Part != null)
Part.Interface = null;
- // TODO: Handle DatItem_Feature*
+ // TODO: Handle DatItem_Part_Feature*
if (fields.Contains(Field.DatItem_Value))
Value = null;
diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs
index 8fc10cfe..c5d34814 100644
--- a/SabreTools.Library/Filtering/Filter.cs
+++ b/SabreTools.Library/Filtering/Filter.cs
@@ -138,7 +138,7 @@ namespace SabreTools.Library.Filtering
public FilterItem DatItem_AreaSize { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_AreaWidth { get; private set; } = new FilterItem();
public FilterItem DatItem_AreaEndianness { get; private set; } = new FilterItem();
- public FilterItem DatItem_LoadFlag { get; private set; } = new FilterItem();
+ public FilterItem DatItem_LoadFlag { get; private set; } = new FilterItem() { Positive = LoadFlag.NULL, Negative = LoadFlag.NULL };
public FilterItem DatItem_Part_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Part_Interface { get; private set; } = new FilterItem();
public FilterItem DatItem_Part_Feature_Name { get; private set; } = new FilterItem();
@@ -196,7 +196,7 @@ namespace SabreTools.Library.Filtering
public FilterItem DatItem_Interface { get; private set; } = new FilterItem();
// Display
- public FilterItem DatItem_DisplayType { get; private set; } = new FilterItem();
+ public FilterItem DatItem_DisplayType { get; private set; } = new FilterItem() { Positive = DisplayType.NULL, Negative = DisplayType.NULL };
public FilterItem DatItem_Rotate { get; private set; } = new FilterItem();
public FilterItem DatItem_FlipX { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Width { get; private set; } = new FilterItem();
@@ -928,9 +928,9 @@ namespace SabreTools.Library.Filtering
case Field.DatItem_LoadFlag:
if (negate)
- DatItem_LoadFlag.NegativeSet.Add(value);
+ DatItem_LoadFlag.Negative |= value.AsLoadFlag();
else
- DatItem_LoadFlag.PositiveSet.Add(value);
+ DatItem_LoadFlag.Positive |= value.AsLoadFlag();
break;
case Field.DatItem_Part_Name:
@@ -1193,9 +1193,9 @@ namespace SabreTools.Library.Filtering
// Display
case Field.DatItem_DisplayType:
if (negate)
- DatItem_DisplayType.NegativeSet.Add(value);
+ DatItem_DisplayType.Negative |= value.AsDisplayType();
else
- DatItem_DisplayType.PositiveSet.Add(value);
+ DatItem_DisplayType.Positive |= value.AsDisplayType();
break;
case Field.DatItem_Rotate:
diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs
index 4edda1e0..ce79c2b9 100644
--- a/SabreTools.Library/Tools/Converters.cs
+++ b/SabreTools.Library/Tools/Converters.cs
@@ -172,6 +172,42 @@ namespace SabreTools.Library.Tools
}
}
+ ///
+ /// Get DisplayType value from input string
+ ///
+ /// String to get value from
+ /// DisplayType value corresponding to the string
+ public static DisplayType AsDisplayType(this string displayType)
+ {
+#if NET_FRAMEWORK
+ switch (displayType?.ToLowerInvariant())
+ {
+ case "raster":
+ return DisplayType.Raster;
+ case "vector":
+ return DisplayType.Vector;
+ case "lcd":
+ return DisplayType.LCD;
+ case "svg":
+ return DisplayType.SVG;
+ case "unknown":
+ return DisplayType.Unknown;
+ default:
+ return DisplayType.NULL;
+ }
+#else
+ return displayType?.ToLowerInvariant() switch
+ {
+ "raster" => DisplayType.Raster,
+ "vector" => DisplayType.Vector,
+ "lcd" => DisplayType.LCD,
+ "svg" => DisplayType.SVG,
+ "unknown" => DisplayType.Unknown,
+ _ => DisplayType.NULL,
+ };
+#endif
+ }
+
///
/// Get FeatureStatus value from input string
///
@@ -1669,6 +1705,69 @@ namespace SabreTools.Library.Tools
#endif
}
+ ///
+ /// Get LoadFlag value from input string
+ ///
+ /// String to get value from
+ /// LoadFlag value corresponding to the string
+ public static LoadFlag AsLoadFlag(this string loadFlag)
+ {
+#if NET_FRAMEWORK
+ switch (loadFlag?.ToLowerInvariant())
+ {
+ case "load16_byte":
+ return LoadFlag.Load16Byte;
+ case "load16_word":
+ return LoadFlag.Load16Word;
+ case "load16_word_swap":
+ return LoadFlag.Load16WordSwap;
+ case "load32_byte":
+ return LoadFlag.Load32Byte;
+ case "load32_word":
+ return LoadFlag.Load32Word;
+ case "load32_word_swap":
+ return LoadFlag.Load32WordSwap;
+ case "load32_dword":
+ return LoadFlag.Load32DWord;
+ case "load64_word":
+ return LoadFlag.Load64Word;
+ case "load64_word_swap":
+ return LoadFlag.Load64WordSwap;
+ case "reload":
+ return LoadFlag.Reload;
+ case "fill":
+ return LoadFlag.Fill;
+ case "continue":
+ return LoadFlag.Continue;
+ case "reload_plain":
+ return LoadFlag.ReloadPlain;
+ case "sccpluscart":
+ return LoadFlag.Ignore;
+ default:
+ return LoadFlag.NULL;
+ }
+#else
+ return loadFlag?.ToLowerInvariant() switch
+ {
+ "load16_byte" => LoadFlag.Load16Byte,
+ "load16_word" => LoadFlag.Load16Word,
+ "load16_word_swap" => LoadFlag.Load16WordSwap,
+ "load32_byte" => LoadFlag.Load32Byte,
+ "load32_word" => LoadFlag.Load32Word,
+ "load32_word_swap" => LoadFlag.Load32WordSwap,
+ "load32_dword" => LoadFlag.Load32DWord,
+ "load64_word" => LoadFlag.Load64Word,
+ "load64_word_swap" => LoadFlag.Load64WordSwap,
+ "reload" => LoadFlag.Reload,
+ "fill" => LoadFlag.Fill,
+ "continue" => LoadFlag.Continue,
+ "reload_plain" => LoadFlag.ReloadPlain,
+ "ignore" => LoadFlag.Ignore,
+ _ => LoadFlag.NULL,
+ };
+#endif
+ }
+
///
/// Get MachineType value from input string
///
@@ -2072,6 +2171,42 @@ namespace SabreTools.Library.Tools
#endif
}
+ ///
+ /// Get string value from input DisplayType
+ ///
+ /// DisplayType to get value from
+ /// String value corresponding to the DisplayType
+ public static string FromDisplayType(this DisplayType displayType)
+ {
+#if NET_FRAMEWORK
+ switch (displayType)
+ {
+ case DisplayType.Raster:
+ return "raster";
+ case DisplayType.Vector:
+ return "vector";
+ case DisplayType.LCD:
+ return "lcd";
+ case DisplayType.SVG:
+ return "svg";
+ case DisplayType.Unknown:
+ return "unknown";
+ default:
+ return null;
+ }
+#else
+ return displayType switch
+ {
+ DisplayType.Raster => "raster",
+ DisplayType.Vector => "vector",
+ DisplayType.LCD => "lcd",
+ DisplayType.SVG => "svg",
+ DisplayType.Unknown => "unknown",
+ _ => null,
+ };
+#endif
+ }
+
///
/// Get string value from input FeatureStatus
///
@@ -2196,6 +2331,69 @@ namespace SabreTools.Library.Tools
#endif
}
+ ///
+ /// Get string value from input LoadFlag
+ ///
+ /// LoadFlag to get value from
+ /// String value corresponding to the LoadFlag
+ public static string FromLoadFlag(this LoadFlag loadFlag)
+ {
+#if NET_FRAMEWORK
+ switch (loadFlag)
+ {
+ case LoadFlag.Load16Byte:
+ return "load16_byte";
+ case LoadFlag.Load16Word:
+ return "load16_word";
+ case LoadFlag.Load16WordSwap:
+ return "load16_word_swap";
+ case LoadFlag.Load32Byte:
+ return "load32_byte";
+ case LoadFlag.Load32Word:
+ return "load32_word";
+ case LoadFlag.Load32WordSwap:
+ return "load32_word_swap";
+ case LoadFlag.Load32DWord:
+ return "load32_dword";
+ case LoadFlag.Load64Word:
+ return "load64_word";
+ case LoadFlag.Load64WordSwap:
+ return "load64_word_swap";
+ case LoadFlag.Reload:
+ return "reload";
+ case LoadFlag.Fill:
+ return "fill";
+ case LoadFlag.Continue:
+ return "continue";
+ case LoadFlag.ReloadPlain:
+ return "reload_plain";
+ case LoadFlag.Ignore:
+ return "sccpluscart";
+ default:
+ return null;
+ }
+#else
+ return loadFlag switch
+ {
+ LoadFlag.Load16Byte => "load16_byte",
+ LoadFlag.Load16Word => "load16_word",
+ LoadFlag.Load16WordSwap => "load16_word_swap",
+ LoadFlag.Load32Byte => "load32_byte",
+ LoadFlag.Load32Word => "load32_word",
+ LoadFlag.Load32WordSwap => "load32_word_swap",
+ LoadFlag.Load32DWord => "load32_dword",
+ LoadFlag.Load64Word => "load64_word",
+ LoadFlag.Load64WordSwap => "load64_word_swap",
+ LoadFlag.Reload => "reload",
+ LoadFlag.Fill => "fill",
+ LoadFlag.Continue => "continue",
+ LoadFlag.ReloadPlain => "reload_plain",
+ LoadFlag.Ignore => "ignore",
+ _ => null,
+ };
+#endif
+ }
+
///
/// Get string value from input ItemType?
///