OpenMSX has changed a bit

This commit is contained in:
Matt Nadareski
2026-09-18 10:15:54 -04:00
parent 3798dbcb47
commit d9bf16deef
16 changed files with 210 additions and 47 deletions

View File

@@ -192,6 +192,9 @@ namespace SabreTools.Data.Models.Metadata
/// <remarks>(baddump|nodump|good|verified) "good"</remarks>
public ItemStatus? Status { get; set; }
/// <remarks>Possibly enum; OpenMSX.RomBase</remarks>
public string? StatusMisc { get; set; }
/// <remarks>ArchiveDotOrg.File</remarks>
public string? Summation { get; set; }
@@ -353,6 +356,7 @@ namespace SabreTools.Data.Models.Metadata
obj.SpamSum = SpamSum;
obj.Start = Start;
obj.Status = Status;
obj.StatusMisc = StatusMisc;
obj.Summation = Summation;
obj.TesseractOCR = TesseractOCR;
obj.TesseractOCRConverted = TesseractOCRConverted;

View File

@@ -8,17 +8,29 @@ namespace SabreTools.Data.Models.OpenMSX
/// </summary>
public abstract class RomBase
{
[XmlElement("start")]
public string? Start { get; set; }
/// <remarks>
/// "hash" in older versions, "sha1" in newer versions
/// </remarks>
[XmlElement("hash")]
[XmlElement("sha1")]
public string? SHA1 { get; set; }
[XmlElement("type")]
public string? Type { get; set; }
/// <remarks>SHA-1 hash</remarks>
[XmlElement("hash")]
public string? Hash { get; set; }
/// <remarks>
/// Only present in newer versions
/// </remarks>
[XmlElement("status")]
public string? Status { get; set; }
[XmlElement("remark")]
public string? Remark { get; set; }
/// <remarks>
/// Only present in older versions
/// </remarks>
[XmlElement("start")]
public string? Start { get; set; }
}
}

View File

@@ -6,30 +6,63 @@ namespace SabreTools.Data.Models.OpenMSX
[XmlRoot("software")]
public class Software
{
/// <remarks>
/// Element in older versions and DTD, attribute in newer versions
/// </remarks>
[Required]
[XmlAttribute("title")]
[XmlElement("title")]
public string? Title { get; set; }
[XmlElement("genmsxid")]
public string? GenMSXID { get; set; }
/// <remarks>
/// Element in older versions and DTD, attribute in newer versions
/// </remarks>
[Required]
[XmlAttribute("system")]
[XmlElement("system")]
public string? System { get; set; }
/// <remarks>
/// Element in older versions and DTD, attribute in newer versions
/// </remarks>
[Required]
[XmlAttribute("company")]
[XmlElement("company")]
public string? Company { get; set; }
/// <remarks>
/// Element in older versions and DTD, attribute in newer versions
/// </remarks>
[Required]
[XmlAttribute("year")]
[XmlElement("year")]
public string? Year { get; set; }
/// <remarks>
/// Element in older versions and DTD, attribute in newer versions
/// </remarks>
[Required]
[XmlAttribute("country")]
[XmlElement("country")]
public string? Country { get; set; }
/// <remarks>
/// Element in older versions and DTD, attribute in newer versions
/// </remarks>
[XmlAttribute("genmsxid")]
[XmlElement("genmsxid")]
public string? GenMSXID { get; set; }
/// <remarks>
/// Present in older versions
/// </remarks>
[XmlElement("dump")]
public Dump[]? Dump { get; set; }
/// <remarks>
/// Present in newer versions
/// </remarks>
[XmlElement("rom")]
public RomBase[]? Rom { get; set; }
}
}

View File

@@ -839,6 +839,7 @@ namespace SabreTools.Metadata.DatFiles.Test
SpamSum = HashType.SpamSum.ZeroString,
Start = "start",
Status = Data.Models.Metadata.ItemStatus.Good,
StatusMisc = "status",
Summation = "summation",
TesseractOCR = "ocr",
TesseractOCRConverted = "ocr_converted",
@@ -1516,6 +1517,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal(HashType.SpamSum.ZeroString, rom.SpamSum);
Assert.Equal("start", rom.Start);
Assert.Equal(Data.Models.Metadata.ItemStatus.Good, rom.Status);
Assert.Equal("status", rom.StatusMisc);
Assert.Equal("summation", rom.Summation);
Assert.Equal("ocr", rom.TesseractOCR);
Assert.Equal("ocr_converted", rom.TesseractOCRConverted);

View File

@@ -1066,6 +1066,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal(HashType.SpamSum.ZeroString, rom.SpamSum);
Assert.Equal("start", rom.Start);
Assert.Equal(Data.Models.Metadata.ItemStatus.Good, rom.Status);
Assert.Equal("status", rom.StatusMisc);
Assert.Equal("summation", rom.Summation);
Assert.Equal("ocr", rom.TesseractOCR);
Assert.Equal("ocr_converted", rom.TesseractOCRConverted);

View File

@@ -29,17 +29,22 @@ namespace SabreTools.Metadata.DatFiles.Formats
<![CDATA[
The softwaredb.xml file contains information about rom mapper types
- Copyright 2003 Nicolas Beyaert (Initial Database)
- Copyright 2004-2013 BlueMSX Team
- Copyright 2005-2023 openMSX Team
- Generation MSXIDs by www.generation-msx.nl
Copyright 2003 Nicolas Beyaert (Initial Database)
Copyright 2004-2013 BlueMSX Team
Copyright 2005-2026 openMSX Team
- Thanks go out to:
- - Generation MSX/Sylvester for the incredible source of information
- p_gimeno and diedel for their help adding and valdiating ROM additions
Generation MSXIDs by www.generation-msx.nl
Thanks go out to:
- Generation MSX / Sylvester for the incredible source of information
- p_gimeno and diedel for their help adding and validating ROM additions
- GDX for additional ROM info and validations and corrections
- TFH / Filehunter for his sharing of information
- MP83 for deep dives into software and corrections
- bsittler for preservation and sharing of information
Important: This file is auto generated using a database.
The Database is located at https://romdb.vampier.net/
]]>";
#endregion

View File

@@ -442,6 +442,12 @@ namespace SabreTools.Metadata.DatItems.Formats
set => _internal.Status = value;
}
public string? StatusMisc
{
get => _internal.StatusMisc;
set => _internal.StatusMisc = value;
}
public string? Summation
{
get => _internal.Summation;

View File

@@ -1661,6 +1661,7 @@ namespace SabreTools.Metadata.Filter.Test
[InlineData("rom.spamsum", "3::")]
[InlineData("rom.start", "start")]
[InlineData("rom.status", "good")]
[InlineData("rom.status_misc", "status")]
[InlineData("rom.summation", "summation")]
[InlineData("rom.ocr", "ocr")]
[InlineData("rom.tesseractocr", "ocr")]
@@ -1785,6 +1786,7 @@ namespace SabreTools.Metadata.Filter.Test
SpamSum = HashType.SpamSum.ZeroString,
Start = "start",
Status = ItemStatus.Good,
StatusMisc = "status",
Summation = "summation",
TesseractOCR = "ocr",
TesseractOCRConverted = "ocr_converted",

View File

@@ -625,6 +625,7 @@ namespace SabreTools.Metadata.Filter
"spamsum",
"start",
"status",
"status_misc",
"summation",
"tesseractocr",
"tesseractocrconverted",

View File

@@ -2099,6 +2099,9 @@ namespace SabreTools.Metadata.Filter
case "status":
checkValue = obj.Status?.AsStringValue();
return true;
case "status_misc":
checkValue = obj.StatusMisc;
return true;
case "summation":
checkValue = obj.Summation;
return true;

View File

@@ -40,11 +40,19 @@ namespace SabreTools.Serialization.CrossModel.Test
Content = "content",
};
var standalone_rom = new Data.Models.OpenMSX.Rom
{
SHA1 = "sha1",
Type = "type",
Status = "status",
Remark = "remark",
};
var rom = new Data.Models.OpenMSX.Rom
{
Start = "start",
Type = "type",
Hash = "hash",
SHA1 = "hash",
Remark = "remark",
};
@@ -59,7 +67,7 @@ namespace SabreTools.Serialization.CrossModel.Test
{
Start = "start",
Type = "type",
Hash = "hash",
SHA1 = "hash",
Remark = "remark",
};
@@ -74,7 +82,7 @@ namespace SabreTools.Serialization.CrossModel.Test
{
Start = "start",
Type = "type",
Hash = "hash",
SHA1 = "hash",
Remark = "remark",
};
@@ -94,6 +102,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Year = "year",
Country = "country",
Dump = [dump_rom, dump_megarom, dump_sccpluscart],
Rom = [standalone_rom],
};
return new Data.Models.OpenMSX.SoftwareDb
@@ -122,6 +131,10 @@ namespace SabreTools.Serialization.CrossModel.Test
{
Validate(dump);
}
Assert.NotNull(software.Rom);
var rom = Assert.Single(software.Rom);
ValidateStandalone(rom);
}
/// <summary>
@@ -154,7 +167,19 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.NotNull(rombase);
Assert.Equal("start", rombase.Start);
Assert.Equal("type", rombase.Type);
Assert.Equal("hash", rombase.Hash);
Assert.Equal("hash", rombase.SHA1);
Assert.Equal("remark", rombase.Remark);
}
/// <summary>
/// Validate a RomBase
/// </summary>
private static void ValidateStandalone(Data.Models.OpenMSX.RomBase? rombase)
{
Assert.NotNull(rombase);
Assert.Equal("sha1", rombase.SHA1);
Assert.Equal("type", rombase.Type);
Assert.Equal("status", rombase.Status);
Assert.Equal("remark", rombase.Remark);
}
}

View File

@@ -41,17 +41,21 @@ namespace SabreTools.Serialization.CrossModel
var game = new Software
{
Title = item.Name,
GenMSXID = item.GenMSXID,
System = item.System,
Company = item.Company,
Year = item.Year,
Country = item.Country,
GenMSXID = item.GenMSXID,
};
var dumps = item.Dump;
if (dumps is not null && dumps.Length > 0)
game.Dump = Array.ConvertAll(dumps, ConvertFromInternalModel);
var roms = item.Rom;
if (roms is not null && roms.Length > 0)
game.Rom = Array.ConvertAll(roms, ConvertRomFromInternalModel);
return game;
}
@@ -90,10 +94,11 @@ namespace SabreTools.Serialization.CrossModel
{
var megaRom = new MegaRom
{
Start = item.Start,
SHA1 = item.SHA1,
Type = item.OpenMSXType,
Hash = item.SHA1,
Status = item.StatusMisc,
Remark = item.Remark,
Start = item.Start,
};
return megaRom;
}
@@ -118,10 +123,11 @@ namespace SabreTools.Serialization.CrossModel
{
var rom = new Rom
{
Start = item.Start,
SHA1 = item.SHA1,
Type = item.OpenMSXType,
Hash = item.SHA1,
Status = item.StatusMisc,
Remark = item.Remark,
Start = item.Start,
};
return rom;
}
@@ -133,10 +139,11 @@ namespace SabreTools.Serialization.CrossModel
{
var sccPlusCart = new SCCPlusCart
{
Start = item.Start,
SHA1 = item.SHA1,
Type = item.OpenMSXType,
Hash = item.SHA1,
Status = item.StatusMisc,
Remark = item.Remark,
Start = item.Start,
};
return sccPlusCart;
}

View File

@@ -52,6 +52,9 @@ namespace SabreTools.Serialization.CrossModel
if (item.Dump is not null && item.Dump.Length > 0)
machine.Dump = Array.ConvertAll(item.Dump, ConvertToInternalModel);
if (item.Rom is not null && item.Rom.Length > 0)
machine.Rom = Array.ConvertAll(item.Rom, ConvertToInternalModel);
return machine;
}
@@ -112,10 +115,11 @@ namespace SabreTools.Serialization.CrossModel
{
var rom = new Data.Models.Metadata.Rom
{
Start = item.Start,
SHA1 = item.SHA1,
OpenMSXType = item.Type,
SHA1 = item.Hash,
StatusMisc = item.Status,
Remark = item.Remark,
Start = item.Start,
};
return rom;
}

View File

@@ -106,11 +106,19 @@ namespace SabreTools.Serialization.Readers.Test
Content = "content",
};
var standalone_rom = new Data.Models.OpenMSX.Rom
{
SHA1 = "sha1",
Type = "type",
Status = "status",
Remark = "remark",
};
var rom = new Data.Models.OpenMSX.Rom
{
Start = "start",
Type = "type",
Hash = "hash",
SHA1 = "hash",
Remark = "remark",
};
@@ -125,7 +133,7 @@ namespace SabreTools.Serialization.Readers.Test
{
Start = "start",
Type = "type",
Hash = "hash",
SHA1 = "hash",
Remark = "remark",
};
@@ -140,7 +148,7 @@ namespace SabreTools.Serialization.Readers.Test
{
Start = "start",
Type = "type",
Hash = "hash",
SHA1 = "hash",
Remark = "remark",
};
@@ -160,6 +168,7 @@ namespace SabreTools.Serialization.Readers.Test
Year = "year",
Country = "country",
Dump = [dump_rom, dump_megarom, dump_sccpluscart],
Rom = [standalone_rom],
};
return new Data.Models.OpenMSX.SoftwareDb
@@ -188,6 +197,10 @@ namespace SabreTools.Serialization.Readers.Test
{
Validate(dump);
}
Assert.NotNull(software.Rom);
var rom = Assert.Single(software.Rom);
ValidateStandalone(rom);
}
/// <summary>
@@ -220,7 +233,19 @@ namespace SabreTools.Serialization.Readers.Test
Assert.NotNull(rombase);
Assert.Equal("start", rombase.Start);
Assert.Equal("type", rombase.Type);
Assert.Equal("hash", rombase.Hash);
Assert.Equal("hash", rombase.SHA1);
Assert.Equal("remark", rombase.Remark);
}
/// <summary>
/// Validate a RomBase
/// </summary>
private static void ValidateStandalone(Data.Models.OpenMSX.RomBase? rombase)
{
Assert.NotNull(rombase);
Assert.Equal("sha1", rombase.SHA1);
Assert.Equal("type", rombase.Type);
Assert.Equal("status", rombase.Status);
Assert.Equal("remark", rombase.Remark);
}
}

View File

@@ -253,11 +253,12 @@ namespace SabreTools.Serialization.Readers
switch (reader.Name)
{
case "start":
if (obj.Start is not null && Debug)
case "hash":
case "sha1":
if (obj.SHA1 is not null && Debug)
Console.WriteLine($"'{reader.Name}' element already found, overwriting");
obj.Start = reader.ReadElementContentAsString();
obj.SHA1 = reader.ReadElementContentAsString();
break;
case "type":
if (obj.Type is not null && Debug)
@@ -265,11 +266,11 @@ namespace SabreTools.Serialization.Readers
obj.Type = reader.ReadElementContentAsString();
break;
case "hash":
if (obj.Hash is not null && Debug)
case "status":
if (obj.Status is not null && Debug)
Console.WriteLine($"'{reader.Name}' element already found, overwriting");
obj.Hash = reader.ReadElementContentAsString();
obj.Status = reader.ReadElementContentAsString();
break;
case "remark":
if (obj.Remark is not null && Debug)
@@ -277,6 +278,12 @@ namespace SabreTools.Serialization.Readers
obj.Remark = reader.ReadElementContentAsString();
break;
case "start":
if (obj.Start is not null && Debug)
Console.WriteLine($"'{reader.Name}' element already found, overwriting");
obj.Start = reader.ReadElementContentAsString();
break;
default:
if (Debug) Console.Error.WriteLine($"Element '{reader.Name}' is not recognized");
@@ -297,11 +304,19 @@ namespace SabreTools.Serialization.Readers
{
var obj = new Software();
obj.Title = reader.GetAttribute("title");
obj.System = reader.GetAttribute("system");
obj.Company = reader.GetAttribute("company");
obj.Year = reader.GetAttribute("year");
obj.Country = reader.GetAttribute("country");
obj.GenMSXID = reader.GetAttribute("genmsxid");
// Handle empty elements
if (reader.IsEmptyElement)
return obj;
List<Dump> dumps = [];
List<RomBase> roms = [];
reader.Read();
while (!reader.EOF)
@@ -369,6 +384,13 @@ namespace SabreTools.Serialization.Readers
reader.Skip();
break;
case "rom":
var rom = ParseRomBase(reader);
if (rom is not null)
roms.Add(rom);
reader.Skip();
break;
default:
if (Debug) Console.Error.WriteLine($"Element '{reader.Name}' is not recognized");
@@ -379,6 +401,8 @@ namespace SabreTools.Serialization.Readers
if (dumps.Count > 0)
obj.Dump = [.. dumps];
if (roms.Count > 0)
obj.Rom = [.. roms];
return obj;
}

View File

@@ -141,10 +141,11 @@ namespace SabreTools.Serialization.Writers
else
return;
writer.WriteOptionalElementString("start", obj.Start);
writer.WriteOptionalElementString("sha1", obj.SHA1);
writer.WriteOptionalElementString("type", obj.Type);
writer.WriteOptionalElementString("hash", obj.Hash);
writer.WriteOptionalElementString("status", obj.Status);
writer.WriteOptionalElementString("remark", obj.Remark);
writer.WriteOptionalElementString("start", obj.Start);
writer.WriteEndElement();
}
@@ -158,12 +159,12 @@ namespace SabreTools.Serialization.Writers
{
writer.WriteStartElement("software");
writer.WriteRequiredElementString("title", obj.Title);
writer.WriteOptionalElementString("genmsxid", obj.GenMSXID);
writer.WriteRequiredElementString("system", obj.System);
writer.WriteRequiredElementString("company", obj.Company);
writer.WriteRequiredElementString("year", obj.Year);
writer.WriteRequiredElementString("country", obj.Country);
writer.WriteRequiredAttributeString("title", obj.Title);
writer.WriteRequiredAttributeString("system", obj.System);
writer.WriteRequiredAttributeString("company", obj.Company);
writer.WriteRequiredAttributeString("country", obj.Country);
writer.WriteRequiredAttributeString("year", obj.Year);
writer.WriteOptionalAttributeString("genmsxid", obj.GenMSXID);
if (obj.Dump is not null && obj.Dump.Length > 0)
{
@@ -173,6 +174,14 @@ namespace SabreTools.Serialization.Writers
}
}
if (obj.Rom is not null && obj.Rom.Length > 0)
{
foreach (var rom in obj.Rom)
{
WriteRomBase(rom, writer);
}
}
writer.WriteEndElement();
}
}