2018-02-07 15:20:26 +00:00
|
|
|
#ifdef TEENSYDUINO
|
|
|
|
#include <Arduino.h>
|
2020-07-04 12:04:26 +00:00
|
|
|
#include "teensy-println.h"
|
2018-02-07 15:20:26 +00:00
|
|
|
#endif
|
|
|
|
|
2018-01-10 09:13:04 +00:00
|
|
|
#include "vmram.h"
|
|
|
|
#include <string.h>
|
2018-01-10 13:05:49 +00:00
|
|
|
#include "globals.h"
|
2018-01-10 09:13:04 +00:00
|
|
|
|
2020-07-07 01:31:37 +00:00
|
|
|
#ifdef TEENSYDUINO
|
2020-12-29 14:12:33 +00:00
|
|
|
EXTMEM uint8_t preallocatedRam[599*256];
|
2020-07-07 01:31:37 +00:00
|
|
|
#else
|
2020-12-29 14:12:33 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
uint8_t preallocatedRam[599*256];
|
2020-07-07 01:31:37 +00:00
|
|
|
#endif
|
|
|
|
|
2018-01-10 09:13:04 +00:00
|
|
|
#ifndef TEENSYDUINO
|
|
|
|
#include <assert.h>
|
|
|
|
#else
|
2020-07-04 12:04:26 +00:00
|
|
|
#define assert(x) { if (!(x)) {print("assertion failed at "); println(__LINE__); delay(10000);} }
|
2018-02-07 15:20:26 +00:00
|
|
|
//#define assert(x) { }
|
2018-01-10 09:13:04 +00:00
|
|
|
#endif
|
|
|
|
|
2018-01-10 13:05:49 +00:00
|
|
|
// Serializing token for RAM data
|
|
|
|
#define RAMMAGIC 'R'
|
|
|
|
|
2018-01-10 09:13:04 +00:00
|
|
|
VMRam::VMRam() {memset(preallocatedRam, 0, sizeof(preallocatedRam)); }
|
|
|
|
|
|
|
|
VMRam::~VMRam() { }
|
|
|
|
|
|
|
|
void VMRam::init()
|
|
|
|
{
|
|
|
|
for (uint32_t i=0; i<sizeof(preallocatedRam); i++) {
|
|
|
|
preallocatedRam[i] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-07 15:20:26 +00:00
|
|
|
uint8_t VMRam::readByte(uint32_t addr)
|
|
|
|
{
|
|
|
|
return preallocatedRam[addr];
|
|
|
|
}
|
2018-01-10 09:13:04 +00:00
|
|
|
|
2018-02-07 15:20:26 +00:00
|
|
|
void VMRam::writeByte(uint32_t addr, uint8_t value)
|
|
|
|
{
|
|
|
|
preallocatedRam[addr] = value;
|
|
|
|
}
|
2018-01-10 13:05:49 +00:00
|
|
|
|
2020-12-29 14:12:33 +00:00
|
|
|
uint8_t *VMRam::memPtr(uint32_t addr)
|
|
|
|
{
|
|
|
|
printf("Asked for preallocated RAM pointer at 0x%X\n", addr);
|
|
|
|
printf("Base is 0x%llX\n", (unsigned long long) preallocatedRam);
|
|
|
|
return &preallocatedRam[addr];
|
|
|
|
}
|
|
|
|
|
2018-01-10 13:05:49 +00:00
|
|
|
bool VMRam::Serialize(int8_t fd)
|
|
|
|
{
|
|
|
|
uint32_t size = sizeof(preallocatedRam);
|
2020-06-28 19:24:49 +00:00
|
|
|
uint8_t buf[5] = { RAMMAGIC,
|
2020-07-04 12:04:26 +00:00
|
|
|
(uint8_t)((size >> 24) & 0xFF),
|
|
|
|
(uint8_t)((size >> 16) & 0xFF),
|
|
|
|
(uint8_t)((size >> 8) & 0xFF),
|
|
|
|
(uint8_t)((size ) & 0xFF) };
|
2020-06-28 19:24:49 +00:00
|
|
|
if (g_filemanager->write(fd, buf, 5) != 5)
|
|
|
|
return false;
|
2018-01-10 13:05:49 +00:00
|
|
|
|
2020-06-28 19:24:49 +00:00
|
|
|
if (g_filemanager->write(fd, preallocatedRam, sizeof(preallocatedRam)) != sizeof(preallocatedRam))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (g_filemanager->write(fd, buf, 1) != 1)
|
|
|
|
return false;
|
2018-01-10 13:05:49 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VMRam::Deserialize(int8_t fd)
|
|
|
|
{
|
2020-06-28 19:24:49 +00:00
|
|
|
uint8_t buf[5];
|
|
|
|
if (g_filemanager->read(fd, buf, 5) != 5)
|
2018-01-10 13:05:49 +00:00
|
|
|
return false;
|
|
|
|
|
2020-06-28 19:24:49 +00:00
|
|
|
if (buf[0] != RAMMAGIC)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
uint32_t size = (buf[1] << 24) | (buf[2] << 16) | (buf[3] << 8) | buf[4];
|
2018-01-10 13:05:49 +00:00
|
|
|
|
2020-06-28 19:24:49 +00:00
|
|
|
if (size != sizeof(preallocatedRam))
|
2018-01-10 13:05:49 +00:00
|
|
|
return false;
|
|
|
|
|
2020-06-28 19:24:49 +00:00
|
|
|
if (g_filemanager->read(fd, preallocatedRam, size) != size)
|
|
|
|
return false;
|
2018-01-10 13:05:49 +00:00
|
|
|
|
2020-06-28 19:24:49 +00:00
|
|
|
if (g_filemanager->read(fd, buf, 1) != 1)
|
|
|
|
return false;
|
|
|
|
if (buf[0] != RAMMAGIC)
|
2018-01-10 13:05:49 +00:00
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2018-02-07 15:20:26 +00:00
|
|
|
|
|
|
|
bool VMRam::Test()
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|