diff --git a/DiscImageChef.DiscImages/Anex86.cs b/DiscImageChef.DiscImages/Anex86.cs index ab3de9a5..1c689417 100644 --- a/DiscImageChef.DiscImages/Anex86.cs +++ b/DiscImageChef.DiscImages/Anex86.cs @@ -334,18 +334,7 @@ namespace DiscImageChef.DiscImages return false; } - (ushort cylinders, byte heads, ushort sectorsPerTrack, uint bytesPerSector, MediaEncoding encoding, bool - variableSectorsPerTrack, MediaType type) geometry = Geometry.GetGeometry(mediaType); - - fdihdr = new Anex86Header - { - hdrSize = 4096, - dskSize = (int)(sectors * sectorSize), - bps = (int)sectorSize, - spt = geometry.sectorsPerTrack, - heads = geometry.heads, - cylinders = geometry.cylinders - }; + fdihdr = new Anex86Header {hdrSize = 4096, dskSize = (int)(sectors * sectorSize), bps = (int)sectorSize}; IsWriting = true; ErrorMessage = null; @@ -438,26 +427,26 @@ namespace DiscImageChef.DiscImages return false; } - if(imageInfo.MediaType == MediaType.Unknown || imageInfo.MediaType == MediaType.GENERIC_HDD) + if((imageInfo.MediaType == MediaType.Unknown || imageInfo.MediaType == MediaType.GENERIC_HDD) && + fdihdr.cylinders == 0) { - // TODO: Interface to set geometry - imageInfo.Cylinders = (uint)(imageInfo.Sectors / 8 / 33); - imageInfo.Heads = 8; - imageInfo.SectorsPerTrack = 33; + fdihdr.cylinders = (int)(imageInfo.Sectors / 8 / 33); + fdihdr.heads = 8; + fdihdr.spt = 33; - while(imageInfo.Cylinders == 0) + while(fdihdr.cylinders == 0) { - imageInfo.Heads--; + fdihdr.heads--; - if(imageInfo.Heads == 0) + if(fdihdr.heads == 0) { - imageInfo.SectorsPerTrack--; - imageInfo.Heads = 8; + fdihdr.spt--; + fdihdr.heads = 8; } - imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); + fdihdr.cylinders = (int)imageInfo.Sectors / fdihdr.heads / fdihdr.spt; - if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; + if(fdihdr.cylinders == 0 && fdihdr.heads == 0 && fdihdr.spt == 0) break; } } @@ -482,6 +471,33 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + if(cylinders > int.MaxValue) + { + ErrorMessage = "Too many cylinders."; + return false; + } + + if(heads > int.MaxValue) + { + ErrorMessage = "Too many heads."; + return false; + } + + if(sectorsPerTrack > int.MaxValue) + { + ErrorMessage = "Too many sectors per track."; + return false; + } + + fdihdr.spt = (int)sectorsPerTrack; + fdihdr.heads = (int)heads; + fdihdr.cylinders = (int)cylinders; + + return true; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] struct Anex86Header { diff --git a/DiscImageChef.DiscImages/CDRWin.cs b/DiscImageChef.DiscImages/CDRWin.cs index 5c8007b4..d7da1d00 100644 --- a/DiscImageChef.DiscImages/CDRWin.cs +++ b/DiscImageChef.DiscImages/CDRWin.cs @@ -2220,6 +2220,12 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + ErrorMessage = "Unsupported feature"; + return false; + } + public bool SetMetadata(ImageInfo metadata) { discimage.Barcode = metadata.MediaBarcode; diff --git a/DiscImageChef.DiscImages/CisCopy.cs b/DiscImageChef.DiscImages/CisCopy.cs index 7345c215..0786c94c 100644 --- a/DiscImageChef.DiscImages/CisCopy.cs +++ b/DiscImageChef.DiscImages/CisCopy.cs @@ -640,6 +640,12 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + // Geometry is not stored in image + return true; + } + [SuppressMessage("ReSharper", "InconsistentNaming")] enum DiskType : byte { diff --git a/DiscImageChef.DiscImages/DiskCopy42.cs b/DiscImageChef.DiscImages/DiskCopy42.cs index cc745050..dbd1b929 100644 --- a/DiscImageChef.DiscImages/DiskCopy42.cs +++ b/DiscImageChef.DiscImages/DiskCopy42.cs @@ -807,7 +807,7 @@ namespace DiscImageChef.DiscImages ErrorMessage = "Unsupported sector size"; return false; } - + switch(mediaType) { case MediaType.AppleFileWare: @@ -1143,6 +1143,12 @@ namespace DiscImageChef.DiscImages Close(); } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + // Geometry is not stored in image + return true; + } + // DiskCopy 4.2 header, big-endian, data-fork, start of file, 84 bytes struct Dc42Header { diff --git a/DiscImageChef.DiscImages/DriDiskCopy.cs b/DiscImageChef.DiscImages/DriDiskCopy.cs index 655da2c6..cfd8a3e3 100644 --- a/DiscImageChef.DiscImages/DriDiskCopy.cs +++ b/DiscImageChef.DiscImages/DriDiskCopy.cs @@ -544,6 +544,12 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + // Geometry is set by media type + return true; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] struct DriFooter { diff --git a/DiscImageChef.DiscImages/IWritableImage.cs b/DiscImageChef.DiscImages/IWritableImage.cs index a461ccf0..5f15a4ad 100644 --- a/DiscImageChef.DiscImages/IWritableImage.cs +++ b/DiscImageChef.DiscImages/IWritableImage.cs @@ -63,7 +63,7 @@ namespace DiscImageChef.DiscImages /// IEnumerable KnownExtensions { get; } - bool IsWriting { get; } + bool IsWriting { get; } string ErrorMessage { get; } /// @@ -139,8 +139,17 @@ namespace DiscImageChef.DiscImages /// /// Sets image metadata /// - /// containing image metadata + /// containing image metadata /// true if operating completed successfully, false otherwise bool SetMetadata(ImageInfo metadata); + + /// + /// Sets media geometry + /// + /// Cylinders + /// Heads + /// Sectors per track + /// true if operating completed successfully, false otherwise + bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack); } } \ No newline at end of file diff --git a/DiscImageChef.DiscImages/MaxiDisk.cs b/DiscImageChef.DiscImages/MaxiDisk.cs index 0fd5371c..18490d4e 100644 --- a/DiscImageChef.DiscImages/MaxiDisk.cs +++ b/DiscImageChef.DiscImages/MaxiDisk.cs @@ -515,6 +515,33 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + if(cylinders > 90) + { + ErrorMessage = "Too many cylinders."; + return false; + } + + if(heads > 2) + { + ErrorMessage = "Too many heads."; + return false; + } + + if(sectorsPerTrack > byte.MaxValue) + { + ErrorMessage = "Too many sectors per track."; + return false; + } + + imageInfo.SectorsPerTrack = sectorsPerTrack; + imageInfo.Heads = heads; + imageInfo.Cylinders = cylinders; + + return true; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] struct HdkHeader { diff --git a/DiscImageChef.DiscImages/NHDr0.cs b/DiscImageChef.DiscImages/NHDr0.cs index 515df67d..af0bd751 100644 --- a/DiscImageChef.DiscImages/NHDr0.cs +++ b/DiscImageChef.DiscImages/NHDr0.cs @@ -415,24 +415,26 @@ namespace DiscImageChef.DiscImages return false; } - // TODO: Interface to set geometry - imageInfo.Cylinders = (uint)(imageInfo.Sectors / 8 / 17); - imageInfo.Heads = 8; - imageInfo.SectorsPerTrack = 17; - - while(imageInfo.Cylinders == 0) + if(imageInfo.Cylinders == 0) { - imageInfo.Heads--; + imageInfo.Cylinders = (uint)(imageInfo.Sectors / 8 / 17); + imageInfo.Heads = 8; + imageInfo.SectorsPerTrack = 17; - if(imageInfo.Heads == 0) + while(imageInfo.Cylinders == 0) { - imageInfo.SectorsPerTrack--; - imageInfo.Heads = 16; + imageInfo.Heads--; + + if(imageInfo.Heads == 0) + { + imageInfo.SectorsPerTrack--; + imageInfo.Heads = 16; + } + + imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); + + if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } - - imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); - - if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } Nhdr0Header header = new Nhdr0Header @@ -477,6 +479,33 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + if(cylinders > int.MaxValue) + { + ErrorMessage = "Too many cylinders."; + return false; + } + + if(heads > short.MaxValue) + { + ErrorMessage = "Too many heads."; + return false; + } + + if(sectorsPerTrack > short.MaxValue) + { + ErrorMessage = "Too many sectors per track."; + return false; + } + + imageInfo.SectorsPerTrack = sectorsPerTrack; + imageInfo.Heads = heads; + imageInfo.Cylinders = cylinders; + + return true; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] struct Nhdr0Header { diff --git a/DiscImageChef.DiscImages/RayDIM.cs b/DiscImageChef.DiscImages/RayDIM.cs index 5a73f7cf..e0656ec3 100644 --- a/DiscImageChef.DiscImages/RayDIM.cs +++ b/DiscImageChef.DiscImages/RayDIM.cs @@ -458,6 +458,12 @@ namespace DiscImageChef.DiscImages return false; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + // Geometry is set by media type + return true; + } + public bool Close() { if(!IsWriting) diff --git a/DiscImageChef.DiscImages/RsIde.cs b/DiscImageChef.DiscImages/RsIde.cs index a7e2953b..05f7a5b7 100644 --- a/DiscImageChef.DiscImages/RsIde.cs +++ b/DiscImageChef.DiscImages/RsIde.cs @@ -440,24 +440,26 @@ namespace DiscImageChef.DiscImages Version thisVersion = GetType().Assembly.GetName().Version; - // TODO: Interface to set geometry - imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); - imageInfo.Heads = 16; - imageInfo.SectorsPerTrack = 63; - - while(imageInfo.Cylinders == 0) + if(imageInfo.Cylinders == 0) { - imageInfo.Heads--; + imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); + imageInfo.Heads = 16; + imageInfo.SectorsPerTrack = 63; - if(imageInfo.Heads == 0) + while(imageInfo.Cylinders == 0) { - imageInfo.SectorsPerTrack--; - imageInfo.Heads = 16; + imageInfo.Heads--; + + if(imageInfo.Heads == 0) + { + imageInfo.SectorsPerTrack--; + imageInfo.Heads = 16; + } + + imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); + + if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } - - imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); - - if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } RsIdeHeader header = new RsIdeHeader @@ -538,7 +540,35 @@ namespace DiscImageChef.DiscImages imageInfo.DriveModel = metadata.DriveModel; imageInfo.DriveFirmwareRevision = metadata.DriveFirmwareRevision; imageInfo.DriveSerialNumber = metadata.DriveSerialNumber; - throw new NotImplementedException(); + + return true; + } + + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + if(cylinders > ushort.MaxValue) + { + ErrorMessage = "Too many cylinders."; + return false; + } + + if(heads > ushort.MaxValue) + { + ErrorMessage = "Too many heads."; + return false; + } + + if(sectorsPerTrack > ushort.MaxValue) + { + ErrorMessage = "Too many sectors per track."; + return false; + } + + imageInfo.SectorsPerTrack = sectorsPerTrack; + imageInfo.Heads = heads; + imageInfo.Cylinders = cylinders; + + return true; } static byte[] ScrambleATAString(string text, int length) diff --git a/DiscImageChef.DiscImages/SaveDskF.cs b/DiscImageChef.DiscImages/SaveDskF.cs index db37b93c..ab816d76 100644 --- a/DiscImageChef.DiscImages/SaveDskF.cs +++ b/DiscImageChef.DiscImages/SaveDskF.cs @@ -538,6 +538,12 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + // Geometry is set by media type + return true; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] struct SaveDskFHeader { diff --git a/DiscImageChef.DiscImages/T98.cs b/DiscImageChef.DiscImages/T98.cs index 5a8167f5..01fe5d0a 100644 --- a/DiscImageChef.DiscImages/T98.cs +++ b/DiscImageChef.DiscImages/T98.cs @@ -401,6 +401,12 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + // Format uses fixed geometry for heads and sectors per track, cylinders must be calculated on closing. + return true; + } + public bool SetMetadata(ImageInfo metadata) { return true; diff --git a/DiscImageChef.DiscImages/VHD.cs b/DiscImageChef.DiscImages/VHD.cs index 2b2ff756..005959e5 100644 --- a/DiscImageChef.DiscImages/VHD.cs +++ b/DiscImageChef.DiscImages/VHD.cs @@ -1218,24 +1218,26 @@ namespace DiscImageChef.DiscImages Version thisVersion = GetType().Assembly.GetName().Version; - // TODO: Interface to set geometry - imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); - imageInfo.Heads = 16; - imageInfo.SectorsPerTrack = 63; - - while(imageInfo.Cylinders == 0) + if(imageInfo.Cylinders == 0) { - imageInfo.Heads--; + imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); + imageInfo.Heads = 16; + imageInfo.SectorsPerTrack = 63; - if(imageInfo.Heads == 0) + while(imageInfo.Cylinders == 0) { - imageInfo.SectorsPerTrack--; - imageInfo.Heads = 16; + imageInfo.Heads--; + + if(imageInfo.Heads == 0) + { + imageInfo.SectorsPerTrack--; + imageInfo.Heads = 16; + } + + imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); + + if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } - - imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); - - if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } HardDiskFooter footer = new HardDiskFooter @@ -1294,6 +1296,33 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + if(cylinders > 0xFFFF) + { + ErrorMessage = "Too many cylinders."; + return false; + } + + if(heads > 0xFF) + { + ErrorMessage = "Too many heads."; + return false; + } + + if(sectorsPerTrack > 0xFF) + { + ErrorMessage = "Too many sectors per track."; + return false; + } + + imageInfo.SectorsPerTrack = sectorsPerTrack; + imageInfo.Heads = heads; + imageInfo.Cylinders = cylinders; + + return true; + } + static uint VhdChecksum(IEnumerable data) { uint checksum = data.Aggregate(0, (current, b) => current + b); diff --git a/DiscImageChef.DiscImages/VMware.cs b/DiscImageChef.DiscImages/VMware.cs index 06a63560..7a683bb3 100644 --- a/DiscImageChef.DiscImages/VMware.cs +++ b/DiscImageChef.DiscImages/VMware.cs @@ -1066,24 +1066,26 @@ namespace DiscImageChef.DiscImages writingStream.Flush(); writingStream.Close(); - // TODO: Interface to set geometry - imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); - imageInfo.Heads = 16; - imageInfo.SectorsPerTrack = 63; - - while(imageInfo.Cylinders == 0) + if(imageInfo.Cylinders == 0) { - imageInfo.Heads--; + imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); + imageInfo.Heads = 16; + imageInfo.SectorsPerTrack = 63; - if(imageInfo.Heads == 0) + while(imageInfo.Cylinders == 0) { - imageInfo.SectorsPerTrack--; - imageInfo.Heads = 16; + imageInfo.Heads--; + + if(imageInfo.Heads == 0) + { + imageInfo.SectorsPerTrack--; + imageInfo.Heads = 16; + } + + imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); + + if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } - - imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); - - if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } descriptorStream.WriteLine("# Disk DescriptorFile"); @@ -1116,6 +1118,33 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + if(cylinders > ushort.MaxValue) + { + ErrorMessage = "Too many cylinders."; + return false; + } + + if(heads > byte.MaxValue) + { + ErrorMessage = "Too many heads."; + return false; + } + + if(sectorsPerTrack > byte.MaxValue) + { + ErrorMessage = "Too many sectors per track."; + return false; + } + + imageInfo.SectorsPerTrack = sectorsPerTrack; + imageInfo.Heads = heads; + imageInfo.Cylinders = cylinders; + + return true; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] struct VMwareExtentHeader { diff --git a/DiscImageChef.DiscImages/Virtual98.cs b/DiscImageChef.DiscImages/Virtual98.cs index 0b99dc34..57aec2eb 100644 --- a/DiscImageChef.DiscImages/Virtual98.cs +++ b/DiscImageChef.DiscImages/Virtual98.cs @@ -427,24 +427,26 @@ namespace DiscImageChef.DiscImages return false; } - // TODO: Interface to set geometry - imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); - imageInfo.Heads = 16; - imageInfo.SectorsPerTrack = 63; - - while(imageInfo.Cylinders == 0) + if(imageInfo.Cylinders == 0) { - imageInfo.Heads--; + imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63); + imageInfo.Heads = 16; + imageInfo.SectorsPerTrack = 63; - if(imageInfo.Heads == 0) + while(imageInfo.Cylinders == 0) { - imageInfo.SectorsPerTrack--; - imageInfo.Heads = 16; + imageInfo.Heads--; + + if(imageInfo.Heads == 0) + { + imageInfo.SectorsPerTrack--; + imageInfo.Heads = 16; + } + + imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); + + if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } - - imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack); - - if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break; } byte[] commentsBytes = null; @@ -489,6 +491,33 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + if(cylinders > ushort.MaxValue) + { + ErrorMessage = "Too many cylinders."; + return false; + } + + if(heads > byte.MaxValue) + { + ErrorMessage = "Too many heads."; + return false; + } + + if(sectorsPerTrack > byte.MaxValue) + { + ErrorMessage = "Too many sectors per track."; + return false; + } + + imageInfo.SectorsPerTrack = sectorsPerTrack; + imageInfo.Heads = heads; + imageInfo.Cylinders = cylinders; + + return true; + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] struct Virtual98Header { diff --git a/DiscImageChef.DiscImages/ZZZRawImage.cs b/DiscImageChef.DiscImages/ZZZRawImage.cs index 33000b3b..45a1182b 100644 --- a/DiscImageChef.DiscImages/ZZZRawImage.cs +++ b/DiscImageChef.DiscImages/ZZZRawImage.cs @@ -957,6 +957,7 @@ namespace DiscImageChef.DiscImages return types; } } + public IEnumerable<(string name, Type type, string description)> SupportedOptions => new (string name, Type type, string description)[] { }; public IEnumerable KnownExtensions => @@ -993,6 +994,12 @@ namespace DiscImageChef.DiscImages return true; } + public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack) + { + // Geometry is not stored in image + return true; + } + public bool WriteMediaTag(byte[] data, MediaTagType tag) { // TODO: Implement diff --git a/DiscImageChef/Commands/ConvertImage.cs b/DiscImageChef/Commands/ConvertImage.cs index 02169306..c467a5ed 100644 --- a/DiscImageChef/Commands/ConvertImage.cs +++ b/DiscImageChef/Commands/ConvertImage.cs @@ -38,6 +38,7 @@ using DiscImageChef.Console; using DiscImageChef.Core; using DiscImageChef.DiscImages; using DiscImageChef.Filters; +using Version = DiscImageChef.Interop.Version; namespace DiscImageChef.Commands { @@ -202,7 +203,7 @@ namespace DiscImageChef.Commands ImageInfo metadata = new ImageInfo { Application = "DiscImageChef", - ApplicationVersion = Interop.Version.GetVersion(), + ApplicationVersion = Version.GetVersion(), Comments = options.Comments, Creator = options.Creator, DriveFirmwareRevision = options.DriveFirmwareRevision, @@ -316,52 +317,58 @@ namespace DiscImageChef.Commands doneSectors += sectorsToDo; } + DicConsole.Write("\rConverting sectors {0} to {1} ({2:P2} done)", inputFormat.Info.Sectors, inputFormat.Info.Sectors, 1.0); DicConsole.WriteLine(); } else - { foreach(Track track in tracks) { - doneSectors = 0; + doneSectors = 0; ulong trackSectors = track.TrackEndSector - track.TrackStartSector + 1; - + while(doneSectors < trackSectors) { byte[] sector; uint sectorsToDo; - if(trackSectors - doneSectors >= (ulong)options.Count) - sectorsToDo = (uint)options.Count; - else sectorsToDo = (uint)(trackSectors - doneSectors); + if(trackSectors - doneSectors >= (ulong)options.Count) sectorsToDo = (uint)options.Count; + else + sectorsToDo = + (uint)(trackSectors - doneSectors); DicConsole.Write("\rConverting sectors {0} to {1} in track {3} ({2:P2} done)", doneSectors, - doneSectors + sectorsToDo, doneSectors / (double)trackSectors, track.TrackSequence); + doneSectors + sectorsToDo, doneSectors / (double)trackSectors, + track.TrackSequence); bool result; if(useLong) if(sectorsToDo == 1) { - sector = inputFormat.ReadSectorLong(doneSectors + track.TrackStartSector); + sector = inputFormat.ReadSectorLong(doneSectors + track.TrackStartSector); result = outputFormat.WriteSectorLong(sector, doneSectors + track.TrackStartSector); } else { - sector = inputFormat.ReadSectorsLong(doneSectors + track.TrackStartSector, sectorsToDo); - result = outputFormat.WriteSectorsLong(sector, doneSectors + track.TrackStartSector, sectorsToDo); + sector = inputFormat.ReadSectorsLong(doneSectors + track.TrackStartSector, + sectorsToDo); + result = outputFormat.WriteSectorsLong(sector, doneSectors + track.TrackStartSector, + sectorsToDo); } else { if(sectorsToDo == 1) { - sector = inputFormat.ReadSector(doneSectors + track.TrackStartSector); + sector = inputFormat.ReadSector(doneSectors + track.TrackStartSector); result = outputFormat.WriteSector(sector, doneSectors + track.TrackStartSector); } else { - sector = inputFormat.ReadSectors(doneSectors + track.TrackStartSector, sectorsToDo); - result = outputFormat.WriteSectors(sector, doneSectors + track.TrackStartSector, sectorsToDo); + sector = inputFormat.ReadSectors(doneSectors + track.TrackStartSector, + sectorsToDo); + result = outputFormat.WriteSectors(sector, doneSectors + track.TrackStartSector, + sectorsToDo); } } @@ -383,6 +390,16 @@ namespace DiscImageChef.Commands trackSectors, 1.0, track.TrackSequence); DicConsole.WriteLine(); } + + if(tracks == null) + { + DicConsole.WriteLine("Setting geometry to {0} cylinders, {1} heads and {2} sectors per track", + inputFormat.Info.Cylinders, inputFormat.Info.Heads, + inputFormat.Info.SectorsPerTrack); + if(!outputFormat.SetGeometry(inputFormat.Info.Cylinders, inputFormat.Info.Heads, + inputFormat.Info.SectorsPerTrack)) + DicConsole.ErrorWriteLine("Error {0} setting geometry, image may be incorrect, continuing...", + outputFormat.ErrorMessage); } DicConsole.WriteLine("Closing output image.");