diff --git a/ChangeLog b/ChangeLog index 5d3410103..04a9a72c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-10-24 Natalia Portillo + + * SCSI/Modes.cs: + Added header information from SCSI-2. + 2015-10-24 Natalia Portillo * SCSI/Modes.cs: diff --git a/SCSI/Modes.cs b/SCSI/Modes.cs index 6591e872b..2febbfa6f 100644 --- a/SCSI/Modes.cs +++ b/SCSI/Modes.cs @@ -51,7 +51,7 @@ namespace DiscImageChef.Decoders.SCSI /// ECMA54 = 0x09, /// - /// ECMA-59: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on Both Sides + /// ECMA-59 & ANSI X3.121-1984: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on Both Sides /// ECMA59 = 0x0A, /// @@ -63,22 +63,80 @@ namespace DiscImageChef.Decoders.SCSI /// ECMA66 = 0x0E, /// - /// ECMA-70: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 1,9 Tracks per mm + /// ECMA-70 & ANSI X3.125-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 1,9 Tracks per mm /// ECMA70 = 0x12, /// - /// ECMA-78: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 3,8 Tracks per mm + /// ECMA-78 & ANSI X3.126-1986: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 3,8 Tracks per mm /// ECMA78 = 0x16, /// - /// ECMA-99: 130 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides; 3,8 Tracks per mm + /// ECMA-99 & ISO 8630-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides; 3,8 Tracks per mm /// ECMA99 = 0x1A, /// - /// ECMA-100: 90 mm Flexible Disk Cartridge using MFM Recording at 7859 ftprad on Both Sides; 5,3 Tracks per mm + /// ECMA-100 & ANSI X3.137: 90 mm Flexible Disk Cartridge using MFM Recording at 7859 ftprad on Both Sides; 5,3 Tracks per mm /// - ECMA100 = 0x1E + ECMA100 = 0x1E, #endregion Medium Types defined in ECMA-111 for Direct-Access devices + + #region Medium Types defined in SCSI-2 for Direct-Access devices + /// + /// Unspecified single sided flexible disk + /// + Unspecified_SS = 0x01, + /// + /// Unspecified double sided flexible disk + /// + Unspecified_DS = 0x02, + /// + /// ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 1 side + /// + X3_73 = 0x05, + /// + /// ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 2 sides + /// + X3_73_DS = 0x06, + /// + /// ANSI X3.80-1980: 130 mm, 3979 ftprad, 1,9 Tracks per mm, 1 side + /// + X3_82 = 0x0D, + /// + /// 6,3 mm tape with 12 tracks at 394 ftpmm + /// + Tape12 = 0x40, + /// + /// 6,3 mm tape with 24 tracks at 394 ftpmm + /// + Tape24 = 0x44, + #endregion Medium Types defined in SCSI-2 for Direct-Access devices + + #region Medium Types defined in SCSI-2 for MultiMedia devices + /// + /// 120 mm CD-ROM + /// + CDROM = 0x01, + /// + /// 120 mm Compact Disc Digital Audio + /// + CDDA = 0x02, + /// + /// 120 mm Compact Disc with data and audio + /// + MixedCD = 0x03, + /// + /// 80 mm CD-ROM + /// + CDROM_80 = 0x05, + /// + /// 80 mm Compact Disc Digital Audio + /// + CDDA_80 = 0x06, + /// + /// 80 mm Compact Disc with data and audio + /// + MixedCD_80 = 0x07 + #endregion Medium Types defined in SCSI-2 for MultiMedia devices } public enum DensityType : byte @@ -99,36 +157,157 @@ namespace DiscImageChef.Decoders.SCSI Flux15916 = 0x03, #endregion Density Types defined in ECMA-111 for Direct-Access devices - #region Medium Types defined in ECMA-111 for Sequential-Access devices + #region Density Types defined in ECMA-111 for Sequential-Access devices /// - /// ECMA-62: 12,7 mm 9-Track Magnetic Tape, 32 ftpmm, NRZ1, 32 cpmm + /// ECMA-62 & ANSI X3.22-1983: 12,7 mm 9-Track Magnetic Tape, 32 ftpmm, NRZI, 32 cpmm /// ECMA62 = 0x01, /// - /// ECMA-62: 12,7 mm 9-Track Magnetic Tape, 126 ftpmm, Phase Encoding, 63 cpmm + /// ECMA-62 & ANSI X3.39-1986: 12,7 mm 9-Track Magnetic Tape, 126 ftpmm, Phase Encoding, 63 cpmm /// ECMA62_Phase = 0x02, /// - /// ECMA-62: 12,7 mm 9-Track Magnetic Tape, 356 ftpmm, NRZ1, 245 cpmm GCR + /// ECMA-62 & ANSI X3.54-1986: 12,7 mm 9-Track Magnetic Tape, 356 ftpmm, NRZI, 245 cpmm GCR /// ECMA62_GCR = 0x03, /// - /// ECMA-79: 6,30 mm Magnetic Tape Cartridge using MFM Recording at 252 ftpmm + /// ECMA-79 & ANSI X3.116-1986: 6,30 mm Magnetic Tape Cartridge using MFM Recording at 252 ftpmm /// ECMA79 = 0x07, /// - /// Draft ECMA: 12,7 mm Magnetic Tape Cartridge using IFM Recording on 18 Tracks at 1944 ftpmm, GCR + /// Draft ECMA & ANSI X3B5/87-099: 12,7 mm Magnetic Tape Cartridge using IFM Recording on 18 Tracks at 1944 ftpmm, GCR /// ECMADraft = 0x09, /// - /// ECMA-46: 6,30 mm Magnetic Tape Cartridge, Phase Encoding, 63 bpmm + /// ECMA-46 & ANSI X3.56-1986: 6,30 mm Magnetic Tape Cartridge, Phase Encoding, 63 bpmm /// ECMA46 = 0x0B, /// - /// ECMA-98: 6,30 mm Magnetic Tape Cartridge, NRZ1 Recording, 394 ftpmm + /// ECMA-98: 6,30 mm Magnetic Tape Cartridge, NRZI Recording, 394 ftpmm /// - ECMA98 = 0x0E - #endregion Medium Types defined in ECMA-111 for Sequential-Access devices + ECMA98 = 0x0E, + #endregion Density Types defined in ECMA-111 for Sequential-Access devices + + #region Density Types defined in SCSI-2 for Sequential-Access devices + /// + /// ANXI X3.136-1986: 6,3 mm 4 or 9-Track Magnetic Tape Cartridge, 315 bpmm, GCR + /// + X3_136 = 0x05, + /// + /// ANXI X3.157-1987: 12,7 mm 9-Track Magnetic Tape, 126 bpmm, Phase Encoding + /// + X3_157 = 0x06, + /// + /// ANXI X3.158-1987: 3,81 mm 4-Track Magnetic Tape Cassette, 315 bpmm, GCR + /// + X3_158 = 0x08, + /// + /// ANXI X3B5/86-199: 12,7 mm 22-Track Magnetic Tape Cartridge, 262 bpmm, MFM + /// + X3B5_86 = 0x0A, + /// + /// HI-TC1: 12,7 mm 24-Track Magnetic Tape Cartridge, 500 bpmm, GCR + /// + HiTC1 = 0x0C, + /// + /// HI-TC2: 12,7 mm 24-Track Magnetic Tape Cartridge, 999 bpmm, GCR + /// + HiTC2 = 0x0D, + /// + /// QIC-120: 6,3 mm 15-Track Magnetic Tape Cartridge, 394 bpmm, GCR + /// + QIC120 = 0x0F, + /// + /// QIC-150: 6,3 mm 18-Track Magnetic Tape Cartridge, 394 bpmm, GCR + /// + QIC150 = 0x10, + /// + /// QIC-320: 6,3 mm 26-Track Magnetic Tape Cartridge, 630 bpmm, GCR + /// + QIC320 = 0x11, + /// + /// QIC-1350: 6,3 mm 30-Track Magnetic Tape Cartridge, 2034 bpmm, RLL + /// + QIC1350 = 0x12, + /// + /// ANXI X3B5/88-185A: 3,81 mm Magnetic Tape Cassette, 2400 bpmm, DDS + /// + X3B5_88 = 0x13, + /// + /// ANXI X3.202-1991: 8 mm Magnetic Tape Cassette, 1703 bpmm, RLL + /// + X3_202 = 0x14, + /// + /// ECMA TC17: 8 mm Magnetic Tape Cassette, 1789 bpmm, RLL + /// + ECMA_TC17 = 0x15, + /// + /// ANXI X3.193-1990: 12,7 mm 48-Track Magnetic Tape Cartridge, 394 bpmm, MFM + /// + X3_193 = 0x16, + /// + /// ANXI X3B5/97-174: 12,7 mm 48-Track Magnetic Tape Cartridge, 1673 bpmm, MFM + /// + X3B5_91 = 0x17, + #endregion Density Types defined in SCSI-2 for Sequential-Access devices + + #region Density Types defined in SCSI-2 for MultiMedia devices + /// + /// User data only + /// + User = 0x01, + /// + /// User data plus auxiliary data field + /// + UserAuxiliary = 0x02, + /// + /// 4-byt tag field, user data plus auxiliary data + /// + UserAuxiliaryTag = 0x03, + /// + /// Audio information only + /// + Audio = 0x04, + #endregion Density Types defined in SCSI-2 for MultiMedia devices + + #region Density Types defined in SCSI-2 for Optical devices + /// + /// 86 mm Read/Write single-sided optical disc with 12500 tracks + /// + D660 = 0x01, + /// + /// 89 mm Read/Write double-sided optical disc with 12500 tracks + /// + D581 = 0x02, + /// + /// 130 mm Read/Write double-sided optical disc with 18750 tracks + /// + I607 = 0x03, + /// + /// 130 mm Write-Once double-sided optical disc with 30000 tracks + /// + D655 = 0x04, + /// + /// 130 mm Write-Once double-sided optical disc with 20000 tracks + /// + D659 = 0x05, + /// + /// 130 mm Write-Once double-sided optical disc with 18750 tracks + /// + D457 = 0x06, + /// + /// 200 mm optical disc + /// + D407 = 0x07, + /// + /// 300 mm double-sided optical disc + /// + D408 = 0x08, + /// + /// 356 mm double-sided optical disc with 56350 tracks + /// + D456 = 0x09 + #endregion Density Types defined in SCSI-2 for Optical devices } public struct BlockDescriptor @@ -146,6 +325,7 @@ namespace DiscImageChef.Decoders.SCSI public byte Speed; public byte BufferedMode; public bool EBC; + public bool DPOFUA; } public static ModeHeader? DecodeModeHeader6(byte[] modeResponse, PeripheralDeviceTypes deviceType) @@ -171,8 +351,11 @@ namespace DiscImageChef.Decoders.SCSI } } - if (deviceType == PeripheralDeviceTypes.DirectAccess) + if (deviceType == PeripheralDeviceTypes.DirectAccess || deviceType == PeripheralDeviceTypes.MultiMediaDevice) + { header.WriteProtected = ((modeResponse[2] & 0x80) == 0x80); + header.DPOFUA = ((modeResponse[2] & 0x10) == 0x10); + } if (deviceType == PeripheralDeviceTypes.SequentialAccess) { @@ -188,6 +371,7 @@ namespace DiscImageChef.Decoders.SCSI { header.WriteProtected = ((modeResponse[2] & 0x80) == 0x80); header.EBC = ((modeResponse[2] & 0x01) == 0x01); + header.DPOFUA = ((modeResponse[2] & 0x10) == 0x10); } return header; @@ -219,7 +403,7 @@ namespace DiscImageChef.Decoders.SCSI sb.AppendLine("ECMA-54: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on One Side"); break; case MediumTypes.ECMA59: - sb.AppendLine("ECMA-59: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on Both Sides"); + sb.AppendLine("ECMA-59 & ANSI X3.121-1984: 200 mm Flexible Disk Cartridge using Two-Frequency Recording at 13262 ftprad on Both Sides"); break; case MediumTypes.ECMA69: sb.AppendLine("ECMA-69: 200 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides"); @@ -228,16 +412,37 @@ namespace DiscImageChef.Decoders.SCSI sb.AppendLine("ECMA-66: 130 mm Flexible Disk Cartridge using Two-Frequency Recording at 7958 ftprad on One Side"); break; case MediumTypes.ECMA70: - sb.AppendLine("ECMA-70: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 1,9 Tracks per mm"); + sb.AppendLine("ECMA-70 & ANSI X3.125-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 1,9 Tracks per mm"); break; case MediumTypes.ECMA78: - sb.AppendLine("ECMA-78: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 3,8 Tracks per mm"); + sb.AppendLine("ECMA-78 & ANSI X3.126-1986: 130 mm Flexible Disk Cartridge using MFM Recording at 7958 ftprad on Both Sides; 3,8 Tracks per mm"); break; case MediumTypes.ECMA99: - sb.AppendLine("ECMA-99: 130 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides; 3,8 Tracks per mm"); + sb.AppendLine("ECMA-99 & ISO 8630-1985: 130 mm Flexible Disk Cartridge using MFM Recording at 13262 ftprad on Both Sides; 3,8 Tracks per mm"); break; case MediumTypes.ECMA100: - sb.AppendLine("ECMA-100: 90 mm Flexible Disk Cartridge using MFM Recording at 7859 ftprad on Both Sides; 5,3 Tracks per mm"); + sb.AppendLine("ECMA-100 & ANSI X3.137: 90 mm Flexible Disk Cartridge using MFM Recording at 7859 ftprad on Both Sides; 5,3 Tracks per mm"); + break; + case MediumTypes.Unspecified_SS: + sb.AppendLine("Unspecified single sided flexible disk"); + break; + case MediumTypes.Unspecified_DS: + sb.AppendLine("Unspecified double sided flexible disk"); + break; + case MediumTypes.X3_73: + sb.AppendLine("ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 1 side"); + break; + case MediumTypes.X3_73_DS: + sb.AppendLine("ANSI X3.73-1980: 200 mm, 6631 ftprad, 1,9 Tracks per mm, 2 sides"); + break; + case MediumTypes.X3_82: + sb.AppendLine("ANSI X3.80-1980: 130 mm, 3979 ftprad, 1,9 Tracks per mm, 1 side"); + break; + case MediumTypes.Tape12: + sb.AppendLine("6,3 mm tape with 12 tracks at 394 ftpmm"); + break; + case MediumTypes.Tape24: + sb.AppendLine("6,3 mm tape with 24 tracks at 394 ftpmm"); break; default: sb.AppendFormat("Unknown medium type 0x{0:X2}", header.Value.MediumType).AppendLine(); @@ -246,12 +451,17 @@ namespace DiscImageChef.Decoders.SCSI if (header.Value.WriteProtected) sb.AppendLine("Medium is write protected"); - + + if (header.Value.DPOFUA) + sb.AppendLine("Drive supports DPO and FUA bits"); + foreach (BlockDescriptor descriptor in header.Value.BlockDescriptors) { - string density; + string density = ""; switch (descriptor.Density) { + case DensityType.Default: + break; case DensityType.Flux7958: density = "7958 flux transitions per radian"; break; @@ -266,10 +476,20 @@ namespace DiscImageChef.Decoders.SCSI break; } - if (descriptor.Blocks == 0) - sb.AppendFormat("All remaining blocks have {0} and are {1} bytes each", density, descriptor.BlockLength).AppendLine(); + if (density != "") + { + if (descriptor.Blocks == 0) + sb.AppendFormat("All remaining blocks have {0} and are {1} bytes each", density, descriptor.BlockLength).AppendLine(); + else + sb.AppendFormat("{0} blocks have {1} and are {2} bytes each", descriptor.Blocks, density, descriptor.BlockLength).AppendLine(); + } else - sb.AppendFormat("{0} blocks have {1} and are {2} bytes each", descriptor.Blocks, density, descriptor.BlockLength).AppendLine(); + { + if (descriptor.Blocks == 0) + sb.AppendFormat("All remaining blocks are {0} bytes each", descriptor.BlockLength).AppendLine(); + else + sb.AppendFormat("{0} blocks are {1} bytes each", descriptor.Blocks, descriptor.BlockLength).AppendLine(); + } } break; @@ -284,6 +504,9 @@ namespace DiscImageChef.Decoders.SCSI case 1: sb.AppendLine("Device uses a write cache"); break; + case 2: + sb.AppendLine("Device uses a write cache but doesn't return until cache is flushed"); + break; default: sb.AppendFormat("Unknown buffered mode code 0x{0:X2}", header.Value.BufferedMode).AppendLine(); break; @@ -299,48 +522,115 @@ namespace DiscImageChef.Decoders.SCSI foreach (BlockDescriptor descriptor in header.Value.BlockDescriptors) { - string density; + string density = ""; switch (descriptor.Density) { + case DensityType.Default: + break; case DensityType.ECMA62: - density = "ECMA-62: 12,7 mm 9-Track Magnetic Tape, 32 ftpmm, NRZ1, 32 cpmm"; + density = "ECMA-62 & ANSI X3.22-1983: 12,7 mm 9-Track Magnetic Tape, 32 ftpmm, NRZI, 32 cpmm"; break; case DensityType.ECMA62_Phase: - density = "ECMA-62: 12,7 mm 9-Track Magnetic Tape, 126 ftpmm, Phase Encoding, 63 cpmm"; + density = "ECMA-62 & ANSI X3.39-1986: 12,7 mm 9-Track Magnetic Tape, 126 ftpmm, Phase Encoding, 63 cpmm"; break; case DensityType.ECMA62_GCR: - density = "ECMA-62: 12,7 mm 9-Track Magnetic Tape, 356 ftpmm, NRZ1, 245 cpmm GCR"; + density = "ECMA-62 & ANSI X3.54-1986: 12,7 mm 9-Track Magnetic Tape, 356 ftpmm, NRZI, 245 cpmm GCR"; break; case DensityType.ECMA79: - density = "ECMA-79: 6,30 mm Magnetic Tape Cartridge, 252 ftpmm, MFM"; + density = "ECMA-79 & ANSI X3.116-1986: 6,30 mm Magnetic Tape Cartridge, 252 ftpmm, MFM"; break; case DensityType.ECMADraft: - density = "Draft ECMA: 12,7 mm 18-Track Magnetic Tape Cartridge, 1944 ftpmm, IFM, GCR"; + density = "Draft ECMA & ANSI X3B5/87-099: 12,7 mm 18-Track Magnetic Tape Cartridge, 1944 ftpmm, IFM, GCR"; break; case DensityType.ECMA46: - density = "ECMA-46: 6,30 mm Magnetic Tape Cartridge, Phase Encoding, 63 bpmm"; + density = "ECMA-46 & ANSI X3.56-1986: 6,30 mm Magnetic Tape Cartridge, Phase Encoding, 63 bpmm"; break; case DensityType.ECMA98: - density = "ECMA-98: 6,30 mm Magnetic Tape Cartridge, NRZ1, 394 ftpmm"; + density = "ECMA-98: 6,30 mm Magnetic Tape Cartridge, NRZI, 394 ftpmm"; + break; + case DensityType.X3_136: + density = "ANXI X3.136-1986: 6,3 mm 4 or 9-Track Magnetic Tape Cartridge, 315 bpmm, GCR"; + break; + case DensityType.X3_157: + density = "ANXI X3.157-1987: 12,7 mm 9-Track Magnetic Tape, 126 bpmm, Phase Encoding"; + break; + case DensityType.X3_158: + density = "ANXI X3.158-1987: 3,81 mm 4-Track Magnetic Tape Cassette, 315 bpmm, GCR"; + break; + case DensityType.X3B5_86: + density = "ANXI X3B5/86-199: 12,7 mm 22-Track Magnetic Tape Cartridge, 262 bpmm, MFM"; + break; + case DensityType.HiTC1: + density = "HI-TC1: 12,7 mm 24-Track Magnetic Tape Cartridge, 500 bpmm, GCR"; + break; + case DensityType.HiTC2: + density = "HI-TC2: 12,7 mm 24-Track Magnetic Tape Cartridge, 999 bpmm, GCR"; + break; + case DensityType.QIC120: + density = "QIC-120: 6,3 mm 15-Track Magnetic Tape Cartridge, 394 bpmm, GCR"; + break; + case DensityType.QIC150: + density = "QIC-150: 6,3 mm 18-Track Magnetic Tape Cartridge, 394 bpmm, GCR"; + break; + case DensityType.QIC320: + density = "QIC-320: 6,3 mm 26-Track Magnetic Tape Cartridge, 630 bpmm, GCR"; + break; + case DensityType.QIC1350: + density = "QIC-1350: 6,3 mm 30-Track Magnetic Tape Cartridge, 2034 bpmm, RLL"; + break; + case DensityType.X3B5_88: + density = "ANXI X3B5/88-185A: 3,81 mm Magnetic Tape Cassette, 2400 bpmm, DDS"; + break; + case DensityType.X3_202: + density = "ANXI X3.202-1991: 8 mm Magnetic Tape Cassette, 1703 bpmm, RLL"; + break; + case DensityType.ECMA_TC17: + density = "ECMA TC17: 8 mm Magnetic Tape Cassette, 1789 bpmm, RLL"; + break; + case DensityType.X3_193: + density = "ANXI X3.193-1990: 12,7 mm 48-Track Magnetic Tape Cartridge, 394 bpmm, MFM"; + break; + case DensityType.X3B5_91: + density = "ANXI X3B5/97-174: 12,7 mm 48-Track Magnetic Tape Cartridge, 1673 bpmm, MFM"; break; default: density = String.Format("Unknown density code 0x{0:X2}", descriptor.Density); break; } - if (descriptor.Blocks == 0) + if (density != "") { - if (descriptor.BlockLength == 0) - sb.AppendFormat("All remaining blocks conform to {0} and have a variable length", density).AppendLine(); + if (descriptor.Blocks == 0) + { + if (descriptor.BlockLength == 0) + sb.AppendFormat("All remaining blocks conform to {0} and have a variable length", density).AppendLine(); + else + sb.AppendFormat("All remaining blocks conform to {0} and are {1} bytes each", density, descriptor.BlockLength).AppendLine(); + } else - sb.AppendFormat("All remaining blocks conform to {0} and are {1} bytes each", density, descriptor.BlockLength).AppendLine(); + { + if (descriptor.BlockLength == 0) + sb.AppendFormat("{0} blocks conform to {1} and have a variable length", descriptor.Blocks, density).AppendLine(); + else + sb.AppendFormat("{0} blocks conform to {1} and are {2} bytes each", descriptor.Blocks, density, descriptor.BlockLength).AppendLine(); + } } else { - if (descriptor.BlockLength == 0) - sb.AppendFormat("{0} blocks conform to {1} and have a variable length", descriptor.Blocks, density).AppendLine(); + if (descriptor.Blocks == 0) + { + if (descriptor.BlockLength == 0) + sb.AppendFormat("All remaining blocks have a variable length").AppendLine(); + else + sb.AppendFormat("All remaining blocks are {0} bytes each", descriptor.BlockLength).AppendLine(); + } else - sb.AppendFormat("{0} blocks conform to {1} and are {2} bytes each", descriptor.Blocks, density, descriptor.BlockLength).AppendLine(); + { + if (descriptor.BlockLength == 0) + sb.AppendFormat("{0} blocks have a variable length", descriptor.Blocks).AppendLine(); + else + sb.AppendFormat("{0} blocks are {1} bytes each", descriptor.Blocks, descriptor.BlockLength).AppendLine(); + } } } @@ -368,6 +658,160 @@ namespace DiscImageChef.Decoders.SCSI sb.AppendLine("Medium is write protected"); if (header.Value.EBC) sb.AppendLine("Blank checking during write is enabled"); + if (header.Value.DPOFUA) + sb.AppendLine("Drive supports DPO and FUA bits"); + + foreach (BlockDescriptor descriptor in header.Value.BlockDescriptors) + { + string density = ""; + switch (descriptor.Density) + { + case DensityType.Default: + break; + case DensityType.D660: + density = "86 mm Read/Write single-sided optical disc with 12500 tracks"; + break; + case DensityType.D581: + density = "89 mm Read/Write double-sided optical disc with 12500 tracks"; + break; + case DensityType.I607: + density = "130 mm Read/Write double-sided optical disc with 18750 tracks"; + break; + case DensityType.D655: + density = "130 mm Write-Once double-sided optical disc with 30000 tracks"; + break; + case DensityType.D659: + density = "130 mm Write-Once double-sided optical disc with 20000 tracks"; + break; + case DensityType.D457: + density = "130 mm Write-Once double-sided optical disc with 18750 tracks"; + break; + case DensityType.D407: + density = "200 mm optical disc"; + break; + case DensityType.D408: + density = "300 mm double-sided optical disc"; + break; + case DensityType.D456: + density = "356 mm double-sided optical disc with 56350 tracks"; + break; + default: + density = String.Format("Unknown density code 0x{0:X2}", descriptor.Density); + break; + } + + if (density != "") + { + if (descriptor.Blocks == 0) + { + if (descriptor.BlockLength == 0) + sb.AppendFormat("All remaining blocks are {0} and have a variable length", density).AppendLine(); + else + sb.AppendFormat("All remaining blocks are {0} and are {1} bytes each", density, descriptor.BlockLength).AppendLine(); + } + else + { + if (descriptor.BlockLength == 0) + sb.AppendFormat("{0} blocks are {1} and have a variable length", descriptor.Blocks, density).AppendLine(); + else + sb.AppendFormat("{0} blocks are {1} and are {2} bytes each", descriptor.Blocks, density, descriptor.BlockLength).AppendLine(); + } + } + else + { + if (descriptor.Blocks == 0) + { + if (descriptor.BlockLength == 0) + sb.AppendFormat("All remaining blocks have a variable length").AppendLine(); + else + sb.AppendFormat("All remaining blocks are {0} bytes each", descriptor.BlockLength).AppendLine(); + } + else + { + if (descriptor.BlockLength == 0) + sb.AppendFormat("{0} blocks have a variable length", descriptor.Blocks).AppendLine(); + else + sb.AppendFormat("{0} blocks are {1} bytes each", descriptor.Blocks, descriptor.BlockLength).AppendLine(); + } + } + } + + break; + } + case PeripheralDeviceTypes.MultiMediaDevice: + { + sb.Append("Medium is "); + + switch (header.Value.MediumType) + { + case MediumTypes.CDROM: + sb.AppendLine("120 mm CD-ROM"); + break; + case MediumTypes.CDDA: + sb.AppendLine("120 mm Compact Disc Digital Audio"); + break; + case MediumTypes.MixedCD: + sb.AppendLine("120 mm Compact Disc with data and audio"); + break; + case MediumTypes.CDROM_80: + sb.AppendLine("80 mm CD-ROM"); + break; + case MediumTypes.CDDA_80: + sb.AppendLine("80 mm Compact Disc Digital Audio"); + break; + case MediumTypes.MixedCD_80: + sb.AppendLine("80 mm Compact Disc with data and audio"); + break; + default: + sb.AppendFormat("Unknown medium type 0x{0:X2}", header.Value.MediumType).AppendLine(); + break; + } + + if (header.Value.WriteProtected) + sb.AppendLine("Medium is write protected"); + + if (header.Value.DPOFUA) + sb.AppendLine("Drive supports DPO and FUA bits"); + + foreach (BlockDescriptor descriptor in header.Value.BlockDescriptors) + { + string density = ""; + switch (descriptor.Density) + { + case DensityType.Default: + break; + case DensityType.User: + density = "user data only"; + break; + case DensityType.UserAuxiliary: + density = "user data plus auxiliary data"; + break; + case DensityType.UserAuxiliaryTag: + density = "4-byte tag, user data plus auxiliary data"; + break; + case DensityType.Audio: + density = "audio information only"; + break; + default: + density = String.Format("with unknown density code 0x{0:X2}", descriptor.Density); + break; + } + + if (density != "") + { + if (descriptor.Blocks == 0) + sb.AppendFormat("All remaining blocks have {0} and are {1} bytes each", density, descriptor.BlockLength).AppendLine(); + else + sb.AppendFormat("{0} blocks have {1} and are {2} bytes each", descriptor.Blocks, density, descriptor.BlockLength).AppendLine(); + } + else + { + if (descriptor.Blocks == 0) + sb.AppendFormat("All remaining blocks are {0} bytes each", descriptor.BlockLength).AppendLine(); + else + sb.AppendFormat("{0} blocks are {1} bytes each", descriptor.Blocks, descriptor.BlockLength).AppendLine(); + } + } break; }