Update ListXML DTD and required attributes

This commit is contained in:
Matt Nadareski
2022-11-03 11:12:54 -07:00
parent 00fa7abc01
commit 07a5489ebf

View File

@@ -22,164 +22,167 @@ namespace SabreTools.DatFiles.Formats
/// <summary> /// <summary>
/// DTD for original MAME XML DATs /// DTD for original MAME XML DATs
/// </summary> /// </summary>
private const string MAMEDTD = @"<!ELEMENT mame (machine+)> private const string MAMEDTD = @"<!DOCTYPE mame [
<!ATTLIST mame build CDATA #IMPLIED> <!ELEMENT mame (machine+)>
<!ATTLIST mame debug (yes|no) string.Emptynostring.Empty> <!ATTLIST mame build CDATA #IMPLIED>
<!ATTLIST mame mameconfig CDATA #REQUIRED> <!ATTLIST mame debug (yes|no) ""no"">
<!ELEMENT machine (description, year?, manufacturer?, biosset*, rom*, disk*, device_ref*, sample*, chip*, display*, sound?, input?, dipswitch*, configuration*, port*, adjuster*, driver?, feature*, device*, slot*, softwarelist*, ramoption*)> <!ATTLIST mame mameconfig CDATA #REQUIRED>
<!ATTLIST machine name CDATA #REQUIRED> <!ELEMENT machine (description, year?, manufacturer?, biosset*, rom*, disk*, device_ref*, sample*, chip*, display*, sound?, input?, dipswitch*, configuration*, port*, adjuster*, driver?, feature*, device*, slot*, softwarelist*, ramoption*)>
<!ATTLIST machine sourcefile CDATA #IMPLIED> <!ATTLIST machine name CDATA #REQUIRED>
<!ATTLIST machine isbios (yes|no) string.Emptynostring.Empty> <!ATTLIST machine sourcefile CDATA #IMPLIED>
<!ATTLIST machine isdevice (yes|no) string.Emptynostring.Empty> <!ATTLIST machine isbios (yes|no) ""no"">
<!ATTLIST machine ismechanical (yes|no) string.Emptynostring.Empty> <!ATTLIST machine isdevice (yes|no) ""no"">
<!ATTLIST machine runnable (yes|no) string.Emptyyesstring.Empty> <!ATTLIST machine ismechanical (yes|no) ""no"">
<!ATTLIST machine cloneof CDATA #IMPLIED> <!ATTLIST machine runnable (yes|no) ""yes"">
<!ATTLIST machine romof CDATA #IMPLIED> <!ATTLIST machine cloneof CDATA #IMPLIED>
<!ATTLIST machine sampleof CDATA #IMPLIED> <!ATTLIST machine romof CDATA #IMPLIED>
<!ELEMENT description (#PCDATA)> <!ATTLIST machine sampleof CDATA #IMPLIED>
<!ELEMENT year (#PCDATA)> <!ELEMENT description (#PCDATA)>
<!ELEMENT manufacturer (#PCDATA)> <!ELEMENT year (#PCDATA)>
<!ELEMENT biosset EMPTY> <!ELEMENT manufacturer (#PCDATA)>
<!ATTLIST biosset name CDATA #REQUIRED> <!ELEMENT biosset EMPTY>
<!ATTLIST biosset description CDATA #REQUIRED> <!ATTLIST biosset name CDATA #REQUIRED>
<!ATTLIST biosset default (yes|no) string.Emptynostring.Empty> <!ATTLIST biosset description CDATA #REQUIRED>
<!ELEMENT rom EMPTY> <!ATTLIST biosset default (yes|no) ""no"">
<!ATTLIST rom name CDATA #REQUIRED> <!ELEMENT rom EMPTY>
<!ATTLIST rom bios CDATA #IMPLIED> <!ATTLIST rom name CDATA #REQUIRED>
<!ATTLIST rom size CDATA #REQUIRED> <!ATTLIST rom bios CDATA #IMPLIED>
<!ATTLIST rom crc CDATA #IMPLIED> <!ATTLIST rom size CDATA #REQUIRED>
<!ATTLIST rom md5 CDATA #IMPLIED> <!ATTLIST rom crc CDATA #IMPLIED>
<!ATTLIST rom sha1 CDATA #IMPLIED> <!ATTLIST rom sha1 CDATA #IMPLIED>
<!ATTLIST rom sha256 CDATA #IMPLIED> <!ATTLIST rom merge CDATA #IMPLIED>
<!ATTLIST rom sha384 CDATA #IMPLIED> <!ATTLIST rom region CDATA #IMPLIED>
<!ATTLIST rom sha512 CDATA #IMPLIED> <!ATTLIST rom offset CDATA #IMPLIED>
<!ATTLIST rom merge CDATA #IMPLIED> <!ATTLIST rom status (baddump|nodump|good) ""good"">
<!ATTLIST rom region CDATA #IMPLIED> <!ATTLIST rom optional (yes|no) ""no"">
<!ATTLIST rom offset CDATA #IMPLIED> <!ELEMENT disk EMPTY>
<!ATTLIST rom status (baddump|nodump|good) string.Emptygoodstring.Empty> <!ATTLIST disk name CDATA #REQUIRED>
<!ATTLIST rom optional (yes|no) string.Emptynostring.Empty> <!ATTLIST disk sha1 CDATA #IMPLIED>
<!ELEMENT disk EMPTY> <!ATTLIST disk merge CDATA #IMPLIED>
<!ATTLIST disk name CDATA #REQUIRED> <!ATTLIST disk region CDATA #IMPLIED>
<!ATTLIST disk md5 CDATA #IMPLIED> <!ATTLIST disk index CDATA #IMPLIED>
<!ATTLIST disk sha1 CDATA #IMPLIED> <!ATTLIST disk writable (yes|no) ""no"">
<!ATTLIST disk merge CDATA #IMPLIED> <!ATTLIST disk status (baddump|nodump|good) ""good"">
<!ATTLIST disk region CDATA #IMPLIED> <!ATTLIST disk optional (yes|no) ""no"">
<!ATTLIST disk index CDATA #IMPLIED> <!ELEMENT device_ref EMPTY>
<!ATTLIST disk writable (yes|no) string.Emptynostring.Empty> <!ATTLIST device_ref name CDATA #REQUIRED>
<!ATTLIST disk status (baddump|nodump|good) string.Emptygoodstring.Empty> <!ELEMENT sample EMPTY>
<!ATTLIST disk optional (yes|no) string.Emptynostring.Empty> <!ATTLIST sample name CDATA #REQUIRED>
<!ELEMENT device_ref EMPTY> <!ELEMENT chip EMPTY>
<!ATTLIST device_ref name CDATA #REQUIRED> <!ATTLIST chip name CDATA #REQUIRED>
<!ELEMENT sample EMPTY> <!ATTLIST chip tag CDATA #IMPLIED>
<!ATTLIST sample name CDATA #REQUIRED> <!ATTLIST chip type (cpu|audio) #REQUIRED>
<!ELEMENT chip EMPTY> <!ATTLIST chip clock CDATA #IMPLIED>
<!ATTLIST chip name CDATA #REQUIRED> <!ELEMENT display EMPTY>
<!ATTLIST chip tag CDATA #IMPLIED> <!ATTLIST display tag CDATA #IMPLIED>
<!ATTLIST chip type (cpu|audio) #REQUIRED> <!ATTLIST display type (raster|vector|lcd|svg|unknown) #REQUIRED>
<!ATTLIST chip clock CDATA #IMPLIED> <!ATTLIST display rotate (0|90|180|270) #IMPLIED>
<!ELEMENT display EMPTY> <!ATTLIST display flipx (yes|no) ""no"">
<!ATTLIST display tag CDATA #IMPLIED> <!ATTLIST display width CDATA #IMPLIED>
<!ATTLIST display type (raster|vector|lcd|svg|unknown) #REQUIRED> <!ATTLIST display height CDATA #IMPLIED>
<!ATTLIST display rotate (0|90|180|270) #IMPLIED> <!ATTLIST display refresh CDATA #REQUIRED>
<!ATTLIST display flipx (yes|no) string.Emptynostring.Empty> <!ATTLIST display pixclock CDATA #IMPLIED>
<!ATTLIST display width CDATA #IMPLIED> <!ATTLIST display htotal CDATA #IMPLIED>
<!ATTLIST display height CDATA #IMPLIED> <!ATTLIST display hbend CDATA #IMPLIED>
<!ATTLIST display refresh CDATA #REQUIRED> <!ATTLIST display hbstart CDATA #IMPLIED>
<!ATTLIST display pixclock CDATA #IMPLIED> <!ATTLIST display vtotal CDATA #IMPLIED>
<!ATTLIST display htotal CDATA #IMPLIED> <!ATTLIST display vbend CDATA #IMPLIED>
<!ATTLIST display hbend CDATA #IMPLIED> <!ATTLIST display vbstart CDATA #IMPLIED>
<!ATTLIST display hbstart CDATA #IMPLIED> <!ELEMENT sound EMPTY>
<!ATTLIST display vtotal CDATA #IMPLIED> <!ATTLIST sound channels CDATA #REQUIRED>
<!ATTLIST display vbend CDATA #IMPLIED> <!ELEMENT condition EMPTY>
<!ATTLIST display vbstart CDATA #IMPLIED> <!ATTLIST condition tag CDATA #REQUIRED>
<!ELEMENT sound EMPTY> <!ATTLIST condition mask CDATA #REQUIRED>
<!ATTLIST sound channels CDATA #REQUIRED> <!ATTLIST condition relation (eq|ne|gt|le|lt|ge) #REQUIRED>
<!ELEMENT condition EMPTY> <!ATTLIST condition value CDATA #REQUIRED>
<!ATTLIST condition tag CDATA #REQUIRED> <!ELEMENT input (control*)>
<!ATTLIST condition mask CDATA #REQUIRED> <!ATTLIST input service (yes|no) ""no"">
<!ATTLIST condition relation (eq|ne|gt|le|lt|ge) #REQUIRED> <!ATTLIST input tilt (yes|no) ""no"">
<!ATTLIST condition value CDATA #REQUIRED> <!ATTLIST input players CDATA #REQUIRED>
<!ELEMENT input (control*)> <!ATTLIST input coins CDATA #IMPLIED>
<!ATTLIST input service (yes|no) string.Emptynostring.Empty> <!ELEMENT control EMPTY>
<!ATTLIST input tilt (yes|no) string.Emptynostring.Empty> <!ATTLIST control type CDATA #REQUIRED>
<!ATTLIST input players CDATA #REQUIRED> <!ATTLIST control player CDATA #IMPLIED>
<!ATTLIST input coins CDATA #IMPLIED> <!ATTLIST control buttons CDATA #IMPLIED>
<!ELEMENT control EMPTY> <!ATTLIST control reqbuttons CDATA #IMPLIED>
<!ATTLIST control type CDATA #REQUIRED> <!ATTLIST control minimum CDATA #IMPLIED>
<!ATTLIST control player CDATA #IMPLIED> <!ATTLIST control maximum CDATA #IMPLIED>
<!ATTLIST control buttons CDATA #IMPLIED> <!ATTLIST control sensitivity CDATA #IMPLIED>
<!ATTLIST control reqbuttons CDATA #IMPLIED> <!ATTLIST control keydelta CDATA #IMPLIED>
<!ATTLIST control minimum CDATA #IMPLIED> <!ATTLIST control reverse (yes|no) ""no"">
<!ATTLIST control maximum CDATA #IMPLIED> <!ATTLIST control ways CDATA #IMPLIED>
<!ATTLIST control sensitivity CDATA #IMPLIED> <!ATTLIST control ways2 CDATA #IMPLIED>
<!ATTLIST control keydelta CDATA #IMPLIED> <!ATTLIST control ways3 CDATA #IMPLIED>
<!ATTLIST control reverse (yes|no) string.Emptynostring.Empty> <!ELEMENT dipswitch (condition?, diplocation*, dipvalue*)>
<!ATTLIST control ways CDATA #IMPLIED> <!ATTLIST dipswitch name CDATA #REQUIRED>
<!ATTLIST control ways2 CDATA #IMPLIED> <!ATTLIST dipswitch tag CDATA #REQUIRED>
<!ATTLIST control ways3 CDATA #IMPLIED> <!ATTLIST dipswitch mask CDATA #REQUIRED>
<!ELEMENT dipswitch (condition?, diplocation*, dipvalue*)> <!ELEMENT diplocation EMPTY>
<!ATTLIST dipswitch name CDATA #REQUIRED> <!ATTLIST diplocation name CDATA #REQUIRED>
<!ATTLIST dipswitch tag CDATA #REQUIRED> <!ATTLIST diplocation number CDATA #REQUIRED>
<!ATTLIST dipswitch mask CDATA #REQUIRED> <!ATTLIST diplocation inverted (yes|no) ""no"">
<!ELEMENT diplocation EMPTY> <!ELEMENT dipvalue (condition?)>
<!ATTLIST diplocation name CDATA #REQUIRED> <!ATTLIST dipvalue name CDATA #REQUIRED>
<!ATTLIST diplocation number CDATA #REQUIRED> <!ATTLIST dipvalue value CDATA #REQUIRED>
<!ATTLIST diplocation inverted (yes|no) string.Emptynostring.Empty> <!ATTLIST dipvalue default (yes|no) ""no"">
<!ELEMENT dipvalue (condition?)> <!ELEMENT configuration (condition?, conflocation*, confsetting*)>
<!ATTLIST dipvalue name CDATA #REQUIRED> <!ATTLIST configuration name CDATA #REQUIRED>
<!ATTLIST dipvalue value CDATA #REQUIRED> <!ATTLIST configuration tag CDATA #REQUIRED>
<!ATTLIST dipvalue default (yes|no) string.Emptynostring.Empty> <!ATTLIST configuration mask CDATA #REQUIRED>
<!ELEMENT configuration (condition?, conflocation*, confsetting*)> <!ELEMENT conflocation EMPTY>
<!ATTLIST configuration name CDATA #REQUIRED> <!ATTLIST conflocation name CDATA #REQUIRED>
<!ATTLIST configuration tag CDATA #REQUIRED> <!ATTLIST conflocation number CDATA #REQUIRED>
<!ATTLIST configuration mask CDATA #REQUIRED> <!ATTLIST conflocation inverted (yes|no) ""no"">
<!ELEMENT conflocation EMPTY> <!ELEMENT confsetting (condition?)>
<!ATTLIST conflocation name CDATA #REQUIRED> <!ATTLIST confsetting name CDATA #REQUIRED>
<!ATTLIST conflocation number CDATA #REQUIRED> <!ATTLIST confsetting value CDATA #REQUIRED>
<!ATTLIST conflocation inverted (yes|no) string.Emptynostring.Empty> <!ATTLIST confsetting default (yes|no) ""no"">
<!ELEMENT confsetting (condition?)> <!ELEMENT port (analog*)>
<!ATTLIST confsetting name CDATA #REQUIRED> <!ATTLIST port tag CDATA #REQUIRED>
<!ATTLIST confsetting value CDATA #REQUIRED> <!ELEMENT analog EMPTY>
<!ATTLIST confsetting default (yes|no) string.Emptynostring.Empty> <!ATTLIST analog mask CDATA #REQUIRED>
<!ELEMENT port (analog*)> <!ELEMENT adjuster (condition?)>
<!ATTLIST port tag CDATA #REQUIRED> <!ATTLIST adjuster name CDATA #REQUIRED>
<!ELEMENT analog EMPTY> <!ATTLIST adjuster default CDATA #REQUIRED>
<!ATTLIST analog mask CDATA #REQUIRED> <!ELEMENT driver EMPTY>
<!ELEMENT adjuster (condition?)> <!ATTLIST driver status (good|imperfect|preliminary) #REQUIRED>
<!ATTLIST adjuster name CDATA #REQUIRED> <!ATTLIST driver emulation (good|imperfect|preliminary) #REQUIRED>
<!ATTLIST adjuster default CDATA #REQUIRED> <!ATTLIST driver cocktail (good|imperfect|preliminary) #IMPLIED>
<!ELEMENT driver EMPTY> <!ATTLIST driver savestate (supported|unsupported) #REQUIRED>
<!ATTLIST driver status (good|imperfect|preliminary) #REQUIRED> <!ATTLIST driver requiresartwork (yes|no) ""no"">
<!ATTLIST driver emulation (good|imperfect|preliminary) #REQUIRED> <!ATTLIST driver unofficial (yes|no) ""no"">
<!ATTLIST driver cocktail (good|imperfect|preliminary) #IMPLIED> <!ATTLIST driver nosoundhardware (yes|no) ""no"">
<!ATTLIST driver savestate (supported|unsupported) #REQUIRED> <!ATTLIST driver incomplete (yes|no) ""no"">
<!ELEMENT feature EMPTY> <!ELEMENT feature EMPTY>
<!ATTLIST feature type (protection|palette|graphics|sound|controls|keyboard|mouse|microphone|camera|disk|printer|lan|wan|timing) #REQUIRED> <!ATTLIST feature type (protection|timing|graphics|palette|sound|capture|camera|microphone|controls|keyboard|mouse|media|disk|printer|tape|punch|drum|rom|comms|lan|wan) #REQUIRED>
<!ATTLIST feature status (unemulated|imperfect) #IMPLIED> <!ATTLIST feature status (unemulated|imperfect) #IMPLIED>
<!ATTLIST feature overall (unemulated|imperfect) #IMPLIED> <!ATTLIST feature overall (unemulated|imperfect) #IMPLIED>
<!ELEMENT device (instance?, extension*)> <!ELEMENT device (instance?, extension*)>
<!ATTLIST device type CDATA #REQUIRED> <!ATTLIST device type CDATA #REQUIRED>
<!ATTLIST device tag CDATA #IMPLIED> <!ATTLIST device tag CDATA #IMPLIED>
<!ATTLIST device fixed_image CDATA #IMPLIED> <!ATTLIST device fixed_image CDATA #IMPLIED>
<!ATTLIST device mandatory CDATA #IMPLIED> <!ATTLIST device mandatory CDATA #IMPLIED>
<!ATTLIST device interface CDATA #IMPLIED> <!ATTLIST device interface CDATA #IMPLIED>
<!ELEMENT instance EMPTY> <!ELEMENT instance EMPTY>
<!ATTLIST instance name CDATA #REQUIRED> <!ATTLIST instance name CDATA #REQUIRED>
<!ATTLIST instance briefname CDATA #REQUIRED> <!ATTLIST instance briefname CDATA #REQUIRED>
<!ELEMENT extension EMPTY> <!ELEMENT extension EMPTY>
<!ATTLIST extension name CDATA #REQUIRED> <!ATTLIST extension name CDATA #REQUIRED>
<!ELEMENT slot (slotoption*)> <!ELEMENT slot (slotoption*)>
<!ATTLIST slot name CDATA #REQUIRED> <!ATTLIST slot name CDATA #REQUIRED>
<!ELEMENT slotoption EMPTY> <!ELEMENT slotoption EMPTY>
<!ATTLIST slotoption name CDATA #REQUIRED> <!ATTLIST slotoption name CDATA #REQUIRED>
<!ATTLIST slotoption devname CDATA #REQUIRED> <!ATTLIST slotoption devname CDATA #REQUIRED>
<!ATTLIST slotoption default (yes|no) string.Emptynostring.Empty> <!ATTLIST slotoption default (yes|no) ""no"">
<!ELEMENT softwarelist EMPTY> <!ELEMENT softwarelist EMPTY>
<!ATTLIST softwarelist name CDATA #REQUIRED> <!ATTLIST softwarelist tag CDATA #REQUIRED>
<!ATTLIST softwarelist status (original|compatible) #REQUIRED> <!ATTLIST softwarelist name CDATA #REQUIRED>
<!ATTLIST softwarelist filter CDATA #IMPLIED> <!ATTLIST softwarelist status (original|compatible) #REQUIRED>
<!ELEMENT ramoption (#PCDATA)> <!ATTLIST softwarelist filter CDATA #IMPLIED>
<!ATTLIST ramoption default CDATA #IMPLIED> <!ELEMENT ramoption (#PCDATA)>
<!ATTLIST ramoption name CDATA #REQUIRED>
<!ATTLIST ramoption default CDATA #IMPLIED>
]>
"; ";
/// <summary> /// <summary>
@@ -1506,16 +1509,16 @@ namespace SabreTools.DatFiles.Formats
var adjuster = datItem as Adjuster; var adjuster = datItem as Adjuster;
xtw.WriteStartElement("adjuster"); xtw.WriteStartElement("adjuster");
xtw.WriteRequiredAttributeString("name", adjuster.Name); xtw.WriteRequiredAttributeString("name", adjuster.Name);
xtw.WriteOptionalAttributeString("default", adjuster.Default.FromYesNo()); xtw.WriteRequiredAttributeString("default", adjuster.Default.FromYesNo());
if (adjuster.ConditionsSpecified) if (adjuster.ConditionsSpecified)
{ {
foreach (var adjusterCondition in adjuster.Conditions) foreach (var adjusterCondition in adjuster.Conditions)
{ {
xtw.WriteStartElement("condition"); xtw.WriteStartElement("condition");
xtw.WriteOptionalAttributeString("tag", adjusterCondition.Tag); xtw.WriteRequiredAttributeString("tag", adjusterCondition.Tag);
xtw.WriteOptionalAttributeString("mask", adjusterCondition.Mask); xtw.WriteRequiredAttributeString("mask", adjusterCondition.Mask);
xtw.WriteOptionalAttributeString("relation", adjusterCondition.Relation.FromRelation()); xtw.WriteRequiredAttributeString("relation", adjusterCondition.Relation.FromRelation());
xtw.WriteOptionalAttributeString("value", adjusterCondition.Value); xtw.WriteRequiredAttributeString("value", adjusterCondition.Value);
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
} }
@@ -1526,7 +1529,7 @@ namespace SabreTools.DatFiles.Formats
var biosSet = datItem as BiosSet; var biosSet = datItem as BiosSet;
xtw.WriteStartElement("biosset"); xtw.WriteStartElement("biosset");
xtw.WriteRequiredAttributeString("name", biosSet.Name); xtw.WriteRequiredAttributeString("name", biosSet.Name);
xtw.WriteOptionalAttributeString("description", biosSet.Description); xtw.WriteRequiredAttributeString("description", biosSet.Description);
xtw.WriteOptionalAttributeString("default", biosSet.Default?.ToString().ToLowerInvariant()); xtw.WriteOptionalAttributeString("default", biosSet.Default?.ToString().ToLowerInvariant());
xtw.WriteEndElement(); xtw.WriteEndElement();
break; break;
@@ -1536,7 +1539,7 @@ namespace SabreTools.DatFiles.Formats
xtw.WriteStartElement("chip"); xtw.WriteStartElement("chip");
xtw.WriteRequiredAttributeString("name", chip.Name); xtw.WriteRequiredAttributeString("name", chip.Name);
xtw.WriteOptionalAttributeString("tag", chip.Tag); xtw.WriteOptionalAttributeString("tag", chip.Tag);
xtw.WriteOptionalAttributeString("type", chip.ChipType.FromChipType()); xtw.WriteRequiredAttributeString("type", chip.ChipType.FromChipType());
xtw.WriteOptionalAttributeString("clock", chip.Clock?.ToString()); xtw.WriteOptionalAttributeString("clock", chip.Clock?.ToString());
xtw.WriteEndElement(); xtw.WriteEndElement();
break; break;
@@ -1544,29 +1547,29 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Condition: case ItemType.Condition:
var condition = datItem as Condition; var condition = datItem as Condition;
xtw.WriteStartElement("condition"); xtw.WriteStartElement("condition");
xtw.WriteOptionalAttributeString("tag", condition.Tag); xtw.WriteRequiredAttributeString("tag", condition.Tag);
xtw.WriteOptionalAttributeString("mask", condition.Mask); xtw.WriteRequiredAttributeString("mask", condition.Mask);
xtw.WriteOptionalAttributeString("relation", condition.Relation.FromRelation()); xtw.WriteRequiredAttributeString("relation", condition.Relation.FromRelation());
xtw.WriteOptionalAttributeString("value", condition.Value); xtw.WriteRequiredAttributeString("value", condition.Value);
xtw.WriteEndElement(); xtw.WriteEndElement();
break; break;
case ItemType.Configuration: case ItemType.Configuration:
var configuration = datItem as Configuration; var configuration = datItem as Configuration;
xtw.WriteStartElement("configuration"); xtw.WriteStartElement("configuration");
xtw.WriteOptionalAttributeString("name", configuration.Name); xtw.WriteRequiredAttributeString("name", configuration.Name);
xtw.WriteOptionalAttributeString("tag", configuration.Tag); xtw.WriteRequiredAttributeString("tag", configuration.Tag);
xtw.WriteOptionalAttributeString("mask", configuration.Mask); xtw.WriteRequiredAttributeString("mask", configuration.Mask);
if (configuration.ConditionsSpecified) if (configuration.ConditionsSpecified)
{ {
foreach (var configurationCondition in configuration.Conditions) foreach (var configurationCondition in configuration.Conditions)
{ {
xtw.WriteStartElement("condition"); xtw.WriteStartElement("condition");
xtw.WriteOptionalAttributeString("tag", configurationCondition.Tag); xtw.WriteRequiredAttributeString("tag", configurationCondition.Tag);
xtw.WriteOptionalAttributeString("mask", configurationCondition.Mask); xtw.WriteRequiredAttributeString("mask", configurationCondition.Mask);
xtw.WriteOptionalAttributeString("relation", configurationCondition.Relation.FromRelation()); xtw.WriteRequiredAttributeString("relation", configurationCondition.Relation.FromRelation());
xtw.WriteOptionalAttributeString("value", configurationCondition.Value); xtw.WriteRequiredAttributeString("value", configurationCondition.Value);
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
} }
@@ -1575,8 +1578,8 @@ namespace SabreTools.DatFiles.Formats
foreach (var location in configuration.Locations) foreach (var location in configuration.Locations)
{ {
xtw.WriteStartElement("conflocation"); xtw.WriteStartElement("conflocation");
xtw.WriteOptionalAttributeString("name", location.Name); xtw.WriteRequiredAttributeString("name", location.Name);
xtw.WriteOptionalAttributeString("number", location.Number?.ToString()); xtw.WriteRequiredAttributeString("number", location.Number?.ToString());
xtw.WriteOptionalAttributeString("inverted", location.Inverted.FromYesNo()); xtw.WriteOptionalAttributeString("inverted", location.Inverted.FromYesNo());
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
@@ -1586,8 +1589,8 @@ namespace SabreTools.DatFiles.Formats
foreach (var setting in configuration.Settings) foreach (var setting in configuration.Settings)
{ {
xtw.WriteStartElement("confsetting"); xtw.WriteStartElement("confsetting");
xtw.WriteOptionalAttributeString("name", setting.Name); xtw.WriteRequiredAttributeString("name", setting.Name);
xtw.WriteOptionalAttributeString("value", setting.Value); xtw.WriteRequiredAttributeString("value", setting.Value);
xtw.WriteOptionalAttributeString("default", setting.Default.FromYesNo()); xtw.WriteOptionalAttributeString("default", setting.Default.FromYesNo());
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
@@ -1598,7 +1601,7 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Device: case ItemType.Device:
var device = datItem as Device; var device = datItem as Device;
xtw.WriteStartElement("device"); xtw.WriteStartElement("device");
xtw.WriteOptionalAttributeString("type", device.DeviceType.FromDeviceType()); xtw.WriteRequiredAttributeString("type", device.DeviceType.FromDeviceType());
xtw.WriteOptionalAttributeString("tag", device.Tag); xtw.WriteOptionalAttributeString("tag", device.Tag);
xtw.WriteOptionalAttributeString("fixed_image", device.FixedImage); xtw.WriteOptionalAttributeString("fixed_image", device.FixedImage);
xtw.WriteOptionalAttributeString("mandatory", device.Mandatory?.ToString()); xtw.WriteOptionalAttributeString("mandatory", device.Mandatory?.ToString());
@@ -1608,8 +1611,8 @@ namespace SabreTools.DatFiles.Formats
foreach (var instance in device.Instances) foreach (var instance in device.Instances)
{ {
xtw.WriteStartElement("instance"); xtw.WriteStartElement("instance");
xtw.WriteOptionalAttributeString("name", instance.Name); xtw.WriteRequiredAttributeString("name", instance.Name);
xtw.WriteOptionalAttributeString("briefname", instance.BriefName); xtw.WriteRequiredAttributeString("briefname", instance.BriefName);
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
} }
@@ -1618,7 +1621,7 @@ namespace SabreTools.DatFiles.Formats
foreach (var extension in device.Extensions) foreach (var extension in device.Extensions)
{ {
xtw.WriteStartElement("extension"); xtw.WriteStartElement("extension");
xtw.WriteOptionalAttributeString("name", extension.Name); xtw.WriteRequiredAttributeString("name", extension.Name);
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
} }
@@ -1635,18 +1638,18 @@ namespace SabreTools.DatFiles.Formats
case ItemType.DipSwitch: case ItemType.DipSwitch:
var dipSwitch = datItem as DipSwitch; var dipSwitch = datItem as DipSwitch;
xtw.WriteStartElement("dipswitch"); xtw.WriteStartElement("dipswitch");
xtw.WriteOptionalAttributeString("name", dipSwitch.Name); xtw.WriteRequiredAttributeString("name", dipSwitch.Name);
xtw.WriteOptionalAttributeString("tag", dipSwitch.Tag); xtw.WriteRequiredAttributeString("tag", dipSwitch.Tag);
xtw.WriteOptionalAttributeString("mask", dipSwitch.Mask); xtw.WriteRequiredAttributeString("mask", dipSwitch.Mask);
if (dipSwitch.ConditionsSpecified) if (dipSwitch.ConditionsSpecified)
{ {
foreach (var dipSwitchCondition in dipSwitch.Conditions) foreach (var dipSwitchCondition in dipSwitch.Conditions)
{ {
xtw.WriteStartElement("condition"); xtw.WriteStartElement("condition");
xtw.WriteOptionalAttributeString("tag", dipSwitchCondition.Tag); xtw.WriteRequiredAttributeString("tag", dipSwitchCondition.Tag);
xtw.WriteOptionalAttributeString("mask", dipSwitchCondition.Mask); xtw.WriteRequiredAttributeString("mask", dipSwitchCondition.Mask);
xtw.WriteOptionalAttributeString("relation", dipSwitchCondition.Relation.FromRelation()); xtw.WriteRequiredAttributeString("relation", dipSwitchCondition.Relation.FromRelation());
xtw.WriteOptionalAttributeString("value", dipSwitchCondition.Value); xtw.WriteRequiredAttributeString("value", dipSwitchCondition.Value);
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
} }
@@ -1655,8 +1658,8 @@ namespace SabreTools.DatFiles.Formats
foreach (var location in dipSwitch.Locations) foreach (var location in dipSwitch.Locations)
{ {
xtw.WriteStartElement("diplocation"); xtw.WriteStartElement("diplocation");
xtw.WriteOptionalAttributeString("name", location.Name); xtw.WriteRequiredAttributeString("name", location.Name);
xtw.WriteOptionalAttributeString("number", location.Number?.ToString()); xtw.WriteRequiredAttributeString("number", location.Number?.ToString());
xtw.WriteOptionalAttributeString("inverted", location.Inverted.FromYesNo()); xtw.WriteOptionalAttributeString("inverted", location.Inverted.FromYesNo());
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
@@ -1666,18 +1669,18 @@ namespace SabreTools.DatFiles.Formats
foreach (var value in dipSwitch.Values) foreach (var value in dipSwitch.Values)
{ {
xtw.WriteStartElement("dipvalue"); xtw.WriteStartElement("dipvalue");
xtw.WriteOptionalAttributeString("name", value.Name); xtw.WriteRequiredAttributeString("name", value.Name);
xtw.WriteOptionalAttributeString("value", value.Value); xtw.WriteRequiredAttributeString("value", value.Value);
xtw.WriteOptionalAttributeString("default", value.Default.FromYesNo()); xtw.WriteOptionalAttributeString("default", value.Default.FromYesNo());
if (value.ConditionsSpecified) if (value.ConditionsSpecified)
{ {
foreach (var dipValueCondition in value.Conditions) foreach (var dipValueCondition in value.Conditions)
{ {
xtw.WriteStartElement("condition"); xtw.WriteStartElement("condition");
xtw.WriteOptionalAttributeString("tag", dipValueCondition.Tag); xtw.WriteRequiredAttributeString("tag", dipValueCondition.Tag);
xtw.WriteOptionalAttributeString("mask", dipValueCondition.Mask); xtw.WriteRequiredAttributeString("mask", dipValueCondition.Mask);
xtw.WriteOptionalAttributeString("relation", dipValueCondition.Relation.FromRelation()); xtw.WriteRequiredAttributeString("relation", dipValueCondition.Relation.FromRelation());
xtw.WriteOptionalAttributeString("value", dipValueCondition.Value); xtw.WriteRequiredAttributeString("value", dipValueCondition.Value);
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
} }
@@ -1705,12 +1708,12 @@ namespace SabreTools.DatFiles.Formats
var display = datItem as Display; var display = datItem as Display;
xtw.WriteStartElement("display"); xtw.WriteStartElement("display");
xtw.WriteOptionalAttributeString("tag", display.Tag); 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("rotate", display.Rotate?.ToString());
xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo()); xtw.WriteOptionalAttributeString("flipx", display.FlipX.FromYesNo());
xtw.WriteOptionalAttributeString("width", display.Width?.ToString()); xtw.WriteOptionalAttributeString("width", display.Width?.ToString());
xtw.WriteOptionalAttributeString("height", display.Height?.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("pixclock", display.PixClock?.ToString());
xtw.WriteOptionalAttributeString("htotal", display.HTotal?.ToString()); xtw.WriteOptionalAttributeString("htotal", display.HTotal?.ToString());
xtw.WriteOptionalAttributeString("hbend", display.HBEnd?.ToString()); xtw.WriteOptionalAttributeString("hbend", display.HBEnd?.ToString());
@@ -1724,17 +1727,17 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Driver: case ItemType.Driver:
var driver = datItem as Driver; var driver = datItem as Driver;
xtw.WriteStartElement("driver"); xtw.WriteStartElement("driver");
xtw.WriteOptionalAttributeString("status", driver.Status.FromSupportStatus()); xtw.WriteRequiredAttributeString("status", driver.Status.FromSupportStatus());
xtw.WriteOptionalAttributeString("emulation", driver.Emulation.FromSupportStatus()); xtw.WriteRequiredAttributeString("emulation", driver.Emulation.FromSupportStatus());
xtw.WriteOptionalAttributeString("cocktail", driver.Cocktail.FromSupportStatus()); xtw.WriteOptionalAttributeString("cocktail", driver.Cocktail.FromSupportStatus());
xtw.WriteOptionalAttributeString("savestate", driver.SaveState.FromSupported(true)); xtw.WriteRequiredAttributeString("savestate", driver.SaveState.FromSupported(true));
xtw.WriteEndElement(); xtw.WriteEndElement();
break; break;
case ItemType.Feature: case ItemType.Feature:
var feature = datItem as Feature; var feature = datItem as Feature;
xtw.WriteStartElement("feature"); xtw.WriteStartElement("feature");
xtw.WriteOptionalAttributeString("type", feature.Type.FromFeatureType()); xtw.WriteRequiredAttributeString("type", feature.Type.FromFeatureType());
xtw.WriteOptionalAttributeString("status", feature.Status.FromFeatureStatus()); xtw.WriteOptionalAttributeString("status", feature.Status.FromFeatureStatus());
xtw.WriteOptionalAttributeString("overall", feature.Overall.FromFeatureStatus()); xtw.WriteOptionalAttributeString("overall", feature.Overall.FromFeatureStatus());
xtw.WriteEndElement(); xtw.WriteEndElement();
@@ -1745,14 +1748,14 @@ namespace SabreTools.DatFiles.Formats
xtw.WriteStartElement("input"); xtw.WriteStartElement("input");
xtw.WriteOptionalAttributeString("service", input.Service.FromYesNo()); xtw.WriteOptionalAttributeString("service", input.Service.FromYesNo());
xtw.WriteOptionalAttributeString("tilt", input.Tilt.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()); xtw.WriteOptionalAttributeString("coins", input.Coins?.ToString());
if (input.ControlsSpecified) if (input.ControlsSpecified)
{ {
foreach (var control in input.Controls) foreach (var control in input.Controls)
{ {
xtw.WriteStartElement("control"); xtw.WriteStartElement("control");
xtw.WriteOptionalAttributeString("type", control.ControlType.FromControlType()); xtw.WriteRequiredAttributeString("type", control.ControlType.FromControlType());
xtw.WriteOptionalAttributeString("player", control.Player?.ToString()); xtw.WriteOptionalAttributeString("player", control.Player?.ToString());
xtw.WriteOptionalAttributeString("buttons", control.Buttons?.ToString()); xtw.WriteOptionalAttributeString("buttons", control.Buttons?.ToString());
xtw.WriteOptionalAttributeString("reqbuttons", control.RequiredButtons?.ToString()); xtw.WriteOptionalAttributeString("reqbuttons", control.RequiredButtons?.ToString());
@@ -1773,13 +1776,13 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Port: case ItemType.Port:
var port = datItem as Port; var port = datItem as Port;
xtw.WriteStartElement("port"); xtw.WriteStartElement("port");
xtw.WriteOptionalAttributeString("tag", port.Tag); xtw.WriteRequiredAttributeString("tag", port.Tag);
if (port.AnalogsSpecified) if (port.AnalogsSpecified)
{ {
foreach (var analog in port.Analogs) foreach (var analog in port.Analogs)
{ {
xtw.WriteStartElement("analog"); xtw.WriteStartElement("analog");
xtw.WriteOptionalAttributeString("mask", analog.Mask); xtw.WriteRequiredAttributeString("mask", analog.Mask);
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
} }
@@ -1799,10 +1802,10 @@ namespace SabreTools.DatFiles.Formats
var rom = datItem as Rom; var rom = datItem as Rom;
xtw.WriteStartElement("rom"); xtw.WriteStartElement("rom");
xtw.WriteRequiredAttributeString("name", rom.Name); 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("crc", rom.CRC?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant()); xtw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("bios", rom.Bios);
xtw.WriteOptionalAttributeString("merge", rom.MergeTag); xtw.WriteOptionalAttributeString("merge", rom.MergeTag);
xtw.WriteOptionalAttributeString("region", rom.Region); xtw.WriteOptionalAttributeString("region", rom.Region);
xtw.WriteOptionalAttributeString("offset", rom.Offset); xtw.WriteOptionalAttributeString("offset", rom.Offset);
@@ -1821,14 +1824,14 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Slot: case ItemType.Slot:
var slot = datItem as Slot; var slot = datItem as Slot;
xtw.WriteStartElement("slot"); xtw.WriteStartElement("slot");
xtw.WriteOptionalAttributeString("name", slot.Name); xtw.WriteRequiredAttributeString("name", slot.Name);
if (slot.SlotOptionsSpecified) if (slot.SlotOptionsSpecified)
{ {
foreach (var slotOption in slot.SlotOptions) foreach (var slotOption in slot.SlotOptions)
{ {
xtw.WriteStartElement("slotoption"); xtw.WriteStartElement("slotoption");
xtw.WriteOptionalAttributeString("name", slotOption.Name); xtw.WriteRequiredAttributeString("name", slotOption.Name);
xtw.WriteOptionalAttributeString("devname", slotOption.DeviceName); xtw.WriteRequiredAttributeString("devname", slotOption.DeviceName);
xtw.WriteOptionalAttributeString("default", slotOption.Default.FromYesNo()); xtw.WriteOptionalAttributeString("default", slotOption.Default.FromYesNo());
xtw.WriteEndElement(); xtw.WriteEndElement();
} }
@@ -1840,7 +1843,7 @@ namespace SabreTools.DatFiles.Formats
var softwareList = datItem as DatItems.Formats.SoftwareList; var softwareList = datItem as DatItems.Formats.SoftwareList;
xtw.WriteStartElement("softwarelist"); xtw.WriteStartElement("softwarelist");
xtw.WriteRequiredAttributeString("name", softwareList.Name); xtw.WriteRequiredAttributeString("name", softwareList.Name);
xtw.WriteOptionalAttributeString("status", softwareList.Status.FromSoftwareListStatus()); xtw.WriteRequiredAttributeString("status", softwareList.Status.FromSoftwareListStatus());
xtw.WriteOptionalAttributeString("filter", softwareList.Filter); xtw.WriteOptionalAttributeString("filter", softwareList.Filter);
xtw.WriteEndElement(); xtw.WriteEndElement();
break; break;
@@ -1848,7 +1851,7 @@ namespace SabreTools.DatFiles.Formats
case ItemType.Sound: case ItemType.Sound:
var sound = datItem as Sound; var sound = datItem as Sound;
xtw.WriteStartElement("sound"); xtw.WriteStartElement("sound");
xtw.WriteOptionalAttributeString("channels", sound.Channels?.ToString()); xtw.WriteRequiredAttributeString("channels", sound.Channels?.ToString());
xtw.WriteEndElement(); xtw.WriteEndElement();
break; break;
} }