aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/nasm/src/main.rs2
-rw-r--r--crates/readrom/Cargo.toml12
-rw-r--r--crates/readrom/src/main.rs55
3 files changed, 68 insertions, 1 deletions
diff --git a/crates/nasm/src/main.rs b/crates/nasm/src/main.rs
index 9ad710b..105a995 100644
--- a/crates/nasm/src/main.rs
+++ b/crates/nasm/src/main.rs
@@ -5,7 +5,7 @@ use std::io::{self, Read, Write};
use xixanta::assembler::Assembler;
use xixanta::mapping::{Mapping, EMPTY, NROM, NROM65};
-/// Assembler for the 6502 microprocessor that targets the NES.
+/// Assembler for the 6502 microprocessor that targets the NES/Famicom.
#[derive(ClapParser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
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(())
+}