コード例 #1
0
ファイル: HuBasicDiskEntry.cs プロジェクト: BouKiCHi/HuDisk
        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);
        }
コード例 #2
0
ファイル: HuBasicDiskEntry.cs プロジェクト: BouKiCHi/HuDisk
        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);
        }