From 1df2a2d030b255429228e9276e13674f70f44b88 Mon Sep 17 00:00:00 2001 From: Stephen Crane Date: Wed, 22 Oct 2014 19:47:06 +0100 Subject: [PATCH] checkpointing --- hardware.cpp | 30 ++++++++++++++++-------------- spiram.cpp | 34 +++++++++++++++++----------------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/hardware.cpp b/hardware.cpp index 930fcd7..604c963 100644 --- a/hardware.cpp +++ b/hardware.cpp @@ -36,25 +36,27 @@ bool hardware_init(CPU &cpu) { } void hardware_checkpoint(Stream &s) { - _cpu->checkpoint(s); - Memory::Device *d = 0; - for (unsigned i = 0; i < 0x10000; i += Memory::page_size) { + unsigned ds = 0; + for (unsigned i = 0; i < 0x10000; i += ds) { Memory::Device *dev = memory.get(i); - if (dev && dev != d) { - d = dev; - d->checkpoint(s); - } + if (dev) { + dev->checkpoint(s); + ds = dev->pages() * Memory::page_size; + } else + ds = Memory::page_size; } + _cpu->checkpoint(s); } void hardware_restore(Stream &s) { - _cpu->restore(s); - Memory::Device *d = 0; - for (unsigned i = 0; i < 0x10000; i += Memory::page_size) { + unsigned ds = 0; + for (unsigned i = 0; i < 0x10000; i += ds) { Memory::Device *dev = memory.get(i); - if (dev && dev != d) { - d = dev; - d->restore(s); - } + if (dev) { + dev->restore(s); + ds = dev->pages() * Memory::page_size; + } else + ds = Memory::page_size; } + _cpu->restore(s); } diff --git a/spiram.cpp b/spiram.cpp index fff96c5..0894bbc 100644 --- a/spiram.cpp +++ b/spiram.cpp @@ -10,38 +10,38 @@ SpiRAM spiRam(SPIRAM_DEV, SPIRAM_CS); void spiram::begin(byte cs, int module) { - SPI_for_SD.setModule(module); - SPI_for_SD.setClockDivider(SPI_CLOCK_DIV16); - SPI_for_SD.setDataMode(SPI_MODE0); - pinMode(PF_3, OUTPUT); - pinMode(cs, OUTPUT); + SPI_for_SD.setModule(module); + SPI_for_SD.setClockDivider(SPI_CLOCK_DIV16); + SPI_for_SD.setDataMode(SPI_MODE0); + pinMode(PF_3, OUTPUT); + pinMode(cs, OUTPUT); } void spiram::operator=(byte b) { - spiRam.write_byte(_acc, b); + spiRam.write_byte(_acc, b); } spiram::operator byte() { - return spiRam.read_byte(_acc); + return spiRam.read_byte(_acc); } void spiram::checkpoint(Stream &s) { - char buf[Memory::page_size]; - for (int i = 0; i < pages(); i++) { - spiRam.read_stream(i * Memory::page_size, buf, sizeof(buf)); - s.write((byte *)buf, sizeof(buf)); - } + char buf[Memory::page_size]; + for (int i = 0; i < pages(); i++) { + spiRam.read_stream(i * 256, buf, sizeof(buf)); + s.write((byte *)buf, sizeof(buf)); + } } void spiram::restore(Stream &s) { - char buf[Memory::page_size]; - for (int i = 0; i < pages(); i++) { - s.readBytes(buf, sizeof(buf)); - spiRam.write_stream(i * Memory::page_size, buf, sizeof(buf)); - } + char buf[Memory::page_size]; + for (int i = 0; i < pages(); i++) { + s.readBytes(buf, sizeof(buf)); + spiRam.write_stream(i * 256, buf, sizeof(buf)); + } }