Skip to content

Instantly share code, notes, and snippets.

@Ced2911
Created December 21, 2015 16:45
Show Gist options
  • Save Ced2911/d6d9c2ccfc9eca726201 to your computer and use it in GitHub Desktop.
Save Ced2911/d6d9c2ccfc9eca726201 to your computer and use it in GitHub Desktop.
#define N_ADDR_PIN 20
#define N_DATA_PIN 16
typedef unsigned long uint32_t;
typedef unsigned long addr_t;
typedef unsigned short data_t;
typedef struct {
byte addr_pin[N_ADDR_PIN];
byte data_pin[N_DATA_PIN];
byte ce_pin;
byte vcc;
byte bp;
byte oe;
byte gnd[2];
} ccprom_t;
ccprom_t ccprom;
void __init() {
int i = 0;
for(i = 0; i < N_ADDR_PIN; i++) {
ccprom.addr_pin[i] = 0;
}
for(i = 0; i < N_DATA_PIN; i++) {
ccprom.data_pin[i] = 0;
}
ccprom.ce_pin = 0;
ccprom.vcc = 0;
ccprom.bp = 0;
ccprom.oe = 0;
ccprom.gnd[0] = 0;
ccprom.gnd[1] = 0;
}
void setup() {
// put your setup code here, to run once:
__init();
ccprom.addr_pin[18] = 21;
ccprom.addr_pin[17] = 22;
ccprom.addr_pin[7] = 24;
ccprom.addr_pin[6] = 26;
ccprom.addr_pin[5] = 28;
ccprom.addr_pin[4] = 30;
ccprom.addr_pin[3] = 32;
ccprom.addr_pin[2] = 34;
ccprom.addr_pin[1] = 36;
ccprom.addr_pin[0] = 38;
ccprom.ce_pin = 40;
ccprom.gnd[0] = 42;
ccprom.oe = 44;
ccprom.data_pin[0] = 46;
ccprom.data_pin[8] = 48;
ccprom.data_pin[1] = 50;
ccprom.data_pin[9] = 52;
ccprom.data_pin[2] = 17;
ccprom.data_pin[10] = 16;
ccprom.data_pin[3] = 15;
ccprom.data_pin[11] = 14;
/****************************************/
ccprom.addr_pin[19] = 7;
ccprom.addr_pin[8] = 23;
ccprom.addr_pin[9] = 25;
ccprom.addr_pin[10] = 27;
ccprom.addr_pin[11] = 29;
ccprom.addr_pin[12] = 31;
ccprom.addr_pin[13] = 33;
ccprom.addr_pin[14] = 35;
ccprom.addr_pin[15] = 37;
ccprom.addr_pin[16] = 39;
ccprom.bp = 41;
ccprom.gnd[1] = 43;
ccprom.data_pin[15] = 45;
ccprom.data_pin[7] = 47;
ccprom.data_pin[14] = 49;
ccprom.data_pin[6] = 51;
ccprom.data_pin[13] = 53;
ccprom.data_pin[5] = 20;
ccprom.data_pin[12] = 19;
ccprom.data_pin[4] = 18;
/****************************************/
for(int i=0;i<N_ADDR_PIN;i++){
pinMode(ccprom.addr_pin[i],OUTPUT);
digitalWrite(ccprom.addr_pin[i], 0);
}
for(int i=0;i<N_DATA_PIN;i++){
pinMode(ccprom.data_pin[i],INPUT);
}
digitalWrite(ccprom.addr_pin[17], HIGH);
//digitalWrite(ccprom.addr_pin[16], HIGH);
//digitalWrite(ccprom.addr_pin[0], LOW);
pinMode(ccprom.ce_pin,OUTPUT);
pinMode(ccprom.oe,OUTPUT);
pinMode(ccprom.bp,OUTPUT);
pinMode(ccprom.gnd[0],OUTPUT);
pinMode(ccprom.gnd[1],OUTPUT);
digitalWrite(ccprom.ce_pin,HIGH);
digitalWrite(ccprom.oe,HIGH);
digitalWrite(ccprom.bp,HIGH);
// tmp
pinMode(7,OUTPUT);
digitalWrite(7,LOW);
digitalWrite(ccprom.gnd[0],LOW);
digitalWrite(ccprom.gnd[1],LOW);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for ATmega32u4-based boards and Arduino 101
}
delay(1000);
}
#include <stdarg.h>
void p(char *fmt, ... ){
char buf[128]; // resulting string limited to 128 chars
va_list args;
va_start (args, fmt );
vsnprintf(buf, 128, fmt, args);
va_end (args);
Serial.print(buf);
}
void dumpAddr(addr_t addr) {
addr_t a = addr;
addr_t r = 0;
byte b = 0;
unsigned long t = 0;
delayMicroseconds(10);
Serial.println("dumpAddr");
// 8 bit cpu !!
for(int i=0;i<8;i++){
b=digitalRead(ccprom.addr_pin[i]);
p("i: %02d pin: %02d n: %d r: %d\r\n",i, ccprom.addr_pin[i], addr&(1<<i)?1:0, b);
r|=b<<i;
}
addr=addr>>8;
for(int i=0;i<8;i++){
b=digitalRead(ccprom.addr_pin[i+8]);
p("i: %02d pin: %02d n: %d r: %d\r\n",i+8, ccprom.addr_pin[i+8], addr&(1<<i)?1:0, b);
r|=b<<(i+8);
}
addr=addr>>8;
for(int i=0;i<4;i++){
b=digitalRead(ccprom.addr_pin[i+16]);
p("i: %02d pin: %02d n: %d r: %d\r\n",i+16, ccprom.addr_pin[i+16], addr&(1<<i)?1:0, b);
r|=b<<(i+16);
}
p("%08lx == %08lx\r\n", a, r);
}
void setAddr(addr_t addr) {
addr_t a = addr;
// addr = 0;
digitalWrite(ccprom.ce_pin,HIGH);
digitalWrite(ccprom.oe,HIGH);
// 8bit cpu :s
for(int i=0;i<8;i++){
digitalWrite(ccprom.addr_pin[i], addr&(1<<i));
}
addr=addr>>8;
for(int i=0;i<8;i++){
digitalWrite(ccprom.addr_pin[i+8], addr&(1<<i));
}
addr=addr>>8;
for(int i=0;i<4;i++){
digitalWrite(ccprom.addr_pin[i+16], addr&(1<<i));
}
for(int i=0;i<16;i++){
//digitalWrite(ccprom.addr_pin[i], addr&(1<<i));
}
//dumpAddr(a);
}
data_t readWord(addr_t addr) {
data_t data = 0;
setAddr(addr);
delayMicroseconds(100);
digitalWrite(ccprom.ce_pin, LOW);
digitalWrite(ccprom.oe, LOW);
delayMicroseconds(10);
for(int i=0;i<8;i++){
data|=digitalRead(ccprom.data_pin[i])<<i;
}
data = data << 8;
for(int i=0;i<8;i++){
data|=digitalRead(ccprom.data_pin[i + 8])<<i;
}
return data;
}
#define DUMP_BUF_SIZE 0x20
byte dump_buf[DUMP_BUF_SIZE];
void output_dump(byte len) {
Serial.write(dump_buf, len);
}
void dump(addr_t addr, addr_t addr_end) {
byte rpos = 0;
digitalWrite(13, HIGH);
unsigned short data = 0;
for(int i=addr; i< addr_end; i++){
data = readWord(i);
dump_buf[rpos++] = (data >> 8) & 0xFF;
dump_buf[rpos++] = data & 0xFF;
if (rpos >= DUMP_BUF_SIZE) {
output_dump(DUMP_BUF_SIZE);
rpos = 0;
}
}
if (rpos>0) {
output_dump(rpos);
}
Serial.write(0);
Serial.write(0);
Serial.write(0);
Serial.write(0);
digitalWrite(13, LOW);
delay(5);
}
void loop(){
Serial.flush();
if (1 && Serial.available()) {
while (Serial.available()) {Serial.read();};
Serial.flush();
//delay(1);
dump(0x0, 0x100000);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment