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); } }
private void Dispose(bool disposing) { if (isDisposed) { return; } if (disposing) { trackStream.Flush(); trackStream = null; } isDisposed = true; }
/// <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; }
/// <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); }
/// <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]); } } }