This commit is contained in:
Theron 2020-03-01 01:24:36 -06:00
commit 5f54f10b3c
4 changed files with 8 additions and 21 deletions

View File

@ -1,7 +1,6 @@
# nestur # nestur
Nestur is an NES emulator. There are plenty of full-featured emulators out there; this is primarily an educational project but it is usable. There may still be many bugs, but I'm probably not aware of them so please submit issues. Nestur is an NES emulator. There are plenty of full-featured emulators out there; this is primarily an educational project but it is usable. There may still be many bugs, but I'm probably not aware of them so please submit issues.
- SDL2 is the only dependency
- no use of `unsafe` - no use of `unsafe`
- NTSC timing - NTSC timing
- supports mappers 0-4 which cover ~85% of [games](http://tuxnes.sourceforge.net/nesmapper.txt) - supports mappers 0-4 which cover ~85% of [games](http://tuxnes.sourceforge.net/nesmapper.txt)
@ -23,7 +22,7 @@ ___________________
------------------- -------------------
Save state: F5 Save state: F5
Load state: F9 Load state: F9
(Only one save state at a time supported currently: saving a second time overwrites the first.) (Saving state a second time overwrites the first unless you copy/rename the `.dat` file. You can drag and drop any `.dat` file onto the window to load it.)
``` ```
The code aims to follow the explanations from the [NES dev wiki](https://wiki.nesdev.com/w/index.php/NES_reference_guide) where possible, especially in the PPU, and the comments quote from it often. Thanks to everyone who contributes to that wiki/forum, and to Michael Fogleman's [NES](https://github.com/fogleman/nes) and Scott Ferguson's [Fergulator](https://github.com/scottferg/Fergulator) for getting me unstuck at several points. The code aims to follow the explanations from the [NES dev wiki](https://wiki.nesdev.com/w/index.php/NES_reference_guide) where possible, especially in the PPU, and the comments quote from it often. Thanks to everyone who contributes to that wiki/forum, and to Michael Fogleman's [NES](https://github.com/fogleman/nes) and Scott Ferguson's [Fergulator](https://github.com/scottferg/Fergulator) for getting me unstuck at several points.
@ -47,9 +46,9 @@ The code aims to follow the explanations from the [NES dev wiki](https://wiki.ne
- DMC audio channel, high- and low-pass filters - DMC audio channel, high- and low-pass filters
- Better GUI and distributable solution - Better GUI
- Save states - Better save state handling
- Player 2 controller? - Player 2 controller?

View File

@ -2,8 +2,7 @@ pub type ApuData = super::Apu;
impl super::Apu{ impl super::Apu{
pub fn save_state(&self) -> ApuData { pub fn save_state(&self) -> ApuData {
let x: ApuData = self.clone(); self.clone()
x
} }
pub fn load_state(&mut self, data: ApuData) { pub fn load_state(&mut self, data: ApuData) {

View File

@ -21,6 +21,7 @@ use sdl2::keyboard::Keycode;
use sdl2::EventPump; use sdl2::EventPump;
use sdl2::event::Event; use sdl2::event::Event;
use sdl2::pixels::PixelFormatEnum; use sdl2::pixels::PixelFormatEnum;
use std::path::Path;
// use cpuprofiler::PROFILER; // use cpuprofiler::PROFILER;

View File

@ -4,7 +4,7 @@ use super::apu;
use std::fs::File; use std::fs::File;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::path::Path; use std::path::{Path, PathBuf};
use serde::{Serialize, Deserialize}; use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@ -14,7 +14,7 @@ struct SaveState {
apu: apu::serialize::ApuData, apu: apu::serialize::ApuData,
} }
pub fn save_state(cpu: &cpu::Cpu, filename: &str) -> Result<(), String> { pub fn save_state(cpu: &cpu::Cpu, save_file: PathBuf) -> Result<(), String> {
let data = SaveState{ let data = SaveState{
cpu: cpu.save_state(), cpu: cpu.save_state(),
ppu: cpu.ppu.save_state(), ppu: cpu.ppu.save_state(),
@ -30,19 +30,7 @@ pub fn save_state(cpu: &cpu::Cpu, filename: &str) -> Result<(), String> {
Ok(()) Ok(())
} }
pub fn load_state(cpu: &mut cpu::Cpu, filename: &str) -> Result<(), String> { pub fn load_state(cpu: &mut cpu::Cpu, save_file: PathBuf) -> Result<(), String> {
// load file, deserialize to cpudata, set cpu fields to data fields
let path = match Path::new(&filename).parent() {
Some(p) => p,
None => return Err("couldn't convert filename to path".to_string()),
};
let stem = match Path::new(&filename).file_stem() {
Some(s) => s,
None => return Err("couldn't get file stem".to_string()),
};
let mut save_file = path.join(stem);
save_file.set_extension("dat");
if Path::new(&save_file).exists() { if Path::new(&save_file).exists() {
let mut f = File::open(save_file.clone()) let mut f = File::open(save_file.clone())
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;