From 531240e94e22ce08f3d33b48d3a3895697f67e86 Mon Sep 17 00:00:00 2001 From: Theron Date: Fri, 28 Feb 2020 19:47:46 -0600 Subject: [PATCH] experimenting with serde --- Cargo.toml | 1 + src/cpu/mod.rs | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4f48ada..1a87293 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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] diff --git a/src/cpu/mod.rs b/src/cpu/mod.rs index 06df672..23e0dd6 100644 --- a/src/cpu/mod.rs +++ b/src/cpu/mod.rs @@ -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, // 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>, // cartridge data pub ppu: super::Ppu, pub apu: super::Apu, @@ -285,6 +288,30 @@ impl Cpu { } } + +impl Serialize for Cpu { + fn serialize(&self, serializer: S) -> Result + 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