/// <summary> /// Write a sector containing file data to the disk /// </summary> /// <param name="sector"></param> /// <param name="fileSector"></param> public override void WriteFileSector(int sector, FileSector fileSector) { var sectorData = new byte[128]; Array.Clear(sectorData, 0, 128); Array.Copy(fileSector.Data, sectorData, fileSector.ByteCount); sectorData[125] = (byte)((fileSector.NextSector & 0xff00) >> 8); sectorData[126] = (byte)(fileSector.NextSector & 0xff); sectorData[127] = (byte)fileSector.ByteCount; WriteSector(sector, sectorData); }
/// <summary> /// Read a sector containing file data from the disk /// </summary> /// <param name="sector"></param> /// <returns></returns> public override FileSector ReadFileSector(int sector) { var fileSector = new FileSector(); fileSector.Data = new byte[125]; var sec = ReadSector(sector); fileSector.FileHandle = -1; fileSector.NextSector = (sec[125] << 8) + sec[126]; fileSector.ByteCount = sec[127] & 0x7F; fileSector.Sector = sector; for (int i = 0; i < 125; i++) fileSector.Data[i] = sec[i]; return fileSector; }
/// <summary> /// Read a sector containing file data from the disk /// </summary> /// <param name="sector"></param> /// <returns></returns> public virtual FileSector ReadFileSector(int sector) { var fileSector = new FileSector(); fileSector.Data = new byte[125]; var sec = ReadSector(sector); fileSector.Sector = sector; fileSector.FileHandle = (sec[125] & 0xfc) >> 2; fileSector.NextSector = ((sec[125] & 0x3) << 8) + sec[126]; fileSector.ByteCount = sec[127] & 0x7F; for (int i = 0; i < 125; i++) fileSector.Data[i] = sec[i]; return fileSector; }
/// ----------------------------------------------------------------------------- /// <summary> /// Adds a file to the disk /// </summary> /// <param name="Filename">Name of file being added</param> /// <param name="data">File data</param> /// <remarks> /// </remarks> /// ----------------------------------------------------------------------------- public override void AddFile(string Filename, byte[] data) { DirectoryEntry entry; int curSector; int nextSector; int len; Attach(); //Be sure filename is valid if (!ValidFileName(Filename)) { throw new InvalidFileNameException(); } //If file already exists, delete it entry = FindDirectoryEntry(Filename); if (entry != null) { DeleteFile(Filename); } // Check for disk space int dataLength = 0; if (data != null) dataLength = data.Length; int requiredSectors = (dataLength / 125); if (dataLength % 125 > 0) requiredSectors += 1; if (requiredSectors == 0) requiredSectors = 1; // Files are always at least one sector if (requiredSectors > UnusedSectors()) throw new InsufficientDiskSpaceException(); // Find open directory entry entry = GetOpenEntry(); if (entry == null) throw new DirectoryFullException(); entry.FileName = Filename; entry.Deleted = false; entry.EntryInUse = true; entry.Locked = false; entry.OpenForOutput = false; entry.StartSector = sectorMap.GetNextAvailableSector(); entry.NumSectors = requiredSectors; curSector = entry.StartSector; for (int i = 0; i <= requiredSectors - 1; i++) { if ((dataLength - (i * 125)) <= 125) { len = dataLength - (i * 125); nextSector = 0; } else { len = 125; nextSector = sectorMap.GetNextAvailableSector(); } var fileSec = new FileSector(); fileSec.FileHandle = entry.FileNumber; fileSec.NextSector = nextSector; fileSec.ByteCount = len; fileSec.Data = new byte[125]; if (data != null) Array.Copy(data, i * 125, fileSec.Data, 0, len); WriteFileSector(curSector, fileSec); curSector = nextSector; } WriteDirectoryEntry(entry); WriteSectorMap(); //Refresh the directory ReadDirectory(); UpdateUnusedSectors(); }
/// <summary> /// Write a sector containing file data to the disk /// </summary> /// <param name="sector"></param> /// <param name="fileSector"></param> public virtual void WriteFileSector(int sector, FileSector fileSector) { var sectorData = new byte[128]; Array.Clear(sectorData, 0, 128); Array.Copy(fileSector.Data, sectorData, fileSector.ByteCount); var b = (byte)(fileSector.FileHandle << 2); b |= (byte)((fileSector.NextSector & 0x300) >> 8); sectorData[125] = b; sectorData[126] = (byte)(fileSector.NextSector & 0xff); sectorData[127] = (byte)fileSector.ByteCount; WriteSector(sector, sectorData); }