diff --git a/ChangeLog b/ChangeLog index 1a84aaf..4cf4438 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2016-10-13 Natalia Portillo + + * Modes.cs: Added MODE PAGE 1Dh + 2016-10-13 Natalia Portillo * EVPD.cs: diff --git a/SCSI/Modes.cs b/SCSI/Modes.cs index 7c0ac62..455998f 100644 --- a/SCSI/Modes.cs +++ b/SCSI/Modes.cs @@ -7396,6 +7396,99 @@ namespace DiscImageChef.Decoders.SCSI #endregion Certance Mode Page 0x22: Interface Control Mode Page + #region Mode Page 0x1D: Medium Configuration Mode Page + public struct ModePage_1D + { + /// + /// Parameters can be saved + /// + public bool PS; + public bool WORMM; + public byte WormModeLabelRestrictions; + public byte WormModeFilemarkRestrictions; + } + + public static ModePage_1D? DecodeModePage_1D(byte[] pageResponse) + { + if(pageResponse == null) + return null; + + if((pageResponse[0] & 0x40) == 0x40) + return null; + + if((pageResponse[0] & 0x3F) != 0x1D) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 32) + return null; + + ModePage_1D decoded = new ModePage_1D(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.WORMM |= (pageResponse[2] & 0x01) == 0x01; + decoded.WormModeLabelRestrictions = pageResponse[4]; + decoded.WormModeFilemarkRestrictions = pageResponse[5]; + + return decoded; + } + + public static string PrettifyModePage_1D(byte[] pageResponse) + { + return PrettifyModePage_1D(DecodeModePage_1D(pageResponse)); + } + + public static string PrettifyModePage_1D(ModePage_1D? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1D page = modePage.Value; + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("SCSI Medium Configuration Mode Page:"); + + if(page.PS) + sb.AppendLine("\tParameters can be saved"); + + if(page.WORMM) + sb.AppendLine("\tDrive is operating in WORM mode"); + + switch(page.WormModeLabelRestrictions) + { + case 0: + sb.AppendLine("\tDrive does not allow any logical blocks to be overwritten"); + break; + case 1: + sb.AppendLine("\tDrive allows a tape header to be overwritten"); + break; + case 2: + sb.AppendLine("\tDrive allows all format labels to be overwritten"); + break; + default: + sb.AppendFormat("\tUnknown WORM mode label restrictions code {0}", page.WormModeLabelRestrictions).AppendLine(); + break; + } + + switch(page.WormModeFilemarkRestrictions) + { + case 2: + sb.AppendLine("\tDrive allows any number of filemarks immediately preceding EOD to be overwritten except filemark closes to BOP"); + break; + case 3: + sb.AppendLine("\tDrive allows any number of filemarks immediately preceding EOD to be overwritten"); + break; + default: + sb.AppendFormat("\tUnknown WORM mode filemark restrictions code {0}", page.WormModeLabelRestrictions).AppendLine(); + break; + } + + return sb.ToString(); + } + + #endregion Mode Page 0x1D: Medium Configuration Mode Page } }