diff --git a/InfoPrint/Features/MainFeature.cs b/InfoPrint/Features/MainFeature.cs
index 57fb3fc7..4c1bf7d2 100644
--- a/InfoPrint/Features/MainFeature.cs
+++ b/InfoPrint/Features/MainFeature.cs
@@ -247,6 +247,8 @@ namespace InfoPrint.Features
builder.AppendLine($"CRC-16 checksum: {crc16}");
if (hashes.TryGetValue(HashType.CRC32, out string? crc32) && crc32 != null)
builder.AppendLine($"CRC-32 checksum: {crc32}");
+ if (hashes.TryGetValue(HashType.CRC64, out string? crc64) && crc64 != null)
+ builder.AppendLine($"CRC-64 checksum: {crc64}");
if (hashes.TryGetValue(HashType.MD2, out string? md2) && md2 != null)
builder.AppendLine($"MD2 hash: {md2}");
if (hashes.TryGetValue(HashType.MD4, out string? md4) && md4 != null)
diff --git a/SabreTools.Serialization.Test/CrossModel/ClrMameProTests.cs b/SabreTools.Serialization.Test/CrossModel/ClrMameProTests.cs
index eeca3343..e8584656 100644
--- a/SabreTools.Serialization.Test/CrossModel/ClrMameProTests.cs
+++ b/SabreTools.Serialization.Test/CrossModel/ClrMameProTests.cs
@@ -97,7 +97,9 @@ namespace SabreTools.Serialization.Test.CrossModel
{
Name = "XXXXXX",
Size = "XXXXXX",
+ CRC16 = "XXXXXX",
CRC = "XXXXXX",
+ CRC64 = "XXXXXX",
MD2 = "XXXXXX",
MD4 = "XXXXXX",
MD5 = "XXXXXX",
@@ -350,7 +352,9 @@ namespace SabreTools.Serialization.Test.CrossModel
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
+ Assert.Equal("XXXXXX", rom.CRC16);
Assert.Equal("XXXXXX", rom.CRC);
+ Assert.Equal("XXXXXX", rom.CRC64);
Assert.Equal("XXXXXX", rom.MD2);
Assert.Equal("XXXXXX", rom.MD4);
Assert.Equal("XXXXXX", rom.MD5);
diff --git a/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs b/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs
index 22b35e17..dda71bc9 100644
--- a/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs
+++ b/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs
@@ -150,7 +150,9 @@ namespace SabreTools.Serialization.Test.CrossModel
{
Name = "XXXXXX",
Size = "XXXXXX",
+ CRC16 = "XXXXXX",
CRC = "XXXXXX",
+ CRC64 = "XXXXXX",
MD2 = "XXXXXX",
MD4 = "XXXXXX",
MD5 = "XXXXXX",
@@ -464,7 +466,9 @@ namespace SabreTools.Serialization.Test.CrossModel
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
+ Assert.Equal("XXXXXX", rom.CRC16);
Assert.Equal("XXXXXX", rom.CRC);
+ Assert.Equal("XXXXXX", rom.CRC64);
Assert.Equal("XXXXXX", rom.MD2);
Assert.Equal("XXXXXX", rom.MD4);
Assert.Equal("XXXXXX", rom.MD5);
diff --git a/SabreTools.Serialization.Test/Readers/ClrMameProTests.cs b/SabreTools.Serialization.Test/Readers/ClrMameProTests.cs
index 44c70898..72888b71 100644
--- a/SabreTools.Serialization.Test/Readers/ClrMameProTests.cs
+++ b/SabreTools.Serialization.Test/Readers/ClrMameProTests.cs
@@ -214,7 +214,9 @@ namespace SabreTools.Serialization.Test.Readers
{
Name = "XXXXXX",
Size = "XXXXXX",
+ CRC16 = "XXXXXX",
CRC = "XXXXXX",
+ CRC64 = "XXXXXX",
MD2 = "XXXXXX",
MD4 = "XXXXXX",
MD5 = "XXXXXX",
@@ -467,7 +469,9 @@ namespace SabreTools.Serialization.Test.Readers
Assert.NotNull(rom);
Assert.Equal("XXXXXX", rom.Name);
Assert.Equal("XXXXXX", rom.Size);
+ Assert.Equal("XXXXXX", rom.CRC16);
Assert.Equal("XXXXXX", rom.CRC);
+ Assert.Equal("XXXXXX", rom.CRC64);
Assert.Equal("XXXXXX", rom.MD2);
Assert.Equal("XXXXXX", rom.MD4);
Assert.Equal("XXXXXX", rom.MD5);
diff --git a/SabreTools.Serialization.Test/Readers/LogiqxTests.cs b/SabreTools.Serialization.Test/Readers/LogiqxTests.cs
index 5b1e09b6..ebdcccaa 100644
--- a/SabreTools.Serialization.Test/Readers/LogiqxTests.cs
+++ b/SabreTools.Serialization.Test/Readers/LogiqxTests.cs
@@ -215,7 +215,9 @@ namespace SabreTools.Serialization.Test.Readers
{
Name = "XXXXXX",
Size = "XXXXXX",
+ CRC16 = "XXXXXX",
CRC = "XXXXXX",
+ CRC64 = "XXXXXX",
MD2 = "XXXXXX",
MD4 = "XXXXXX",
MD5 = "XXXXXX",
diff --git a/SabreTools.Serialization/CrossModel/ClrMamePro.Deserializer.cs b/SabreTools.Serialization/CrossModel/ClrMamePro.Deserializer.cs
index c9d1cb12..da352bd7 100644
--- a/SabreTools.Serialization/CrossModel/ClrMamePro.Deserializer.cs
+++ b/SabreTools.Serialization/CrossModel/ClrMamePro.Deserializer.cs
@@ -274,7 +274,9 @@ namespace SabreTools.Serialization.CrossModel
{
Name = item.ReadString(Data.Models.Metadata.Rom.NameKey),
Size = item.ReadString(Data.Models.Metadata.Rom.SizeKey),
+ CRC16 = item.ReadString(Data.Models.Metadata.Rom.CRC16Key),
CRC = item.ReadString(Data.Models.Metadata.Rom.CRCKey),
+ CRC64 = item.ReadString(Data.Models.Metadata.Rom.CRC64Key),
MD2 = item.ReadString(Data.Models.Metadata.Rom.MD2Key),
MD4 = item.ReadString(Data.Models.Metadata.Rom.MD4Key),
MD5 = item.ReadString(Data.Models.Metadata.Rom.MD5Key),
diff --git a/SabreTools.Serialization/CrossModel/ClrMamePro.Serializer.cs b/SabreTools.Serialization/CrossModel/ClrMamePro.Serializer.cs
index 24c06ada..73e720f3 100644
--- a/SabreTools.Serialization/CrossModel/ClrMamePro.Serializer.cs
+++ b/SabreTools.Serialization/CrossModel/ClrMamePro.Serializer.cs
@@ -289,7 +289,9 @@ namespace SabreTools.Serialization.CrossModel
{
[Data.Models.Metadata.Rom.NameKey] = item.Name,
[Data.Models.Metadata.Rom.SizeKey] = item.Size,
+ [Data.Models.Metadata.Rom.CRC16Key] = item.CRC16,
[Data.Models.Metadata.Rom.CRCKey] = item.CRC,
+ [Data.Models.Metadata.Rom.CRC64Key] = item.CRC64,
[Data.Models.Metadata.Rom.MD2Key] = item.MD2,
[Data.Models.Metadata.Rom.MD4Key] = item.MD4,
[Data.Models.Metadata.Rom.MD5Key] = item.MD5,
diff --git a/SabreTools.Serialization/CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization/CrossModel/Logiqx.Deserializer.cs
index caa7c7ee..b4f47278 100644
--- a/SabreTools.Serialization/CrossModel/Logiqx.Deserializer.cs
+++ b/SabreTools.Serialization/CrossModel/Logiqx.Deserializer.cs
@@ -301,7 +301,9 @@ namespace SabreTools.Serialization.CrossModel
{
Name = item.ReadString(Data.Models.Metadata.Rom.NameKey),
Size = item.ReadString(Data.Models.Metadata.Rom.SizeKey),
+ CRC16 = item.ReadString(Data.Models.Metadata.Rom.CRC16Key),
CRC = item.ReadString(Data.Models.Metadata.Rom.CRCKey),
+ CRC64 = item.ReadString(Data.Models.Metadata.Rom.CRC64Key),
MD2 = item.ReadString(Data.Models.Metadata.Rom.MD2Key),
MD4 = item.ReadString(Data.Models.Metadata.Rom.MD4Key),
MD5 = item.ReadString(Data.Models.Metadata.Rom.MD5Key),
diff --git a/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs
index 79c07f09..1d429938 100644
--- a/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs
+++ b/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs
@@ -296,7 +296,9 @@ namespace SabreTools.Serialization.CrossModel
{
[Data.Models.Metadata.Rom.NameKey] = item.Name,
[Data.Models.Metadata.Rom.SizeKey] = item.Size,
+ [Data.Models.Metadata.Rom.CRC16Key] = item.CRC16,
[Data.Models.Metadata.Rom.CRCKey] = item.CRC,
+ [Data.Models.Metadata.Rom.CRC64Key] = item.CRC64,
[Data.Models.Metadata.Rom.MD2Key] = item.MD2,
[Data.Models.Metadata.Rom.MD4Key] = item.MD4,
[Data.Models.Metadata.Rom.MD5Key] = item.MD5,
diff --git a/SabreTools.Serialization/Models/ClrMamePro/Rom.cs b/SabreTools.Serialization/Models/ClrMamePro/Rom.cs
index cc288099..48cb1ce9 100644
--- a/SabreTools.Serialization/Models/ClrMamePro/Rom.cs
+++ b/SabreTools.Serialization/Models/ClrMamePro/Rom.cs
@@ -36,7 +36,13 @@ namespace SabreTools.Data.Models.ClrMamePro
#region Hash Extensions
- /// md2; Appears after CRC
+ /// crc16; Appears before CRC
+ public string? CRC16 { get; set; }
+
+ /// crc64; Appears after CRC
+ public string? CRC64 { get; set; }
+
+ /// md2; Appears after CRC64
public string? MD2 { get; set; }
/// md4; Appears after MD2
@@ -102,4 +108,4 @@ namespace SabreTools.Data.Models.ClrMamePro
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/SabreTools.Serialization/Models/Logiqx/Rom.cs b/SabreTools.Serialization/Models/Logiqx/Rom.cs
index 0787db31..2b92b639 100644
--- a/SabreTools.Serialization/Models/Logiqx/Rom.cs
+++ b/SabreTools.Serialization/Models/Logiqx/Rom.cs
@@ -15,9 +15,17 @@ namespace SabreTools.Data.Models.Logiqx
[XmlAttribute("size")]
public string? Size { get; set; }
+ /// Hash extension
+ [XmlAttribute("crc16")]
+ public string? CRC16 { get; set; }
+
[XmlAttribute("crc")]
public string? CRC { get; set; }
+ /// Hash extension
+ [XmlAttribute("crc64")]
+ public string? CRC64 { get; set; }
+
/// Hash extension
[XmlAttribute("md2")]
public string? MD2 { get; set; }
@@ -90,4 +98,4 @@ namespace SabreTools.Data.Models.Logiqx
[XmlAttribute("mia")]
public string? MIA { get; set; }
}
-}
\ No newline at end of file
+}
diff --git a/SabreTools.Serialization/Models/Metadata/Rom.cs b/SabreTools.Serialization/Models/Metadata/Rom.cs
index 0bd39552..728b0009 100644
--- a/SabreTools.Serialization/Models/Metadata/Rom.cs
+++ b/SabreTools.Serialization/Models/Metadata/Rom.cs
@@ -50,6 +50,12 @@ namespace SabreTools.Data.Models.Metadata
/// string; Also "crc32" in ArchiveDotOrg.File
public const string CRCKey = "crc";
+ /// string
+ public const string CRC16Key = "crc16";
+
+ /// string
+ public const string CRC64Key = "crc64";
+
/// string; ArchiveDotOrg.File
public const string CreatorKey = "creator";
diff --git a/SabreTools.Serialization/Readers/ClrMamePro.cs b/SabreTools.Serialization/Readers/ClrMamePro.cs
index 9f6b575c..cf106326 100644
--- a/SabreTools.Serialization/Readers/ClrMamePro.cs
+++ b/SabreTools.Serialization/Readers/ClrMamePro.cs
@@ -473,6 +473,12 @@ namespace SabreTools.Serialization.Readers
case "crc":
rom.CRC = kvp.Value;
break;
+ case "crc16":
+ rom.CRC16 = kvp.Value;
+ break;
+ case "crc64":
+ rom.CRC64 = kvp.Value;
+ break;
case "md2":
rom.MD2 = kvp.Value;
break;
diff --git a/SabreTools.Serialization/Writers/ClrMamePro.cs b/SabreTools.Serialization/Writers/ClrMamePro.cs
index ae53084d..7e9fe953 100644
--- a/SabreTools.Serialization/Writers/ClrMamePro.cs
+++ b/SabreTools.Serialization/Writers/ClrMamePro.cs
@@ -251,7 +251,9 @@ namespace SabreTools.Serialization.Writers
writer.WriteStartElement("rom");
writer.WriteRequiredAttributeString("name", rom.Name, throwOnError: true);
writer.WriteRequiredAttributeString("size", rom.Size, throwOnError: true);
+ writer.WriteOptionalAttributeString("crc16", rom.CRC16);
writer.WriteOptionalAttributeString("crc", rom.CRC);
+ writer.WriteOptionalAttributeString("crc64", rom.CRC64);
writer.WriteOptionalAttributeString("md2", rom.MD2);
writer.WriteOptionalAttributeString("md4", rom.MD4);
writer.WriteOptionalAttributeString("md5", rom.MD5);