public bool WriteStream(Stream fs, int StartCluster, int Filesize) { Log.Info("StartCluster:" + StartCluster.ToString()); int Size = Filesize; int c = StartCluster; while (true) { var s = c * ClusterPerSector; var LastSector = 0; for (var sc = 0; sc < ClusterPerSector; sc++, s++) { var Length = Size < DefaultSectorBytes ? Size : DefaultSectorBytes; DiskImage.GetSector(s).Fill(0x00); if (Size == 0) { continue; } var SectorBuffer = DiskImage.GetSectorDataForWrite(s); fs.Read(SectorBuffer, 0, Length); Size -= Length; if (Length > 0) { LastSector = sc; } } if (Size == 0) { if (Setting.X1SMode && LastSector > 0) { LastSector--; if ((Filesize & 0xff) == 0) { LastSector++; } } SetClusterValue(c, LastSector, true); break; } var next = GetNextFreeCluster(2); if (next < 0) { Log.Error($"Too big filesize!: LastClaster={c}"); SetClusterValue(c, LastSector, true); return(false); } SetClusterValue(c, next); c = next; } return(true); }
private void FillAllocationTable() { var dc = DiskImage.GetDataControllerForWrite(AllocationTableStart); dc.Fill(0); dc.SetByte(0, 0x01); dc.SetByte(1, 0x8f); switch (ImageType) { case DiskTypeEnum.Disk2D: for (var i = 0x50; i < 0x80; i++) { dc.SetByte(i, 0x8f); } break; case DiskTypeEnum.Disk2DD: dc.SetBuffer(DiskImage.GetSectorDataForWrite(AllocationTableStart + 1)); dc.Fill(0); for (var i = 0x20; i < 0x80; i++) { dc.SetByte(i, 0x8f); } break; case DiskTypeEnum.Disk2HD: dc.SetByte(2, 0x8f); dc.SetBuffer(DiskImage.GetSectorDataForWrite(AllocationTableStart + 1)); dc.Fill(0); for (var i = 0x7a; i < 0x80; i++) { dc.SetByte(i, 0x8f); } break; } FormatEntry(CurrentEntrySector); }