diff --git a/ChangeLog b/ChangeLog index 3985c2e..f25578e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-01-15 Natalia Portillo + + * SCSI/Modes.cs: + Implement decoding Fujitsu Verify Control Page. + 2016-01-15 Natalia Portillo * SCSI/Modes.cs: diff --git a/SCSI/Modes.cs b/SCSI/Modes.cs index 710e38e..bfe1448 100644 --- a/SCSI/Modes.cs +++ b/SCSI/Modes.cs @@ -6620,6 +6620,130 @@ namespace DiscImageChef.Decoders.SCSI return decoded; } + + #region Fujitsu Mode Page 0x3E: Verify Control page + public enum Fujitsu_VerifyModes : byte + { + /// + /// Always verify after writing + /// + Always = 0, + /// + /// Never verify after writing + /// + Never = 1, + /// + /// Verify after writing depending on condition + /// + Depends = 2, + Reserved = 4 + } + + public struct Fujitsu_ModePage_3E + { + /// + /// Parameters can be saved + /// + public bool PS; + /// + /// If set, AV data support mode is applied + /// + public bool audioVisualMode; + /// + /// If set the test write operation is restricted + /// + public bool streamingMode; + public byte Reserved1; + /// + /// Verify mode for WRITE commands + /// + public Fujitsu_VerifyModes verifyMode; + public byte Reserved2; + /// + /// Device type provided in response to INQUIRY + /// + public PeripheralDeviceTypes devType; + public byte[] Reserved3; + } + + public static Fujitsu_ModePage_3E? DecodeFujitsuModePage_3E(byte[] pageResponse) + { + if (pageResponse == null) + return null; + + if ((pageResponse[0] & 0x40) == 0x40) + return null; + + if ((pageResponse[0] & 0x3F) != 0x3E) + return null; + + if (pageResponse[1] + 2 != pageResponse.Length) + return null; + + if (pageResponse.Length != 8) + return null; + + Fujitsu_ModePage_3E decoded = new Fujitsu_ModePage_3E(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + + decoded.audioVisualMode |= (pageResponse[2] & 0x80) == 0x80; + decoded.streamingMode |= (pageResponse[2] & 0x40) == 0x40; + decoded.Reserved1 = (byte)((pageResponse[2] & 0x3C) >> 2); + decoded.verifyMode = (Fujitsu_VerifyModes)(pageResponse[2] & 0x03); + + decoded.Reserved2 = (byte)((pageResponse[3] & 0xE0) >> 5); + decoded.devType = (PeripheralDeviceTypes)(pageResponse[3] & 0x1F); + + decoded.Reserved3 = new byte[4]; + Array.Copy(pageResponse, 4, decoded.Reserved3, 0, 4); + + return decoded; + } + + public static string PrettifyFujitsuModePage_3E(byte[] pageResponse) + { + return PrettifyFujitsuModePage_3E(DecodeFujitsuModePage_3E(pageResponse)); + } + + public static string PrettifyFujitsuModePage_3E(Fujitsu_ModePage_3E? modePage) + { + if (!modePage.HasValue) + return null; + + Fujitsu_ModePage_3E page = modePage.Value; + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("Fujitsu Verify Control Page:"); + + if (page.PS) + sb.AppendLine("\tParameters can be saved"); + + if (page.audioVisualMode) + sb.AppendLine("\tAudio/Visual data support mode is applied"); + if (page.streamingMode) + sb.AppendLine("\tTest write operation is restricted during read or write operations."); + + switch (page.verifyMode) + { + case Fujitsu_VerifyModes.Always: + sb.AppendLine("\tAlways apply the verify operation"); + break; + case Fujitsu_VerifyModes.Never: + sb.AppendLine("\tNever apply the verify operation"); + break; + case Fujitsu_VerifyModes.Depends: + sb.AppendLine("\tApply the verify operation depending on the condition"); + break; + } + + sb.AppendFormat("\tThe device type that would be provided in the INQUIRY response is {0}", + page.devType).AppendLine(); + + return sb.ToString(); + } + + #endregion Fujitsu Mode Page 0x3E: Verify Control page } }