Exemple #1
0
 public TrackData(ImdMode mode, int cylinder, bool headOne, int numSectors, SectorSize sectorSize,
                  ISectorData[] sectors)
 {
     Mode       = mode;
     Cylinder   = cylinder;
     HeadOne    = headOne;
     NumSectors = numSectors;
     SectorSize = sectorSize;
     Sectors    = sectors;
 }
Exemple #2
0
        public ImdFloppy(byte[] data)
        {
            if (!(data[0] == 'I' && data[1] == 'M' && data[2] == 'D'))
            {
                throw new ArgumentException("Supplied disk is not actually in IMD format");
            }

            int i          = 4; // start of version
            int versionEnd = 4;

            while (data[versionEnd] != ':')
            {
                versionEnd++;
            }
            byte[] versionBytes = new byte[versionEnd - i];
            Array.Copy(data, i, versionBytes, 0, versionEnd - i);
            ImdVersion = Encoding.ASCII.GetString(versionBytes);

            i = versionEnd + 3;
            int dateEnd = i + 18;

            byte[] dateBytes = new byte[dateEnd - i];
            Array.Copy(data, i, dateBytes, 0, dateEnd - i);
            ImdDate = Encoding.ASCII.GetString(dateBytes);

            i = dateEnd;
            int commentEnd = i;

            while (data[commentEnd] != 0x1A)
            {
                commentEnd++;
            }
            byte[] commentBytes = new byte[commentEnd - i];
            Array.Copy(data, i, commentBytes, 0, commentEnd - i);
            ImdComment = Encoding.ASCII.GetString(commentBytes);

            _tracks = new List <TrackData>();

            i = commentEnd + 1;
            while (i < data.Length)
            {
                ImdMode mode = (ImdMode)data[i];
                i++;
                int cylinder = data[i];
                i++;
                int head = data[i];
                i++;
                int numSectors = data[i];
                i++;
                int sectorSizeFlag = data[i];
                i++;

                if (sectorSizeFlag != 2)
                {
                    throw new InvalidOperationException("Only IMD disks with sector size of 512 are supported");
                }
                SectorSize sectorSize = SectorSize.Size512;

                if ((head & HEAD_MARK_CYL_MAP) == HEAD_MARK_CYL_MAP)
                {
                    throw new InvalidOperationException("Unsupported field: Sector Cylinder Map");
                }
                if ((head & HEAD_MARK_HEA_MAP) == HEAD_MARK_HEA_MAP)
                {
                    throw new InvalidOperationException("Unsupported field: Sector Head Map");
                }

                byte[] sectorNumMap = new byte[numSectors];
                Array.Copy(data, i, sectorNumMap, 0, numSectors);
                i += numSectors;

                ISectorData[] sectors = new ISectorData[numSectors];
                for (var si = 0; si < numSectors; si++)
                {
                    SectorDataType type = (SectorDataType)data[i];
                    i++;

                    ISectorData sector;
                    switch (type)
                    {
                    case SectorDataType.Normal:
                    case SectorDataType.NormalDeleted:
                        byte[] sectorData = new byte[sectorSize.Size];
                        Array.Copy(data, i, sectorData, 0, sectorSize.Size);
                        i     += sectorSize.Size;
                        sector = new NormalSectorData(sectorData, type == SectorDataType.NormalDeleted);
                        break;

                    case SectorDataType.Compressed:
                    case SectorDataType.CompressedDeleted:
                        sector = new CompressedSectorData(data[i], type == SectorDataType.CompressedDeleted);
                        i++;
                        break;

                    case SectorDataType.Unavailable:
                    case SectorDataType.NormalError:
                    case SectorDataType.CompressedError:
                    case SectorDataType.DeletedError:
                    case SectorDataType.CompressedDeletedError:
                        throw new InvalidOperationException("Only IMD disks with no errors are supported");

                    default:
                        throw new InvalidOperationException("Unknown sector data type: " + type);
                    }
                    sectors[sectorNumMap[si] - 1] = sector;
                }
                TrackData track = new TrackData(mode, cylinder, (head & 1) == 1, numSectors, sectorSize, sectors);
                _tracks.Add(track);
            }
        }