Esempio n. 1
0
 public static void FixSector(CdromSector sector)
 {
     switch (sector.Mode)
     {
     case CdromSectorMode.Mode1:
         ComputeSectorMode1Data(sector);
         break;
     }
 }
        public CdromImage ReadImage(string filename)
        {
            byte[]   buffer;
            FileInfo fileinfo;

            try
            {
                fileinfo = new FileInfo(filename);
                if (fileinfo.Length % 2352 != 0)
                {
                    throw new IOException($"File size of {filename} does not match.");
                }
            }
            catch (Exception exception)
            {
                throw new IOException($"Unable to read file {filename}", exception);
            }

            try
            {
                buffer           = new byte[fileinfo.Length];
                using var stream = new FileStream(filename, FileMode.Open, FileAccess.Read);
                using var reader = new BinaryReader(stream);
                if (reader.Read(buffer, 0, (int)fileinfo.Length) != fileinfo.Length)
                {
                    throw new IOException($"Unable to read whole {filename} file.");
                }
                ;
            }
            catch (Exception exception)
            {
                throw new IOException($"Unable to read file {filename}", exception);
            }

            var cdrom = new CdromImage();

            for (var i = 0; i < buffer.Length / 2352; i++)
            {
                var sector = new CdromSector
                {
                    PhysicalAddress = i,
                    Mode            = CdromSectorMode.Mode1
                };

                Buffer.BlockCopy(buffer, i * 2352, sector.Data, 0, 2352);
                cdrom.Sectors.Add(sector);
            }

            return(cdrom);
        }
Esempio n. 3
0
        private void FixSectorData(CdromSector sector)
        {
            for (var i = 1; i < 11; i++)
            {
                sector.Data[i] = 0xff;
            }

            var sectorAddress = new CdromSectorAddress((uint)sector.PhysicalAddress);

            sector.Data[0x0c] = sectorAddress.Minute;
            sector.Data[0x0d] = sectorAddress.Second;
            sector.Data[0x0e] = sectorAddress.Frame;
            sector.Data[0x0f] = (byte)CdromSectorMode.Mode1;

            ErrorCorrectionModel.FixSector(sector);
        }
Esempio n. 4
0
        private static void ComputeSectorMode1Data(CdromSector sector)
        {
            const uint edcOffset = 0x810;
            var        edc       = CalculateEdc(sector.Data, 0, edcOffset);

            sector.Data[edcOffset + 0] = (byte)(edc & 0xff);
            sector.Data[edcOffset + 1] = (byte)((edc >> 8) & 0xff);
            sector.Data[edcOffset + 2] = (byte)((edc >> 16) & 0xff);
            sector.Data[edcOffset + 3] = (byte)((edc >> 24) & 0xff);

            for (var i = edcOffset + 4; i < edcOffset + 4 + 8; i++)
            {
                sector.Data[i] = 0;
            }

            ComputeEcc(sector.Data, 0x0c, 86, 24, 2, 86, 0x81c);
            ComputeEcc(sector.Data, 0x0c, 52, 43, 86, 88, 0x8c8);
        }