diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs
index 0420673f..07ea5852 100644
--- a/SabreTools.Library/DatFiles/Listxml.cs
+++ b/SabreTools.Library/DatFiles/Listxml.cs
@@ -357,11 +357,10 @@ namespace SabreTools.Library.DatFiles
break;
case "display":
- datItems.Add(new Display
+ var display = new Display
{
Tag = reader.GetAttribute("tag"),
DisplayType = reader.GetAttribute("type").AsDisplayType(),
- Rotate = reader.GetAttribute("rotate"),
FlipX = reader.GetAttribute("flipx").AsYesNo(),
Width = reader.GetAttribute("width"),
Height = reader.GetAttribute("height"),
@@ -379,7 +378,16 @@ namespace SabreTools.Library.DatFiles
Index = indexId,
Name = filename,
},
- });
+ };
+
+ // Set the rotation
+ if (reader.GetAttribute("rotate") != null)
+ {
+ if (Int64.TryParse(reader.GetAttribute("rotate"), out long rotate))
+ display.Rotate = rotate;
+ }
+
+ datItems.Add(display);
reader.Read();
break;
@@ -1531,7 +1539,7 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("display");
xtw.WriteOptionalAttributeString("tag", display.Tag);
xtw.WriteOptionalAttributeString("type", display.DisplayType.FromDisplayType());
- xtw.WriteOptionalAttributeString("rotate", display.Rotate);
+ xtw.WriteOptionalAttributeString("rotate", display.Rotate?.ToString());
xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo());
xtw.WriteOptionalAttributeString("width", display.Width);
xtw.WriteOptionalAttributeString("height", display.Height);
diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs
index b04f9e69..fea881bb 100644
--- a/SabreTools.Library/DatFiles/SabreDat.cs
+++ b/SabreTools.Library/DatFiles/SabreDat.cs
@@ -1437,7 +1437,7 @@ namespace SabreTools.Library.DatFiles
xtw.WriteAttributeString("type", "display");
xtw.WriteOptionalAttributeString("tag", display.Tag);
xtw.WriteOptionalAttributeString("type", display.DisplayType.FromDisplayType());
- xtw.WriteOptionalAttributeString("rotate", display.Rotate);
+ xtw.WriteOptionalAttributeString("rotate", display.Rotate?.ToString());
xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo());
xtw.WriteOptionalAttributeString("width", display.Width);
xtw.WriteOptionalAttributeString("height", display.Height);
diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs
index b98d79c1..b39424c0 100644
--- a/SabreTools.Library/DatFiles/SoftwareList.cs
+++ b/SabreTools.Library/DatFiles/SoftwareList.cs
@@ -359,23 +359,7 @@ namespace SabreTools.Library.DatFiles
switch (reader.Name)
{
case "rom":
- // If the rom is continue or ignore, add the size to the previous rom
- if (reader.GetAttribute("loadflag") == "continue" || reader.GetAttribute("loadflag") == "ignore")
- {
- int index = Items[key].Count - 1;
- DatItem lastrom = Items[key][index];
- if (lastrom.ItemType == ItemType.Rom)
- {
- ((Rom)lastrom).Size += Sanitizer.CleanSize(reader.GetAttribute("size"));
- }
-
- Items[key].RemoveAt(index);
- Items[key].Add(lastrom);
- reader.Read();
- continue;
- }
-
- DatItem rom = new Rom
+ var rom = new Rom
{
Name = reader.GetAttribute("name"),
Size = Sanitizer.CleanSize(reader.GetAttribute("size")),
@@ -389,6 +373,24 @@ namespace SabreTools.Library.DatFiles
DataArea = dataArea,
};
+ // If the rom is continue or ignore, add the size to the previous rom
+ // TODO: Can this be done on write? We technically lose information this way.
+ // Order is not guaranteed, and since these don't tend to have any way
+ // of determining what the "previous" item was after this, that info would
+ // have to be stored *with* the item somehow
+ if (rom.LoadFlag == LoadFlag.Continue || rom.LoadFlag == LoadFlag.Ignore)
+ {
+ int index = Items[key].Count - 1;
+ DatItem lastrom = Items[key][index];
+ if (lastrom.ItemType == ItemType.Rom)
+ (lastrom as Rom).Size += rom.Size;
+
+ Items[key].RemoveAt(index);
+ Items[key].Add(lastrom);
+ reader.Read();
+ continue;
+ }
+
items.Add(rom);
reader.Read();
break;
diff --git a/SabreTools.Library/DatItems/Device.cs b/SabreTools.Library/DatItems/Device.cs
index 85e711cb..02f80ed1 100644
--- a/SabreTools.Library/DatItems/Device.cs
+++ b/SabreTools.Library/DatItems/Device.cs
@@ -35,8 +35,9 @@ namespace SabreTools.Library.DatItems
///
/// Determines if the devices is mandatory
///
+ /// Only value used seems to be 1. Used like bool, but actually int
[JsonProperty("mandatory", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public string Mandatory { get; set; } // TODO: bool?
+ public string Mandatory { get; set; } // TODO: long?
///
/// Device interface
diff --git a/SabreTools.Library/DatItems/Display.cs b/SabreTools.Library/DatItems/Display.cs
index e68d62e2..1494bed1 100644
--- a/SabreTools.Library/DatItems/Display.cs
+++ b/SabreTools.Library/DatItems/Display.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Linq;
using SabreTools.Library.Filtering;
@@ -33,7 +34,7 @@ namespace SabreTools.Library.DatItems
/// Display rotation
///
[JsonProperty("rotate", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public string Rotate { get; set; } // TODO: (0|90|180|270) Int32?
+ public long? Rotate { get; set; }
///
/// Determines if display is flipped in the X-coordinates
@@ -122,7 +123,10 @@ namespace SabreTools.Library.DatItems
DisplayType = mappings[Field.DatItem_DisplayType].AsDisplayType();
if (mappings.Keys.Contains(Field.DatItem_Rotate))
- Rotate = mappings[Field.DatItem_Rotate];
+ {
+ if (Int64.TryParse(mappings[Field.DatItem_Rotate], out long rotate))
+ Rotate = rotate;
+ }
if (mappings.Keys.Contains(Field.DatItem_FlipX))
FlipX = mappings[Field.DatItem_FlipX].AsYesNo();
@@ -260,9 +264,9 @@ namespace SabreTools.Library.DatItems
return false;
// Filter on rotation
- if (filter.DatItem_Rotate.MatchesPositiveSet(Rotate) == false)
+ if (filter.DatItem_Rotate.MatchesPositive(null, Rotate) == false)
return false;
- if (filter.DatItem_Rotate.MatchesNegativeSet(Rotate) == true)
+ if (filter.DatItem_Rotate.MatchesNegative(null, Rotate) == true)
return false;
// Filter on flipx
diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs
index 138476c2..dbbcccd0 100644
--- a/SabreTools.Library/DatItems/Rom.cs
+++ b/SabreTools.Library/DatItems/Rom.cs
@@ -51,6 +51,7 @@ namespace SabreTools.Library.DatItems
///
/// Byte size of the rom
///
+ /// TODO: Can this be made optional instead of concrete long? Use `null` instead of `-1`?
[JsonProperty("size", DefaultValueHandling = DefaultValueHandling.Ignore)]
public long Size { get; set; }
diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs
index 78e7a374..fd4aa360 100644
--- a/SabreTools.Library/Filtering/Filter.cs
+++ b/SabreTools.Library/Filtering/Filter.cs
@@ -197,7 +197,7 @@ namespace SabreTools.Library.Filtering
// Display
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_Rotate { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_FlipX { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Width { get; private set; } = new FilterItem();
public FilterItem DatItem_Height { get; private set; } = new FilterItem();
@@ -839,7 +839,7 @@ namespace SabreTools.Library.Filtering
break;
case Field.DatItem_Rotate:
- SetStringFilter(DatItem_Rotate, value, negate);
+ SetOptionalLongFilter(DatItem_Rotate, value, negate);
break;
case Field.DatItem_FlipX: