mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Code reformat.
This commit is contained in:
575
CD/ATIP.cs
575
CD/ATIP.cs
@@ -38,201 +38,28 @@ using DiscImageChef.Console;
|
||||
namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
/// <summary>
|
||||
/// Information from the following standards:
|
||||
/// ANSI X3.304-1997
|
||||
/// T10/1048-D revision 9.0
|
||||
/// T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c
|
||||
/// T10/1228-D revision 11a
|
||||
/// T10/1363-D revision 10g
|
||||
/// T10/1545-D revision 1d
|
||||
/// T10/1545-D revision 5
|
||||
/// T10/1545-D revision 5a
|
||||
/// T10/1675-D revision 2c
|
||||
/// T10/1675-D revision 4
|
||||
/// T10/1836-D revision 2g
|
||||
/// Information from the following standards: ANSI X3.304-1997 T10/1048-D revision 9.0 T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c T10/1228-D revision 11a T10/1363-D revision 10g T10/1545-D revision 1d T10/1545-D revision
|
||||
/// 5 T10/1545-D revision 5a T10/1675-D revision 2c T10/1675-D revision 4 T10/1836-D revision 2g
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"), SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
public static class ATIP
|
||||
{
|
||||
public struct CDATIP
|
||||
{
|
||||
/// <summary>
|
||||
/// Bytes 1 to 0
|
||||
/// Total size of returned session information minus this field
|
||||
/// </summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>
|
||||
/// Byte 2
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>
|
||||
/// Byte 3
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>
|
||||
/// Byte 4, bits 7 to 4
|
||||
/// Indicative target writing power
|
||||
/// </summary>
|
||||
public byte ITWP;
|
||||
/// <summary>
|
||||
/// Byte 4, bit 3
|
||||
/// Set if DDCD
|
||||
/// </summary>
|
||||
public bool DDCD;
|
||||
/// <summary>
|
||||
/// Byte 4, bits 2 to 0
|
||||
/// Reference speed
|
||||
/// </summary>
|
||||
public byte ReferenceSpeed;
|
||||
/// <summary>
|
||||
/// Byte 5, bit 7
|
||||
/// Always unset
|
||||
/// </summary>
|
||||
public bool AlwaysZero;
|
||||
/// <summary>
|
||||
/// Byte 5, bit 6
|
||||
/// Unrestricted media
|
||||
/// </summary>
|
||||
public bool URU;
|
||||
/// <summary>
|
||||
/// Byte 5, bits 5 to 0
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved3;
|
||||
/// <summary>
|
||||
/// Byte 6, bit 7
|
||||
/// Always set
|
||||
/// </summary>
|
||||
public bool AlwaysOne;
|
||||
/// <summary>
|
||||
/// Byte 6, bit 6
|
||||
/// Set if rewritable (CD-RW or DDCD-RW)
|
||||
/// </summary>
|
||||
public bool DiscType;
|
||||
/// <summary>
|
||||
/// Byte 6, bits 5 to 3
|
||||
/// Disc subtype
|
||||
/// </summary>
|
||||
public byte DiscSubType;
|
||||
/// <summary>
|
||||
/// Byte 6, bit 2
|
||||
/// A1 values are valid
|
||||
/// </summary>
|
||||
public bool A1Valid;
|
||||
/// <summary>
|
||||
/// Byte 6, bit 1
|
||||
/// A2 values are valid
|
||||
/// </summary>
|
||||
public bool A2Valid;
|
||||
/// <summary>
|
||||
/// Byte 6, bit 0
|
||||
/// A3 values are valid
|
||||
/// </summary>
|
||||
public bool A3Valid;
|
||||
/// <summary>
|
||||
/// Byte 7
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved4;
|
||||
/// <summary>
|
||||
/// Byte 8
|
||||
/// ATIP Start time of Lead-In (Minute)
|
||||
/// </summary>
|
||||
public byte LeadInStartMin;
|
||||
/// <summary>
|
||||
/// Byte 9
|
||||
/// ATIP Start time of Lead-In (Second)
|
||||
/// </summary>
|
||||
public byte LeadInStartSec;
|
||||
/// <summary>
|
||||
/// Byte 10
|
||||
/// ATIP Start time of Lead-In (Frame)
|
||||
/// </summary>
|
||||
public byte LeadInStartFrame;
|
||||
/// <summary>
|
||||
/// Byte 11
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved5;
|
||||
/// <summary>
|
||||
/// Byte 12
|
||||
/// ATIP Last possible start time of Lead-Out (Minute)
|
||||
/// </summary>
|
||||
public byte LeadOutStartMin;
|
||||
/// <summary>
|
||||
/// Byte 13
|
||||
/// ATIP Last possible start time of Lead-Out (Second)
|
||||
/// </summary>
|
||||
public byte LeadOutStartSec;
|
||||
/// <summary>
|
||||
/// Byte 14
|
||||
/// ATIP Last possible start time of Lead-Out (Frame)
|
||||
/// </summary>
|
||||
public byte LeadOutStartFrame;
|
||||
/// <summary>
|
||||
/// Byte 15
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved6;
|
||||
/// <summary>
|
||||
/// Bytes 16 to 18
|
||||
/// A1 values
|
||||
/// </summary>
|
||||
public byte[] A1Values;
|
||||
/// <summary>
|
||||
/// Byte 19
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved7;
|
||||
/// <summary>
|
||||
/// Bytes 20 to 22
|
||||
/// A2 values
|
||||
/// </summary>
|
||||
public byte[] A2Values;
|
||||
/// <summary>
|
||||
/// Byte 23
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved8;
|
||||
/// <summary>
|
||||
/// Bytes 24 to 26
|
||||
/// A3 values
|
||||
/// </summary>
|
||||
public byte[] A3Values;
|
||||
/// <summary>
|
||||
/// Byte 27
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved9;
|
||||
/// <summary>
|
||||
/// Bytes 28 to 30
|
||||
/// S4 values
|
||||
/// </summary>
|
||||
public byte[] S4Values;
|
||||
/// <summary>
|
||||
/// Byte 31
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved10;
|
||||
}
|
||||
|
||||
public static CDATIP? Decode(byte[] CDATIPResponse)
|
||||
{
|
||||
if(CDATIPResponse == null) return null;
|
||||
if(CDATIPResponse == null)
|
||||
return null;
|
||||
|
||||
CDATIP decoded = new CDATIP();
|
||||
var decoded = new CDATIP();
|
||||
|
||||
if(CDATIPResponse.Length != 32 && CDATIPResponse.Length != 28)
|
||||
if(CDATIPResponse.Length != 32 &&
|
||||
CDATIPResponse.Length != 28)
|
||||
{
|
||||
DicConsole.DebugWriteLine("CD ATIP decoder",
|
||||
"Expected CD ATIP size (32 bytes) is not received size ({0} bytes), not decoding",
|
||||
CDATIPResponse.Length);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -275,7 +102,8 @@ namespace DiscImageChef.Decoders.CD
|
||||
decoded.Reserved8 = CDATIPResponse[23];
|
||||
decoded.Reserved9 = CDATIPResponse[27];
|
||||
|
||||
if(CDATIPResponse.Length < 32) return decoded;
|
||||
if(CDATIPResponse.Length < 32)
|
||||
return decoded;
|
||||
|
||||
decoded.S4Values = new byte[3];
|
||||
Array.Copy(CDATIPResponse, 28, decoded.S4Values, 0, 3);
|
||||
@@ -286,72 +114,89 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
public static string Prettify(CDATIP? CDATIPResponse)
|
||||
{
|
||||
if(CDATIPResponse == null) return null;
|
||||
if(CDATIPResponse == null)
|
||||
return null;
|
||||
|
||||
CDATIP response = CDATIPResponse.Value;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
|
||||
if(response.DDCD)
|
||||
{
|
||||
sb.AppendFormat("Indicative Target Writing Power: 0x{0:X2}", response.ITWP).AppendLine();
|
||||
sb.AppendLine(response.DiscType ? "Disc is DDCD-RW" : "Disc is DDCD-R");
|
||||
|
||||
switch(response.ReferenceSpeed)
|
||||
{
|
||||
case 2:
|
||||
sb.AppendLine("Reference speed is 4x");
|
||||
|
||||
break;
|
||||
case 3:
|
||||
sb.AppendLine("Reference speed is 8x");
|
||||
|
||||
break;
|
||||
default:
|
||||
sb.AppendFormat("Reference speed set is unknown: {0}", response.ReferenceSpeed).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
sb.AppendFormat("ATIP Start time of Lead-in: 0x{0:X6}",
|
||||
(response.LeadInStartMin << 16) + (response.LeadInStartSec << 8) +
|
||||
response.LeadInStartFrame).AppendLine();
|
||||
|
||||
sb.AppendFormat("ATIP Last possible start time of Lead-out: 0x{0:X6}",
|
||||
(response.LeadOutStartMin << 16) + (response.LeadOutStartSec << 8) +
|
||||
response.LeadOutStartFrame).AppendLine();
|
||||
|
||||
sb.AppendFormat("S4 value: 0x{0:X6}",
|
||||
(response.S4Values[0] << 16) + (response.S4Values[1] << 8) + response.S4Values[2])
|
||||
.AppendLine();
|
||||
(response.S4Values[0] << 16) + (response.S4Values[1] << 8) + response.S4Values[2]).
|
||||
AppendLine();
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendFormat("Indicative Target Writing Power: 0x{0:X2}", response.ITWP & 0x07).AppendLine();
|
||||
|
||||
if(response.DiscType)
|
||||
{
|
||||
switch(response.DiscSubType)
|
||||
{
|
||||
case 0:
|
||||
sb.AppendLine("Disc is CD-RW");
|
||||
|
||||
break;
|
||||
case 1:
|
||||
sb.AppendLine("Disc is High-Speed CD-RW");
|
||||
|
||||
break;
|
||||
case 2:
|
||||
sb.AppendLine("Disc is Ultra-Speed CD-RW");
|
||||
|
||||
break;
|
||||
case 3:
|
||||
sb.AppendLine("Disc is Ultra-Speed+ CD-RW");
|
||||
|
||||
break;
|
||||
case 4:
|
||||
sb.AppendLine("Disc is medium type B, low beta category (B-) CD-RW");
|
||||
|
||||
break;
|
||||
case 5:
|
||||
sb.AppendLine("Disc is medium type B, high beta category (B+) CD-RW");
|
||||
|
||||
break;
|
||||
case 6:
|
||||
sb.AppendLine("Disc is medium type C, low beta category (C-) CD-RW");
|
||||
|
||||
break;
|
||||
case 7:
|
||||
sb.AppendLine("Disc is medium type C, high beta category (C+) CD-RW");
|
||||
|
||||
break;
|
||||
default:
|
||||
sb.AppendFormat("Unknown CD-RW disc subtype: {0}", response.DiscSubType).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -359,44 +204,56 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
case 1:
|
||||
sb.AppendLine("Reference speed is 2x");
|
||||
|
||||
break;
|
||||
default:
|
||||
sb.AppendFormat("Reference speed set is unknown: {0}", response.ReferenceSpeed)
|
||||
.AppendLine();
|
||||
sb.AppendFormat("Reference speed set is unknown: {0}", response.ReferenceSpeed).
|
||||
AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendLine("Disc is CD-R");
|
||||
|
||||
switch(response.DiscSubType)
|
||||
{
|
||||
case 0:
|
||||
sb.AppendLine("Disc is normal speed (CLV) CD-R");
|
||||
|
||||
break;
|
||||
case 1:
|
||||
sb.AppendLine("Disc is high speed (CAV) CD-R");
|
||||
|
||||
break;
|
||||
case 2:
|
||||
sb.AppendLine("Disc is medium type A, low beta category (A-) CD-R");
|
||||
|
||||
break;
|
||||
case 3:
|
||||
sb.AppendLine("Disc is medium type A, high beta category (A+) CD-R");
|
||||
|
||||
break;
|
||||
case 4:
|
||||
sb.AppendLine("Disc is medium type B, low beta category (B-) CD-R");
|
||||
|
||||
break;
|
||||
case 5:
|
||||
sb.AppendLine("Disc is medium type B, high beta category (B+) CD-R");
|
||||
|
||||
break;
|
||||
case 6:
|
||||
sb.AppendLine("Disc is medium type C, low beta category (C-) CD-R");
|
||||
|
||||
break;
|
||||
case 7:
|
||||
sb.AppendLine("Disc is medium type C, high beta category (C+) CD-R");
|
||||
|
||||
break;
|
||||
default:
|
||||
sb.AppendFormat("Unknown CD-R disc subtype: {0}", response.DiscSubType).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -405,41 +262,48 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
sb.AppendFormat("ATIP Start time of Lead-in: {0}:{1:D2}:{2:D2}", response.LeadInStartMin,
|
||||
response.LeadInStartSec, response.LeadInStartFrame).AppendLine();
|
||||
|
||||
sb.AppendFormat("ATIP Last possible start time of Lead-out: {0}:{1:D2}:{2:D2}",
|
||||
response.LeadOutStartMin, response.LeadOutStartSec, response.LeadOutStartFrame)
|
||||
.AppendLine();
|
||||
response.LeadOutStartMin, response.LeadOutStartSec, response.LeadOutStartFrame).
|
||||
AppendLine();
|
||||
|
||||
if(response.A1Valid)
|
||||
sb.AppendFormat("A1 value: 0x{0:X6}",
|
||||
(response.A1Values[0] << 16) + (response.A1Values[1] << 8) + response.A1Values[2])
|
||||
.AppendLine();
|
||||
(response.A1Values[0] << 16) + (response.A1Values[1] << 8) + response.A1Values[2]).
|
||||
AppendLine();
|
||||
|
||||
if(response.A2Valid)
|
||||
sb.AppendFormat("A2 value: 0x{0:X6}",
|
||||
(response.A2Values[0] << 16) + (response.A2Values[1] << 8) + response.A2Values[2])
|
||||
.AppendLine();
|
||||
(response.A2Values[0] << 16) + (response.A2Values[1] << 8) + response.A2Values[2]).
|
||||
AppendLine();
|
||||
|
||||
if(response.A3Valid)
|
||||
sb.AppendFormat("A3 value: 0x{0:X6}",
|
||||
(response.A3Values[0] << 16) + (response.A3Values[1] << 8) + response.A3Values[2])
|
||||
.AppendLine();
|
||||
(response.A3Values[0] << 16) + (response.A3Values[1] << 8) + response.A3Values[2]).
|
||||
AppendLine();
|
||||
|
||||
if(response.S4Values != null)
|
||||
sb.AppendFormat("S4 value: 0x{0:X6}",
|
||||
(response.S4Values[0] << 16) + (response.S4Values[1] << 8) + response.S4Values[2])
|
||||
.AppendLine();
|
||||
(response.S4Values[0] << 16) + (response.S4Values[1] << 8) + response.S4Values[2]).
|
||||
AppendLine();
|
||||
}
|
||||
|
||||
if(response.LeadInStartMin != 97) return sb.ToString();
|
||||
if(response.LeadInStartMin != 97)
|
||||
return sb.ToString();
|
||||
|
||||
int type = response.LeadInStartFrame % 10;
|
||||
int frm = response.LeadInStartFrame - type;
|
||||
|
||||
if(response.DiscType) sb.AppendLine("Disc uses phase change");
|
||||
if(response.DiscType)
|
||||
sb.AppendLine("Disc uses phase change");
|
||||
else
|
||||
sb.AppendLine(type < 5
|
||||
? "Disc uses long strategy type dye (Cyanine, AZO, etc...)"
|
||||
sb.AppendLine(type < 5 ? "Disc uses long strategy type dye (Cyanine, AZO, etc...)"
|
||||
: "Disc uses short strategy type dye (Phthalocyanine, etc...)");
|
||||
|
||||
string manufacturer = ManufacturerFromATIP(response.LeadInStartSec, frm);
|
||||
|
||||
if(manufacturer != "") sb.AppendFormat("Disc manufactured by: {0}", manufacturer).AppendLine();
|
||||
if(manufacturer != "")
|
||||
sb.AppendFormat("Disc manufactured by: {0}", manufacturer).AppendLine();
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
@@ -447,6 +311,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
public static string Prettify(byte[] CDATIPResponse)
|
||||
{
|
||||
CDATIP? decoded = Decode(CDATIPResponse);
|
||||
|
||||
return Prettify(decoded);
|
||||
}
|
||||
|
||||
@@ -457,166 +322,169 @@ namespace DiscImageChef.Decoders.CD
|
||||
case 15:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "TDK Corporation";
|
||||
case 10: return "Ritek Co.";
|
||||
case 20: return "Mitsubishi Chemical Corporation";
|
||||
case 30: return "NAN-YA Plastics Corporation";
|
||||
case 00: return"TDK Corporation";
|
||||
case 10: return"Ritek Co.";
|
||||
case 20: return"Mitsubishi Chemical Corporation";
|
||||
case 30: return"NAN-YA Plastics Corporation";
|
||||
}
|
||||
|
||||
break;
|
||||
case 16:
|
||||
switch(frm)
|
||||
{
|
||||
case 20: return "Shenzen SG&Gast Digital Optical Discs";
|
||||
case 30: return "Grand Advance Technology Ltd.";
|
||||
case 20: return"Shenzen SG&Gast Digital Optical Discs";
|
||||
case 30: return"Grand Advance Technology Ltd.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 17:
|
||||
if(frm == 00) return "Moser Baer India Limited";
|
||||
if(frm == 00)
|
||||
return"Moser Baer India Limited";
|
||||
|
||||
break;
|
||||
case 18:
|
||||
switch(frm)
|
||||
{
|
||||
case 10: return "Wealth Fair Investment Ltd.";
|
||||
case 60: return "Taroko International Co. Ltd.";
|
||||
case 10: return"Wealth Fair Investment Ltd.";
|
||||
case 60: return"Taroko International Co. Ltd.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 20:
|
||||
if(frm == 10) return "CDA Datenträger Albrechts GmbH";
|
||||
if(frm == 10)
|
||||
return"CDA Datenträger Albrechts GmbH";
|
||||
|
||||
break;
|
||||
case 21:
|
||||
switch(frm)
|
||||
{
|
||||
case 10: return "Grupo Condor S.L.";
|
||||
case 30: return "Bestdisc Technology Corporation";
|
||||
case 40: return "Optical Disc Manufacturing Equipment";
|
||||
case 50: return "Sound Sound Multi-Media Development Ltd.";
|
||||
case 10: return"Grupo Condor S.L.";
|
||||
case 30: return"Bestdisc Technology Corporation";
|
||||
case 40: return"Optical Disc Manufacturing Equipment";
|
||||
case 50: return"Sound Sound Multi-Media Development Ltd.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 22:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Woongjin Media Corp.";
|
||||
case 10: return "Seantram Technology Inc.";
|
||||
case 20: return "Advanced Digital Media";
|
||||
case 30: return "EXIMPO";
|
||||
case 40: return "CIS Technology Inc.";
|
||||
case 50: return "Hong Kong Digital Technology Co., Ltd.";
|
||||
case 60: return "Acer Media Technology, Inc.";
|
||||
case 00: return"Woongjin Media Corp.";
|
||||
case 10: return"Seantram Technology Inc.";
|
||||
case 20: return"Advanced Digital Media";
|
||||
case 30: return"EXIMPO";
|
||||
case 40: return"CIS Technology Inc.";
|
||||
case 50: return"Hong Kong Digital Technology Co., Ltd.";
|
||||
case 60: return"Acer Media Technology, Inc.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 23:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Matsushita Electric Industrial Co., Ltd.";
|
||||
case 10: return "Doremi Media Co., Ltd.";
|
||||
case 20: return "Nacar Media s.r.l.";
|
||||
case 30: return "Audio Distributors Co., Ltd.";
|
||||
case 40: return "Victor Company of Japan, Ltd.";
|
||||
case 50: return "Optrom Inc.";
|
||||
case 60: return "Customer Pressing Oosterhout";
|
||||
case 00: return"Matsushita Electric Industrial Co., Ltd.";
|
||||
case 10: return"Doremi Media Co., Ltd.";
|
||||
case 20: return"Nacar Media s.r.l.";
|
||||
case 30: return"Audio Distributors Co., Ltd.";
|
||||
case 40: return"Victor Company of Japan, Ltd.";
|
||||
case 50: return"Optrom Inc.";
|
||||
case 60: return"Customer Pressing Oosterhout";
|
||||
}
|
||||
|
||||
break;
|
||||
case 24:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Taiyo Yuden Company Ltd.";
|
||||
case 10: return "SONY Corporation";
|
||||
case 20: return "Computer Support Italy s.r.l.";
|
||||
case 30: return "Unitech Japan Inc.";
|
||||
case 40: return "kdg mediatech AG";
|
||||
case 50: return "Guann Yinn Co., Ltd.";
|
||||
case 60: return "Harmonic Hall Optical Disc Ltd.";
|
||||
case 00: return"Taiyo Yuden Company Ltd.";
|
||||
case 10: return"SONY Corporation";
|
||||
case 20: return"Computer Support Italy s.r.l.";
|
||||
case 30: return"Unitech Japan Inc.";
|
||||
case 40: return"kdg mediatech AG";
|
||||
case 50: return"Guann Yinn Co., Ltd.";
|
||||
case 60: return"Harmonic Hall Optical Disc Ltd.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 25:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "MPO";
|
||||
case 20: return "Hitachi Maxell, Ltd.";
|
||||
case 30: return "Infodisc Technology Co. Ltd.";
|
||||
case 40: return "Vivastar AG";
|
||||
case 50: return "AMS Technology Inc.";
|
||||
case 60: return "Xcitec Inc.";
|
||||
case 00: return"MPO";
|
||||
case 20: return"Hitachi Maxell, Ltd.";
|
||||
case 30: return"Infodisc Technology Co. Ltd.";
|
||||
case 40: return"Vivastar AG";
|
||||
case 50: return"AMS Technology Inc.";
|
||||
case 60: return"Xcitec Inc.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 26:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Fornet International Pte Ltd.";
|
||||
case 10: return "POSTECH Corporation";
|
||||
case 20: return "SKC Co., Ltd.";
|
||||
case 30: return "Optical Disc Corporation";
|
||||
case 40: return "FUJI Photo Film Co., Ltd.";
|
||||
case 50: return "Lead Data Inc.";
|
||||
case 60: return "CMC Magnetics Corporation";
|
||||
case 00: return"Fornet International Pte Ltd.";
|
||||
case 10: return"POSTECH Corporation";
|
||||
case 20: return"SKC Co., Ltd.";
|
||||
case 30: return"Optical Disc Corporation";
|
||||
case 40: return"FUJI Photo Film Co., Ltd.";
|
||||
case 50: return"Lead Data Inc.";
|
||||
case 60: return"CMC Magnetics Corporation";
|
||||
}
|
||||
|
||||
break;
|
||||
case 27:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Digital Storage Technology Co., Ltd.";
|
||||
case 10: return "Plasmon Data systems Ltd.";
|
||||
case 20: return "Princo Corporation";
|
||||
case 30: return "Pioneer Video Corporation";
|
||||
case 40: return "Kodak Japan Ltd.";
|
||||
case 50: return "Mitsui Chemicals, Inc.";
|
||||
case 60: return "Ricoh Company Ltd.";
|
||||
case 00: return"Digital Storage Technology Co., Ltd.";
|
||||
case 10: return"Plasmon Data systems Ltd.";
|
||||
case 20: return"Princo Corporation";
|
||||
case 30: return"Pioneer Video Corporation";
|
||||
case 40: return"Kodak Japan Ltd.";
|
||||
case 50: return"Mitsui Chemicals, Inc.";
|
||||
case 60: return"Ricoh Company Ltd.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 28:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Opti.Me.S. S.p.A.";
|
||||
case 10: return "Gigastore Corporation";
|
||||
case 20: return "Multi Media Masters & Machinary SA";
|
||||
case 30: return "Auvistar Industry Co., Ltd.";
|
||||
case 40: return "King Pro Mediatek Inc.";
|
||||
case 50: return "Delphi Technology Inc.";
|
||||
case 60: return "Friendly CD-Tek Co.";
|
||||
case 00: return"Opti.Me.S. S.p.A.";
|
||||
case 10: return"Gigastore Corporation";
|
||||
case 20: return"Multi Media Masters & Machinary SA";
|
||||
case 30: return"Auvistar Industry Co., Ltd.";
|
||||
case 40: return"King Pro Mediatek Inc.";
|
||||
case 50: return"Delphi Technology Inc.";
|
||||
case 60: return"Friendly CD-Tek Co.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 29:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Taeil Media Co., Ltd.";
|
||||
case 10: return "Vanguard Disc Inc.";
|
||||
case 20: return "Unidisc Technology Co., Ltd.";
|
||||
case 30: return "Hile Optical Disc Technology Corp.";
|
||||
case 40: return "Viva Magnetics Ltd.";
|
||||
case 50: return "General Magnetics Ltd.";
|
||||
case 00: return"Taeil Media Co., Ltd.";
|
||||
case 10: return"Vanguard Disc Inc.";
|
||||
case 20: return"Unidisc Technology Co., Ltd.";
|
||||
case 30: return"Hile Optical Disc Technology Corp.";
|
||||
case 40: return"Viva Magnetics Ltd.";
|
||||
case 50: return"General Magnetics Ltd.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 30:
|
||||
if(frm == 10) return "CDA Datenträger Albrechts GmbH";
|
||||
if(frm == 10)
|
||||
return"CDA Datenträger Albrechts GmbH";
|
||||
|
||||
break;
|
||||
case 31:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Ritek Co.";
|
||||
case 30: return "Grand Advance Technology Ltd.";
|
||||
case 00: return"Ritek Co.";
|
||||
case 30: return"Grand Advance Technology Ltd.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 32:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "TDK Corporation";
|
||||
case 10: return "Prodisc Technology Inc.";
|
||||
case 00: return"TDK Corporation";
|
||||
case 10: return"Prodisc Technology Inc.";
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -624,96 +492,165 @@ namespace DiscImageChef.Decoders.CD
|
||||
switch(frm)
|
||||
{
|
||||
case 20:
|
||||
case 22: return "Mitsubishi Chemical Corporation";
|
||||
case 22: return"Mitsubishi Chemical Corporation";
|
||||
}
|
||||
|
||||
break;
|
||||
case 42:
|
||||
if(frm == 20) return "Advanced Digital Media";
|
||||
if(frm == 20)
|
||||
return"Advanced Digital Media";
|
||||
|
||||
break;
|
||||
case 45:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Fornet International Pte Ltd.";
|
||||
case 10: return "Unitech Japan Inc.";
|
||||
case 20: return "Acer Media Technology, Inc.";
|
||||
case 40: return "CIS Technology Inc.";
|
||||
case 50: return "Guann Yinn Co., Ltd.";
|
||||
case 60: return "Xcitec Inc.";
|
||||
case 00: return"Fornet International Pte Ltd.";
|
||||
case 10: return"Unitech Japan Inc.";
|
||||
case 20: return"Acer Media Technology, Inc.";
|
||||
case 40: return"CIS Technology Inc.";
|
||||
case 50: return"Guann Yinn Co., Ltd.";
|
||||
case 60: return"Xcitec Inc.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 46:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Taiyo Yuden Company Ltd.";
|
||||
case 10: return "Hong Kong Digital Technology Co., Ltd.";
|
||||
case 20: return "Multi Media Masters & Machinary SA";
|
||||
case 30: return "Computer Support Italy s.r.l.";
|
||||
case 40: return "FUJI Photo Film Co., Ltd.";
|
||||
case 50: return "Auvistar Industry Co., Ltd.";
|
||||
case 60: return "CMC Magnetics Corporation";
|
||||
case 00: return"Taiyo Yuden Company Ltd.";
|
||||
case 10: return"Hong Kong Digital Technology Co., Ltd.";
|
||||
case 20: return"Multi Media Masters & Machinary SA";
|
||||
case 30: return"Computer Support Italy s.r.l.";
|
||||
case 40: return"FUJI Photo Film Co., Ltd.";
|
||||
case 50: return"Auvistar Industry Co., Ltd.";
|
||||
case 60: return"CMC Magnetics Corporation";
|
||||
}
|
||||
|
||||
break;
|
||||
case 47:
|
||||
switch(frm)
|
||||
{
|
||||
case 10: return "Hitachi Maxell, Ltd.";
|
||||
case 20: return "Princo Corporation";
|
||||
case 40: return "POSTECH Corporation";
|
||||
case 50: return "Ritek Co.";
|
||||
case 60: return "Prodisc Technology Inc.";
|
||||
case 10: return"Hitachi Maxell, Ltd.";
|
||||
case 20: return"Princo Corporation";
|
||||
case 40: return"POSTECH Corporation";
|
||||
case 50: return"Ritek Co.";
|
||||
case 60: return"Prodisc Technology Inc.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 48:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "Ricoh Company Ltd.";
|
||||
case 10: return "Kodak Japan Ltd.";
|
||||
case 20: return "Plasmon Data systems Ltd.";
|
||||
case 30: return "Pioneer Video Corporation";
|
||||
case 40: return "Digital Storage Technology Co., Ltd.";
|
||||
case 50: return "Mitsui Chemicals, Inc.";
|
||||
case 60: return "Lead Data Inc.";
|
||||
case 00: return"Ricoh Company Ltd.";
|
||||
case 10: return"Kodak Japan Ltd.";
|
||||
case 20: return"Plasmon Data systems Ltd.";
|
||||
case 30: return"Pioneer Video Corporation";
|
||||
case 40: return"Digital Storage Technology Co., Ltd.";
|
||||
case 50: return"Mitsui Chemicals, Inc.";
|
||||
case 60: return"Lead Data Inc.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 49:
|
||||
switch(frm)
|
||||
{
|
||||
case 00: return "TDK Corporation";
|
||||
case 10: return "Gigastore Corporation";
|
||||
case 20: return "King Pro Mediatek Inc.";
|
||||
case 30: return "Opti.Me.S. S.p.A.";
|
||||
case 40: return "Victor Company of Japan, Ltd.";
|
||||
case 60: return "Matsushita Electric Industrial Co., Ltd.";
|
||||
case 00: return"TDK Corporation";
|
||||
case 10: return"Gigastore Corporation";
|
||||
case 20: return"King Pro Mediatek Inc.";
|
||||
case 30: return"Opti.Me.S. S.p.A.";
|
||||
case 40: return"Victor Company of Japan, Ltd.";
|
||||
case 60: return"Matsushita Electric Industrial Co., Ltd.";
|
||||
}
|
||||
|
||||
break;
|
||||
case 50:
|
||||
switch(frm)
|
||||
{
|
||||
case 10: return "Vanguard Disc Inc.";
|
||||
case 20: return "Mitsubishi Chemical Corporation";
|
||||
case 30: return "CDA Datenträger Albrechts GmbH";
|
||||
case 10: return"Vanguard Disc Inc.";
|
||||
case 20: return"Mitsubishi Chemical Corporation";
|
||||
case 30: return"CDA Datenträger Albrechts GmbH";
|
||||
}
|
||||
|
||||
break;
|
||||
case 51:
|
||||
switch(frm)
|
||||
{
|
||||
case 10: return "Grand Advance Technology Ltd.";
|
||||
case 20: return "Infodisc Technology Co. Ltd.";
|
||||
case 50: return "Hile Optical Disc Technology Corp.";
|
||||
case 10: return"Grand Advance Technology Ltd.";
|
||||
case 20: return"Infodisc Technology Co. Ltd.";
|
||||
case 50: return"Hile Optical Disc Technology Corp.";
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return "";
|
||||
return"";
|
||||
}
|
||||
|
||||
public struct CDATIP
|
||||
{
|
||||
/// <summary>Bytes 1 to 0 Total size of returned session information minus this field</summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>Byte 2 Reserved</summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>Byte 3 Reserved</summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>Byte 4, bits 7 to 4 Indicative target writing power</summary>
|
||||
public byte ITWP;
|
||||
/// <summary>Byte 4, bit 3 Set if DDCD</summary>
|
||||
public bool DDCD;
|
||||
/// <summary>Byte 4, bits 2 to 0 Reference speed</summary>
|
||||
public byte ReferenceSpeed;
|
||||
/// <summary>Byte 5, bit 7 Always unset</summary>
|
||||
public bool AlwaysZero;
|
||||
/// <summary>Byte 5, bit 6 Unrestricted media</summary>
|
||||
public bool URU;
|
||||
/// <summary>Byte 5, bits 5 to 0 Reserved</summary>
|
||||
public byte Reserved3;
|
||||
/// <summary>Byte 6, bit 7 Always set</summary>
|
||||
public bool AlwaysOne;
|
||||
/// <summary>Byte 6, bit 6 Set if rewritable (CD-RW or DDCD-RW)</summary>
|
||||
public bool DiscType;
|
||||
/// <summary>Byte 6, bits 5 to 3 Disc subtype</summary>
|
||||
public byte DiscSubType;
|
||||
/// <summary>Byte 6, bit 2 A1 values are valid</summary>
|
||||
public bool A1Valid;
|
||||
/// <summary>Byte 6, bit 1 A2 values are valid</summary>
|
||||
public bool A2Valid;
|
||||
/// <summary>Byte 6, bit 0 A3 values are valid</summary>
|
||||
public bool A3Valid;
|
||||
/// <summary>Byte 7 Reserved</summary>
|
||||
public byte Reserved4;
|
||||
/// <summary>Byte 8 ATIP Start time of Lead-In (Minute)</summary>
|
||||
public byte LeadInStartMin;
|
||||
/// <summary>Byte 9 ATIP Start time of Lead-In (Second)</summary>
|
||||
public byte LeadInStartSec;
|
||||
/// <summary>Byte 10 ATIP Start time of Lead-In (Frame)</summary>
|
||||
public byte LeadInStartFrame;
|
||||
/// <summary>Byte 11 Reserved</summary>
|
||||
public byte Reserved5;
|
||||
/// <summary>Byte 12 ATIP Last possible start time of Lead-Out (Minute)</summary>
|
||||
public byte LeadOutStartMin;
|
||||
/// <summary>Byte 13 ATIP Last possible start time of Lead-Out (Second)</summary>
|
||||
public byte LeadOutStartSec;
|
||||
/// <summary>Byte 14 ATIP Last possible start time of Lead-Out (Frame)</summary>
|
||||
public byte LeadOutStartFrame;
|
||||
/// <summary>Byte 15 Reserved</summary>
|
||||
public byte Reserved6;
|
||||
/// <summary>Bytes 16 to 18 A1 values</summary>
|
||||
public byte[] A1Values;
|
||||
/// <summary>Byte 19 Reserved</summary>
|
||||
public byte Reserved7;
|
||||
/// <summary>Bytes 20 to 22 A2 values</summary>
|
||||
public byte[] A2Values;
|
||||
/// <summary>Byte 23 Reserved</summary>
|
||||
public byte Reserved8;
|
||||
/// <summary>Bytes 24 to 26 A3 values</summary>
|
||||
public byte[] A3Values;
|
||||
/// <summary>Byte 27 Reserved</summary>
|
||||
public byte Reserved9;
|
||||
/// <summary>Bytes 28 to 30 S4 values</summary>
|
||||
public byte[] S4Values;
|
||||
/// <summary>Byte 31 Reserved</summary>
|
||||
public byte Reserved10;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -38,178 +38,57 @@ using DiscImageChef.Console;
|
||||
namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
/// <summary>
|
||||
/// Information from the following standards:
|
||||
/// ANSI X3.304-1997
|
||||
/// T10/1048-D revision 9.0
|
||||
/// T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c
|
||||
/// T10/1228-D revision 11a
|
||||
/// T10/1363-D revision 10g
|
||||
/// T10/1545-D revision 1d
|
||||
/// T10/1545-D revision 5
|
||||
/// T10/1545-D revision 5a
|
||||
/// T10/1675-D revision 2c
|
||||
/// T10/1675-D revision 4
|
||||
/// T10/1836-D revision 2g
|
||||
/// Information from the following standards: ANSI X3.304-1997 T10/1048-D revision 9.0 T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c T10/1228-D revision 11a T10/1363-D revision 10g T10/1545-D revision 1d T10/1545-D revision
|
||||
/// 5 T10/1545-D revision 5a T10/1675-D revision 2c T10/1675-D revision 4 T10/1836-D revision 2g
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global"), SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
public static class CDTextOnLeadIn
|
||||
{
|
||||
public enum PackTypeIndicator : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// Title of the track (or album if track == 0)
|
||||
/// </summary>
|
||||
Title = 0x80,
|
||||
/// <summary>
|
||||
/// Performer
|
||||
/// </summary>
|
||||
Performer = 0x81,
|
||||
/// <summary>
|
||||
/// Songwriter
|
||||
/// </summary>
|
||||
Songwriter = 0x82,
|
||||
/// <summary>
|
||||
/// Composer
|
||||
/// </summary>
|
||||
Composer = 0x83,
|
||||
/// <summary>
|
||||
/// Arranger
|
||||
/// </summary>
|
||||
Arranger = 0x84,
|
||||
/// <summary>
|
||||
/// Message from the content provider or artist
|
||||
/// </summary>
|
||||
Message = 0x85,
|
||||
/// <summary>
|
||||
/// Disc identification information
|
||||
/// </summary>
|
||||
DiscIdentification = 0x86,
|
||||
/// <summary>
|
||||
/// Genre identification
|
||||
/// </summary>
|
||||
GenreIdentification = 0x87,
|
||||
/// <summary>
|
||||
/// Table of content information
|
||||
/// </summary>
|
||||
TOCInformation = 0x88,
|
||||
/// <summary>
|
||||
/// Second table of content information
|
||||
/// </summary>
|
||||
SecondTOCInformation = 0x89,
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
Reserved1 = 0x8A,
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
Reserved2 = 0x8B,
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
Reserved3 = 0x8C,
|
||||
/// <summary>
|
||||
/// Reserved for content provider only
|
||||
/// </summary>
|
||||
ReservedForContentProvider = 0x8D,
|
||||
/// <summary>
|
||||
/// UPC of album or ISRC of track
|
||||
/// </summary>
|
||||
UPCorISRC = 0x8E,
|
||||
/// <summary>
|
||||
/// Size information of the block
|
||||
/// </summary>
|
||||
/// <summary>Title of the track (or album if track == 0)</summary>
|
||||
Title = 0x80, /// <summary>Performer</summary>
|
||||
Performer = 0x81, /// <summary>Songwriter</summary>
|
||||
Songwriter = 0x82, /// <summary>Composer</summary>
|
||||
Composer = 0x83, /// <summary>Arranger</summary>
|
||||
Arranger = 0x84, /// <summary>Message from the content provider or artist</summary>
|
||||
Message = 0x85, /// <summary>Disc identification information</summary>
|
||||
DiscIdentification = 0x86, /// <summary>Genre identification</summary>
|
||||
GenreIdentification = 0x87, /// <summary>Table of content information</summary>
|
||||
TOCInformation = 0x88, /// <summary>Second table of content information</summary>
|
||||
SecondTOCInformation = 0x89, /// <summary>Reserved</summary>
|
||||
Reserved1 = 0x8A, /// <summary>Reserved</summary>
|
||||
Reserved2 = 0x8B, /// <summary>Reserved</summary>
|
||||
Reserved3 = 0x8C, /// <summary>Reserved for content provider only</summary>
|
||||
ReservedForContentProvider = 0x8D, /// <summary>UPC of album or ISRC of track</summary>
|
||||
UPCorISRC = 0x8E, /// <summary>Size information of the block</summary>
|
||||
BlockSizeInformation = 0x8F
|
||||
}
|
||||
|
||||
public struct CDText
|
||||
{
|
||||
/// <summary>
|
||||
/// Total size of returned CD-Text information minus this field
|
||||
/// </summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>
|
||||
/// CD-Text data packs
|
||||
/// </summary>
|
||||
public CDTextPack[] DataPacks;
|
||||
}
|
||||
|
||||
public struct CDTextPack
|
||||
{
|
||||
/// <summary>
|
||||
/// Byte 0
|
||||
/// Pack ID1 (Pack Type)
|
||||
/// </summary>
|
||||
public byte HeaderID1;
|
||||
/// <summary>
|
||||
/// Byte 1
|
||||
/// Pack ID2 (Track number)
|
||||
/// </summary>
|
||||
public byte HeaderID2;
|
||||
/// <summary>
|
||||
/// Byte 2
|
||||
/// Pack ID3
|
||||
/// </summary>
|
||||
public byte HeaderID3;
|
||||
/// <summary>
|
||||
/// Byte 3, bit 7
|
||||
/// Double Byte Character Code
|
||||
/// </summary>
|
||||
public bool DBCC;
|
||||
/// <summary>
|
||||
/// Byte 3, bits 6 to 4
|
||||
/// Block number
|
||||
/// </summary>
|
||||
public byte BlockNumber;
|
||||
/// <summary>
|
||||
/// Byte 3, bits 3 to 0
|
||||
/// Character position
|
||||
/// </summary>
|
||||
public byte CharacterPosition;
|
||||
/// <summary>
|
||||
/// Bytes 4 to 15
|
||||
/// Text data
|
||||
/// </summary>
|
||||
public byte[] TextDataField;
|
||||
/// <summary>
|
||||
/// Bytes 16 to 17
|
||||
/// CRC16
|
||||
/// </summary>
|
||||
public ushort CRC;
|
||||
}
|
||||
|
||||
public static CDText? Decode(byte[] CDTextResponse)
|
||||
{
|
||||
if(CDTextResponse == null) return null;
|
||||
if(CDTextResponse == null)
|
||||
return null;
|
||||
|
||||
CDText decoded = new CDText
|
||||
var decoded = new CDText
|
||||
{
|
||||
DataLength = BigEndianBitConverter.ToUInt16(CDTextResponse, 0),
|
||||
Reserved1 = CDTextResponse[2],
|
||||
DataLength = BigEndianBitConverter.ToUInt16(CDTextResponse, 0), Reserved1 = CDTextResponse[2],
|
||||
Reserved2 = CDTextResponse[3]
|
||||
};
|
||||
|
||||
decoded.DataPacks = new CDTextPack[(decoded.DataLength - 2) / 18];
|
||||
|
||||
if(decoded.DataLength == 2) return null;
|
||||
if(decoded.DataLength == 2)
|
||||
return null;
|
||||
|
||||
if(decoded.DataLength + 2 != CDTextResponse.Length)
|
||||
{
|
||||
DicConsole.DebugWriteLine("CD-TEXT decoder",
|
||||
"Expected CD-TEXT size ({0} bytes) is not received size ({1} bytes), not decoding",
|
||||
decoded.DataLength + 2, CDTextResponse.Length);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -231,23 +110,27 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
public static string Prettify(CDText? CDTextResponse)
|
||||
{
|
||||
if(CDTextResponse == null) return null;
|
||||
if(CDTextResponse == null)
|
||||
return null;
|
||||
|
||||
CDText response = CDTextResponse.Value;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
CDText response = CDTextResponse.Value;
|
||||
var sb = new StringBuilder();
|
||||
|
||||
#if DEBUG
|
||||
if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine();
|
||||
if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine();
|
||||
#endif
|
||||
#if DEBUG
|
||||
if(response.Reserved1 != 0)
|
||||
sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine();
|
||||
|
||||
if(response.Reserved2 != 0)
|
||||
sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine();
|
||||
#endif
|
||||
|
||||
foreach(CDTextPack descriptor in response.DataPacks)
|
||||
if((descriptor.HeaderID1 & 0x80) != 0x80)
|
||||
{
|
||||
// Ignore NOPs
|
||||
if((descriptor.HeaderID1 & 0x80) != 0)
|
||||
sb.AppendFormat("Incorrect CD-Text pack type {0}, not decoding", descriptor.HeaderID1)
|
||||
.AppendLine();
|
||||
sb.AppendFormat("Incorrect CD-Text pack type {0}, not decoding", descriptor.HeaderID1).
|
||||
AppendLine();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -256,71 +139,98 @@ namespace DiscImageChef.Decoders.CD
|
||||
case 0x80:
|
||||
{
|
||||
sb.Append("CD-Text pack contains title for ");
|
||||
if(descriptor.HeaderID2 == 0x00) sb.AppendLine("album");
|
||||
else sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
if(descriptor.HeaderID2 == 0x00)
|
||||
sb.AppendLine("album");
|
||||
else
|
||||
sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x81:
|
||||
{
|
||||
sb.Append("CD-Text pack contains performer for ");
|
||||
if(descriptor.HeaderID2 == 0x00) sb.AppendLine("album");
|
||||
else sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
if(descriptor.HeaderID2 == 0x00)
|
||||
sb.AppendLine("album");
|
||||
else
|
||||
sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x82:
|
||||
{
|
||||
sb.Append("CD-Text pack contains songwriter for ");
|
||||
if(descriptor.HeaderID2 == 0x00) sb.AppendLine("album");
|
||||
else sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
if(descriptor.HeaderID2 == 0x00)
|
||||
sb.AppendLine("album");
|
||||
else
|
||||
sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x83:
|
||||
{
|
||||
if(descriptor.HeaderID2 == 0x00) sb.AppendLine("album");
|
||||
else sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
if(descriptor.HeaderID2 == 0x00)
|
||||
sb.AppendLine("album");
|
||||
else
|
||||
sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x84:
|
||||
{
|
||||
sb.Append("CD-Text pack contains arranger for ");
|
||||
if(descriptor.HeaderID2 == 0x00) sb.AppendLine("album");
|
||||
else sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
if(descriptor.HeaderID2 == 0x00)
|
||||
sb.AppendLine("album");
|
||||
else
|
||||
sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x85:
|
||||
{
|
||||
sb.Append("CD-Text pack contains content provider's message for ");
|
||||
if(descriptor.HeaderID2 == 0x00) sb.AppendLine("album");
|
||||
else sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
if(descriptor.HeaderID2 == 0x00)
|
||||
sb.AppendLine("album");
|
||||
else
|
||||
sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x86:
|
||||
{
|
||||
sb.AppendLine("CD-Text pack contains disc identification information");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x87:
|
||||
{
|
||||
sb.AppendLine("CD-Text pack contains genre identification information");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x88:
|
||||
{
|
||||
sb.AppendLine("CD-Text pack contains table of contents information");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x89:
|
||||
{
|
||||
sb.AppendLine("CD-Text pack contains second table of contents information");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -329,25 +239,31 @@ namespace DiscImageChef.Decoders.CD
|
||||
case 0x8C:
|
||||
{
|
||||
sb.AppendLine("CD-Text pack contains reserved data");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x8D:
|
||||
{
|
||||
sb.AppendLine("CD-Text pack contains data reserved for content provider only");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x8E:
|
||||
{
|
||||
if(descriptor.HeaderID2 == 0x00) sb.AppendLine("CD-Text pack contains UPC");
|
||||
else sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
if(descriptor.HeaderID2 == 0x00)
|
||||
sb.AppendLine("CD-Text pack contains UPC");
|
||||
else
|
||||
sb.AppendFormat("track {0}", descriptor.HeaderID2).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x8F:
|
||||
{
|
||||
sb.AppendLine("CD-Text pack contains size block information");
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -364,20 +280,25 @@ namespace DiscImageChef.Decoders.CD
|
||||
case 0x87:
|
||||
case 0x8E:
|
||||
{
|
||||
if(descriptor.DBCC) sb.AppendLine("Double Byte Character Code is used");
|
||||
if(descriptor.DBCC)
|
||||
sb.AppendLine("Double Byte Character Code is used");
|
||||
|
||||
sb.AppendFormat("Block number {0}", descriptor.BlockNumber).AppendLine();
|
||||
sb.AppendFormat("Character position {0}", descriptor.CharacterPosition).AppendLine();
|
||||
|
||||
sb.AppendFormat("Text field: \"{0}\"",
|
||||
StringHandlers.CToString(descriptor.TextDataField,
|
||||
Encoding.GetEncoding("iso-8859-1"))).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
sb.AppendFormat("Binary contents: {0}",
|
||||
PrintHex.ByteArrayToHexArrayString(descriptor.TextDataField, 28))
|
||||
.AppendLine();
|
||||
PrintHex.ByteArrayToHexArrayString(descriptor.TextDataField, 28)).
|
||||
AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -391,7 +312,40 @@ namespace DiscImageChef.Decoders.CD
|
||||
public static string Prettify(byte[] CDTextResponse)
|
||||
{
|
||||
CDText? decoded = Decode(CDTextResponse);
|
||||
|
||||
return Prettify(decoded);
|
||||
}
|
||||
|
||||
public struct CDText
|
||||
{
|
||||
/// <summary>Total size of returned CD-Text information minus this field</summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>Reserved</summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>Reserved</summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>CD-Text data packs</summary>
|
||||
public CDTextPack[] DataPacks;
|
||||
}
|
||||
|
||||
public struct CDTextPack
|
||||
{
|
||||
/// <summary>Byte 0 Pack ID1 (Pack Type)</summary>
|
||||
public byte HeaderID1;
|
||||
/// <summary>Byte 1 Pack ID2 (Track number)</summary>
|
||||
public byte HeaderID2;
|
||||
/// <summary>Byte 2 Pack ID3</summary>
|
||||
public byte HeaderID3;
|
||||
/// <summary>Byte 3, bit 7 Double Byte Character Code</summary>
|
||||
public bool DBCC;
|
||||
/// <summary>Byte 3, bits 6 to 4 Block number</summary>
|
||||
public byte BlockNumber;
|
||||
/// <summary>Byte 3, bits 3 to 0 Character position</summary>
|
||||
public byte CharacterPosition;
|
||||
/// <summary>Bytes 4 to 15 Text data</summary>
|
||||
public byte[] TextDataField;
|
||||
/// <summary>Bytes 16 to 17 CRC16</summary>
|
||||
public ushort CRC;
|
||||
}
|
||||
}
|
||||
}
|
||||
68
CD/Enums.cs
68
CD/Enums.cs
@@ -37,65 +37,25 @@ namespace DiscImageChef.Decoders.CD
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
public enum TocAdr : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// Q Sub-channel mode information not supplied
|
||||
/// </summary>
|
||||
NoInformation = 0x00,
|
||||
/// <summary>
|
||||
/// Q Sub-channel encodes current position data
|
||||
/// </summary>
|
||||
CurrentPosition = 0x01,
|
||||
/// <summary>
|
||||
/// Q Sub-channel encodes the media catalog number
|
||||
/// </summary>
|
||||
MediaCatalogNumber = 0x02,
|
||||
/// <summary>
|
||||
/// Q Sub-channel encodes the ISRC
|
||||
/// </summary>
|
||||
ISRC = 0x03,
|
||||
/// <summary>
|
||||
/// Q Sub-channel encodes the start of an audio/data track (if found in TOC)
|
||||
/// </summary>
|
||||
TrackPointer = 0x01,
|
||||
/// <summary>
|
||||
/// Q Sub-channel encodes the start of a video track (if found in TOC) for CD-V
|
||||
/// </summary>
|
||||
/// <summary>Q Sub-channel mode information not supplied</summary>
|
||||
NoInformation = 0x00, /// <summary>Q Sub-channel encodes current position data</summary>
|
||||
CurrentPosition = 0x01, /// <summary>Q Sub-channel encodes the media catalog number</summary>
|
||||
MediaCatalogNumber = 0x02, /// <summary>Q Sub-channel encodes the ISRC</summary>
|
||||
ISRC = 0x03, /// <summary>Q Sub-channel encodes the start of an audio/data track (if found in TOC)</summary>
|
||||
TrackPointer = 0x01, /// <summary>Q Sub-channel encodes the start of a video track (if found in TOC) for CD-V</summary>
|
||||
VideoTrackPointer = 0x04
|
||||
}
|
||||
|
||||
public enum TocControl : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// Stereo audio, no pre-emphasis
|
||||
/// </summary>
|
||||
TwoChanNoPreEmph = 0x00,
|
||||
/// <summary>
|
||||
/// Stereo audio with pre-emphasis
|
||||
/// </summary>
|
||||
TwoChanPreEmph = 0x01,
|
||||
/// <summary>
|
||||
/// If mask applied, track can be copied
|
||||
/// </summary>
|
||||
CopyPermissionMask = 0x02,
|
||||
/// <summary>
|
||||
/// Data track, recorded uninterrumpted
|
||||
/// </summary>
|
||||
DataTrack = 0x04,
|
||||
/// <summary>
|
||||
/// Data track, recorded incrementally
|
||||
/// </summary>
|
||||
DataTrackIncremental = 0x05,
|
||||
/// <summary>
|
||||
/// Quadraphonic audio, no pre-emphasis
|
||||
/// </summary>
|
||||
FourChanNoPreEmph = 0x08,
|
||||
/// <summary>
|
||||
/// Quadraphonic audio with pre-emphasis
|
||||
/// </summary>
|
||||
FourChanPreEmph = 0x09,
|
||||
/// <summary>
|
||||
/// Reserved mask
|
||||
/// </summary>
|
||||
/// <summary>Stereo audio, no pre-emphasis</summary>
|
||||
TwoChanNoPreEmph = 0x00, /// <summary>Stereo audio with pre-emphasis</summary>
|
||||
TwoChanPreEmph = 0x01, /// <summary>If mask applied, track can be copied</summary>
|
||||
CopyPermissionMask = 0x02, /// <summary>Data track, recorded uninterrumpted</summary>
|
||||
DataTrack = 0x04, /// <summary>Data track, recorded incrementally</summary>
|
||||
DataTrackIncremental = 0x05, /// <summary>Quadraphonic audio, no pre-emphasis</summary>
|
||||
FourChanNoPreEmph = 0x08, /// <summary>Quadraphonic audio with pre-emphasis</summary>
|
||||
FourChanPreEmph = 0x09, /// <summary>Reserved mask</summary>
|
||||
ReservedMask = 0x0C
|
||||
}
|
||||
}
|
||||
301
CD/FullTOC.cs
301
CD/FullTOC.cs
@@ -37,25 +37,13 @@ using DiscImageChef.Console;
|
||||
namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
/// <summary>
|
||||
/// Information from the following standards:
|
||||
/// ANSI X3.304-1997
|
||||
/// T10/1048-D revision 9.0
|
||||
/// T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c
|
||||
/// T10/1228-D revision 11a
|
||||
/// T10/1363-D revision 10g
|
||||
/// T10/1545-D revision 1d
|
||||
/// T10/1545-D revision 5
|
||||
/// T10/1545-D revision 5a
|
||||
/// T10/1675-D revision 2c
|
||||
/// T10/1675-D revision 4
|
||||
/// T10/1836-D revision 2g
|
||||
/// ISO/IEC 61104: Compact disc video system - 12 cm CD-V
|
||||
/// ISO/IEC 60908: Audio recording - Compact disc digital audio system
|
||||
/// Information from the following standards: ANSI X3.304-1997 T10/1048-D revision 9.0 T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c T10/1228-D revision 11a T10/1363-D revision 10g T10/1545-D revision 1d T10/1545-D revision
|
||||
/// 5 T10/1545-D revision 5a T10/1675-D revision 2c T10/1675-D revision 4 T10/1836-D revision 2g ISO/IEC 61104: Compact
|
||||
/// disc video system - 12 cm CD-V ISO/IEC 60908: Audio recording - Compact disc digital audio system
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class FullTOC
|
||||
{
|
||||
const string StereoNoPre = "Stereo audio track with no pre-emphasis";
|
||||
@@ -65,98 +53,15 @@ namespace DiscImageChef.Decoders.CD
|
||||
const string DataUnintrp = "Data track, recorded uninterrupted";
|
||||
const string DataIncrtly = "Data track, recorded incrementally";
|
||||
|
||||
public struct CDFullTOC
|
||||
{
|
||||
/// <summary>
|
||||
/// Total size of returned session information minus this field
|
||||
/// </summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>
|
||||
/// First complete session number in hex
|
||||
/// </summary>
|
||||
public byte FirstCompleteSession;
|
||||
/// <summary>
|
||||
/// Last complete session number in hex
|
||||
/// </summary>
|
||||
public byte LastCompleteSession;
|
||||
/// <summary>
|
||||
/// Track descriptors
|
||||
/// </summary>
|
||||
public TrackDataDescriptor[] TrackDescriptors;
|
||||
}
|
||||
|
||||
public struct TrackDataDescriptor
|
||||
{
|
||||
/// <summary>
|
||||
/// Byte 0
|
||||
/// Session number in hex
|
||||
/// </summary>
|
||||
public byte SessionNumber;
|
||||
/// <summary>
|
||||
/// Byte 1, bits 7 to 4
|
||||
/// Type of information in Q subchannel of block where this TOC entry was found
|
||||
/// </summary>
|
||||
public byte ADR;
|
||||
/// <summary>
|
||||
/// Byte 1, bits 3 to 0
|
||||
/// Track attributes
|
||||
/// </summary>
|
||||
public byte CONTROL;
|
||||
/// <summary>
|
||||
/// Byte 2
|
||||
/// </summary>
|
||||
public byte TNO;
|
||||
/// <summary>
|
||||
/// Byte 3
|
||||
/// </summary>
|
||||
public byte POINT;
|
||||
/// <summary>
|
||||
/// Byte 4
|
||||
/// </summary>
|
||||
public byte Min;
|
||||
/// <summary>
|
||||
/// Byte 5
|
||||
/// </summary>
|
||||
public byte Sec;
|
||||
/// <summary>
|
||||
/// Byte 6
|
||||
/// </summary>
|
||||
public byte Frame;
|
||||
/// <summary>
|
||||
/// Byte 7, CD only
|
||||
/// </summary>
|
||||
public byte Zero;
|
||||
/// <summary>
|
||||
/// Byte 7, bits 7 to 4, DDCD only
|
||||
/// </summary>
|
||||
public byte HOUR;
|
||||
/// <summary>
|
||||
/// Byte 7, bits 3 to 0, DDCD only
|
||||
/// </summary>
|
||||
public byte PHOUR;
|
||||
/// <summary>
|
||||
/// Byte 8
|
||||
/// </summary>
|
||||
public byte PMIN;
|
||||
/// <summary>
|
||||
/// Byte 9
|
||||
/// </summary>
|
||||
public byte PSEC;
|
||||
/// <summary>
|
||||
/// Byte 10
|
||||
/// </summary>
|
||||
public byte PFRAME;
|
||||
}
|
||||
|
||||
public static CDFullTOC? Decode(byte[] CDFullTOCResponse)
|
||||
{
|
||||
if(CDFullTOCResponse == null) return null;
|
||||
if(CDFullTOCResponse == null)
|
||||
return null;
|
||||
|
||||
CDFullTOC decoded = new CDFullTOC
|
||||
var decoded = new CDFullTOC
|
||||
{
|
||||
DataLength = BigEndianBitConverter.ToUInt16(CDFullTOCResponse, 0),
|
||||
FirstCompleteSession = CDFullTOCResponse[2],
|
||||
LastCompleteSession = CDFullTOCResponse[3]
|
||||
FirstCompleteSession = CDFullTOCResponse[2], LastCompleteSession = CDFullTOCResponse[3]
|
||||
};
|
||||
|
||||
decoded.TrackDescriptors = new TrackDataDescriptor[(decoded.DataLength - 2) / 11];
|
||||
@@ -166,6 +71,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
DicConsole.DebugWriteLine("CD full TOC decoder",
|
||||
"Expected CDFullTOC size ({0} bytes) is not received size ({1} bytes), not decoding",
|
||||
decoded.DataLength + 2, CDFullTOCResponse.Length);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -192,16 +98,18 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
public static string Prettify(CDFullTOC? CDFullTOCResponse)
|
||||
{
|
||||
if(CDFullTOCResponse == null) return null;
|
||||
if(CDFullTOCResponse == null)
|
||||
return null;
|
||||
|
||||
CDFullTOC response = CDFullTOCResponse.Value;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
|
||||
int lastSession = 0;
|
||||
|
||||
sb.AppendFormat("First complete session number: {0}", response.FirstCompleteSession).AppendLine();
|
||||
sb.AppendFormat("Last complete session number: {0}", response.LastCompleteSession).AppendLine();
|
||||
|
||||
foreach(TrackDataDescriptor descriptor in response.TrackDescriptors)
|
||||
if((descriptor.CONTROL & 0x08) == 0x08 ||
|
||||
descriptor.ADR != 1 && descriptor.ADR != 5 && descriptor.ADR != 4 && descriptor.ADR != 6 ||
|
||||
@@ -240,31 +148,40 @@ namespace DiscImageChef.Decoders.CD
|
||||
case 0xA0 when descriptor.ADR == 4:
|
||||
{
|
||||
sb.AppendFormat("First video track number: {0}", descriptor.PMIN).AppendLine();
|
||||
|
||||
switch(descriptor.PSEC)
|
||||
{
|
||||
case 0x10:
|
||||
sb.AppendLine("CD-V single in NTSC format with digital stereo sound");
|
||||
|
||||
break;
|
||||
case 0x11:
|
||||
sb.AppendLine("CD-V single in NTSC format with digital bilingual sound");
|
||||
|
||||
break;
|
||||
case 0x12:
|
||||
sb.AppendLine("CD-V disc in NTSC format with digital stereo sound");
|
||||
|
||||
break;
|
||||
case 0x13:
|
||||
sb.AppendLine("CD-V disc in NTSC format with digital bilingual sound");
|
||||
|
||||
break;
|
||||
case 0x20:
|
||||
sb.AppendLine("CD-V single in PAL format with digital stereo sound");
|
||||
|
||||
break;
|
||||
case 0x21:
|
||||
sb.AppendLine("CD-V single in PAL format with digital bilingual sound");
|
||||
|
||||
break;
|
||||
case 0x22:
|
||||
sb.AppendLine("CD-V disc in PAL format with digital stereo sound");
|
||||
|
||||
break;
|
||||
case 0x23:
|
||||
sb.AppendLine("CD-V disc in PAL format with digital bilingual sound");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -274,63 +191,80 @@ namespace DiscImageChef.Decoders.CD
|
||||
case 0xA0 when descriptor.ADR == 1:
|
||||
{
|
||||
sb.AppendFormat("First track number: {0} (", descriptor.PMIN);
|
||||
|
||||
switch((TocControl)(descriptor.CONTROL & 0x0D))
|
||||
{
|
||||
case TocControl.TwoChanNoPreEmph:
|
||||
sb.Append(StereoNoPre);
|
||||
|
||||
break;
|
||||
case TocControl.TwoChanPreEmph:
|
||||
sb.Append(StereoPreEm);
|
||||
|
||||
break;
|
||||
case TocControl.FourChanNoPreEmph:
|
||||
sb.Append(QuadNoPreEm);
|
||||
|
||||
break;
|
||||
case TocControl.FourChanPreEmph:
|
||||
sb.Append(QuadPreEmph);
|
||||
|
||||
break;
|
||||
case TocControl.DataTrack:
|
||||
sb.Append(DataUnintrp);
|
||||
|
||||
break;
|
||||
case TocControl.DataTrackIncremental:
|
||||
sb.Append(DataIncrtly);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
sb.AppendLine(")");
|
||||
sb.AppendFormat("Disc type: {0}", descriptor.PSEC).AppendLine();
|
||||
|
||||
//sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xA1 when descriptor.ADR == 4:
|
||||
sb.AppendFormat("Last video track number: {0}", descriptor.PMIN).AppendLine();
|
||||
|
||||
break;
|
||||
case 0xA1 when descriptor.ADR == 1:
|
||||
{
|
||||
sb.AppendFormat("Last track number: {0} (", descriptor.PMIN);
|
||||
|
||||
switch((TocControl)(descriptor.CONTROL & 0x0D))
|
||||
{
|
||||
case TocControl.TwoChanNoPreEmph:
|
||||
sb.Append(StereoNoPre);
|
||||
|
||||
break;
|
||||
case TocControl.TwoChanPreEmph:
|
||||
sb.Append(StereoPreEm);
|
||||
|
||||
break;
|
||||
case TocControl.FourChanNoPreEmph:
|
||||
sb.Append(QuadNoPreEm);
|
||||
|
||||
break;
|
||||
case TocControl.FourChanPreEmph:
|
||||
sb.Append(QuadPreEmph);
|
||||
|
||||
break;
|
||||
case TocControl.DataTrack:
|
||||
sb.Append(DataUnintrp);
|
||||
|
||||
break;
|
||||
case TocControl.DataTrackIncremental:
|
||||
sb.Append(DataIncrtly);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
sb.AppendLine(")");
|
||||
|
||||
//sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine();
|
||||
break;
|
||||
}
|
||||
@@ -343,8 +277,9 @@ namespace DiscImageChef.Decoders.CD
|
||||
descriptor.PHOUR).AppendLine();
|
||||
else
|
||||
sb.AppendFormat("Lead-out start position: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME)
|
||||
.AppendLine();
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).
|
||||
AppendLine();
|
||||
|
||||
//sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine();
|
||||
|
||||
switch((TocControl)(descriptor.CONTROL & 0x0D))
|
||||
@@ -354,10 +289,12 @@ namespace DiscImageChef.Decoders.CD
|
||||
case TocControl.FourChanNoPreEmph:
|
||||
case TocControl.FourChanPreEmph:
|
||||
sb.AppendLine("Lead-out is audio type");
|
||||
|
||||
break;
|
||||
case TocControl.DataTrack:
|
||||
case TocControl.DataTrackIncremental:
|
||||
sb.AppendLine("Lead-out is data type");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -366,21 +303,24 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
case 0xF0:
|
||||
{
|
||||
sb.AppendFormat("Book type: 0x{0:X2}", descriptor.PMIN);
|
||||
sb.AppendFormat("Material type: 0x{0:X2}", descriptor.PSEC);
|
||||
sb.AppendFormat("Book type: 0x{0:X2}", descriptor.PMIN);
|
||||
sb.AppendFormat("Material type: 0x{0:X2}", descriptor.PSEC);
|
||||
sb.AppendFormat("Moment of inertia: 0x{0:X2}", descriptor.PFRAME);
|
||||
|
||||
if(descriptor.PHOUR > 0)
|
||||
sb.AppendFormat("Absolute time: {3:D2}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min,
|
||||
descriptor.Sec, descriptor.Frame, descriptor.HOUR).AppendLine();
|
||||
else
|
||||
sb.AppendFormat("Absolute time: {0:D2}:{1:D2}:{2:D2}", descriptor.Min,
|
||||
descriptor.Sec, descriptor.Frame).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
if(descriptor.POINT >= 0x01 && descriptor.POINT <= 0x63)
|
||||
if(descriptor.POINT >= 0x01 &&
|
||||
descriptor.POINT <= 0x63)
|
||||
if(descriptor.ADR == 4)
|
||||
sb.AppendFormat("Video track {3} starts at: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME,
|
||||
@@ -391,7 +331,8 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
if((TocControl)(descriptor.CONTROL & 0x0D) == TocControl.DataTrack ||
|
||||
(TocControl)(descriptor.CONTROL & 0x0D) ==
|
||||
TocControl.DataTrackIncremental) type = "Data";
|
||||
TocControl.DataTrackIncremental)
|
||||
type = "Data";
|
||||
|
||||
if(descriptor.PHOUR > 0)
|
||||
sb.AppendFormat("{5} track {3} starts at: {4:D2}:{0:D2}:{1:D2}:{2:D2} (",
|
||||
@@ -406,21 +347,27 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
case TocControl.TwoChanNoPreEmph:
|
||||
sb.Append(StereoNoPre);
|
||||
|
||||
break;
|
||||
case TocControl.TwoChanPreEmph:
|
||||
sb.Append(StereoPreEm);
|
||||
|
||||
break;
|
||||
case TocControl.FourChanNoPreEmph:
|
||||
sb.Append(QuadNoPreEm);
|
||||
|
||||
break;
|
||||
case TocControl.FourChanPreEmph:
|
||||
sb.Append(QuadPreEmph);
|
||||
|
||||
break;
|
||||
case TocControl.DataTrack:
|
||||
sb.Append(DataUnintrp);
|
||||
|
||||
break;
|
||||
case TocControl.DataTrackIncremental:
|
||||
sb.Append(DataIncrtly);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -457,24 +404,26 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
if(descriptor.PHOUR > 0)
|
||||
{
|
||||
sb
|
||||
.AppendFormat("Start of next possible program in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
sb.
|
||||
AppendFormat("Start of next possible program in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.Min, descriptor.Sec, descriptor.Frame,
|
||||
descriptor.HOUR).AppendLine();
|
||||
sb
|
||||
.AppendFormat("Maximum start of outermost Lead-out in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
|
||||
sb.
|
||||
AppendFormat("Maximum start of outermost Lead-out in the recordable area of the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME,
|
||||
descriptor.PHOUR).AppendLine();
|
||||
}
|
||||
else
|
||||
{
|
||||
sb
|
||||
.AppendFormat("Start of next possible program in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2}",
|
||||
sb.
|
||||
AppendFormat("Start of next possible program in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.Min, descriptor.Sec, descriptor.Frame).AppendLine();
|
||||
sb
|
||||
.AppendFormat("Maximum start of outermost Lead-out in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME)
|
||||
.AppendLine();
|
||||
|
||||
sb.
|
||||
AppendFormat("Maximum start of outermost Lead-out in the recordable area of the disc: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).
|
||||
AppendLine();
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -482,9 +431,11 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
case 0xB1:
|
||||
{
|
||||
sb.AppendFormat("Number of skip interval pointers: {0}", descriptor.PMIN)
|
||||
.AppendLine();
|
||||
sb.AppendFormat("Number of skip interval pointers: {0}", descriptor.PMIN).
|
||||
AppendLine();
|
||||
|
||||
sb.AppendFormat("Number of skip track pointers: {0}", descriptor.PSEC).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -499,22 +450,25 @@ namespace DiscImageChef.Decoders.CD
|
||||
sb.AppendFormat("Skip track {0}", descriptor.PMIN).AppendLine();
|
||||
sb.AppendFormat("Skip track {0}", descriptor.PSEC).AppendLine();
|
||||
sb.AppendFormat("Skip track {0}", descriptor.PFRAME).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xC0:
|
||||
{
|
||||
sb.AppendFormat("Optimum recording power: 0x{0:X2}", descriptor.Min).AppendLine();
|
||||
|
||||
if(descriptor.PHOUR > 0)
|
||||
sb
|
||||
.AppendFormat("Start time of the first Lead-in area in the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
sb.
|
||||
AppendFormat("Start time of the first Lead-in area in the disc: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME,
|
||||
descriptor.PHOUR).AppendLine();
|
||||
else
|
||||
sb
|
||||
.AppendFormat("Start time of the first Lead-in area in the disc: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME)
|
||||
.AppendLine();
|
||||
sb.
|
||||
AppendFormat("Start time of the first Lead-in area in the disc: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).
|
||||
AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -528,6 +482,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine();
|
||||
sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine();
|
||||
sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -535,23 +490,25 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
if(descriptor.PHOUR > 0)
|
||||
{
|
||||
sb
|
||||
.AppendFormat("Start position of outer part lead-in area: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
sb.
|
||||
AppendFormat("Start position of outer part lead-in area: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME,
|
||||
descriptor.PHOUR).AppendLine();
|
||||
sb
|
||||
.AppendFormat("Stop position of inner part lead-out area: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
|
||||
sb.
|
||||
AppendFormat("Stop position of inner part lead-out area: {3:D2}:{0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.Min, descriptor.Sec, descriptor.Frame,
|
||||
descriptor.HOUR).AppendLine();
|
||||
}
|
||||
else
|
||||
{
|
||||
sb
|
||||
.AppendFormat("Start position of outer part lead-in area: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME)
|
||||
.AppendLine();
|
||||
sb
|
||||
.AppendFormat("Stop position of inner part lead-out area: {0:D2}:{1:D2}:{2:D2}",
|
||||
sb.
|
||||
AppendFormat("Start position of outer part lead-in area: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).
|
||||
AppendLine();
|
||||
|
||||
sb.
|
||||
AppendFormat("Stop position of inner part lead-out area: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.Min, descriptor.Sec, descriptor.Frame).AppendLine();
|
||||
}
|
||||
|
||||
@@ -560,14 +517,16 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
default:
|
||||
{
|
||||
if(descriptor.POINT >= 0x01 && descriptor.POINT <= 0x40)
|
||||
if(descriptor.POINT >= 0x01 &&
|
||||
descriptor.POINT <= 0x40)
|
||||
{
|
||||
sb
|
||||
.AppendFormat("Start time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME)
|
||||
.AppendLine();
|
||||
sb
|
||||
.AppendFormat("Ending time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2}",
|
||||
sb.
|
||||
AppendFormat("Start time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME).
|
||||
AppendLine();
|
||||
|
||||
sb.
|
||||
AppendFormat("Ending time for interval that should be skipped: {0:D2}:{1:D2}:{2:D2}",
|
||||
descriptor.Min, descriptor.Sec, descriptor.Frame).AppendLine();
|
||||
}
|
||||
else
|
||||
@@ -597,6 +556,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
uint id = (uint)((descriptor.Min << 16) + (descriptor.Sec << 8) + descriptor.Frame);
|
||||
sb.AppendFormat("Disc ID: {0:X6}", id & 0x00FFFFFF).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -608,7 +568,52 @@ namespace DiscImageChef.Decoders.CD
|
||||
public static string Prettify(byte[] CDFullTOCResponse)
|
||||
{
|
||||
CDFullTOC? decoded = Decode(CDFullTOCResponse);
|
||||
|
||||
return Prettify(decoded);
|
||||
}
|
||||
|
||||
public struct CDFullTOC
|
||||
{
|
||||
/// <summary>Total size of returned session information minus this field</summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>First complete session number in hex</summary>
|
||||
public byte FirstCompleteSession;
|
||||
/// <summary>Last complete session number in hex</summary>
|
||||
public byte LastCompleteSession;
|
||||
/// <summary>Track descriptors</summary>
|
||||
public TrackDataDescriptor[] TrackDescriptors;
|
||||
}
|
||||
|
||||
public struct TrackDataDescriptor
|
||||
{
|
||||
/// <summary>Byte 0 Session number in hex</summary>
|
||||
public byte SessionNumber;
|
||||
/// <summary>Byte 1, bits 7 to 4 Type of information in Q subchannel of block where this TOC entry was found</summary>
|
||||
public byte ADR;
|
||||
/// <summary>Byte 1, bits 3 to 0 Track attributes</summary>
|
||||
public byte CONTROL;
|
||||
/// <summary>Byte 2</summary>
|
||||
public byte TNO;
|
||||
/// <summary>Byte 3</summary>
|
||||
public byte POINT;
|
||||
/// <summary>Byte 4</summary>
|
||||
public byte Min;
|
||||
/// <summary>Byte 5</summary>
|
||||
public byte Sec;
|
||||
/// <summary>Byte 6</summary>
|
||||
public byte Frame;
|
||||
/// <summary>Byte 7, CD only</summary>
|
||||
public byte Zero;
|
||||
/// <summary>Byte 7, bits 7 to 4, DDCD only</summary>
|
||||
public byte HOUR;
|
||||
/// <summary>Byte 7, bits 3 to 0, DDCD only</summary>
|
||||
public byte PHOUR;
|
||||
/// <summary>Byte 8</summary>
|
||||
public byte PMIN;
|
||||
/// <summary>Byte 9</summary>
|
||||
public byte PSEC;
|
||||
/// <summary>Byte 10</summary>
|
||||
public byte PFRAME;
|
||||
}
|
||||
}
|
||||
}
|
||||
254
CD/PMA.cs
254
CD/PMA.cs
@@ -37,112 +37,22 @@ using DiscImageChef.Console;
|
||||
namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
/// <summary>
|
||||
/// Information from the following standards:
|
||||
/// ANSI X3.304-1997
|
||||
/// T10/1048-D revision 9.0
|
||||
/// T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c
|
||||
/// T10/1228-D revision 11a
|
||||
/// T10/1363-D revision 10g
|
||||
/// T10/1545-D revision 1d
|
||||
/// T10/1545-D revision 5
|
||||
/// T10/1545-D revision 5a
|
||||
/// T10/1675-D revision 2c
|
||||
/// T10/1675-D revision 4
|
||||
/// T10/1836-D revision 2g
|
||||
/// Information from the following standards: ANSI X3.304-1997 T10/1048-D revision 9.0 T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c T10/1228-D revision 11a T10/1363-D revision 10g T10/1545-D revision 1d T10/1545-D revision
|
||||
/// 5 T10/1545-D revision 5a T10/1675-D revision 2c T10/1675-D revision 4 T10/1836-D revision 2g
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class PMA
|
||||
{
|
||||
public struct CDPMA
|
||||
{
|
||||
/// <summary>
|
||||
/// Total size of returned session information minus this field
|
||||
/// </summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>
|
||||
/// Track descriptors
|
||||
/// </summary>
|
||||
public CDPMADescriptors[] PMADescriptors;
|
||||
}
|
||||
|
||||
public struct CDPMADescriptors
|
||||
{
|
||||
/// <summary>
|
||||
/// Byte 0
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved;
|
||||
/// <summary>
|
||||
/// Byte 1, bits 7 to 4
|
||||
/// Type of information in Q subchannel of block where this TOC entry was found
|
||||
/// </summary>
|
||||
public byte ADR;
|
||||
/// <summary>
|
||||
/// Byte 1, bits 3 to 0
|
||||
/// Track attributes
|
||||
/// </summary>
|
||||
public byte CONTROL;
|
||||
/// <summary>
|
||||
/// Byte 2
|
||||
/// </summary>
|
||||
public byte TNO;
|
||||
/// <summary>
|
||||
/// Byte 3
|
||||
/// </summary>
|
||||
public byte POINT;
|
||||
/// <summary>
|
||||
/// Byte 4
|
||||
/// </summary>
|
||||
public byte Min;
|
||||
/// <summary>
|
||||
/// Byte 5
|
||||
/// </summary>
|
||||
public byte Sec;
|
||||
/// <summary>
|
||||
/// Byte 6
|
||||
/// </summary>
|
||||
public byte Frame;
|
||||
/// <summary>
|
||||
/// Byte 7, bits 7 to 4
|
||||
/// </summary>
|
||||
public byte HOUR;
|
||||
/// <summary>
|
||||
/// Byte 7, bits 3 to 0
|
||||
/// </summary>
|
||||
public byte PHOUR;
|
||||
/// <summary>
|
||||
/// Byte 8
|
||||
/// </summary>
|
||||
public byte PMIN;
|
||||
/// <summary>
|
||||
/// Byte 9
|
||||
/// </summary>
|
||||
public byte PSEC;
|
||||
/// <summary>
|
||||
/// Byte 10
|
||||
/// </summary>
|
||||
public byte PFRAME;
|
||||
}
|
||||
|
||||
public static CDPMA? Decode(byte[] CDPMAResponse)
|
||||
{
|
||||
if(CDPMAResponse == null) return null;
|
||||
if(CDPMAResponse == null)
|
||||
return null;
|
||||
|
||||
CDPMA decoded = new CDPMA
|
||||
var decoded = new CDPMA
|
||||
{
|
||||
DataLength = BigEndianBitConverter.ToUInt16(CDPMAResponse, 0),
|
||||
Reserved1 = CDPMAResponse[2],
|
||||
DataLength = BigEndianBitConverter.ToUInt16(CDPMAResponse, 0), Reserved1 = CDPMAResponse[2],
|
||||
Reserved2 = CDPMAResponse[3]
|
||||
};
|
||||
|
||||
@@ -153,6 +63,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
DicConsole.DebugWriteLine("CD PMA decoder",
|
||||
"Expected CDPMA size ({0} bytes) is not received size ({1} bytes), not decoding",
|
||||
decoded.DataLength + 2, CDPMAResponse.Length);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -178,22 +89,27 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
public static string Prettify(CDPMA? CDPMAResponse)
|
||||
{
|
||||
if(CDPMAResponse == null) return null;
|
||||
if(CDPMAResponse == null)
|
||||
return null;
|
||||
|
||||
CDPMA response = CDPMAResponse.Value;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
|
||||
#if DEBUG
|
||||
if(response.Reserved1 != 0) sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine();
|
||||
if(response.Reserved2 != 0) sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine();
|
||||
#endif
|
||||
#if DEBUG
|
||||
if(response.Reserved1 != 0)
|
||||
sb.AppendFormat("Reserved1 = 0x{0:X2}", response.Reserved1).AppendLine();
|
||||
|
||||
if(response.Reserved2 != 0)
|
||||
sb.AppendFormat("Reserved2 = 0x{0:X2}", response.Reserved2).AppendLine();
|
||||
#endif
|
||||
|
||||
foreach(CDPMADescriptors descriptor in response.PMADescriptors)
|
||||
{
|
||||
#if DEBUG
|
||||
if(descriptor.Reserved != 0) sb.AppendFormat("Reserved = 0x{0:X2}", descriptor.Reserved).AppendLine();
|
||||
#endif
|
||||
#if DEBUG
|
||||
if(descriptor.Reserved != 0)
|
||||
sb.AppendFormat("Reserved = 0x{0:X2}", descriptor.Reserved).AppendLine();
|
||||
#endif
|
||||
|
||||
switch(descriptor.ADR)
|
||||
{
|
||||
@@ -201,25 +117,32 @@ namespace DiscImageChef.Decoders.CD
|
||||
if(descriptor.POINT > 0)
|
||||
{
|
||||
sb.AppendFormat("Track {0}", descriptor.POINT);
|
||||
|
||||
switch((TocControl)(descriptor.CONTROL & 0x0D))
|
||||
{
|
||||
case TocControl.TwoChanNoPreEmph:
|
||||
sb.Append(" (Stereo audio track with no pre-emphasis)");
|
||||
|
||||
break;
|
||||
case TocControl.TwoChanPreEmph:
|
||||
sb.Append(" (Stereo audio track with 50/15 μs pre-emphasis)");
|
||||
|
||||
break;
|
||||
case TocControl.FourChanNoPreEmph:
|
||||
sb.Append(" (Quadraphonic audio track with no pre-emphasis)");
|
||||
|
||||
break;
|
||||
case TocControl.FourChanPreEmph:
|
||||
sb.Append(" (Quadraphonic audio track with 50/15 μs pre-emphasis)");
|
||||
|
||||
break;
|
||||
case TocControl.DataTrack:
|
||||
sb.Append(" (Data track, recorded uninterrupted)");
|
||||
|
||||
break;
|
||||
case TocControl.DataTrackIncremental:
|
||||
sb.Append(" (Data track, recorded incrementally)");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -229,6 +152,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
else
|
||||
sb.AppendFormat(" starts at {0:D2}:{1:D2}:{2:D2}", descriptor.PMIN, descriptor.PSEC,
|
||||
descriptor.PFRAME);
|
||||
|
||||
if(descriptor.PHOUR > 0)
|
||||
sb.AppendFormat(" and ends at {3}:{0:D2}:{1:D2}:{2:D2}", descriptor.Min, descriptor.Sec,
|
||||
descriptor.Frame, descriptor.HOUR);
|
||||
@@ -238,60 +162,100 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
sb.AppendLine();
|
||||
}
|
||||
else goto default;
|
||||
else
|
||||
goto default;
|
||||
|
||||
break;
|
||||
case 2:
|
||||
uint id = (uint)((descriptor.Min << 16) + (descriptor.Sec << 8) + descriptor.Frame);
|
||||
sb.AppendFormat("Disc ID: {0:X6}", id & 0x00FFFFFF).AppendLine();
|
||||
|
||||
break;
|
||||
case 3:
|
||||
sb.AppendFormat("Skip track assignment {0} says that tracks ", descriptor.POINT);
|
||||
if(descriptor.Min > 0) sb.AppendFormat("{0} ", descriptor.Min);
|
||||
if(descriptor.Sec > 0) sb.AppendFormat("{0} ", descriptor.Sec);
|
||||
if(descriptor.Frame > 0) sb.AppendFormat("{0} ", descriptor.Frame);
|
||||
if(descriptor.PMIN > 0) sb.AppendFormat("{0} ", descriptor.PMIN);
|
||||
if(descriptor.PSEC > 0) sb.AppendFormat("{0} ", descriptor.PSEC);
|
||||
if(descriptor.PFRAME > 0) sb.AppendFormat("{0} ", descriptor.PFRAME);
|
||||
|
||||
if(descriptor.Min > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.Min);
|
||||
|
||||
if(descriptor.Sec > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.Sec);
|
||||
|
||||
if(descriptor.Frame > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.Frame);
|
||||
|
||||
if(descriptor.PMIN > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.PMIN);
|
||||
|
||||
if(descriptor.PSEC > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.PSEC);
|
||||
|
||||
if(descriptor.PFRAME > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.PFRAME);
|
||||
|
||||
sb.AppendLine("should be skipped");
|
||||
|
||||
break;
|
||||
case 4:
|
||||
sb.AppendFormat("Unskip track assignment {0} says that tracks ", descriptor.POINT);
|
||||
if(descriptor.Min > 0) sb.AppendFormat("{0} ", descriptor.Min);
|
||||
if(descriptor.Sec > 0) sb.AppendFormat("{0} ", descriptor.Sec);
|
||||
if(descriptor.Frame > 0) sb.AppendFormat("{0} ", descriptor.Frame);
|
||||
if(descriptor.PMIN > 0) sb.AppendFormat("{0} ", descriptor.PMIN);
|
||||
if(descriptor.PSEC > 0) sb.AppendFormat("{0} ", descriptor.PSEC);
|
||||
if(descriptor.PFRAME > 0) sb.AppendFormat("{0} ", descriptor.PFRAME);
|
||||
|
||||
if(descriptor.Min > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.Min);
|
||||
|
||||
if(descriptor.Sec > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.Sec);
|
||||
|
||||
if(descriptor.Frame > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.Frame);
|
||||
|
||||
if(descriptor.PMIN > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.PMIN);
|
||||
|
||||
if(descriptor.PSEC > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.PSEC);
|
||||
|
||||
if(descriptor.PFRAME > 0)
|
||||
sb.AppendFormat("{0} ", descriptor.PFRAME);
|
||||
|
||||
sb.AppendLine("should not be skipped");
|
||||
|
||||
break;
|
||||
case 5:
|
||||
sb.AppendFormat("Skip time interval assignment {0} says that from ", descriptor.POINT);
|
||||
|
||||
if(descriptor.PHOUR > 0)
|
||||
sb.AppendFormat("{3}:{0:D2}:{1:D2}:{2:D2} to ", descriptor.PMIN, descriptor.PSEC,
|
||||
descriptor.PFRAME, descriptor.PHOUR);
|
||||
else
|
||||
sb.AppendFormat("{0:D2}:{1:D2}:{2:D2} to ", descriptor.PMIN, descriptor.PSEC,
|
||||
descriptor.PFRAME);
|
||||
|
||||
if(descriptor.PHOUR > 0)
|
||||
sb.AppendFormat("{3}:{0:D2}:{1:D2}:{2:D2} ", descriptor.Min, descriptor.Sec,
|
||||
descriptor.Frame, descriptor.HOUR);
|
||||
else sb.AppendFormat("{0:D2}:{1:D2}:{2:D2} ", descriptor.Min, descriptor.Sec, descriptor.Frame);
|
||||
else
|
||||
sb.AppendFormat("{0:D2}:{1:D2}:{2:D2} ", descriptor.Min, descriptor.Sec, descriptor.Frame);
|
||||
|
||||
sb.AppendLine("should be skipped");
|
||||
|
||||
break;
|
||||
case 6:
|
||||
sb.AppendFormat("Unskip time interval assignment {0} says that from ", descriptor.POINT);
|
||||
|
||||
if(descriptor.PHOUR > 0)
|
||||
sb.AppendFormat("{3}:{0:D2}:{1:D2}:{2:D2} to ", descriptor.PMIN, descriptor.PSEC,
|
||||
descriptor.PFRAME, descriptor.PHOUR);
|
||||
else
|
||||
sb.AppendFormat("{0:D2}:{1:D2}:{2:D2} to ", descriptor.PMIN, descriptor.PSEC,
|
||||
descriptor.PFRAME);
|
||||
|
||||
if(descriptor.PHOUR > 0)
|
||||
sb.AppendFormat("{3}:{0:D2}:{1:D2}:{2:D2} ", descriptor.Min, descriptor.Sec,
|
||||
descriptor.Frame, descriptor.HOUR);
|
||||
else sb.AppendFormat("{0:D2}:{1:D2}:{2:D2} ", descriptor.Min, descriptor.Sec, descriptor.Frame);
|
||||
else
|
||||
sb.AppendFormat("{0:D2}:{1:D2}:{2:D2} ", descriptor.Min, descriptor.Sec, descriptor.Frame);
|
||||
|
||||
sb.AppendLine("should not be skipped");
|
||||
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -307,6 +271,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
sb.AppendFormat("PMIN = {0}", descriptor.PMIN).AppendLine();
|
||||
sb.AppendFormat("PSEC = {0}", descriptor.PSEC).AppendLine();
|
||||
sb.AppendFormat("PFRAME = {0}", descriptor.PFRAME).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -317,7 +282,50 @@ namespace DiscImageChef.Decoders.CD
|
||||
public static string Prettify(byte[] CDPMAResponse)
|
||||
{
|
||||
CDPMA? decoded = Decode(CDPMAResponse);
|
||||
|
||||
return Prettify(decoded);
|
||||
}
|
||||
|
||||
public struct CDPMA
|
||||
{
|
||||
/// <summary>Total size of returned session information minus this field</summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>Reserved</summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>Reserved</summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>Track descriptors</summary>
|
||||
public CDPMADescriptors[] PMADescriptors;
|
||||
}
|
||||
|
||||
public struct CDPMADescriptors
|
||||
{
|
||||
/// <summary>Byte 0 Reserved</summary>
|
||||
public byte Reserved;
|
||||
/// <summary>Byte 1, bits 7 to 4 Type of information in Q subchannel of block where this TOC entry was found</summary>
|
||||
public byte ADR;
|
||||
/// <summary>Byte 1, bits 3 to 0 Track attributes</summary>
|
||||
public byte CONTROL;
|
||||
/// <summary>Byte 2</summary>
|
||||
public byte TNO;
|
||||
/// <summary>Byte 3</summary>
|
||||
public byte POINT;
|
||||
/// <summary>Byte 4</summary>
|
||||
public byte Min;
|
||||
/// <summary>Byte 5</summary>
|
||||
public byte Sec;
|
||||
/// <summary>Byte 6</summary>
|
||||
public byte Frame;
|
||||
/// <summary>Byte 7, bits 7 to 4</summary>
|
||||
public byte HOUR;
|
||||
/// <summary>Byte 7, bits 3 to 0</summary>
|
||||
public byte PHOUR;
|
||||
/// <summary>Byte 8</summary>
|
||||
public byte PMIN;
|
||||
/// <summary>Byte 9</summary>
|
||||
public byte PSEC;
|
||||
/// <summary>Byte 10</summary>
|
||||
public byte PFRAME;
|
||||
}
|
||||
}
|
||||
}
|
||||
294
CD/Sector.cs
294
CD/Sector.cs
@@ -36,152 +36,143 @@ using System.Linq;
|
||||
|
||||
namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class Sector
|
||||
{
|
||||
public static readonly byte[] ScrambleTable =
|
||||
{
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00,
|
||||
0x28, 0x00, 0x1E, 0x80, 0x08, 0x60, 0x06, 0xA8, 0x02, 0xFE, 0x81, 0x80, 0x60, 0x60, 0x28, 0x28, 0x1E,
|
||||
0x9E, 0x88, 0x68, 0x66, 0xAE, 0xAA, 0xFC, 0x7F, 0x01, 0xE0, 0x00, 0x48, 0x00, 0x36, 0x80, 0x16, 0xE0,
|
||||
0x0E, 0xC8, 0x04, 0x56, 0x83, 0x7E, 0xE1, 0xE0, 0x48, 0x48, 0x36, 0xB6, 0x96, 0xF6, 0xEE, 0xC6, 0xCC,
|
||||
0x52, 0xD5, 0xFD, 0x9F, 0x01, 0xA8, 0x00, 0x7E, 0x80, 0x20, 0x60, 0x18, 0x28, 0x0A, 0x9E, 0x87, 0x28,
|
||||
0x62, 0x9E, 0xA9, 0xA8, 0x7E, 0xFE, 0xA0, 0x40, 0x78, 0x30, 0x22, 0x94, 0x19, 0xAF, 0x4A, 0xFC, 0x37,
|
||||
0x01, 0xD6, 0x80, 0x5E, 0xE0, 0x38, 0x48, 0x12, 0xB6, 0x8D, 0xB6, 0xE5, 0xB6, 0xCB, 0x36, 0xD7, 0x56,
|
||||
0xDE, 0xBE, 0xD8, 0x70, 0x5A, 0xA4, 0x3B, 0x3B, 0x53, 0x53, 0x7D, 0xFD, 0xE1, 0x81, 0x88, 0x60, 0x66,
|
||||
0xA8, 0x2A, 0xFE, 0x9F, 0x00, 0x68, 0x00, 0x2E, 0x80, 0x1C, 0x60, 0x09, 0xE8, 0x06, 0xCE, 0x82, 0xD4,
|
||||
0x61, 0x9F, 0x68, 0x68, 0x2E, 0xAE, 0x9C, 0x7C, 0x69, 0xE1, 0xEE, 0xC8, 0x4C, 0x56, 0xB5, 0xFE, 0xF7,
|
||||
0x00, 0x46, 0x80, 0x32, 0xE0, 0x15, 0x88, 0x0F, 0x26, 0x84, 0x1A, 0xE3, 0x4B, 0x09, 0xF7, 0x46, 0xC6,
|
||||
0xB2, 0xD2, 0xF5, 0x9D, 0x87, 0x29, 0xA2, 0x9E, 0xF9, 0xA8, 0x42, 0xFE, 0xB1, 0x80, 0x74, 0x60, 0x27,
|
||||
0x68, 0x1A, 0xAE, 0x8B, 0x3C, 0x67, 0x51, 0xEA, 0xBC, 0x4F, 0x31, 0xF4, 0x14, 0x47, 0x4F, 0x72, 0xB4,
|
||||
0x25, 0xB7, 0x5B, 0x36, 0xBB, 0x56, 0xF3, 0x7E, 0xC5, 0xE0, 0x53, 0x08, 0x3D, 0xC6, 0x91, 0x92, 0xEC,
|
||||
0x6D, 0x8D, 0xED, 0xA5, 0x8D, 0xBB, 0x25, 0xB3, 0x5B, 0x35, 0xFB, 0x57, 0x03, 0x7E, 0x81, 0xE0, 0x60,
|
||||
0x48, 0x28, 0x36, 0x9E, 0x96, 0xE8, 0x6E, 0xCE, 0xAC, 0x54, 0x7D, 0xFF, 0x61, 0x80, 0x28, 0x60, 0x1E,
|
||||
0xA8, 0x08, 0x7E, 0x86, 0xA0, 0x62, 0xF8, 0x29, 0x82, 0x9E, 0xE1, 0xA8, 0x48, 0x7E, 0xB6, 0xA0, 0x76,
|
||||
0xF8, 0x26, 0xC2, 0x9A, 0xD1, 0xAB, 0x1C, 0x7F, 0x49, 0xE0, 0x36, 0xC8, 0x16, 0xD6, 0x8E, 0xDE, 0xE4,
|
||||
0x58, 0x4B, 0x7A, 0xB7, 0x63, 0x36, 0xA9, 0xD6, 0xFE, 0xDE, 0xC0, 0x58, 0x50, 0x3A, 0xBC, 0x13, 0x31,
|
||||
0xCD, 0xD4, 0x55, 0x9F, 0x7F, 0x28, 0x20, 0x1E, 0x98, 0x08, 0x6A, 0x86, 0xAF, 0x22, 0xFC, 0x19, 0x81,
|
||||
0xCA, 0xE0, 0x57, 0x08, 0x3E, 0x86, 0x90, 0x62, 0xEC, 0x29, 0x8D, 0xDE, 0xE5, 0x98, 0x4B, 0x2A, 0xB7,
|
||||
0x5F, 0x36, 0xB8, 0x16, 0xF2, 0x8E, 0xC5, 0xA4, 0x53, 0x3B, 0x7D, 0xD3, 0x61, 0x9D, 0xE8, 0x69, 0x8E,
|
||||
0xAE, 0xE4, 0x7C, 0x4B, 0x61, 0xF7, 0x68, 0x46, 0xAE, 0xB2, 0xFC, 0x75, 0x81, 0xE7, 0x20, 0x4A, 0x98,
|
||||
0x37, 0x2A, 0x96, 0x9F, 0x2E, 0xE8, 0x1C, 0x4E, 0x89, 0xF4, 0x66, 0xC7, 0x6A, 0xD2, 0xAF, 0x1D, 0xBC,
|
||||
0x09, 0xB1, 0xC6, 0xF4, 0x52, 0xC7, 0x7D, 0x92, 0xA1, 0xAD, 0xB8, 0x7D, 0xB2, 0xA1, 0xB5, 0xB8, 0x77,
|
||||
0x32, 0xA6, 0x95, 0xBA, 0xEF, 0x33, 0x0C, 0x15, 0xC5, 0xCF, 0x13, 0x14, 0x0D, 0xCF, 0x45, 0x94, 0x33,
|
||||
0x2F, 0x55, 0xDC, 0x3F, 0x19, 0xD0, 0x0A, 0xDC, 0x07, 0x19, 0xC2, 0x8A, 0xD1, 0xA7, 0x1C, 0x7A, 0x89,
|
||||
0xE3, 0x26, 0xC9, 0xDA, 0xD6, 0xDB, 0x1E, 0xDB, 0x48, 0x5B, 0x76, 0xBB, 0x66, 0xF3, 0x6A, 0xC5, 0xEF,
|
||||
0x13, 0x0C, 0x0D, 0xC5, 0xC5, 0x93, 0x13, 0x2D, 0xCD, 0xDD, 0x95, 0x99, 0xAF, 0x2A, 0xFC, 0x1F, 0x01,
|
||||
0xC8, 0x00, 0x56, 0x80, 0x3E, 0xE0, 0x10, 0x48, 0x0C, 0x36, 0x85, 0xD6, 0xE3, 0x1E, 0xC9, 0xC8, 0x56,
|
||||
0xD6, 0xBE, 0xDE, 0xF0, 0x58, 0x44, 0x3A, 0xB3, 0x53, 0x35, 0xFD, 0xD7, 0x01, 0x9E, 0x80, 0x68, 0x60,
|
||||
0x2E, 0xA8, 0x1C, 0x7E, 0x89, 0xE0, 0x66, 0xC8, 0x2A, 0xD6, 0x9F, 0x1E, 0xE8, 0x08, 0x4E, 0x86, 0xB4,
|
||||
0x62, 0xF7, 0x69, 0x86, 0xAE, 0xE2, 0xFC, 0x49, 0x81, 0xF6, 0xE0, 0x46, 0xC8, 0x32, 0xD6, 0x95, 0x9E,
|
||||
0xEF, 0x28, 0x4C, 0x1E, 0xB5, 0xC8, 0x77, 0x16, 0xA6, 0x8E, 0xFA, 0xE4, 0x43, 0x0B, 0x71, 0xC7, 0x64,
|
||||
0x52, 0xAB, 0x7D, 0xBF, 0x61, 0xB0, 0x28, 0x74, 0x1E, 0xA7, 0x48, 0x7A, 0xB6, 0xA3, 0x36, 0xF9, 0xD6,
|
||||
0xC2, 0xDE, 0xD1, 0x98, 0x5C, 0x6A, 0xB9, 0xEF, 0x32, 0xCC, 0x15, 0x95, 0xCF, 0x2F, 0x14, 0x1C, 0x0F,
|
||||
0x49, 0xC4, 0x36, 0xD3, 0x56, 0xDD, 0xFE, 0xD9, 0x80, 0x5A, 0xE0, 0x3B, 0x08, 0x13, 0x46, 0x8D, 0xF2,
|
||||
0xE5, 0x85, 0x8B, 0x23, 0x27, 0x59, 0xDA, 0xBA, 0xDB, 0x33, 0x1B, 0x55, 0xCB, 0x7F, 0x17, 0x60, 0x0E,
|
||||
0xA8, 0x04, 0x7E, 0x83, 0x60, 0x61, 0xE8, 0x28, 0x4E, 0x9E, 0xB4, 0x68, 0x77, 0x6E, 0xA6, 0xAC, 0x7A,
|
||||
0xFD, 0xE3, 0x01, 0x89, 0xC0, 0x66, 0xD0, 0x2A, 0xDC, 0x1F, 0x19, 0xC8, 0x0A, 0xD6, 0x87, 0x1E, 0xE2,
|
||||
0x88, 0x49, 0xA6, 0xB6, 0xFA, 0xF6, 0xC3, 0x06, 0xD1, 0xC2, 0xDC, 0x51, 0x99, 0xFC, 0x6A, 0xC1, 0xEF,
|
||||
0x10, 0x4C, 0x0C, 0x35, 0xC5, 0xD7, 0x13, 0x1E, 0x8D, 0xC8, 0x65, 0x96, 0xAB, 0x2E, 0xFF, 0x5C, 0x40,
|
||||
0x39, 0xF0, 0x12, 0xC4, 0x0D, 0x93, 0x45, 0xAD, 0xF3, 0x3D, 0x85, 0xD1, 0xA3, 0x1C, 0x79, 0xC9, 0xE2,
|
||||
0xD6, 0xC9, 0x9E, 0xD6, 0xE8, 0x5E, 0xCE, 0xB8, 0x54, 0x72, 0xBF, 0x65, 0xB0, 0x2B, 0x34, 0x1F, 0x57,
|
||||
0x48, 0x3E, 0xB6, 0x90, 0x76, 0xEC, 0x26, 0xCD, 0xDA, 0xD5, 0x9B, 0x1F, 0x2B, 0x48, 0x1F, 0x76, 0x88,
|
||||
0x26, 0xE6, 0x9A, 0xCA, 0xEB, 0x17, 0x0F, 0x4E, 0x84, 0x34, 0x63, 0x57, 0x69, 0xFE, 0xAE, 0xC0, 0x7C,
|
||||
0x50, 0x21, 0xFC, 0x18, 0x41, 0xCA, 0xB0, 0x57, 0x34, 0x3E, 0x97, 0x50, 0x6E, 0xBC, 0x2C, 0x71, 0xDD,
|
||||
0xE4, 0x59, 0x8B, 0x7A, 0xE7, 0x63, 0x0A, 0xA9, 0xC7, 0x3E, 0xD2, 0x90, 0x5D, 0xAC, 0x39, 0xBD, 0xD2,
|
||||
0xF1, 0x9D, 0x84, 0x69, 0xA3, 0x6E, 0xF9, 0xEC, 0x42, 0xCD, 0xF1, 0x95, 0x84, 0x6F, 0x23, 0x6C, 0x19,
|
||||
0xED, 0xCA, 0xCD, 0x97, 0x15, 0xAE, 0x8F, 0x3C, 0x64, 0x11, 0xEB, 0x4C, 0x4F, 0x75, 0xF4, 0x27, 0x07,
|
||||
0x5A, 0x82, 0xBB, 0x21, 0xB3, 0x58, 0x75, 0xFA, 0xA7, 0x03, 0x3A, 0x81, 0xD3, 0x20, 0x5D, 0xD8, 0x39,
|
||||
0x9A, 0x92, 0xEB, 0x2D, 0x8F, 0x5D, 0xA4, 0x39, 0xBB, 0x52, 0xF3, 0x7D, 0x85, 0xE1, 0xA3, 0x08, 0x79,
|
||||
0xC6, 0xA2, 0xD2, 0xF9, 0x9D, 0x82, 0xE9, 0xA1, 0x8E, 0xF8, 0x64, 0x42, 0xAB, 0x71, 0xBF, 0x64, 0x70,
|
||||
0x2B, 0x64, 0x1F, 0x6B, 0x48, 0x2F, 0x76, 0x9C, 0x26, 0xE9, 0xDA, 0xCE, 0xDB, 0x14, 0x5B, 0x4F, 0x7B,
|
||||
0x74, 0x23, 0x67, 0x59, 0xEA, 0xBA, 0xCF, 0x33, 0x14, 0x15, 0xCF, 0x4F, 0x14, 0x34, 0x0F, 0x57, 0x44,
|
||||
0x3E, 0xB3, 0x50, 0x75, 0xFC, 0x27, 0x01, 0xDA, 0x80, 0x5B, 0x20, 0x3B, 0x58, 0x13, 0x7A, 0x8D, 0xE3,
|
||||
0x25, 0x89, 0xDB, 0x26, 0xDB, 0x5A, 0xDB, 0x7B, 0x1B, 0x63, 0x4B, 0x69, 0xF7, 0x6E, 0xC6, 0xAC, 0x52,
|
||||
0xFD, 0xFD, 0x81, 0x81, 0xA0, 0x60, 0x78, 0x28, 0x22, 0x9E, 0x99, 0xA8, 0x6A, 0xFE, 0xAF, 0x00, 0x7C,
|
||||
0x00, 0x21, 0xC0, 0x18, 0x50, 0x0A, 0xBC, 0x07, 0x31, 0xC2, 0x94, 0x51, 0xAF, 0x7C, 0x7C, 0x21, 0xE1,
|
||||
0xD8, 0x48, 0x5A, 0xB6, 0xBB, 0x36, 0xF3, 0x56, 0xC5, 0xFE, 0xD3, 0x00, 0x5D, 0xC0, 0x39, 0x90, 0x12,
|
||||
0xEC, 0x0D, 0x8D, 0xC5, 0xA5, 0x93, 0x3B, 0x2D, 0xD3, 0x5D, 0x9D, 0xF9, 0xA9, 0x82, 0xFE, 0xE1, 0x80,
|
||||
0x48, 0x60, 0x36, 0xA8, 0x16, 0xFE, 0x8E, 0xC0, 0x64, 0x50, 0x2B, 0x7C, 0x1F, 0x61, 0xC8, 0x28, 0x56,
|
||||
0x9E, 0xBE, 0xE8, 0x70, 0x4E, 0xA4, 0x34, 0x7B, 0x57, 0x63, 0x7E, 0xA9, 0xE0, 0x7E, 0xC8, 0x20, 0x56,
|
||||
0x98, 0x3E, 0xEA, 0x90, 0x4F, 0x2C, 0x34, 0x1D, 0xD7, 0x49, 0x9E, 0xB6, 0xE8, 0x76, 0xCE, 0xA6, 0xD4,
|
||||
0x7A, 0xDF, 0x63, 0x18, 0x29, 0xCA, 0x9E, 0xD7, 0x28, 0x5E, 0x9E, 0xB8, 0x68, 0x72, 0xAE, 0xA5, 0xBC,
|
||||
0x7B, 0x31, 0xE3, 0x54, 0x49, 0xFF, 0x76, 0xC0, 0x26, 0xD0, 0x1A, 0xDC, 0x0B, 0x19, 0xC7, 0x4A, 0xD2,
|
||||
0xB7, 0x1D, 0xB6, 0x89, 0xB6, 0xE6, 0xF6, 0xCA, 0xC6, 0xD7, 0x12, 0xDE, 0x8D, 0x98, 0x65, 0xAA, 0xAB,
|
||||
0x3F, 0x3F, 0x50, 0x10, 0x3C, 0x0C, 0x11, 0xC5, 0xCC, 0x53, 0x15, 0xFD, 0xCF, 0x01, 0x94, 0x00, 0x6F,
|
||||
0x40, 0x2C, 0x30, 0x1D, 0xD4, 0x09, 0x9F, 0x46, 0xE8, 0x32, 0xCE, 0x95, 0x94, 0x6F, 0x2F, 0x6C, 0x1C,
|
||||
0x2D, 0xC9, 0xDD, 0x96, 0xD9, 0xAE, 0xDA, 0xFC, 0x5B, 0x01, 0xFB, 0x40, 0x43, 0x70, 0x31, 0xE4, 0x14,
|
||||
0x4B, 0x4F, 0x77, 0x74, 0x26, 0xA7, 0x5A, 0xFA, 0xBB, 0x03, 0x33, 0x41, 0xD5, 0xF0, 0x5F, 0x04, 0x38,
|
||||
0x03, 0x52, 0x81, 0xFD, 0xA0, 0x41, 0xB8, 0x30, 0x72, 0x94, 0x25, 0xAF, 0x5B, 0x3C, 0x3B, 0x51, 0xD3,
|
||||
0x7C, 0x5D, 0xE1, 0xF9, 0x88, 0x42, 0xE6, 0xB1, 0x8A, 0xF4, 0x67, 0x07, 0x6A, 0x82, 0xAF, 0x21, 0xBC,
|
||||
0x18, 0x71, 0xCA, 0xA4, 0x57, 0x3B, 0x7E, 0x93, 0x60, 0x6D, 0xE8, 0x2D, 0x8E, 0x9D, 0xA4, 0x69, 0xBB,
|
||||
0x6E, 0xF3, 0x6C, 0x45, 0xED, 0xF3, 0x0D, 0x85, 0xC5, 0xA3, 0x13, 0x39, 0xCD, 0xD2, 0xD5, 0x9D, 0x9F,
|
||||
0x29, 0xA8, 0x1E, 0xFE, 0x88, 0x40, 0x66, 0xB0, 0x2A, 0xF4, 0x1F, 0x07, 0x48, 0x02, 0xB6, 0x81, 0xB6,
|
||||
0xE0, 0x76, 0xC8, 0x26, 0xD6, 0x9A, 0xDE, 0xEB, 0x18, 0x4F, 0x4A, 0xB4, 0x37, 0x37, 0x56, 0x96, 0xBE,
|
||||
0xEE, 0xF0, 0x4C, 0x44, 0x35, 0xF3, 0x57, 0x05, 0xFE, 0x83, 0x00, 0x61, 0xC0, 0x28, 0x50, 0x1E, 0xBC,
|
||||
0x08, 0x71, 0xC6, 0xA4, 0x52, 0xFB, 0x7D, 0x83, 0x61, 0xA1, 0xE8, 0x78, 0x4E, 0xA2, 0xB4, 0x79, 0xB7,
|
||||
0x62, 0xF6, 0xA9, 0x86, 0xFE, 0xE2, 0xC0, 0x49, 0x90, 0x36, 0xEC, 0x16, 0xCD, 0xCE, 0xD5, 0x94, 0x5F,
|
||||
0x2F, 0x78, 0x1C, 0x22, 0x89, 0xD9, 0xA6, 0xDA, 0xFA, 0xDB, 0x03, 0x1B, 0x41, 0xCB, 0x70, 0x57, 0x64,
|
||||
0x3E, 0xAB, 0x50, 0x7F, 0x7C, 0x20, 0x21, 0xD8, 0x18, 0x5A, 0x8A, 0xBB, 0x27, 0x33, 0x5A, 0x95, 0xFB,
|
||||
0x2F, 0x03, 0x5C, 0x01, 0xF9, 0xC0, 0x42, 0xD0, 0x31, 0x9C, 0x14, 0x69, 0xCF, 0x6E, 0xD4, 0x2C, 0x5F,
|
||||
0x5D, 0xF8, 0x39, 0x82, 0x92, 0xE1, 0xAD, 0x88, 0x7D, 0xA6, 0xA1, 0xBA, 0xF8, 0x73, 0x02, 0xA5, 0xC1,
|
||||
0xBB, 0x10, 0x73, 0x4C, 0x25, 0xF5, 0xDB, 0x07, 0x1B, 0x42, 0x8B, 0x71, 0xA7, 0x64, 0x7A, 0xAB, 0x63,
|
||||
0x3F, 0x69, 0xD0, 0x2E, 0xDC, 0x1C, 0x59, 0xC9, 0xFA, 0xD6, 0xC3, 0x1E, 0xD1, 0xC8, 0x5C, 0x56, 0xB9,
|
||||
0xFE, 0xF2, 0xC0, 0x45, 0x90, 0x33, 0x2C, 0x15, 0xDD, 0xCF, 0x19, 0x94, 0x0A, 0xEF, 0x47, 0x0C, 0x32,
|
||||
0x85, 0xD5, 0xA3, 0x1F, 0x39, 0xC8, 0x12, 0xD6, 0x8D, 0x9E, 0xE5, 0xA8, 0x4B, 0x3E, 0xB7, 0x50, 0x76,
|
||||
0xBC, 0x26, 0xF1, 0xDA, 0xC4, 0x5B, 0x13, 0x7B, 0x4D, 0xE3, 0x75, 0x89, 0xE7, 0x26, 0xCA, 0x9A, 0xD7,
|
||||
0x2B, 0x1E, 0x9F, 0x48, 0x68, 0x36, 0xAE, 0x96, 0xFC, 0x6E, 0xC1, 0xEC, 0x50, 0x4D, 0xFC, 0x35, 0x81,
|
||||
0xD7, 0x20, 0x5E, 0x98, 0x38, 0x6A, 0x92, 0xAF, 0x2D, 0xBC, 0x1D, 0xB1, 0xC9, 0xB4, 0x56, 0xF7, 0x7E,
|
||||
0xC6, 0xA0, 0x52, 0xF8, 0x3D, 0x82, 0x91, 0xA1, 0xAC, 0x78, 0x7D, 0xE2, 0xA1, 0x89, 0xB8, 0x66, 0xF2,
|
||||
0xAA, 0xC5, 0xBF, 0x13, 0x30, 0x0D, 0xD4, 0x05, 0x9F, 0x43, 0x28, 0x31, 0xDE, 0x94, 0x58, 0x6F, 0x7A,
|
||||
0xAC, 0x23, 0x3D, 0xD9, 0xD1, 0x9A, 0xDC, 0x6B, 0x19, 0xEF, 0x4A, 0xCC, 0x37, 0x15, 0xD6, 0x8F, 0x1E,
|
||||
0xE4, 0x08, 0x4B, 0x46, 0xB7, 0x72, 0xF6, 0xA5, 0x86, 0xFB, 0x22, 0xC3, 0x59, 0x91, 0xFA, 0xEC, 0x43,
|
||||
0x0D, 0xF1, 0xC5, 0x84, 0x53, 0x23, 0x7D, 0xD9, 0xE1, 0x9A, 0xC8, 0x6B, 0x16, 0xAF, 0x4E, 0xFC, 0x34,
|
||||
0x41, 0xD7, 0x70, 0x5E, 0xA4, 0x38, 0x7B, 0x52, 0xA3, 0x7D, 0xB9, 0xE1, 0xB2, 0xC8, 0x75, 0x96, 0xA7,
|
||||
0x2E, 0xFA, 0x9C, 0x43, 0x29, 0xF1, 0xDE, 0xC4, 0x58, 0x53, 0x7A, 0xBD, 0xE3, 0x31, 0x89, 0xD4, 0x66,
|
||||
0xDF, 0x6A, 0xD8, 0x2F, 0x1A, 0x9C, 0x0B, 0x29, 0xC7, 0x5E, 0xD2, 0xB8, 0x5D, 0xB2, 0xB9, 0xB5, 0xB2,
|
||||
0xF7, 0x35, 0x86, 0x97, 0x22, 0xEE, 0x99, 0x8C, 0x6A, 0xE5, 0xEF, 0x0B, 0x0C, 0x07, 0x45, 0xC2, 0xB3,
|
||||
0x11, 0xB5, 0xCC, 0x77, 0x15, 0xE6, 0x8F, 0x0A, 0xE4, 0x07, 0x0B, 0x42, 0x87, 0x71, 0xA2, 0xA4, 0x79,
|
||||
0xBB, 0x62, 0xF3, 0x69, 0x85, 0xEE, 0xE3, 0x0C, 0x49, 0xC5, 0xF6, 0xD3, 0x06, 0xDD, 0xC2, 0xD9, 0x91,
|
||||
0x9A, 0xEC, 0x6B, 0x0D, 0xEF, 0x45, 0x8C, 0x33, 0x25, 0xD5, 0xDB, 0x1F, 0x1B, 0x48, 0x0B, 0x76, 0x87,
|
||||
0x66, 0xE2, 0xAA, 0xC9, 0xBF, 0x16, 0xF0, 0x0E, 0xC4, 0x04, 0x53, 0x43, 0x7D, 0xF1, 0xE1, 0x84, 0x48,
|
||||
0x63, 0x76, 0xA9, 0xE6, 0xFE, 0xCA, 0xC0, 0x57, 0x10, 0x3E, 0x8C, 0x10, 0x65, 0xCC, 0x2B, 0x15, 0xDF,
|
||||
0x4F, 0x18, 0x34, 0x0A, 0x97, 0x47, 0x2E, 0xB2, 0x9C, 0x75, 0xA9, 0xE7, 0x3E, 0xCA, 0x90, 0x57, 0x2C,
|
||||
0x3E, 0x9D, 0xD0, 0x69, 0x9C, 0x2E, 0xE9, 0xDC, 0x4E, 0xD9, 0xF4, 0x5A, 0xC7, 0x7B, 0x12, 0xA3, 0x4D,
|
||||
0xB9, 0xF5, 0xB2, 0xC7, 0x35, 0x92, 0x97, 0x2D, 0xAE, 0x9D, 0xBC, 0x69, 0xB1, 0xEE, 0xF4, 0x4C, 0x47,
|
||||
0x75, 0xF2, 0xA7, 0x05, 0xBA, 0x83, 0x33, 0x21, 0xD5, 0xD8, 0x5F, 0x1A, 0xB8, 0x0B, 0x32, 0x87, 0x55,
|
||||
0xA2, 0xBF, 0x39, 0xB0, 0x12, 0xF4, 0x0D, 0x87, 0x45, 0xA2, 0xB3, 0x39, 0xB5, 0xD2, 0xF7, 0x1D, 0x86,
|
||||
0x89, 0xA2, 0xE6, 0xF9, 0x8A, 0xC2, 0xE7, 0x11, 0x8A, 0x8C, 0x67, 0x25, 0xEA, 0x9B, 0x0F, 0x2B, 0x44,
|
||||
0x1F, 0x73, 0x48, 0x25, 0xF6, 0x9B, 0x06, 0xEB, 0x42, 0xCF, 0x71, 0x94, 0x24, 0x6F, 0x5B, 0x6C, 0x3B,
|
||||
0x6D, 0xD3, 0x6D, 0x9D, 0xED, 0xA9, 0x8D, 0xBE, 0xE5, 0xB0, 0x4B, 0x34, 0x37, 0x57, 0x56, 0xBE, 0xBE,
|
||||
0xF0, 0x70, 0x44, 0x24, 0x33, 0x5B, 0x55, 0xFB, 0x7F, 0x03, 0x60, 0x01, 0xE8, 0x00, 0x4E, 0x80, 0x34,
|
||||
0x60, 0x17, 0x68, 0x0E, 0xAE, 0x84, 0x7C, 0x63, 0x61, 0xE9, 0xE8, 0x4E, 0xCE, 0xB4, 0x54, 0x77, 0x7F,
|
||||
0x66, 0xA0, 0x2A, 0xF8, 0x1F, 0x02, 0x88, 0x01, 0xA6, 0x80, 0x7A, 0xE0, 0x23, 0x08, 0x19, 0xC6, 0x8A,
|
||||
0xD2, 0xE7, 0x1D, 0x8A, 0x89, 0xA7, 0x26, 0xFA, 0x9A, 0xC3, 0x2B, 0x11, 0xDF, 0x4C, 0x58, 0x35, 0xFA,
|
||||
0x97, 0x03, 0x2E, 0x81, 0xDC, 0x60, 0x59, 0xE8, 0x3A, 0xCE, 0x93, 0x14, 0x6D, 0xCF, 0x6D, 0x94, 0x2D,
|
||||
0xAF, 0x5D, 0xBC, 0x39, 0xB1, 0xD2, 0xF4, 0x5D, 0x87, 0x79, 0xA2, 0xA2, 0xF9, 0xB9, 0x82, 0xF2, 0xE1,
|
||||
0x85, 0x88, 0x63, 0x26, 0xA9, 0xDA, 0xFE, 0xDB, 0x00, 0x5B, 0x40, 0x3B, 0x70, 0x13, 0x64, 0x0D, 0xEB,
|
||||
0x45, 0x8F, 0x73, 0x24, 0x25, 0xDB, 0x5B, 0x1B, 0x7B, 0x4B, 0x63, 0x77, 0x69, 0xE6, 0xAE, 0xCA, 0xFC,
|
||||
0x57, 0x01, 0xFE, 0x80, 0x40, 0x60, 0x30, 0x28, 0x14, 0x1E, 0x8F, 0x48, 0x64, 0x36, 0xAB, 0x56, 0xFF,
|
||||
0x7E, 0xC0, 0x20, 0x50, 0x18, 0x3C, 0x0A, 0x91, 0xC7, 0x2C, 0x52, 0x9D, 0xFD, 0xA9, 0x81, 0xBE, 0xE0,
|
||||
0x70, 0x48, 0x24, 0x36, 0x9B, 0x56, 0xEB, 0x7E, 0xCF, 0x60, 0x54, 0x28, 0x3F, 0x5E, 0x90, 0x38, 0x6C,
|
||||
0x12, 0xAD, 0xCD, 0xBD, 0x95, 0xB1, 0xAF, 0x34, 0x7C, 0x17, 0x61, 0xCE, 0xA8, 0x54, 0x7E, 0xBF, 0x60,
|
||||
0x70, 0x28, 0x24, 0x1E, 0x9B, 0x48, 0x6B, 0x76, 0xAF, 0x66, 0xFC, 0x2A, 0xC1, 0xDF, 0x10, 0x58, 0x0C,
|
||||
0x3A, 0x85, 0xD3, 0x23, 0x1D, 0xD9, 0xC9, 0x9A, 0xD6, 0xEB, 0x1E, 0xCF, 0x48, 0x54, 0x36, 0xBF, 0x56,
|
||||
0xF0, 0x3E, 0xC4, 0x10, 0x53, 0x4C, 0x3D, 0xF5, 0xD1, 0x87, 0x1C, 0x62, 0x89, 0xE9, 0xA6, 0xCE, 0xFA,
|
||||
0xD4, 0x43, 0x1F, 0x71, 0xC8, 0x24, 0x56, 0x9B, 0x7E, 0xEB, 0x60, 0x4F, 0x68, 0x34, 0x2E, 0x97, 0x5C,
|
||||
0x6E, 0xB9, 0xEC, 0x72, 0xCD, 0xE5, 0x95, 0x8B, 0x2F, 0x27, 0x5C, 0x1A, 0xB9, 0xCB, 0x32, 0xD7, 0x55,
|
||||
0x9E, 0xBF, 0x28, 0x70, 0x1E, 0xA4, 0x08, 0x7B, 0x46, 0xA3, 0x72, 0xF9, 0xE5, 0x82, 0xCB, 0x21, 0x97,
|
||||
0x58, 0x6E, 0xBA, 0xAC, 0x73, 0x3D, 0xE5, 0xD1, 0x8B, 0x1C, 0x67, 0x49, 0xEA, 0xB6, 0xCF, 0x36, 0xD4,
|
||||
0x16, 0xDF, 0x4E, 0xD8, 0x34, 0x5A, 0x97, 0x7B, 0x2E, 0xA3, 0x5C, 0x79, 0xF9, 0xE2, 0xC2, 0xC9, 0x91,
|
||||
0x96, 0xEC, 0x6E, 0xCD, 0xEC, 0x55, 0x8D, 0xFF, 0x25, 0x80, 0x1B, 0x20, 0x0B, 0x58, 0x07, 0x7A, 0x82,
|
||||
0xA3, 0x21, 0xB9, 0xD8, 0x72, 0xDA, 0xA5, 0x9B, 0x3B, 0x2B, 0x53, 0x5F, 0x7D, 0xF8, 0x21, 0x82, 0x98,
|
||||
0x61, 0xAA, 0xA8, 0x7F, 0x3E, 0xA0, 0x10, 0x78, 0x0C, 0x22, 0x85, 0xD9, 0xA3, 0x1A, 0xF9, 0xCB, 0x02,
|
||||
0xD7, 0x41, 0x9E, 0xB0, 0x68, 0x74, 0x2E, 0xA7, 0x5C, 0x7A, 0xB9, 0xE3, 0x32, 0xC9, 0xD5, 0x96, 0xDF,
|
||||
0x2E, 0xD8, 0x1C, 0x5A, 0x89, 0xFB, 0x26, 0xC3, 0x5A, 0xD1, 0xFB, 0x1C, 0x43, 0x49, 0xF1, 0xF6, 0xC4,
|
||||
0x46, 0xD3, 0x72, 0xDD, 0xE5, 0x99
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x28,
|
||||
0x00, 0x1E, 0x80, 0x08, 0x60, 0x06, 0xA8, 0x02, 0xFE, 0x81, 0x80, 0x60, 0x60, 0x28, 0x28, 0x1E, 0x9E, 0x88,
|
||||
0x68, 0x66, 0xAE, 0xAA, 0xFC, 0x7F, 0x01, 0xE0, 0x00, 0x48, 0x00, 0x36, 0x80, 0x16, 0xE0, 0x0E, 0xC8, 0x04,
|
||||
0x56, 0x83, 0x7E, 0xE1, 0xE0, 0x48, 0x48, 0x36, 0xB6, 0x96, 0xF6, 0xEE, 0xC6, 0xCC, 0x52, 0xD5, 0xFD, 0x9F,
|
||||
0x01, 0xA8, 0x00, 0x7E, 0x80, 0x20, 0x60, 0x18, 0x28, 0x0A, 0x9E, 0x87, 0x28, 0x62, 0x9E, 0xA9, 0xA8, 0x7E,
|
||||
0xFE, 0xA0, 0x40, 0x78, 0x30, 0x22, 0x94, 0x19, 0xAF, 0x4A, 0xFC, 0x37, 0x01, 0xD6, 0x80, 0x5E, 0xE0, 0x38,
|
||||
0x48, 0x12, 0xB6, 0x8D, 0xB6, 0xE5, 0xB6, 0xCB, 0x36, 0xD7, 0x56, 0xDE, 0xBE, 0xD8, 0x70, 0x5A, 0xA4, 0x3B,
|
||||
0x3B, 0x53, 0x53, 0x7D, 0xFD, 0xE1, 0x81, 0x88, 0x60, 0x66, 0xA8, 0x2A, 0xFE, 0x9F, 0x00, 0x68, 0x00, 0x2E,
|
||||
0x80, 0x1C, 0x60, 0x09, 0xE8, 0x06, 0xCE, 0x82, 0xD4, 0x61, 0x9F, 0x68, 0x68, 0x2E, 0xAE, 0x9C, 0x7C, 0x69,
|
||||
0xE1, 0xEE, 0xC8, 0x4C, 0x56, 0xB5, 0xFE, 0xF7, 0x00, 0x46, 0x80, 0x32, 0xE0, 0x15, 0x88, 0x0F, 0x26, 0x84,
|
||||
0x1A, 0xE3, 0x4B, 0x09, 0xF7, 0x46, 0xC6, 0xB2, 0xD2, 0xF5, 0x9D, 0x87, 0x29, 0xA2, 0x9E, 0xF9, 0xA8, 0x42,
|
||||
0xFE, 0xB1, 0x80, 0x74, 0x60, 0x27, 0x68, 0x1A, 0xAE, 0x8B, 0x3C, 0x67, 0x51, 0xEA, 0xBC, 0x4F, 0x31, 0xF4,
|
||||
0x14, 0x47, 0x4F, 0x72, 0xB4, 0x25, 0xB7, 0x5B, 0x36, 0xBB, 0x56, 0xF3, 0x7E, 0xC5, 0xE0, 0x53, 0x08, 0x3D,
|
||||
0xC6, 0x91, 0x92, 0xEC, 0x6D, 0x8D, 0xED, 0xA5, 0x8D, 0xBB, 0x25, 0xB3, 0x5B, 0x35, 0xFB, 0x57, 0x03, 0x7E,
|
||||
0x81, 0xE0, 0x60, 0x48, 0x28, 0x36, 0x9E, 0x96, 0xE8, 0x6E, 0xCE, 0xAC, 0x54, 0x7D, 0xFF, 0x61, 0x80, 0x28,
|
||||
0x60, 0x1E, 0xA8, 0x08, 0x7E, 0x86, 0xA0, 0x62, 0xF8, 0x29, 0x82, 0x9E, 0xE1, 0xA8, 0x48, 0x7E, 0xB6, 0xA0,
|
||||
0x76, 0xF8, 0x26, 0xC2, 0x9A, 0xD1, 0xAB, 0x1C, 0x7F, 0x49, 0xE0, 0x36, 0xC8, 0x16, 0xD6, 0x8E, 0xDE, 0xE4,
|
||||
0x58, 0x4B, 0x7A, 0xB7, 0x63, 0x36, 0xA9, 0xD6, 0xFE, 0xDE, 0xC0, 0x58, 0x50, 0x3A, 0xBC, 0x13, 0x31, 0xCD,
|
||||
0xD4, 0x55, 0x9F, 0x7F, 0x28, 0x20, 0x1E, 0x98, 0x08, 0x6A, 0x86, 0xAF, 0x22, 0xFC, 0x19, 0x81, 0xCA, 0xE0,
|
||||
0x57, 0x08, 0x3E, 0x86, 0x90, 0x62, 0xEC, 0x29, 0x8D, 0xDE, 0xE5, 0x98, 0x4B, 0x2A, 0xB7, 0x5F, 0x36, 0xB8,
|
||||
0x16, 0xF2, 0x8E, 0xC5, 0xA4, 0x53, 0x3B, 0x7D, 0xD3, 0x61, 0x9D, 0xE8, 0x69, 0x8E, 0xAE, 0xE4, 0x7C, 0x4B,
|
||||
0x61, 0xF7, 0x68, 0x46, 0xAE, 0xB2, 0xFC, 0x75, 0x81, 0xE7, 0x20, 0x4A, 0x98, 0x37, 0x2A, 0x96, 0x9F, 0x2E,
|
||||
0xE8, 0x1C, 0x4E, 0x89, 0xF4, 0x66, 0xC7, 0x6A, 0xD2, 0xAF, 0x1D, 0xBC, 0x09, 0xB1, 0xC6, 0xF4, 0x52, 0xC7,
|
||||
0x7D, 0x92, 0xA1, 0xAD, 0xB8, 0x7D, 0xB2, 0xA1, 0xB5, 0xB8, 0x77, 0x32, 0xA6, 0x95, 0xBA, 0xEF, 0x33, 0x0C,
|
||||
0x15, 0xC5, 0xCF, 0x13, 0x14, 0x0D, 0xCF, 0x45, 0x94, 0x33, 0x2F, 0x55, 0xDC, 0x3F, 0x19, 0xD0, 0x0A, 0xDC,
|
||||
0x07, 0x19, 0xC2, 0x8A, 0xD1, 0xA7, 0x1C, 0x7A, 0x89, 0xE3, 0x26, 0xC9, 0xDA, 0xD6, 0xDB, 0x1E, 0xDB, 0x48,
|
||||
0x5B, 0x76, 0xBB, 0x66, 0xF3, 0x6A, 0xC5, 0xEF, 0x13, 0x0C, 0x0D, 0xC5, 0xC5, 0x93, 0x13, 0x2D, 0xCD, 0xDD,
|
||||
0x95, 0x99, 0xAF, 0x2A, 0xFC, 0x1F, 0x01, 0xC8, 0x00, 0x56, 0x80, 0x3E, 0xE0, 0x10, 0x48, 0x0C, 0x36, 0x85,
|
||||
0xD6, 0xE3, 0x1E, 0xC9, 0xC8, 0x56, 0xD6, 0xBE, 0xDE, 0xF0, 0x58, 0x44, 0x3A, 0xB3, 0x53, 0x35, 0xFD, 0xD7,
|
||||
0x01, 0x9E, 0x80, 0x68, 0x60, 0x2E, 0xA8, 0x1C, 0x7E, 0x89, 0xE0, 0x66, 0xC8, 0x2A, 0xD6, 0x9F, 0x1E, 0xE8,
|
||||
0x08, 0x4E, 0x86, 0xB4, 0x62, 0xF7, 0x69, 0x86, 0xAE, 0xE2, 0xFC, 0x49, 0x81, 0xF6, 0xE0, 0x46, 0xC8, 0x32,
|
||||
0xD6, 0x95, 0x9E, 0xEF, 0x28, 0x4C, 0x1E, 0xB5, 0xC8, 0x77, 0x16, 0xA6, 0x8E, 0xFA, 0xE4, 0x43, 0x0B, 0x71,
|
||||
0xC7, 0x64, 0x52, 0xAB, 0x7D, 0xBF, 0x61, 0xB0, 0x28, 0x74, 0x1E, 0xA7, 0x48, 0x7A, 0xB6, 0xA3, 0x36, 0xF9,
|
||||
0xD6, 0xC2, 0xDE, 0xD1, 0x98, 0x5C, 0x6A, 0xB9, 0xEF, 0x32, 0xCC, 0x15, 0x95, 0xCF, 0x2F, 0x14, 0x1C, 0x0F,
|
||||
0x49, 0xC4, 0x36, 0xD3, 0x56, 0xDD, 0xFE, 0xD9, 0x80, 0x5A, 0xE0, 0x3B, 0x08, 0x13, 0x46, 0x8D, 0xF2, 0xE5,
|
||||
0x85, 0x8B, 0x23, 0x27, 0x59, 0xDA, 0xBA, 0xDB, 0x33, 0x1B, 0x55, 0xCB, 0x7F, 0x17, 0x60, 0x0E, 0xA8, 0x04,
|
||||
0x7E, 0x83, 0x60, 0x61, 0xE8, 0x28, 0x4E, 0x9E, 0xB4, 0x68, 0x77, 0x6E, 0xA6, 0xAC, 0x7A, 0xFD, 0xE3, 0x01,
|
||||
0x89, 0xC0, 0x66, 0xD0, 0x2A, 0xDC, 0x1F, 0x19, 0xC8, 0x0A, 0xD6, 0x87, 0x1E, 0xE2, 0x88, 0x49, 0xA6, 0xB6,
|
||||
0xFA, 0xF6, 0xC3, 0x06, 0xD1, 0xC2, 0xDC, 0x51, 0x99, 0xFC, 0x6A, 0xC1, 0xEF, 0x10, 0x4C, 0x0C, 0x35, 0xC5,
|
||||
0xD7, 0x13, 0x1E, 0x8D, 0xC8, 0x65, 0x96, 0xAB, 0x2E, 0xFF, 0x5C, 0x40, 0x39, 0xF0, 0x12, 0xC4, 0x0D, 0x93,
|
||||
0x45, 0xAD, 0xF3, 0x3D, 0x85, 0xD1, 0xA3, 0x1C, 0x79, 0xC9, 0xE2, 0xD6, 0xC9, 0x9E, 0xD6, 0xE8, 0x5E, 0xCE,
|
||||
0xB8, 0x54, 0x72, 0xBF, 0x65, 0xB0, 0x2B, 0x34, 0x1F, 0x57, 0x48, 0x3E, 0xB6, 0x90, 0x76, 0xEC, 0x26, 0xCD,
|
||||
0xDA, 0xD5, 0x9B, 0x1F, 0x2B, 0x48, 0x1F, 0x76, 0x88, 0x26, 0xE6, 0x9A, 0xCA, 0xEB, 0x17, 0x0F, 0x4E, 0x84,
|
||||
0x34, 0x63, 0x57, 0x69, 0xFE, 0xAE, 0xC0, 0x7C, 0x50, 0x21, 0xFC, 0x18, 0x41, 0xCA, 0xB0, 0x57, 0x34, 0x3E,
|
||||
0x97, 0x50, 0x6E, 0xBC, 0x2C, 0x71, 0xDD, 0xE4, 0x59, 0x8B, 0x7A, 0xE7, 0x63, 0x0A, 0xA9, 0xC7, 0x3E, 0xD2,
|
||||
0x90, 0x5D, 0xAC, 0x39, 0xBD, 0xD2, 0xF1, 0x9D, 0x84, 0x69, 0xA3, 0x6E, 0xF9, 0xEC, 0x42, 0xCD, 0xF1, 0x95,
|
||||
0x84, 0x6F, 0x23, 0x6C, 0x19, 0xED, 0xCA, 0xCD, 0x97, 0x15, 0xAE, 0x8F, 0x3C, 0x64, 0x11, 0xEB, 0x4C, 0x4F,
|
||||
0x75, 0xF4, 0x27, 0x07, 0x5A, 0x82, 0xBB, 0x21, 0xB3, 0x58, 0x75, 0xFA, 0xA7, 0x03, 0x3A, 0x81, 0xD3, 0x20,
|
||||
0x5D, 0xD8, 0x39, 0x9A, 0x92, 0xEB, 0x2D, 0x8F, 0x5D, 0xA4, 0x39, 0xBB, 0x52, 0xF3, 0x7D, 0x85, 0xE1, 0xA3,
|
||||
0x08, 0x79, 0xC6, 0xA2, 0xD2, 0xF9, 0x9D, 0x82, 0xE9, 0xA1, 0x8E, 0xF8, 0x64, 0x42, 0xAB, 0x71, 0xBF, 0x64,
|
||||
0x70, 0x2B, 0x64, 0x1F, 0x6B, 0x48, 0x2F, 0x76, 0x9C, 0x26, 0xE9, 0xDA, 0xCE, 0xDB, 0x14, 0x5B, 0x4F, 0x7B,
|
||||
0x74, 0x23, 0x67, 0x59, 0xEA, 0xBA, 0xCF, 0x33, 0x14, 0x15, 0xCF, 0x4F, 0x14, 0x34, 0x0F, 0x57, 0x44, 0x3E,
|
||||
0xB3, 0x50, 0x75, 0xFC, 0x27, 0x01, 0xDA, 0x80, 0x5B, 0x20, 0x3B, 0x58, 0x13, 0x7A, 0x8D, 0xE3, 0x25, 0x89,
|
||||
0xDB, 0x26, 0xDB, 0x5A, 0xDB, 0x7B, 0x1B, 0x63, 0x4B, 0x69, 0xF7, 0x6E, 0xC6, 0xAC, 0x52, 0xFD, 0xFD, 0x81,
|
||||
0x81, 0xA0, 0x60, 0x78, 0x28, 0x22, 0x9E, 0x99, 0xA8, 0x6A, 0xFE, 0xAF, 0x00, 0x7C, 0x00, 0x21, 0xC0, 0x18,
|
||||
0x50, 0x0A, 0xBC, 0x07, 0x31, 0xC2, 0x94, 0x51, 0xAF, 0x7C, 0x7C, 0x21, 0xE1, 0xD8, 0x48, 0x5A, 0xB6, 0xBB,
|
||||
0x36, 0xF3, 0x56, 0xC5, 0xFE, 0xD3, 0x00, 0x5D, 0xC0, 0x39, 0x90, 0x12, 0xEC, 0x0D, 0x8D, 0xC5, 0xA5, 0x93,
|
||||
0x3B, 0x2D, 0xD3, 0x5D, 0x9D, 0xF9, 0xA9, 0x82, 0xFE, 0xE1, 0x80, 0x48, 0x60, 0x36, 0xA8, 0x16, 0xFE, 0x8E,
|
||||
0xC0, 0x64, 0x50, 0x2B, 0x7C, 0x1F, 0x61, 0xC8, 0x28, 0x56, 0x9E, 0xBE, 0xE8, 0x70, 0x4E, 0xA4, 0x34, 0x7B,
|
||||
0x57, 0x63, 0x7E, 0xA9, 0xE0, 0x7E, 0xC8, 0x20, 0x56, 0x98, 0x3E, 0xEA, 0x90, 0x4F, 0x2C, 0x34, 0x1D, 0xD7,
|
||||
0x49, 0x9E, 0xB6, 0xE8, 0x76, 0xCE, 0xA6, 0xD4, 0x7A, 0xDF, 0x63, 0x18, 0x29, 0xCA, 0x9E, 0xD7, 0x28, 0x5E,
|
||||
0x9E, 0xB8, 0x68, 0x72, 0xAE, 0xA5, 0xBC, 0x7B, 0x31, 0xE3, 0x54, 0x49, 0xFF, 0x76, 0xC0, 0x26, 0xD0, 0x1A,
|
||||
0xDC, 0x0B, 0x19, 0xC7, 0x4A, 0xD2, 0xB7, 0x1D, 0xB6, 0x89, 0xB6, 0xE6, 0xF6, 0xCA, 0xC6, 0xD7, 0x12, 0xDE,
|
||||
0x8D, 0x98, 0x65, 0xAA, 0xAB, 0x3F, 0x3F, 0x50, 0x10, 0x3C, 0x0C, 0x11, 0xC5, 0xCC, 0x53, 0x15, 0xFD, 0xCF,
|
||||
0x01, 0x94, 0x00, 0x6F, 0x40, 0x2C, 0x30, 0x1D, 0xD4, 0x09, 0x9F, 0x46, 0xE8, 0x32, 0xCE, 0x95, 0x94, 0x6F,
|
||||
0x2F, 0x6C, 0x1C, 0x2D, 0xC9, 0xDD, 0x96, 0xD9, 0xAE, 0xDA, 0xFC, 0x5B, 0x01, 0xFB, 0x40, 0x43, 0x70, 0x31,
|
||||
0xE4, 0x14, 0x4B, 0x4F, 0x77, 0x74, 0x26, 0xA7, 0x5A, 0xFA, 0xBB, 0x03, 0x33, 0x41, 0xD5, 0xF0, 0x5F, 0x04,
|
||||
0x38, 0x03, 0x52, 0x81, 0xFD, 0xA0, 0x41, 0xB8, 0x30, 0x72, 0x94, 0x25, 0xAF, 0x5B, 0x3C, 0x3B, 0x51, 0xD3,
|
||||
0x7C, 0x5D, 0xE1, 0xF9, 0x88, 0x42, 0xE6, 0xB1, 0x8A, 0xF4, 0x67, 0x07, 0x6A, 0x82, 0xAF, 0x21, 0xBC, 0x18,
|
||||
0x71, 0xCA, 0xA4, 0x57, 0x3B, 0x7E, 0x93, 0x60, 0x6D, 0xE8, 0x2D, 0x8E, 0x9D, 0xA4, 0x69, 0xBB, 0x6E, 0xF3,
|
||||
0x6C, 0x45, 0xED, 0xF3, 0x0D, 0x85, 0xC5, 0xA3, 0x13, 0x39, 0xCD, 0xD2, 0xD5, 0x9D, 0x9F, 0x29, 0xA8, 0x1E,
|
||||
0xFE, 0x88, 0x40, 0x66, 0xB0, 0x2A, 0xF4, 0x1F, 0x07, 0x48, 0x02, 0xB6, 0x81, 0xB6, 0xE0, 0x76, 0xC8, 0x26,
|
||||
0xD6, 0x9A, 0xDE, 0xEB, 0x18, 0x4F, 0x4A, 0xB4, 0x37, 0x37, 0x56, 0x96, 0xBE, 0xEE, 0xF0, 0x4C, 0x44, 0x35,
|
||||
0xF3, 0x57, 0x05, 0xFE, 0x83, 0x00, 0x61, 0xC0, 0x28, 0x50, 0x1E, 0xBC, 0x08, 0x71, 0xC6, 0xA4, 0x52, 0xFB,
|
||||
0x7D, 0x83, 0x61, 0xA1, 0xE8, 0x78, 0x4E, 0xA2, 0xB4, 0x79, 0xB7, 0x62, 0xF6, 0xA9, 0x86, 0xFE, 0xE2, 0xC0,
|
||||
0x49, 0x90, 0x36, 0xEC, 0x16, 0xCD, 0xCE, 0xD5, 0x94, 0x5F, 0x2F, 0x78, 0x1C, 0x22, 0x89, 0xD9, 0xA6, 0xDA,
|
||||
0xFA, 0xDB, 0x03, 0x1B, 0x41, 0xCB, 0x70, 0x57, 0x64, 0x3E, 0xAB, 0x50, 0x7F, 0x7C, 0x20, 0x21, 0xD8, 0x18,
|
||||
0x5A, 0x8A, 0xBB, 0x27, 0x33, 0x5A, 0x95, 0xFB, 0x2F, 0x03, 0x5C, 0x01, 0xF9, 0xC0, 0x42, 0xD0, 0x31, 0x9C,
|
||||
0x14, 0x69, 0xCF, 0x6E, 0xD4, 0x2C, 0x5F, 0x5D, 0xF8, 0x39, 0x82, 0x92, 0xE1, 0xAD, 0x88, 0x7D, 0xA6, 0xA1,
|
||||
0xBA, 0xF8, 0x73, 0x02, 0xA5, 0xC1, 0xBB, 0x10, 0x73, 0x4C, 0x25, 0xF5, 0xDB, 0x07, 0x1B, 0x42, 0x8B, 0x71,
|
||||
0xA7, 0x64, 0x7A, 0xAB, 0x63, 0x3F, 0x69, 0xD0, 0x2E, 0xDC, 0x1C, 0x59, 0xC9, 0xFA, 0xD6, 0xC3, 0x1E, 0xD1,
|
||||
0xC8, 0x5C, 0x56, 0xB9, 0xFE, 0xF2, 0xC0, 0x45, 0x90, 0x33, 0x2C, 0x15, 0xDD, 0xCF, 0x19, 0x94, 0x0A, 0xEF,
|
||||
0x47, 0x0C, 0x32, 0x85, 0xD5, 0xA3, 0x1F, 0x39, 0xC8, 0x12, 0xD6, 0x8D, 0x9E, 0xE5, 0xA8, 0x4B, 0x3E, 0xB7,
|
||||
0x50, 0x76, 0xBC, 0x26, 0xF1, 0xDA, 0xC4, 0x5B, 0x13, 0x7B, 0x4D, 0xE3, 0x75, 0x89, 0xE7, 0x26, 0xCA, 0x9A,
|
||||
0xD7, 0x2B, 0x1E, 0x9F, 0x48, 0x68, 0x36, 0xAE, 0x96, 0xFC, 0x6E, 0xC1, 0xEC, 0x50, 0x4D, 0xFC, 0x35, 0x81,
|
||||
0xD7, 0x20, 0x5E, 0x98, 0x38, 0x6A, 0x92, 0xAF, 0x2D, 0xBC, 0x1D, 0xB1, 0xC9, 0xB4, 0x56, 0xF7, 0x7E, 0xC6,
|
||||
0xA0, 0x52, 0xF8, 0x3D, 0x82, 0x91, 0xA1, 0xAC, 0x78, 0x7D, 0xE2, 0xA1, 0x89, 0xB8, 0x66, 0xF2, 0xAA, 0xC5,
|
||||
0xBF, 0x13, 0x30, 0x0D, 0xD4, 0x05, 0x9F, 0x43, 0x28, 0x31, 0xDE, 0x94, 0x58, 0x6F, 0x7A, 0xAC, 0x23, 0x3D,
|
||||
0xD9, 0xD1, 0x9A, 0xDC, 0x6B, 0x19, 0xEF, 0x4A, 0xCC, 0x37, 0x15, 0xD6, 0x8F, 0x1E, 0xE4, 0x08, 0x4B, 0x46,
|
||||
0xB7, 0x72, 0xF6, 0xA5, 0x86, 0xFB, 0x22, 0xC3, 0x59, 0x91, 0xFA, 0xEC, 0x43, 0x0D, 0xF1, 0xC5, 0x84, 0x53,
|
||||
0x23, 0x7D, 0xD9, 0xE1, 0x9A, 0xC8, 0x6B, 0x16, 0xAF, 0x4E, 0xFC, 0x34, 0x41, 0xD7, 0x70, 0x5E, 0xA4, 0x38,
|
||||
0x7B, 0x52, 0xA3, 0x7D, 0xB9, 0xE1, 0xB2, 0xC8, 0x75, 0x96, 0xA7, 0x2E, 0xFA, 0x9C, 0x43, 0x29, 0xF1, 0xDE,
|
||||
0xC4, 0x58, 0x53, 0x7A, 0xBD, 0xE3, 0x31, 0x89, 0xD4, 0x66, 0xDF, 0x6A, 0xD8, 0x2F, 0x1A, 0x9C, 0x0B, 0x29,
|
||||
0xC7, 0x5E, 0xD2, 0xB8, 0x5D, 0xB2, 0xB9, 0xB5, 0xB2, 0xF7, 0x35, 0x86, 0x97, 0x22, 0xEE, 0x99, 0x8C, 0x6A,
|
||||
0xE5, 0xEF, 0x0B, 0x0C, 0x07, 0x45, 0xC2, 0xB3, 0x11, 0xB5, 0xCC, 0x77, 0x15, 0xE6, 0x8F, 0x0A, 0xE4, 0x07,
|
||||
0x0B, 0x42, 0x87, 0x71, 0xA2, 0xA4, 0x79, 0xBB, 0x62, 0xF3, 0x69, 0x85, 0xEE, 0xE3, 0x0C, 0x49, 0xC5, 0xF6,
|
||||
0xD3, 0x06, 0xDD, 0xC2, 0xD9, 0x91, 0x9A, 0xEC, 0x6B, 0x0D, 0xEF, 0x45, 0x8C, 0x33, 0x25, 0xD5, 0xDB, 0x1F,
|
||||
0x1B, 0x48, 0x0B, 0x76, 0x87, 0x66, 0xE2, 0xAA, 0xC9, 0xBF, 0x16, 0xF0, 0x0E, 0xC4, 0x04, 0x53, 0x43, 0x7D,
|
||||
0xF1, 0xE1, 0x84, 0x48, 0x63, 0x76, 0xA9, 0xE6, 0xFE, 0xCA, 0xC0, 0x57, 0x10, 0x3E, 0x8C, 0x10, 0x65, 0xCC,
|
||||
0x2B, 0x15, 0xDF, 0x4F, 0x18, 0x34, 0x0A, 0x97, 0x47, 0x2E, 0xB2, 0x9C, 0x75, 0xA9, 0xE7, 0x3E, 0xCA, 0x90,
|
||||
0x57, 0x2C, 0x3E, 0x9D, 0xD0, 0x69, 0x9C, 0x2E, 0xE9, 0xDC, 0x4E, 0xD9, 0xF4, 0x5A, 0xC7, 0x7B, 0x12, 0xA3,
|
||||
0x4D, 0xB9, 0xF5, 0xB2, 0xC7, 0x35, 0x92, 0x97, 0x2D, 0xAE, 0x9D, 0xBC, 0x69, 0xB1, 0xEE, 0xF4, 0x4C, 0x47,
|
||||
0x75, 0xF2, 0xA7, 0x05, 0xBA, 0x83, 0x33, 0x21, 0xD5, 0xD8, 0x5F, 0x1A, 0xB8, 0x0B, 0x32, 0x87, 0x55, 0xA2,
|
||||
0xBF, 0x39, 0xB0, 0x12, 0xF4, 0x0D, 0x87, 0x45, 0xA2, 0xB3, 0x39, 0xB5, 0xD2, 0xF7, 0x1D, 0x86, 0x89, 0xA2,
|
||||
0xE6, 0xF9, 0x8A, 0xC2, 0xE7, 0x11, 0x8A, 0x8C, 0x67, 0x25, 0xEA, 0x9B, 0x0F, 0x2B, 0x44, 0x1F, 0x73, 0x48,
|
||||
0x25, 0xF6, 0x9B, 0x06, 0xEB, 0x42, 0xCF, 0x71, 0x94, 0x24, 0x6F, 0x5B, 0x6C, 0x3B, 0x6D, 0xD3, 0x6D, 0x9D,
|
||||
0xED, 0xA9, 0x8D, 0xBE, 0xE5, 0xB0, 0x4B, 0x34, 0x37, 0x57, 0x56, 0xBE, 0xBE, 0xF0, 0x70, 0x44, 0x24, 0x33,
|
||||
0x5B, 0x55, 0xFB, 0x7F, 0x03, 0x60, 0x01, 0xE8, 0x00, 0x4E, 0x80, 0x34, 0x60, 0x17, 0x68, 0x0E, 0xAE, 0x84,
|
||||
0x7C, 0x63, 0x61, 0xE9, 0xE8, 0x4E, 0xCE, 0xB4, 0x54, 0x77, 0x7F, 0x66, 0xA0, 0x2A, 0xF8, 0x1F, 0x02, 0x88,
|
||||
0x01, 0xA6, 0x80, 0x7A, 0xE0, 0x23, 0x08, 0x19, 0xC6, 0x8A, 0xD2, 0xE7, 0x1D, 0x8A, 0x89, 0xA7, 0x26, 0xFA,
|
||||
0x9A, 0xC3, 0x2B, 0x11, 0xDF, 0x4C, 0x58, 0x35, 0xFA, 0x97, 0x03, 0x2E, 0x81, 0xDC, 0x60, 0x59, 0xE8, 0x3A,
|
||||
0xCE, 0x93, 0x14, 0x6D, 0xCF, 0x6D, 0x94, 0x2D, 0xAF, 0x5D, 0xBC, 0x39, 0xB1, 0xD2, 0xF4, 0x5D, 0x87, 0x79,
|
||||
0xA2, 0xA2, 0xF9, 0xB9, 0x82, 0xF2, 0xE1, 0x85, 0x88, 0x63, 0x26, 0xA9, 0xDA, 0xFE, 0xDB, 0x00, 0x5B, 0x40,
|
||||
0x3B, 0x70, 0x13, 0x64, 0x0D, 0xEB, 0x45, 0x8F, 0x73, 0x24, 0x25, 0xDB, 0x5B, 0x1B, 0x7B, 0x4B, 0x63, 0x77,
|
||||
0x69, 0xE6, 0xAE, 0xCA, 0xFC, 0x57, 0x01, 0xFE, 0x80, 0x40, 0x60, 0x30, 0x28, 0x14, 0x1E, 0x8F, 0x48, 0x64,
|
||||
0x36, 0xAB, 0x56, 0xFF, 0x7E, 0xC0, 0x20, 0x50, 0x18, 0x3C, 0x0A, 0x91, 0xC7, 0x2C, 0x52, 0x9D, 0xFD, 0xA9,
|
||||
0x81, 0xBE, 0xE0, 0x70, 0x48, 0x24, 0x36, 0x9B, 0x56, 0xEB, 0x7E, 0xCF, 0x60, 0x54, 0x28, 0x3F, 0x5E, 0x90,
|
||||
0x38, 0x6C, 0x12, 0xAD, 0xCD, 0xBD, 0x95, 0xB1, 0xAF, 0x34, 0x7C, 0x17, 0x61, 0xCE, 0xA8, 0x54, 0x7E, 0xBF,
|
||||
0x60, 0x70, 0x28, 0x24, 0x1E, 0x9B, 0x48, 0x6B, 0x76, 0xAF, 0x66, 0xFC, 0x2A, 0xC1, 0xDF, 0x10, 0x58, 0x0C,
|
||||
0x3A, 0x85, 0xD3, 0x23, 0x1D, 0xD9, 0xC9, 0x9A, 0xD6, 0xEB, 0x1E, 0xCF, 0x48, 0x54, 0x36, 0xBF, 0x56, 0xF0,
|
||||
0x3E, 0xC4, 0x10, 0x53, 0x4C, 0x3D, 0xF5, 0xD1, 0x87, 0x1C, 0x62, 0x89, 0xE9, 0xA6, 0xCE, 0xFA, 0xD4, 0x43,
|
||||
0x1F, 0x71, 0xC8, 0x24, 0x56, 0x9B, 0x7E, 0xEB, 0x60, 0x4F, 0x68, 0x34, 0x2E, 0x97, 0x5C, 0x6E, 0xB9, 0xEC,
|
||||
0x72, 0xCD, 0xE5, 0x95, 0x8B, 0x2F, 0x27, 0x5C, 0x1A, 0xB9, 0xCB, 0x32, 0xD7, 0x55, 0x9E, 0xBF, 0x28, 0x70,
|
||||
0x1E, 0xA4, 0x08, 0x7B, 0x46, 0xA3, 0x72, 0xF9, 0xE5, 0x82, 0xCB, 0x21, 0x97, 0x58, 0x6E, 0xBA, 0xAC, 0x73,
|
||||
0x3D, 0xE5, 0xD1, 0x8B, 0x1C, 0x67, 0x49, 0xEA, 0xB6, 0xCF, 0x36, 0xD4, 0x16, 0xDF, 0x4E, 0xD8, 0x34, 0x5A,
|
||||
0x97, 0x7B, 0x2E, 0xA3, 0x5C, 0x79, 0xF9, 0xE2, 0xC2, 0xC9, 0x91, 0x96, 0xEC, 0x6E, 0xCD, 0xEC, 0x55, 0x8D,
|
||||
0xFF, 0x25, 0x80, 0x1B, 0x20, 0x0B, 0x58, 0x07, 0x7A, 0x82, 0xA3, 0x21, 0xB9, 0xD8, 0x72, 0xDA, 0xA5, 0x9B,
|
||||
0x3B, 0x2B, 0x53, 0x5F, 0x7D, 0xF8, 0x21, 0x82, 0x98, 0x61, 0xAA, 0xA8, 0x7F, 0x3E, 0xA0, 0x10, 0x78, 0x0C,
|
||||
0x22, 0x85, 0xD9, 0xA3, 0x1A, 0xF9, 0xCB, 0x02, 0xD7, 0x41, 0x9E, 0xB0, 0x68, 0x74, 0x2E, 0xA7, 0x5C, 0x7A,
|
||||
0xB9, 0xE3, 0x32, 0xC9, 0xD5, 0x96, 0xDF, 0x2E, 0xD8, 0x1C, 0x5A, 0x89, 0xFB, 0x26, 0xC3, 0x5A, 0xD1, 0xFB,
|
||||
0x1C, 0x43, 0x49, 0xF1, 0xF6, 0xC4, 0x46, 0xD3, 0x72, 0xDD, 0xE5, 0x99
|
||||
};
|
||||
|
||||
public static readonly byte[] SyncMark =
|
||||
@@ -191,19 +182,26 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
public static byte[] Scramble(byte[] sector)
|
||||
{
|
||||
if(sector == null || sector.Length < 2352) return sector;
|
||||
if(sector == null ||
|
||||
sector.Length < 2352)
|
||||
return sector;
|
||||
|
||||
byte[] sync = new byte[12];
|
||||
Array.Copy(sector, 0, sync, 0, 12);
|
||||
|
||||
if(!SyncMark.SequenceEqual(sync)) return sector;
|
||||
if(!SyncMark.SequenceEqual(sync))
|
||||
return sector;
|
||||
|
||||
byte[] scrambled = new byte[sector.Length];
|
||||
for(int i = 0; i < 2352; i++) scrambled[i] = (byte)(sector[i] ^ ScrambleTable[i]);
|
||||
byte[] scrambled = new byte[sector.Length];
|
||||
|
||||
if(sector.Length <= 2352) return scrambled;
|
||||
for(int i = 0; i < 2352; i++)
|
||||
scrambled[i] = (byte)(sector[i] ^ ScrambleTable[i]);
|
||||
|
||||
for(int i = 2352; i < sector.Length; i++) scrambled[i] = sector[i];
|
||||
if(sector.Length <= 2352)
|
||||
return scrambled;
|
||||
|
||||
for(int i = 2352; i < sector.Length; i++)
|
||||
scrambled[i] = sector[i];
|
||||
|
||||
return scrambled;
|
||||
}
|
||||
|
||||
143
CD/Session.cs
143
CD/Session.cs
@@ -37,88 +37,23 @@ using DiscImageChef.Console;
|
||||
namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
/// <summary>
|
||||
/// Information from the following standards:
|
||||
/// ANSI X3.304-1997
|
||||
/// T10/1048-D revision 9.0
|
||||
/// T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c
|
||||
/// T10/1228-D revision 11a
|
||||
/// T10/1363-D revision 10g
|
||||
/// T10/1545-D revision 1d
|
||||
/// T10/1545-D revision 5
|
||||
/// T10/1545-D revision 5a
|
||||
/// T10/1675-D revision 2c
|
||||
/// T10/1675-D revision 4
|
||||
/// T10/1836-D revision 2g
|
||||
/// Information from the following standards: ANSI X3.304-1997 T10/1048-D revision 9.0 T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c T10/1228-D revision 11a T10/1363-D revision 10g T10/1545-D revision 1d T10/1545-D revision
|
||||
/// 5 T10/1545-D revision 5a T10/1675-D revision 2c T10/1675-D revision 4 T10/1836-D revision 2g
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class Session
|
||||
{
|
||||
public struct CDSessionInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// Total size of returned session information minus this field
|
||||
/// </summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>
|
||||
/// First track number in hex
|
||||
/// </summary>
|
||||
public byte FirstCompleteSession;
|
||||
/// <summary>
|
||||
/// Last track number in hex
|
||||
/// </summary>
|
||||
public byte LastCompleteSession;
|
||||
/// <summary>
|
||||
/// Track descriptors
|
||||
/// </summary>
|
||||
public TrackDataDescriptor[] TrackDescriptors;
|
||||
}
|
||||
|
||||
public struct TrackDataDescriptor
|
||||
{
|
||||
/// <summary>
|
||||
/// Byte 0
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>
|
||||
/// Byte 1, bits 7 to 4
|
||||
/// Type of information in Q subchannel of block where this TOC entry was found
|
||||
/// </summary>
|
||||
public byte ADR;
|
||||
/// <summary>
|
||||
/// Byte 1, bits 3 to 0
|
||||
/// Track attributes
|
||||
/// </summary>
|
||||
public byte CONTROL;
|
||||
/// <summary>
|
||||
/// Byte 2
|
||||
/// First track number in last complete session
|
||||
/// </summary>
|
||||
public byte TrackNumber;
|
||||
/// <summary>
|
||||
/// Byte 3
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>
|
||||
/// Bytes 4 to 7
|
||||
/// First track number in last complete session start address in LBA or in MSF
|
||||
/// </summary>
|
||||
public uint TrackStartAddress;
|
||||
}
|
||||
|
||||
public static CDSessionInfo? Decode(byte[] CDSessionInfoResponse)
|
||||
{
|
||||
if(CDSessionInfoResponse == null) return null;
|
||||
if(CDSessionInfoResponse == null)
|
||||
return null;
|
||||
|
||||
CDSessionInfo decoded = new CDSessionInfo
|
||||
var decoded = new CDSessionInfo
|
||||
{
|
||||
DataLength = BigEndianBitConverter.ToUInt16(CDSessionInfoResponse, 0),
|
||||
FirstCompleteSession = CDSessionInfoResponse[2],
|
||||
LastCompleteSession = CDSessionInfoResponse[3]
|
||||
FirstCompleteSession = CDSessionInfoResponse[2], LastCompleteSession = CDSessionInfoResponse[3]
|
||||
};
|
||||
|
||||
decoded.TrackDescriptors = new TrackDataDescriptor[(decoded.DataLength - 2) / 8];
|
||||
@@ -128,6 +63,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
DicConsole.DebugWriteLine("CD Session Info decoder",
|
||||
"Expected CDSessionInfo size ({0} bytes) is not received size ({1} bytes), not decoding",
|
||||
decoded.DataLength + 2, CDSessionInfoResponse.Length);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -138,6 +74,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
decoded.TrackDescriptors[i].CONTROL = (byte)(CDSessionInfoResponse[1 + i * 8 + 4] & 0x0F);
|
||||
decoded.TrackDescriptors[i].TrackNumber = CDSessionInfoResponse[2 + i * 8 + 4];
|
||||
decoded.TrackDescriptors[i].Reserved2 = CDSessionInfoResponse[3 + i * 8 + 4];
|
||||
|
||||
decoded.TrackDescriptors[i].TrackStartAddress =
|
||||
BigEndianBitConverter.ToUInt32(CDSessionInfoResponse, 4 + i * 8 + 4);
|
||||
}
|
||||
@@ -147,18 +84,21 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
public static string Prettify(CDSessionInfo? CDSessionInfoResponse)
|
||||
{
|
||||
if(CDSessionInfoResponse == null) return null;
|
||||
if(CDSessionInfoResponse == null)
|
||||
return null;
|
||||
|
||||
CDSessionInfo response = CDSessionInfoResponse.Value;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.AppendFormat("First complete session number: {0}", response.FirstCompleteSession).AppendLine();
|
||||
sb.AppendFormat("Last complete session number: {0}", response.LastCompleteSession).AppendLine();
|
||||
|
||||
foreach(TrackDataDescriptor descriptor in response.TrackDescriptors)
|
||||
{
|
||||
sb.AppendFormat("First track number in last complete session: {0}", descriptor.TrackNumber)
|
||||
.AppendLine();
|
||||
sb.AppendFormat("First track number in last complete session: {0}", descriptor.TrackNumber).
|
||||
AppendLine();
|
||||
|
||||
sb.AppendFormat("Track starts at LBA {0}, or MSF {1:X2}:{2:X2}:{3:X2}", descriptor.TrackStartAddress,
|
||||
(descriptor.TrackStartAddress & 0x0000FF00) >> 8,
|
||||
(descriptor.TrackStartAddress & 0x00FF0000) >> 16,
|
||||
@@ -168,15 +108,19 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
case TocAdr.NoInformation:
|
||||
sb.AppendLine("Q subchannel mode not given");
|
||||
|
||||
break;
|
||||
case TocAdr.CurrentPosition:
|
||||
sb.AppendLine("Q subchannel stores current position");
|
||||
|
||||
break;
|
||||
case TocAdr.ISRC:
|
||||
sb.AppendLine("Q subchannel stores ISRC");
|
||||
|
||||
break;
|
||||
case TocAdr.MediaCatalogNumber:
|
||||
sb.AppendLine("Q subchannel stores media catalog number");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -188,35 +132,41 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
case TocControl.TwoChanNoPreEmph:
|
||||
sb.AppendLine("Stereo audio track with no pre-emphasis");
|
||||
|
||||
break;
|
||||
case TocControl.TwoChanPreEmph:
|
||||
sb.AppendLine("Stereo audio track with 50/15 μs pre-emphasis");
|
||||
|
||||
break;
|
||||
case TocControl.FourChanNoPreEmph:
|
||||
sb.AppendLine("Quadraphonic audio track with no pre-emphasis");
|
||||
|
||||
break;
|
||||
case TocControl.FourChanPreEmph:
|
||||
sb.AppendLine("Stereo audio track with 50/15 μs pre-emphasis");
|
||||
|
||||
break;
|
||||
case TocControl.DataTrack:
|
||||
sb.AppendLine("Data track, recorded uninterrupted");
|
||||
|
||||
break;
|
||||
case TocControl.DataTrackIncremental:
|
||||
sb.AppendLine("Data track, recorded incrementally");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
sb.AppendLine((descriptor.CONTROL & (byte)TocControl.CopyPermissionMask) ==
|
||||
(byte)TocControl.CopyPermissionMask
|
||||
? "Digital copy of track is permitted"
|
||||
(byte)TocControl.CopyPermissionMask ? "Digital copy of track is permitted"
|
||||
: "Digital copy of track is prohibited");
|
||||
|
||||
#if DEBUG
|
||||
#if DEBUG
|
||||
if(descriptor.Reserved1 != 0)
|
||||
sb.AppendFormat("Reserved1 = 0x{0:X2}", descriptor.Reserved1).AppendLine();
|
||||
|
||||
if(descriptor.Reserved2 != 0)
|
||||
sb.AppendFormat("Reserved2 = 0x{0:X2}", descriptor.Reserved2).AppendLine();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
sb.AppendLine();
|
||||
}
|
||||
@@ -228,7 +178,36 @@ namespace DiscImageChef.Decoders.CD
|
||||
public static string Prettify(byte[] CDSessionInfoResponse)
|
||||
{
|
||||
CDSessionInfo? decoded = Decode(CDSessionInfoResponse);
|
||||
|
||||
return Prettify(decoded);
|
||||
}
|
||||
|
||||
public struct CDSessionInfo
|
||||
{
|
||||
/// <summary>Total size of returned session information minus this field</summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>First track number in hex</summary>
|
||||
public byte FirstCompleteSession;
|
||||
/// <summary>Last track number in hex</summary>
|
||||
public byte LastCompleteSession;
|
||||
/// <summary>Track descriptors</summary>
|
||||
public TrackDataDescriptor[] TrackDescriptors;
|
||||
}
|
||||
|
||||
public struct TrackDataDescriptor
|
||||
{
|
||||
/// <summary>Byte 0 Reserved</summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>Byte 1, bits 7 to 4 Type of information in Q subchannel of block where this TOC entry was found</summary>
|
||||
public byte ADR;
|
||||
/// <summary>Byte 1, bits 3 to 0 Track attributes</summary>
|
||||
public byte CONTROL;
|
||||
/// <summary>Byte 2 First track number in last complete session</summary>
|
||||
public byte TrackNumber;
|
||||
/// <summary>Byte 3 Reserved</summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>Bytes 4 to 7 First track number in last complete session start address in LBA or in MSF</summary>
|
||||
public uint TrackStartAddress;
|
||||
}
|
||||
}
|
||||
}
|
||||
150
CD/TOC.cs
150
CD/TOC.cs
@@ -37,89 +37,23 @@ using DiscImageChef.Console;
|
||||
namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
/// <summary>
|
||||
/// Information from the following standards:
|
||||
/// ANSI X3.304-1997
|
||||
/// T10/1048-D revision 9.0
|
||||
/// T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c
|
||||
/// T10/1228-D revision 11a
|
||||
/// T10/1363-D revision 10g
|
||||
/// T10/1545-D revision 1d
|
||||
/// T10/1545-D revision 5
|
||||
/// T10/1545-D revision 5a
|
||||
/// T10/1675-D revision 2c
|
||||
/// T10/1675-D revision 4
|
||||
/// T10/1836-D revision 2g
|
||||
/// ISO/IEC 61104: Compact disc video system - 12 cm CD-V
|
||||
/// ISO/IEC 60908: Audio recording - Compact disc digital audio system
|
||||
/// Information from the following standards: ANSI X3.304-1997 T10/1048-D revision 9.0 T10/1048-D revision 10a
|
||||
/// T10/1228-D revision 7.0c T10/1228-D revision 11a T10/1363-D revision 10g T10/1545-D revision 1d T10/1545-D revision
|
||||
/// 5 T10/1545-D revision 5a T10/1675-D revision 2c T10/1675-D revision 4 T10/1836-D revision 2g ISO/IEC 61104: Compact
|
||||
/// disc video system - 12 cm CD-V ISO/IEC 60908: Audio recording - Compact disc digital audio system
|
||||
/// </summary>
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming"), SuppressMessage("ReSharper", "MemberCanBeInternal"),
|
||||
SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
public static class TOC
|
||||
{
|
||||
public struct CDTOC
|
||||
{
|
||||
/// <summary>
|
||||
/// Total size of returned TOC minus this field
|
||||
/// </summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>
|
||||
/// First track number in hex
|
||||
/// </summary>
|
||||
public byte FirstTrack;
|
||||
/// <summary>
|
||||
/// Last track number in hex
|
||||
/// </summary>
|
||||
public byte LastTrack;
|
||||
/// <summary>
|
||||
/// Track descriptors
|
||||
/// </summary>
|
||||
public CDTOCTrackDataDescriptor[] TrackDescriptors;
|
||||
}
|
||||
|
||||
public struct CDTOCTrackDataDescriptor
|
||||
{
|
||||
/// <summary>
|
||||
/// Byte 0
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>
|
||||
/// Byte 1, bits 7 to 4
|
||||
/// Type of information in Q subchannel of block where this TOC entry was found
|
||||
/// </summary>
|
||||
public byte ADR;
|
||||
/// <summary>
|
||||
/// Byte 1, bits 3 to 0
|
||||
/// Track attributes
|
||||
/// </summary>
|
||||
public byte CONTROL;
|
||||
/// <summary>
|
||||
/// Byte 2
|
||||
/// Track number
|
||||
/// </summary>
|
||||
public byte TrackNumber;
|
||||
/// <summary>
|
||||
/// Byte 3
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>
|
||||
/// Bytes 4 to 7
|
||||
/// The track start address in LBA or in MSF
|
||||
/// </summary>
|
||||
public uint TrackStartAddress;
|
||||
}
|
||||
|
||||
public static CDTOC? Decode(byte[] CDTOCResponse)
|
||||
{
|
||||
if(CDTOCResponse == null) return null;
|
||||
if(CDTOCResponse == null)
|
||||
return null;
|
||||
|
||||
CDTOC decoded = new CDTOC
|
||||
var decoded = new CDTOC
|
||||
{
|
||||
DataLength = BigEndianBitConverter.ToUInt16(CDTOCResponse, 0),
|
||||
FirstTrack = CDTOCResponse[2],
|
||||
DataLength = BigEndianBitConverter.ToUInt16(CDTOCResponse, 0), FirstTrack = CDTOCResponse[2],
|
||||
LastTrack = CDTOCResponse[3]
|
||||
};
|
||||
|
||||
@@ -130,6 +64,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
DicConsole.DebugWriteLine("CD TOC decoder",
|
||||
"Expected CDTOC size ({0} bytes) is not received size ({1} bytes), not decoding",
|
||||
decoded.DataLength + 2, CDTOCResponse.Length);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -140,6 +75,7 @@ namespace DiscImageChef.Decoders.CD
|
||||
decoded.TrackDescriptors[i].CONTROL = (byte)(CDTOCResponse[1 + i * 8 + 4] & 0x0F);
|
||||
decoded.TrackDescriptors[i].TrackNumber = CDTOCResponse[2 + i * 8 + 4];
|
||||
decoded.TrackDescriptors[i].Reserved2 = CDTOCResponse[3 + i * 8 + 4];
|
||||
|
||||
decoded.TrackDescriptors[i].TrackStartAddress =
|
||||
BigEndianBitConverter.ToUInt32(CDTOCResponse, 4 + i * 8 + 4);
|
||||
}
|
||||
@@ -149,18 +85,23 @@ namespace DiscImageChef.Decoders.CD
|
||||
|
||||
public static string Prettify(CDTOC? CDTOCResponse)
|
||||
{
|
||||
if(CDTOCResponse == null) return null;
|
||||
if(CDTOCResponse == null)
|
||||
return null;
|
||||
|
||||
CDTOC response = CDTOCResponse.Value;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.AppendFormat("First track number in first complete session: {0}", response.FirstTrack).AppendLine();
|
||||
sb.AppendFormat("Last track number in last complete session: {0}", response.LastTrack).AppendLine();
|
||||
|
||||
foreach(CDTOCTrackDataDescriptor descriptor in response.TrackDescriptors)
|
||||
{
|
||||
if(descriptor.TrackNumber == 0xAA) sb.AppendLine("Track number: Lead-Out");
|
||||
else sb.AppendFormat("Track number: {0}", descriptor.TrackNumber).AppendLine();
|
||||
if(descriptor.TrackNumber == 0xAA)
|
||||
sb.AppendLine("Track number: Lead-Out");
|
||||
else
|
||||
sb.AppendFormat("Track number: {0}", descriptor.TrackNumber).AppendLine();
|
||||
|
||||
sb.AppendFormat("Track starts at LBA {0}, or MSF {1:X2}:{2:X2}:{3:X2}", descriptor.TrackStartAddress,
|
||||
(descriptor.TrackStartAddress & 0x0000FF00) >> 8,
|
||||
(descriptor.TrackStartAddress & 0x00FF0000) >> 16,
|
||||
@@ -170,21 +111,27 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
case TocAdr.NoInformation:
|
||||
sb.AppendLine("Q subchannel mode not given");
|
||||
|
||||
break;
|
||||
case TocAdr.TrackPointer:
|
||||
sb.AppendLine("Q subchannel stores track pointer");
|
||||
|
||||
break;
|
||||
case TocAdr.VideoTrackPointer:
|
||||
sb.AppendLine("Q subchannel stores video track pointer");
|
||||
|
||||
break;
|
||||
case TocAdr.ISRC:
|
||||
sb.AppendLine("Q subchannel stores ISRC");
|
||||
|
||||
break;
|
||||
case TocAdr.MediaCatalogNumber:
|
||||
sb.AppendLine("Q subchannel stores media catalog number");
|
||||
|
||||
break;
|
||||
default:
|
||||
sb.AppendFormat("Q subchannel mode {0}", descriptor.ADR).AppendLine();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -196,35 +143,41 @@ namespace DiscImageChef.Decoders.CD
|
||||
{
|
||||
case TocControl.TwoChanNoPreEmph:
|
||||
sb.AppendLine("Stereo audio track with no pre-emphasis");
|
||||
|
||||
break;
|
||||
case TocControl.TwoChanPreEmph:
|
||||
sb.AppendLine("Stereo audio track with 50/15 μs pre-emphasis");
|
||||
|
||||
break;
|
||||
case TocControl.FourChanNoPreEmph:
|
||||
sb.AppendLine("Quadraphonic audio track with no pre-emphasis");
|
||||
|
||||
break;
|
||||
case TocControl.FourChanPreEmph:
|
||||
sb.AppendLine("Quadraphonic audio track with 50/15 μs pre-emphasis");
|
||||
|
||||
break;
|
||||
case TocControl.DataTrack:
|
||||
sb.AppendLine("Data track, recorded uninterrupted");
|
||||
|
||||
break;
|
||||
case TocControl.DataTrackIncremental:
|
||||
sb.AppendLine("Data track, recorded incrementally");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
sb.AppendLine((descriptor.CONTROL & (byte)TocControl.CopyPermissionMask) ==
|
||||
(byte)TocControl.CopyPermissionMask
|
||||
? "Digital copy of track is permitted"
|
||||
(byte)TocControl.CopyPermissionMask ? "Digital copy of track is permitted"
|
||||
: "Digital copy of track is prohibited");
|
||||
|
||||
#if DEBUG
|
||||
#if DEBUG
|
||||
if(descriptor.Reserved1 != 0)
|
||||
sb.AppendFormat("Reserved1 = 0x{0:X2}", descriptor.Reserved1).AppendLine();
|
||||
|
||||
if(descriptor.Reserved2 != 0)
|
||||
sb.AppendFormat("Reserved2 = 0x{0:X2}", descriptor.Reserved2).AppendLine();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
sb.AppendLine();
|
||||
}
|
||||
@@ -236,7 +189,36 @@ namespace DiscImageChef.Decoders.CD
|
||||
public static string Prettify(byte[] CDTOCResponse)
|
||||
{
|
||||
CDTOC? decoded = Decode(CDTOCResponse);
|
||||
|
||||
return Prettify(decoded);
|
||||
}
|
||||
|
||||
public struct CDTOC
|
||||
{
|
||||
/// <summary>Total size of returned TOC minus this field</summary>
|
||||
public ushort DataLength;
|
||||
/// <summary>First track number in hex</summary>
|
||||
public byte FirstTrack;
|
||||
/// <summary>Last track number in hex</summary>
|
||||
public byte LastTrack;
|
||||
/// <summary>Track descriptors</summary>
|
||||
public CDTOCTrackDataDescriptor[] TrackDescriptors;
|
||||
}
|
||||
|
||||
public struct CDTOCTrackDataDescriptor
|
||||
{
|
||||
/// <summary>Byte 0 Reserved</summary>
|
||||
public byte Reserved1;
|
||||
/// <summary>Byte 1, bits 7 to 4 Type of information in Q subchannel of block where this TOC entry was found</summary>
|
||||
public byte ADR;
|
||||
/// <summary>Byte 1, bits 3 to 0 Track attributes</summary>
|
||||
public byte CONTROL;
|
||||
/// <summary>Byte 2 Track number</summary>
|
||||
public byte TrackNumber;
|
||||
/// <summary>Byte 3 Reserved</summary>
|
||||
public byte Reserved2;
|
||||
/// <summary>Bytes 4 to 7 The track start address in LBA or in MSF</summary>
|
||||
public uint TrackStartAddress;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user