diff options
Diffstat (limited to 'crates/readrom')
| -rw-r--r-- | crates/readrom/Cargo.toml | 12 | ||||
| -rw-r--r-- | crates/readrom/src/main.rs | 55 |
2 files changed, 67 insertions, 0 deletions
diff --git a/crates/readrom/Cargo.toml b/crates/readrom/Cargo.toml new file mode 100644 index 0000000..98a5106 --- /dev/null +++ b/crates/readrom/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "readrom" +version = "1.0.0" +rust-version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true + +[dependencies] +anyhow = "^1" +clap = { version = "^4", features = ["derive"] } +header.workspace = true diff --git a/crates/readrom/src/main.rs b/crates/readrom/src/main.rs new file mode 100644 index 0000000..56e60e0 --- /dev/null +++ b/crates/readrom/src/main.rs @@ -0,0 +1,55 @@ +use anyhow::{bail, Result}; +use clap::Parser as ClapParser; +use header::{Header, Kind}; +use std::fs::File; +use std::io::{ErrorKind, Read}; + +/// Display information about NES/Famicom ROM files. +#[derive(ClapParser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + /// NES/Famicom ROM file from which to display information. + file: String, +} + +fn print_header(header: &Header) { + println!("Header:"); + + match header.kind { + Kind::INes => println!(" Kind:\t\tiNES"), + Kind::Nes20 => println!(" Kind:\t\tNES 2.0"), + } + + println!( + " PRG ROM size:\t{} bytes ({}KB)", + header.prg_rom_size * 16 * 1024, + header.prg_rom_size * 16 + ); + println!( + " CHR ROM size:\t{} bytes ({}KB)", + header.chr_rom_size * 8 * 1024, + header.chr_rom_size * 8 + ); + println!(" Mapper:\t{}", header.mapper); +} + +fn main() -> Result<()> { + let args = Args::parse(); + let mut input = File::open(args.file)?; + + let mut buf = vec![0u8; 0x10]; + if let Err(e) = input.read_exact(&mut buf) { + match e.kind() { + ErrorKind::UnexpectedEof => bail!("malformed ROM file."), + _ => return Err(e.into()), + } + } + + let header = match Header::try_from(buf.as_slice()) { + Ok(h) => h, + Err(e) => bail!("{}.", e), + }; + print_header(&header); + + Ok(()) +} |
