public void DetectSync()
 {
     using (var stream = new MfmStream(new MemoryStream(encodedData, false)))
     {
         int readCount = 0;
         bool sync;
         while (stream.ReadByte(out sync) != -1)
         {
             Assert.AreEqual(syncPosition[readCount], sync);
             readCount++;
         }
         Assert.AreEqual(decodedData.Length, readCount);
     }
 }
 public void DecodeMfm()
 {
     using (var stream = new MfmStream(new MemoryStream(encodedData, false)))
     {
         int readData;
         int readCount = 0;
         while ((readData = stream.ReadByte()) != -1)
         {
             Assert.AreEqual(decodedData[readCount], readData);
             readCount++;
         }
         Assert.AreEqual(decodedData.Length, readCount);
     }
 }
Example #3
0
        private void Dispose(bool disposing)
        {
            if (isDisposed)
            {
                return;
            }

            if (disposing)
            {
                trackStream.Flush();
                trackStream = null;
            }

            isDisposed = true;
        }
Example #4
0
 /// <summary>
 /// Create a track object.
 /// </summary>
 /// <param name="diskStream">Stream for reading disk image data.</param>
 /// <param name="trackOffset">Byte offset of the track representation in the disk image.</param>
 /// <param name="trackLength">Number of bytes in the track representation in the disk image.</param>
 /// <param name="headId">Head ID.</param>
 /// <exception cref="DiskImageFormatException">The disk track cannot be correctly decoded.</exception>
 internal HfeTrack(Stream diskStream, int trackOffset, int trackLength, int headId)
 {
     if (diskStream == null)
     {
         throw new ArgumentNullException("diskStream");
     }
     if (!diskStream.CanRead)
     {
         throw new NotSupportedException("Stream does not support read operations");
     }
     if (!diskStream.CanSeek)
     {
         throw new NotSupportedException("Stream does not support seek operations");
     }
     trackStream = new MfmStream(new HfeRawTrack(diskStream, trackOffset, trackLength, headId));
     TrackOffset = trackOffset;
     TrackLength = trackLength;
 }
Example #5
0
        /// <summary>
        /// Initialize (format) a track by writing headers and sectors to it.
        /// </summary>
        /// <param name="diskStream">Stream for writing the disk track.</param>
        /// <param name="trackOffset">Byte offset of the track data in the disk image.</param>
        /// <param name="headId">Side of disk for initializing the track.</param>
        /// <param name="sectors">Collection of sectors to be written to the track.</param>
        /// <returns>The track length in the disk image stream.</returns>
        static internal int InitializeTrack(Stream diskStream, int trackOffset, int headId, IEnumerable <HfeSector> sectors)
        {
            var rawStream   = new HfeRawTrack(diskStream, trackOffset, headId);
            var trackStream = new MfmStream(rawStream);

            trackStream.WriteBytes(0x4e, PreableLength);

            foreach (var sector in sectors)
            {
                // Write gap preceeding sector ID record
                trackStream.WriteBytes(0x4e, 24);
                trackStream.WriteBytes(0x00, 12);
                trackStream.WriteSync();
                trackStream.WriteSync();
                trackStream.WriteSync();

                // Write sector ID record
                var sectorInfo      = sector.GetSectorInfo();
                var encodedIdRecord = sectorInfo.Encode();
                trackStream.Write(encodedIdRecord, 0, encodedIdRecord.Length);

                // Write gap preceeding sector data record
                trackStream.WriteBytes(0x4e, 22);
                trackStream.WriteBytes(0x00, 12);
                trackStream.WriteSync();
                trackStream.WriteSync();
                trackStream.WriteSync();

                // Write sector data record
                var encodedDataRecord = sector.Encode();
                trackStream.Write(encodedDataRecord, 0, encodedDataRecord.Length);
            }

            trackStream.WriteBytes(0x4e, PostambleLength);
            trackStream.Flush();

            return(rawStream.TrackLength - trackOffset);
        }
Example #6
0
        /// <summary>
        /// Dump raw track data after MFM encoding.
        /// </summary>
        /// <param name="diskStream">Stream for reading the disk image data.</param>
        /// <param name="disk">Disk.</param>
        /// <param name="headId">Head.</param>
        /// <param name="trackId">Track.</param>
        void DumpTrackData(Stream diskStream, HfeDisk disk, int headId, int trackId)
        {
            Console.WriteLine();
            Console.Write("Track data for track {0} side {1}", trackId, headId);
            Console.WriteLine();

            var t = disk.GetTrack(trackId, headId);

            var trackStream = new MfmStream(new HfeRawTrack(diskStream, t.TrackOffset, t.TrackLength, headId));
            var offset = 0;
            var done = false;
            var buffer = new byte[16];
            while (!done)
            {
                Console.Write(String.Format("{0:x4} : ", offset));
                var len = trackStream.Read(buffer, 0, buffer.Length);
                for (var i = 0; i < Math.Min(buffer.Length, len); i++)
                {
                    Console.Write(String.Format("{0:x2} ", buffer[i]));
                }
                Console.WriteLine();
                done = (len < buffer.Length);
                offset += len;
            }
            trackStream.Dispose();
        }
        public void EncodeMfmWithSync()
        {
            using (var memstream = new MemoryStream())
            {
                using (var stream = new MfmStream(memstream))
                {
                    for (var i = 0; i < decodedData.Length; i++)
                    {
                        if (syncPosition[i])
                        {
                            stream.WriteSync();
                        }
                        else
                        {
                            stream.WriteByte(decodedData[i]);
                        }
                    }
                }

                var encoded = memstream.GetBuffer();
                for (var i = 0; i < encodedData.Length; i++)
                {
                    Assert.AreEqual(encodedData[i], encoded[i]);
                }
            }
        }