Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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));
        }
Esempio n. 3
0
        /// <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();
        }
Esempio n. 4
0
        /// <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();
        }