aboutsummaryrefslogtreecommitdiff
path: root/crates/readrom/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/readrom/src')
-rw-r--r--crates/readrom/src/main.rs55
1 files changed, 55 insertions, 0 deletions
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(())
+}