nesfuzz/src/fuzzing_state.rs

64 lines
1.8 KiB
Rust

use crate::apu::Apu;
use crate::cartridge::get_mapper;
use crate::cartridge::serialize::MapperData;
use crate::cpu::serialize::CpuData;
use crate::cpu::Cpu;
use crate::input::FuzzingInput;
use crate::ppu::serialize::PpuData;
use crate::ppu::Ppu;
use std::hash::{Hash, Hasher};
#[derive(Clone)]
pub struct FuzzingState {
pub(crate) cpu_state: CpuData,
ppu_state: PpuData,
mapper_state: MapperData,
pub(crate) frames: usize,
}
impl FuzzingState {
pub fn save_state(cpu: Cpu, frames: usize) -> FuzzingState {
FuzzingState {
cpu_state: cpu.save_state(),
ppu_state: cpu.ppu.save_state(),
mapper_state: cpu.mapper.borrow().save_state(),
frames: frames,
}
}
pub fn default(filename: String) -> FuzzingState {
let mapper = get_mapper(filename);
let ppu = Ppu::new(mapper.clone());
let apu = Apu::new();
let cpu = Cpu::new(mapper.clone(), ppu, apu);
return FuzzingState::save_state(cpu, 0);
}
pub fn load_state(&self, filename: String) -> (Cpu, usize) {
let mapper = get_mapper(filename);
mapper.borrow_mut().load_state(self.mapper_state.clone());
let mut ppu = Ppu::new(mapper.clone());
ppu.load_state(self.ppu_state.clone());
let apu = Apu::new();
let mut cpu = Cpu::new(mapper.clone(), ppu, apu);
cpu.load_state(self.cpu_state.clone());
return (cpu, self.frames);
}
}
pub struct FuzzingInputState(pub FuzzingInput, pub FuzzingState);
impl Hash for FuzzingInputState {
fn hash<H: Hasher>(&self, state: &mut H) {
return self.0.hash(state);
}
}
impl PartialEq<Self> for FuzzingInputState {
fn eq(&self, other: &Self) -> bool {
self.0.eq(&other.0)
}
}
impl Eq for FuzzingInputState {}