diff options
| author | Miquel Sabaté Solà <mssola@mssola.com> | 2026-07-19 22:50:07 +0200 |
|---|---|---|
| committer | Miquel Sabaté Solà <mssola@mssola.com> | 2026-07-23 12:45:59 +0200 |
| commit | f367d25f0d9d7f0e7580a47294f792143fbb6784 (patch) | |
| tree | 6d59af9c529e2f5336dcd8a499c4de665b30758a /crates | |
| parent | 27cea17cf7f4f9b706d0f3da4dc558b8e7b5d764 (diff) | |
| download | tools.nes-f367d25f0d9d7f0e7580a47294f792143fbb6784.tar.gz tools.nes-f367d25f0d9d7f0e7580a47294f792143fbb6784.zip | |
readrom: read the ROM file right on start
This avoids exhausting the input in other scenarios (thus fixing commit
f5549b97bf85 ("readrom: only read the ROM file once")), and it makes
everything more cohesive.
Fixes: f5549b97bf85 ("readrom: only read the ROM file once")
Signed-off-by: Miquel Sabaté Solà <mssola@mssola.com>
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/readrom/src/main.rs | 46 |
1 files changed, 18 insertions, 28 deletions
diff --git a/crates/readrom/src/main.rs b/crates/readrom/src/main.rs index 9207c2a..ef7fa9b 100644 --- a/crates/readrom/src/main.rs +++ b/crates/readrom/src/main.rs @@ -1,7 +1,7 @@ use header::{Header, Kind}; use std::collections::HashMap; use std::fs::File; -use std::io::{BufRead, BufReader, BufWriter, ErrorKind, Read, Write}; +use std::io::{BufRead, BufReader, BufWriter, Read, Write}; use std::path::PathBuf; use xixanta::mapping::get_mapping_configuration; use xixanta::opcodes::OPCODES; @@ -422,12 +422,9 @@ fn do_disassemble( } } -fn handle_disassembling_args(args: &Args, mut input: &File) -> Result<bool, String> { - let mut bytes = Vec::new(); - input.read_to_end(&mut bytes).map_err(|e| e.to_string())?; - +fn handle_disassembling_args(args: &Args, bytes: &[u8]) -> Result<bool, String> { if let Some(address) = &args.disassemble { - if let Err(e) = do_disassemble(&bytes, Some(address), &args.nasm, None, None, args.raw) { + if let Err(e) = do_disassemble(bytes, Some(address), &args.nasm, None, None, args.raw) { die(e); } return Ok(true); @@ -454,7 +451,7 @@ fn handle_disassembling_args(args: &Args, mut input: &File) -> Result<bool, Stri .collect::<Vec<_>>() .join(", ") ); - do_disassemble(&bytes, None, &args.nasm, Some(start), Some(end), args.raw)?; + do_disassemble(bytes, None, &args.nasm, Some(start), Some(end), args.raw)?; } } None => { @@ -483,7 +480,7 @@ fn handle_disassembling_args(args: &Args, mut input: &File) -> Result<bool, Stri .collect::<Vec<_>>() .join(", ") ); - do_disassemble(&bytes, None, &args.nasm, Some(start), Some(end), args.raw)?; + do_disassemble(bytes, None, &args.nasm, Some(start), Some(end), args.raw)?; return Ok(true); } for segment in &m.segments { @@ -500,7 +497,7 @@ fn handle_disassembling_args(args: &Args, mut input: &File) -> Result<bool, Stri .join(", ") ); do_disassemble( - &bytes, + bytes, None, &args.nasm, Some(start), @@ -527,13 +524,18 @@ fn handle_disassembling_args(args: &Args, mut input: &File) -> Result<bool, Stri fn main() { let args = parse_arguments(); + // Open the ROM file and read it. let Ok(mut input) = File::open(&args.file) else { die(format!("failed to open the given file '{}'", args.file)); return; }; + let mut bytes = Vec::new(); + if let Err(e) = input.read_to_end(&mut bytes) { + die(e.to_string()); + } // Check whether the user wanted to disassemble something. - match handle_disassembling_args(&args, &input) { + match handle_disassembling_args(&args, &bytes) { Ok(quit) => { if quit { std::process::exit(0); @@ -544,15 +546,12 @@ fn main() { // Nope. Then let's just print information about it. First the header. - let mut buf = vec![0u8; 0x10]; - if let Err(e) = input.read_exact(&mut buf) { - match e.kind() { - ErrorKind::UnexpectedEof => die("malformed ROM file".to_string()), - _ => die(e.to_string()), - } + let buf = bytes.get(0..0x10).unwrap_or(&[]); + if buf.is_empty() { + die("malformed ROM file".to_string()); } - let header = match Header::try_from(buf.as_slice()) { + let header = match Header::try_from(buf) { Ok(h) => h, Err(e) => { die(e.to_string()); @@ -565,18 +564,9 @@ fn main() { std::process::exit(0); } - // PRG ROM. - - buf = vec![0u8; header.prg_rom_size * 16 * 1024]; - if let Err(e) = input.read_exact(&mut buf) { - match e.kind() { - ErrorKind::UnexpectedEof => die("could not read advertised PRG ROM space".to_string()), - _ => die(e.to_string()), - } - } - // Vectors. - let vectors = &buf.as_slice()[buf.len() - 6..]; + let rom_size = header.prg_rom_size * 16 * 1024; + let vectors = &bytes.get(0x10 + rom_size - 6..).unwrap_or(&[]); print_vectors(vectors); } |
