Skip to content

Instantly share code, notes, and snippets.

@houmei
Last active June 8, 2020 17:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save houmei/7ce0aef4632cebb38876423c84b843cb to your computer and use it in GitHub Desktop.
Save houmei/7ce0aef4632cebb38876423c84b843cb to your computer and use it in GitHub Desktop.
readROM27512 / Read PROM W27C512 by ArduinoMEGA2560
// read 2764-27512 ROM / ArduinoMEGA2650
// 20200607 by @houmei
//
// pin assign
unsigned char Data[8] = {46,48,50,53,51,49,47,45}; // D0,D1,...D7
unsigned char Addr[16] = {44,42,40,38, 36,34,32,30, 33,35,41,37, 28,31,29,26}; // A0,A1,...A15
unsigned char OE = 39 ;
unsigned char CS = 43 ;
unsigned char TMM2364_Vpp = Addr[15];
unsigned char TMM2364_CS1 = Addr[14];
unsigned char TMM2364_CS2 = Addr[13];
unsigned int rombit = 13 ; // 13..2764[12:0] 14..27128[13:0] 15..27256[14:0] 16..27512[15:0]
unsigned long int romsize = 1 ;
// start button
unsigned int btnA=52;
void setup() {
for(int i=0;i<8;i++) pinMode(Data[i],INPUT);
for(int i=0;i<=15;i++) { pinMode(Addr[i],OUTPUT); digitalWrite(Addr[i],HIGH); }
pinMode(OE,OUTPUT); digitalWrite(OE,HIGH);
pinMode(CS,OUTPUT); digitalWrite(CS,HIGH);
pinMode(btnA,INPUT_PULLUP);
for(int i=0;i<rombit;i++) romsize *=2 ;
Serial.begin(9600);
Serial.println();
digitalWrite(TMM2364_Vpp,HIGH);
digitalWrite(TMM2364_CS1,HIGH);
digitalWrite(TMM2364_CS2,HIGH);
digitalWrite(OE,LOW);
digitalWrite(CS,HIGH);
}
void loop() {
while(digitalRead(btnA)) ;
dump_ihex4(romsize);
// dump_hex(romsize);
// dump_verilog(romsize);
delay(1000);
}
void dump_ihex4(unsigned long int romsize) {
unsigned char d,sum;
Serial.print(":020000040000FA"); // ELA=0000
for (unsigned long int aloop=0; aloop<romsize; aloop++) {
d=readROM(aloop,rombit);
if (aloop%16==0) {
if (aloop>0) sprinthex((unsigned char)(-sum),2);
Serial.println();
Serial.print(":10");sprinthex(aloop,4);Serial.print("00");
sum=0x10+(aloop&0xff)+((aloop>>8)&0xff);
}
sprinthex(d,2);
sum += d;
}
sprinthex((unsigned char)(-sum),2); Serial.println();
Serial.print(":00000001FF"); Serial.println();
}
void dump_hex(unsigned long int romsize) {
unsigned char d;
for (unsigned long int aloop=0; aloop<romsize; aloop++) {
d=readROM(aloop,rombit);
if (aloop%16==0) {
Serial.println();
sprinthex(aloop,4);Serial.print(" : ");
}
sprinthex(d,2);
}
Serial.println();
}
void dump_verilog(unsigned long int romsize) {
unsigned char d;
Serial.println();
Serial.print("@00000000");
for (unsigned long int aloop=0; aloop<romsize; aloop++) {
d=readROM(aloop,rombit);
if (aloop%16==0) {
Serial.println();
} else {
Serial.print(" ");
}
sprinthex(d,2);
}
Serial.println();
}
/// ---
unsigned char readROM(unsigned long int address, unsigned int size) {
unsigned long int t=1;
unsigned char s=0 ;
if (size==0) return;
for (int i=0; i<=size-1; i++) {
digitalWrite(Addr[i], (address & t)?HIGH:LOW);
t *=2 ;
}
digitalWrite(CS,LOW);
for(int i=7; i>=0; i--) {
s *= 2 ;
if (digitalRead(Data[i])!=LOW) s |= 1 ;
}
digitalWrite(CS,HIGH);
return s;
}
void sprinthex(unsigned long int x, int dg) {
if (dg>=8) if (x<0x10000000) Serial.print("0");
if (dg>=7) if (x<0x1000000) Serial.print("0");
if (dg>=6) if (x<0x100000) Serial.print("0");
if (dg>=5) if (x<0x10000) Serial.print("0");
if (dg>=4) if (x<0x1000) Serial.print("0");
if (dg>=3) if (x<0x100) Serial.print("0");
if (dg>=2) if (x<0x10) Serial.print("0");
Serial.print(x,HEX);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment