file signature check
This commit is contained in:
parent
24b752c2ee
commit
3845bb8ba1
|
@ -11,8 +11,11 @@ use cnrom::Cnrom;
|
|||
use mmc3::Mmc3;
|
||||
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
use std::fs::File;
|
||||
use std::io;
|
||||
use std::io::prelude::*;
|
||||
use std::io::Read;
|
||||
use std::rc::Rc;
|
||||
|
||||
pub trait Mapper {
|
||||
fn read(&self, address: usize) -> u8;
|
||||
|
@ -108,6 +111,17 @@ impl Cartridge {
|
|||
|
||||
}
|
||||
|
||||
pub fn check_signature(filename: &str) -> Result<(), String> {
|
||||
let mut f = File::open(filename).map_err(|e| e.to_string())?;
|
||||
let mut data = [0; 4];
|
||||
f.read_exact(&mut data).map_err(|e| e.to_string())?;
|
||||
if data == [0x4E, 0x45, 0x53, 0x1A] {
|
||||
Ok(())
|
||||
} else {
|
||||
Err("file signature mismatch: not a valid iNES file".to_string())
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
The mappings above are the fixed addresses from which the PPU uses to fetch data during rendering. The actual device that the PPU fetches data from, however, may be configured by the cartridge.
|
||||
$0000-1FFF is normally mapped by the cartridge to a CHR-ROM or CHR-RAM, often with a bank switching mechanism.
|
||||
|
|
10
src/main.rs
10
src/main.rs
|
@ -10,7 +10,7 @@ mod state;
|
|||
use cpu::Cpu;
|
||||
use ppu::Ppu;
|
||||
use apu::Apu;
|
||||
use cartridge::get_mapper;
|
||||
use cartridge::{check_signature, get_mapper};
|
||||
use input::poll_buttons;
|
||||
use screen::{init_window, draw_pixel, draw_to_window};
|
||||
use state::{save_state, load_state, find_next_filename, find_last_filename};
|
||||
|
@ -203,8 +203,12 @@ fn process_events(event_pump: &mut EventPump, filepath: &PathBuf, cpu: &mut Cpu)
|
|||
let res: Result<(), String> = load_state(cpu, &p)
|
||||
.or_else(|e| {println!("{}", e); Ok(())});
|
||||
res.unwrap();
|
||||
} else if f.len() > 4 && &f[f.len()-4..] == ".nes" {
|
||||
return GameExitMode::NewGame(f)
|
||||
// } else if f.len() > 4 && &f[f.len()-4..] == ".nes" {
|
||||
} else {
|
||||
match cartridge::check_signature(&f) {
|
||||
Ok(()) => return GameExitMode::NewGame(f),
|
||||
Err(e) => println!("{}", e),
|
||||
}
|
||||
}
|
||||
},
|
||||
_ => (),
|
||||
|
|
Loading…
Reference in New Issue