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); }
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); }
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); }