private static async ValueTask <EInputBlockResult> VerifyRomCRCAsync(IRomData romData) { Console.WriteLine("Disassembling ROM."); Console.WriteLine(); var data = await romData.GetDataAsync(); switch (Crc.HasCorrectCrc(data.Span, out var crc)) { case false: Console.WriteLine("ROM has invalid CRC values."); Console.WriteLine($"Expected CRC1: 0x{crc.Crc1:X8}, Actual CRC1: 0x{romData.Header.Crc1:X8}"); Console.WriteLine($"Expected CRC2: 0x{crc.Crc1:X8}, Actual CRC2: 0x{romData.Header.Crc2:X8}"); break; case true: Console.WriteLine("CRC OK."); break; case null: default: Console.WriteLine("Unable to calculate CRC - unknown boot code."); break; } return(EInputBlockResult.Success); }
/// <summary> /// Converts the content in <paramref name="data"/> to the format /// specified in <paramref name="format"/>. /// </summary> /// <remarks> /// This method will make a copy of the data even if the format is not /// changed. /// </remarks> /// <param name="data">The data to convert to.</param> /// <param name="format">The format to convert.</param> /// <param name="cancellationToken">The cancellation token.</param> public static async ValueTask <IRomData> ConvertToAsync(this IRomData data, ERomFormat format, CancellationToken cancellationToken = default) { Guard.IsNotNull(data, nameof(data)); byte[] copy = new byte[data.Length]; var src = await data.GetDataAsync(); src.CopyTo(copy); ConvertTo(format, copy); return(await RomData.LoadRomAsync(copy, cancellationToken)); }
/// <summary> /// Saves <paramref name="romData"/> to disk. /// </summary> /// <param name="romData">The data to save.</param> /// <param name="file">The output file.</param> /// <param name="cancellationToken">The cancellation token.</param> public static async Task SaveAsync(this IRomData romData, FileInfo file, CancellationToken cancellationToken = default) { Guard.IsNotNull(romData, nameof(romData)); Guard.IsNotNull(file, nameof(file)); cancellationToken.ThrowIfCancellationRequested(); if (file.Directory?.Exists == false) { file.Directory.Create(); } using var fs = file.Open(FileMode.Create, FileAccess.Write, FileShare.None); await fs.WriteAsync(await romData.GetDataAsync(), cancellationToken); await fs.FlushAsync(); }
/// <summary> /// Saves <paramref name="romData"/> to disk, using the metadata of the ROM /// to generate the output file name. /// </summary> /// <param name="romData">The data to save.</param> /// <param name="outputDirectory">The output directory.</param> /// <param name="cancellationToken">The cancellation token.</param> public static async Task SaveAsync(this IRomData romData, DirectoryInfo outputDirectory, CancellationToken cancellationToken) { Guard.IsNotNull(romData, nameof(romData)); Guard.IsNotNull(outputDirectory, nameof(outputDirectory)); cancellationToken.ThrowIfCancellationRequested(); if (!outputDirectory.Exists) { outputDirectory.Create(); } string fileName = romData.GetFilename(); var file = new FileInfo(Path.Combine(outputDirectory.FullName, fileName)); using var fs = file.Open(FileMode.Create, FileAccess.Write, FileShare.None); await fs.WriteAsync(await romData.GetDataAsync(), cancellationToken); await fs.FlushAsync(); }