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; }