/*
Silent Scope 1/2 Timekeeper RAM programmer
Version 0.2
Made by Porchy, 2015
http://www.jammarcade.net
*/
#define WE 23
#define CE1 35
#define CE2 46
#define OE 31
#define SDCS 53
#include <SPI.h>
#include <SD.h>
File nvram;
int address[] = {38,36,34,32,30,28,26,24,25,27,33,29,22};
int data[] = {40,42,44,45,43,41,39,37};
void setup()
{
Serial.begin(9600);
pinMode(WE, OUTPUT);
pinMode(CE1, OUTPUT);
pinMode(CE2, OUTPUT);
pinMode(OE, OUTPUT);
digitalWrite(WE, HIGH);
digitalWrite(CE1, HIGH); //active low
digitalWrite(CE2, LOW); //active high
digitalWrite(OE, HIGH);
//setup address pins
for (int addr=0;addr<=12;addr++)
{
pinMode(address[addr], OUTPUT);
}
//setup data pins
for (int dat=0;dat<=7;dat++)
{
pinMode(data[dat], OUTPUT);
}
Serial.print("Looking for SD card...");
pinMode(SDCS, OUTPUT);
if (!SD.begin(SDCS))
{
Serial.print("No SD card found");
while(1); //stop
}
Serial.println("Found");
if (!SD.exists("nvram.bin"))
{
Serial.println("NVRAM data not found.");
Serial.println("File ""nvram.bin"" needs to be present in root");
while(1); //stop
}
Serial.println("NVRAM data found.");
nvram = SD.open("nvram.bin", FILE_READ);
Serial.println("Type 'S' to start");
bool start=false;
while(!start)
{
char wait = Serial.read();
if (wait=='S') start=true;
}
}
void setaddr(uint16_t addr)
{
addr = addr & 0x1fff; //trim if needed
int Bit=0;
for (int setbit=0;setbit<13;setbit++)
{
Bit = ((addr >> setbit) & 1);
digitalWrite(address[setbit], Bit);
}
}
void writedata(uint8_t thisData)
{
digitalWrite(WE, LOW);
digitalWrite(CE1, LOW);
digitalWrite(CE2, HIGH);
for (int dat=0; dat<8;dat++)
{
int Bit = ((thisData >> dat) & 1);
digitalWrite(data[dat], Bit);
}
digitalWrite(CE2, LOW);
digitalWrite(CE1, HIGH);
digitalWrite(WE, HIGH);
}
void loop()
{
Serial.println("Start");
for (uint16_t addr=0;addr<0x2000;++addr)
{
uint8_t thisByte = nvram.read();
setaddr(addr);
writedata(thisByte);
}
nvram.close();
Serial.println("Finished");
while(1);
}
Comments