experimenting with serde

This commit is contained in:
Theron 2020-02-28 19:47:46 -06:00
parent 56925d0815
commit 531240e94e
2 changed files with 30 additions and 2 deletions

View File

@ -6,6 +6,7 @@ edition = "2018"
[dependencies]
sdl2 = { version = "0.33", features = ["bundled", "static-link"] }
serde = { version = "1.0.104", features = ["derive"] }
cpuprofiler = "0.0.3"
[profile.release]

View File

@ -4,6 +4,8 @@ mod utility;
use std::cell::RefCell;
use std::rc::Rc;
use serde::{Serialize, Deserialize};
use serde::ser::{Serializer, SerializeStruct};
use crate::cartridge::Mapper;
// RAM locations
@ -21,7 +23,7 @@ const DECIMAL_FLAG: u8 = 1 << 3;
const OVERFLOW_FLAG: u8 = 1 << 6;
const NEGATIVE_FLAG: u8 = 1 << 7;
#[derive(Clone, Copy, Debug)]
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub enum Mode {
ABS, ABX, ABY, ACC,
IMM, IMP, IDX, IND,
@ -51,7 +53,7 @@ impl Mode {
}
}
// #[derive(Serialize, Deserialize, Debug)]
pub struct Cpu {
mem: Vec<u8>, // CPU's RAM, $0000-$1FFF
A: u8, // accumulator
@ -64,6 +66,7 @@ pub struct Cpu {
clock: u64, // number of ticks in current cycle
delay: usize, // for skipping cycles during OAM DMA
// #[serde(skip_serializing)]
mapper: Rc<RefCell<dyn Mapper>>, // cartridge data
pub ppu: super::Ppu,
pub apu: super::Apu,
@ -285,6 +288,30 @@ impl Cpu {
}
}
impl Serialize for Cpu {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("Cpu", 13)?;
state.serialize_field("mem", &self.mem)?;
state.serialize_field("A", &self.A)?;
state.serialize_field("X", &self.X)?;
state.serialize_field("Y", &self.Y)?;
state.serialize_field("PC", &self.PC)?;
state.serialize_field("S", &self.S)?;
state.serialize_field("P", &self.P)?;
state.serialize_field("clock", &self.clock)?;
state.serialize_field("delay", &self.delay)?;
state.serialize_field("strobe", &self.strobe)?;
state.serialize_field("button_states", &self.button_states)?;
state.serialize_field("button_number", &self.button_number)?;
state.serialize_field("mode_table", &self.mode_table)?;
state.end()
}
}
/*
Address range Size Device
$0000-$07FF $0800 2KB internal RAM