/* 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 #include 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); }