diff --git a/SabreTools.DatFiles/Formats/Listxml.cs b/SabreTools.DatFiles/Formats/Listxml.cs
index 319f9a16..d137d9c3 100644
--- a/SabreTools.DatFiles/Formats/Listxml.cs
+++ b/SabreTools.DatFiles/Formats/Listxml.cs
@@ -22,164 +22,167 @@ namespace SabreTools.DatFiles.Formats
///
/// DTD for original MAME XML DATs
///
- private const string MAMEDTD = @"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ private const string MAMEDTD = @"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+]>
";
///
@@ -1506,16 +1509,16 @@ namespace SabreTools.DatFiles.Formats
var adjuster = datItem as Adjuster;
xtw.WriteStartElement("adjuster");
xtw.WriteRequiredAttributeString("name", adjuster.Name);
- xtw.WriteOptionalAttributeString("default", adjuster.Default.FromYesNo());
+ xtw.WriteRequiredAttributeString("default", adjuster.Default.FromYesNo());
if (adjuster.ConditionsSpecified)
{
foreach (var adjusterCondition in adjuster.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", adjusterCondition.Tag);
- xtw.WriteOptionalAttributeString("mask", adjusterCondition.Mask);
- xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation.FromRelation());
- xtw.WriteOptionalAttributeString("value", adjusterCondition.Value);
+ xtw.WriteRequiredAttributeString("tag", adjusterCondition.Tag);
+ xtw.WriteRequiredAttributeString("mask", adjusterCondition.Mask);
+ xtw.WriteRequiredAttributeString("relation", adjusterCondition.Relation.FromRelation());
+ xtw.WriteRequiredAttributeString("value", adjusterCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1526,7 +1529,7 @@ namespace SabreTools.DatFiles.Formats
var biosSet = datItem as BiosSet;
xtw.WriteStartElement("biosset");
xtw.WriteRequiredAttributeString("name", biosSet.Name);
- xtw.WriteOptionalAttributeString("description", biosSet.Description);
+ xtw.WriteRequiredAttributeString("description", biosSet.Description);
xtw.WriteOptionalAttributeString("default", biosSet.Default?.ToString().ToLowerInvariant());
xtw.WriteEndElement();
break;
@@ -1536,7 +1539,7 @@ namespace SabreTools.DatFiles.Formats
xtw.WriteStartElement("chip");
xtw.WriteRequiredAttributeString("name", chip.Name);
xtw.WriteOptionalAttributeString("tag", chip.Tag);
- xtw.WriteOptionalAttributeString("type", chip.ChipType.FromChipType());
+ xtw.WriteRequiredAttributeString("type", chip.ChipType.FromChipType());
xtw.WriteOptionalAttributeString("clock", chip.Clock?.ToString());
xtw.WriteEndElement();
break;
@@ -1544,29 +1547,29 @@ namespace SabreTools.DatFiles.Formats
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.FromRelation());
- xtw.WriteOptionalAttributeString("value", condition.Value);
+ xtw.WriteRequiredAttributeString("tag", condition.Tag);
+ xtw.WriteRequiredAttributeString("mask", condition.Mask);
+ xtw.WriteRequiredAttributeString("relation", condition.Relation.FromRelation());
+ xtw.WriteRequiredAttributeString("value", condition.Value);
xtw.WriteEndElement();
break;
case ItemType.Configuration:
var configuration = datItem as Configuration;
xtw.WriteStartElement("configuration");
- xtw.WriteOptionalAttributeString("name", configuration.Name);
- xtw.WriteOptionalAttributeString("tag", configuration.Tag);
- xtw.WriteOptionalAttributeString("mask", configuration.Mask);
+ xtw.WriteRequiredAttributeString("name", configuration.Name);
+ xtw.WriteRequiredAttributeString("tag", configuration.Tag);
+ xtw.WriteRequiredAttributeString("mask", configuration.Mask);
if (configuration.ConditionsSpecified)
{
foreach (var configurationCondition in configuration.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", configurationCondition.Tag);
- xtw.WriteOptionalAttributeString("mask", configurationCondition.Mask);
- xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation.FromRelation());
- xtw.WriteOptionalAttributeString("value", configurationCondition.Value);
+ xtw.WriteRequiredAttributeString("tag", configurationCondition.Tag);
+ xtw.WriteRequiredAttributeString("mask", configurationCondition.Mask);
+ xtw.WriteRequiredAttributeString("relation", configurationCondition.Relation.FromRelation());
+ xtw.WriteRequiredAttributeString("value", configurationCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1575,8 +1578,8 @@ namespace SabreTools.DatFiles.Formats
foreach (var location in configuration.Locations)
{
xtw.WriteStartElement("conflocation");
- xtw.WriteOptionalAttributeString("name", location.Name);
- xtw.WriteOptionalAttributeString("number", location.Number?.ToString());
+ xtw.WriteRequiredAttributeString("name", location.Name);
+ xtw.WriteRequiredAttributeString("number", location.Number?.ToString());
xtw.WriteOptionalAttributeString("inverted", location.Inverted.FromYesNo());
xtw.WriteEndElement();
}
@@ -1586,8 +1589,8 @@ namespace SabreTools.DatFiles.Formats
foreach (var setting in configuration.Settings)
{
xtw.WriteStartElement("confsetting");
- xtw.WriteOptionalAttributeString("name", setting.Name);
- xtw.WriteOptionalAttributeString("value", setting.Value);
+ xtw.WriteRequiredAttributeString("name", setting.Name);
+ xtw.WriteRequiredAttributeString("value", setting.Value);
xtw.WriteOptionalAttributeString("default", setting.Default.FromYesNo());
xtw.WriteEndElement();
}
@@ -1598,7 +1601,7 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Device:
var device = datItem as Device;
xtw.WriteStartElement("device");
- xtw.WriteOptionalAttributeString("type", device.DeviceType.FromDeviceType());
+ xtw.WriteRequiredAttributeString("type", device.DeviceType.FromDeviceType());
xtw.WriteOptionalAttributeString("tag", device.Tag);
xtw.WriteOptionalAttributeString("fixed_image", device.FixedImage);
xtw.WriteOptionalAttributeString("mandatory", device.Mandatory?.ToString());
@@ -1608,8 +1611,8 @@ namespace SabreTools.DatFiles.Formats
foreach (var instance in device.Instances)
{
xtw.WriteStartElement("instance");
- xtw.WriteOptionalAttributeString("name", instance.Name);
- xtw.WriteOptionalAttributeString("briefname", instance.BriefName);
+ xtw.WriteRequiredAttributeString("name", instance.Name);
+ xtw.WriteRequiredAttributeString("briefname", instance.BriefName);
xtw.WriteEndElement();
}
}
@@ -1618,7 +1621,7 @@ namespace SabreTools.DatFiles.Formats
foreach (var extension in device.Extensions)
{
xtw.WriteStartElement("extension");
- xtw.WriteOptionalAttributeString("name", extension.Name);
+ xtw.WriteRequiredAttributeString("name", extension.Name);
xtw.WriteEndElement();
}
}
@@ -1635,18 +1638,18 @@ namespace SabreTools.DatFiles.Formats
case ItemType.DipSwitch:
var dipSwitch = datItem as DipSwitch;
xtw.WriteStartElement("dipswitch");
- xtw.WriteOptionalAttributeString("name", dipSwitch.Name);
- xtw.WriteOptionalAttributeString("tag", dipSwitch.Tag);
- xtw.WriteOptionalAttributeString("mask", dipSwitch.Mask);
+ xtw.WriteRequiredAttributeString("name", dipSwitch.Name);
+ xtw.WriteRequiredAttributeString("tag", dipSwitch.Tag);
+ xtw.WriteRequiredAttributeString("mask", dipSwitch.Mask);
if (dipSwitch.ConditionsSpecified)
{
foreach (var dipSwitchCondition in dipSwitch.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", dipSwitchCondition.Tag);
- xtw.WriteOptionalAttributeString("mask", dipSwitchCondition.Mask);
- xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation.FromRelation());
- xtw.WriteOptionalAttributeString("value", dipSwitchCondition.Value);
+ xtw.WriteRequiredAttributeString("tag", dipSwitchCondition.Tag);
+ xtw.WriteRequiredAttributeString("mask", dipSwitchCondition.Mask);
+ xtw.WriteRequiredAttributeString("relation", dipSwitchCondition.Relation.FromRelation());
+ xtw.WriteRequiredAttributeString("value", dipSwitchCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1655,8 +1658,8 @@ namespace SabreTools.DatFiles.Formats
foreach (var location in dipSwitch.Locations)
{
xtw.WriteStartElement("diplocation");
- xtw.WriteOptionalAttributeString("name", location.Name);
- xtw.WriteOptionalAttributeString("number", location.Number?.ToString());
+ xtw.WriteRequiredAttributeString("name", location.Name);
+ xtw.WriteRequiredAttributeString("number", location.Number?.ToString());
xtw.WriteOptionalAttributeString("inverted", location.Inverted.FromYesNo());
xtw.WriteEndElement();
}
@@ -1666,18 +1669,18 @@ namespace SabreTools.DatFiles.Formats
foreach (var value in dipSwitch.Values)
{
xtw.WriteStartElement("dipvalue");
- xtw.WriteOptionalAttributeString("name", value.Name);
- xtw.WriteOptionalAttributeString("value", value.Value);
+ xtw.WriteRequiredAttributeString("name", value.Name);
+ xtw.WriteRequiredAttributeString("value", value.Value);
xtw.WriteOptionalAttributeString("default", value.Default.FromYesNo());
if (value.ConditionsSpecified)
{
foreach (var dipValueCondition in value.Conditions)
{
xtw.WriteStartElement("condition");
- xtw.WriteOptionalAttributeString("tag", dipValueCondition.Tag);
- xtw.WriteOptionalAttributeString("mask", dipValueCondition.Mask);
- xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation.FromRelation());
- xtw.WriteOptionalAttributeString("value", dipValueCondition.Value);
+ xtw.WriteRequiredAttributeString("tag", dipValueCondition.Tag);
+ xtw.WriteRequiredAttributeString("mask", dipValueCondition.Mask);
+ xtw.WriteRequiredAttributeString("relation", dipValueCondition.Relation.FromRelation());
+ xtw.WriteRequiredAttributeString("value", dipValueCondition.Value);
xtw.WriteEndElement();
}
}
@@ -1705,12 +1708,12 @@ namespace SabreTools.DatFiles.Formats
var display = datItem as Display;
xtw.WriteStartElement("display");
xtw.WriteOptionalAttributeString("tag", display.Tag);
- xtw.WriteOptionalAttributeString("type", display.DisplayType.FromDisplayType());
+ xtw.WriteRequiredAttributeString("type", display.DisplayType.FromDisplayType());
xtw.WriteOptionalAttributeString("rotate", display.Rotate?.ToString());
xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo());
xtw.WriteOptionalAttributeString("width", display.Width?.ToString());
xtw.WriteOptionalAttributeString("height", display.Height?.ToString());
- xtw.WriteOptionalAttributeString("refresh", display.Refresh?.ToString("N6"));
+ xtw.WriteRequiredAttributeString("refresh", display.Refresh?.ToString("N6"));
xtw.WriteOptionalAttributeString("pixclock", display.PixClock?.ToString());
xtw.WriteOptionalAttributeString("htotal", display.HTotal?.ToString());
xtw.WriteOptionalAttributeString("hbend", display.HBEnd?.ToString());
@@ -1724,17 +1727,17 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Driver:
var driver = datItem as Driver;
xtw.WriteStartElement("driver");
- xtw.WriteOptionalAttributeString("status", driver.Status.FromSupportStatus());
- xtw.WriteOptionalAttributeString("emulation", driver.Emulation.FromSupportStatus());
+ xtw.WriteRequiredAttributeString("status", driver.Status.FromSupportStatus());
+ xtw.WriteRequiredAttributeString("emulation", driver.Emulation.FromSupportStatus());
xtw.WriteOptionalAttributeString("cocktail", driver.Cocktail.FromSupportStatus());
- xtw.WriteOptionalAttributeString("savestate", driver.SaveState.FromSupported(true));
+ xtw.WriteRequiredAttributeString("savestate", driver.SaveState.FromSupported(true));
xtw.WriteEndElement();
break;
case ItemType.Feature:
var feature = datItem as Feature;
xtw.WriteStartElement("feature");
- xtw.WriteOptionalAttributeString("type", feature.Type.FromFeatureType());
+ xtw.WriteRequiredAttributeString("type", feature.Type.FromFeatureType());
xtw.WriteOptionalAttributeString("status", feature.Status.FromFeatureStatus());
xtw.WriteOptionalAttributeString("overall", feature.Overall.FromFeatureStatus());
xtw.WriteEndElement();
@@ -1745,14 +1748,14 @@ namespace SabreTools.DatFiles.Formats
xtw.WriteStartElement("input");
xtw.WriteOptionalAttributeString("service", input.Service.FromYesNo());
xtw.WriteOptionalAttributeString("tilt", input.Tilt.FromYesNo());
- xtw.WriteOptionalAttributeString("players", input.Players?.ToString());
+ xtw.WriteRequiredAttributeString("players", input.Players?.ToString());
xtw.WriteOptionalAttributeString("coins", input.Coins?.ToString());
if (input.ControlsSpecified)
{
foreach (var control in input.Controls)
{
xtw.WriteStartElement("control");
- xtw.WriteOptionalAttributeString("type", control.ControlType.FromControlType());
+ xtw.WriteRequiredAttributeString("type", control.ControlType.FromControlType());
xtw.WriteOptionalAttributeString("player", control.Player?.ToString());
xtw.WriteOptionalAttributeString("buttons", control.Buttons?.ToString());
xtw.WriteOptionalAttributeString("reqbuttons", control.RequiredButtons?.ToString());
@@ -1773,13 +1776,13 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Port:
var port = datItem as Port;
xtw.WriteStartElement("port");
- xtw.WriteOptionalAttributeString("tag", port.Tag);
+ xtw.WriteRequiredAttributeString("tag", port.Tag);
if (port.AnalogsSpecified)
{
foreach (var analog in port.Analogs)
{
xtw.WriteStartElement("analog");
- xtw.WriteOptionalAttributeString("mask", analog.Mask);
+ xtw.WriteRequiredAttributeString("mask", analog.Mask);
xtw.WriteEndElement();
}
}
@@ -1799,10 +1802,10 @@ namespace SabreTools.DatFiles.Formats
var rom = datItem as Rom;
xtw.WriteStartElement("rom");
xtw.WriteRequiredAttributeString("name", rom.Name);
- xtw.WriteOptionalAttributeString("size", rom.Size?.ToString());
+ xtw.WriteOptionalAttributeString("bios", rom.Bios);
+ xtw.WriteRequiredAttributeString("size", rom.Size?.ToString());
xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
- xtw.WriteOptionalAttributeString("bios", rom.Bios);
xtw.WriteOptionalAttributeString("merge", rom.MergeTag);
xtw.WriteOptionalAttributeString("region", rom.Region);
xtw.WriteOptionalAttributeString("offset", rom.Offset);
@@ -1821,14 +1824,14 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Slot:
var slot = datItem as Slot;
xtw.WriteStartElement("slot");
- xtw.WriteOptionalAttributeString("name", slot.Name);
+ xtw.WriteRequiredAttributeString("name", slot.Name);
if (slot.SlotOptionsSpecified)
{
foreach (var slotOption in slot.SlotOptions)
{
xtw.WriteStartElement("slotoption");
- xtw.WriteOptionalAttributeString("name", slotOption.Name);
- xtw.WriteOptionalAttributeString("devname", slotOption.DeviceName);
+ xtw.WriteRequiredAttributeString("name", slotOption.Name);
+ xtw.WriteRequiredAttributeString("devname", slotOption.DeviceName);
xtw.WriteOptionalAttributeString("default", slotOption.Default.FromYesNo());
xtw.WriteEndElement();
}
@@ -1840,7 +1843,7 @@ namespace SabreTools.DatFiles.Formats
var softwareList = datItem as DatItems.Formats.SoftwareList;
xtw.WriteStartElement("softwarelist");
xtw.WriteRequiredAttributeString("name", softwareList.Name);
- xtw.WriteOptionalAttributeString("status", softwareList.Status.FromSoftwareListStatus());
+ xtw.WriteRequiredAttributeString("status", softwareList.Status.FromSoftwareListStatus());
xtw.WriteOptionalAttributeString("filter", softwareList.Filter);
xtw.WriteEndElement();
break;
@@ -1848,7 +1851,7 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Sound:
var sound = datItem as Sound;
xtw.WriteStartElement("sound");
- xtw.WriteOptionalAttributeString("channels", sound.Channels?.ToString());
+ xtw.WriteRequiredAttributeString("channels", sound.Channels?.ToString());
xtw.WriteEndElement();
break;
}