aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mikisabate@gmail.com>2025-09-12 21:18:34 +0200
committerMiquel Sabaté Solà <mikisabate@gmail.com>2025-09-12 21:55:20 +0200
commitffaa5353031149ab2416bcf6d8b46e0a44a3bb39 (patch)
treea4b9bc79d9825536e2525de0865584db851ddb0b
parent85f8afab8c6e6bd26509c54c765c542279e26675 (diff)
downloadtools.nes-ffaa5353031149ab2416bcf6d8b46e0a44a3bb39.tar.gz
tools.nes-ffaa5353031149ab2416bcf6d8b46e0a44a3bb39.zip
readrom: Add detection of RAM, Timing and mirroring
Signed-off-by: Miquel Sabaté Solà <mikisabate@gmail.com>
-rw-r--r--crates/readrom/src/main.rs48
1 files changed, 40 insertions, 8 deletions
diff --git a/crates/readrom/src/main.rs b/crates/readrom/src/main.rs
index e930e0e..16dfa90 100644
--- a/crates/readrom/src/main.rs
+++ b/crates/readrom/src/main.rs
@@ -62,39 +62,71 @@ fn parse_arguments() -> Args {
res
}
+// Capitalize the given string.
+fn capitalize(s: &str) -> String {
+ let mut c = s.chars();
+ match c.next() {
+ None => String::new(),
+ Some(f) => f.to_uppercase().collect::<String>() + c.as_str(),
+ }
+}
+
fn print_header(header: &Header) {
println!("Header:");
match header.kind {
- Kind::INes => println!(" Kind:\t\tiNES"),
- Kind::Nes20 => println!(" Kind:\t\tNES 2.0"),
+ Kind::INes => println!(" Kind:\t\t\tiNES"),
+ Kind::Nes20 => println!(" Kind:\t\t\tNES 2.0"),
}
println!(
- " PRG ROM size:\t{} bytes ({}KB)",
+ " PRG ROM size:\t\t{} bytes ({}KB)",
header.prg_rom_size * 16 * 1024,
header.prg_rom_size * 16
);
println!(
- " CHR ROM size:\t{} bytes ({}KB)",
+ " CHR ROM size:\t\t{} bytes ({}KB)",
header.chr_rom_size * 8 * 1024,
header.chr_rom_size * 8
);
- println!(" Mapper:\t{}", header.mapper);
+
+ if let Some(def) = &header.prg_ram_definition {
+ println!(
+ " PRG-RAM size:\t\t{} bytes ({}KB); {}",
+ def.size,
+ def.size / 1024,
+ def.kind
+ );
+ }
+ if let Some(def) = &header.chr_ram_definition {
+ println!(
+ " CHR-RAM size:\t\t{} bytes ({}KB); {}",
+ def.size,
+ def.size / 1024,
+ def.kind
+ );
+ }
+
+ println!(" Mapper:\t\t{}", header.mapper);
+ println!(
+ " Mirroring:\t\t{}",
+ capitalize(header.nametable_arrangement.mirroring())
+ );
+ println!(" CPU/PPU timing:\t{}", header.timing);
}
fn print_vectors(addrs: &[u8]) {
println!("Vectors:");
println!(
- " NMI:\t\t{:#04x}",
+ " NMI:\t\t\t{:#04x}",
u16::from_le_bytes([addrs[0], addrs[1]])
);
println!(
- " Reset:\t{:#04x}",
+ " Reset:\t\t{:#04x}",
u16::from_le_bytes([addrs[2], addrs[3]])
);
println!(
- " IRQ:\t\t{:#04x}",
+ " IRQ:\t\t\t{:#04x}",
u16::from_le_bytes([addrs[4], addrs[5]])
);
}