[COLOR="#008000"]/*
74S471 Reader from ROM Reader program found at http://danceswithferrets.org/geekblog/wp-content/uploads/2014/02/RomReader.txt
ROM Reader. Quick Arduino program to read a parallel-accessed ROM and dump it to the serial
port in hex.
Oddbloke. 16th Feb 2014.
Modified by Monty McGraw 1 March 2021 for 256 address 74S471 PROM in Tektronix 4907 8-inch Floppy Drive Controller ROM board
*/
// How I've wired the digital pins on my Arduino to the address and data pins on
// the ROM.[/COLOR]
static const int kPin_A0 = 53;
static const int kPin_A1 = 51;
static const int kPin_A2 = 49;
static const int kPin_A3 = 47;
static const int kPin_A4 = 45;
static const int kPin_A5 = 43;
static const int kPin_A6 = 41;
static const int kPin_A7 = 39;
[COLOR="#008000"]/*
static const int kPin_A8 = 46;
static const int kPin_A9 = 48;
static const int kPin_A10 = 52;
static const int kPin_A11 = 50;
static const int kPin_A12 = 37;
static const int kPin_A13 = 44;
*/[/COLOR]
static const int kPin_D0 = 28;
static const int kPin_D1 = 30;
static const int kPin_D2 = 32;
static const int kPin_D3 = 33;
static const int kPin_D4 = 31;
static const int kPin_D5 = 29;
static const int kPin_D6 = 27;
static const int kPin_D7 = 25;
const char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
void setup()
{
[COLOR="#008000"] // set the address lines as outputs ...[/COLOR]
pinMode(kPin_A0, OUTPUT);
pinMode(kPin_A1, OUTPUT);
pinMode(kPin_A2, OUTPUT);
pinMode(kPin_A3, OUTPUT);
pinMode(kPin_A4, OUTPUT);
pinMode(kPin_A5, OUTPUT);
pinMode(kPin_A6, OUTPUT);
pinMode(kPin_A7, OUTPUT);
[COLOR="#008000"]/*
pinMode(kPin_A8, OUTPUT);
pinMode(kPin_A9, OUTPUT);
pinMode(kPin_A10, OUTPUT);
pinMode(kPin_A11, OUTPUT);
pinMode(kPin_A12, OUTPUT);
pinMode(kPin_A13, OUTPUT);
*/ [/COLOR]
[COLOR="#008000"] // set the data lines as inputs ...[/COLOR]
pinMode(kPin_D0, INPUT);
pinMode(kPin_D1, INPUT);
pinMode(kPin_D2, INPUT);
pinMode(kPin_D3, INPUT);
pinMode(kPin_D4, INPUT);
pinMode(kPin_D5, INPUT);
pinMode(kPin_D6, INPUT);
pinMode(kPin_D7, INPUT);
Serial.begin(9600);
}
void SetAddress(int addr)
{
[COLOR="#008000"] // update the address lines to reflect the address we want ...[/COLOR]
digitalWrite(kPin_A0, (addr & 1)?HIGH:LOW);
digitalWrite(kPin_A1, (addr & 2)?HIGH:LOW);
digitalWrite(kPin_A2, (addr & 4)?HIGH:LOW);
digitalWrite(kPin_A3, (addr & 8)?HIGH:LOW);
digitalWrite(kPin_A4, (addr & 16)?HIGH:LOW);
digitalWrite(kPin_A5, (addr & 32)?HIGH:LOW);
digitalWrite(kPin_A6, (addr & 64)?HIGH:LOW);
digitalWrite(kPin_A7, (addr & 128)?HIGH:LOW);
[COLOR="#008000"]/*
digitalWrite(kPin_A8, (addr & 256)?HIGH:LOW);
digitalWrite(kPin_A9, (addr & 512)?HIGH:LOW);
digitalWrite(kPin_A10, (addr & 1024)?HIGH:LOW);
digitalWrite(kPin_A11, (addr & 2048)?HIGH:LOW);
digitalWrite(kPin_A12, (addr & 4096)?HIGH:LOW);
digitalWrite(kPin_A13, (addr & 8192)?HIGH:LOW);
*/[/COLOR]
}
byte ReadByte()
{
// read the current eight-bit byte being output by the ROM ...
byte b = 0;
if (digitalRead(kPin_D0)) b |= 1;
if (digitalRead(kPin_D1)) b |= 2;
if (digitalRead(kPin_D2)) b |= 4;
if (digitalRead(kPin_D3)) b |= 8;
if (digitalRead(kPin_D4)) b |= 16;
if (digitalRead(kPin_D5)) b |= 32;
if (digitalRead(kPin_D6)) b |= 64;
if (digitalRead(kPin_D7)) b |= 128;
return(b);
}
void loop()
{
byte d[16];
int x, y,i, addr, address;
[COLOR="#008000"] // The only reason I'm choosing to read in blocks of 16 bytes
// is to keep the hex-dump code simple. You could just as easily
// read a single byte at a time if that's all you needed.[/COLOR]
Serial.println("Reading ROM ...\n");
address = 0;
for (i = 0; i < 256; i += 16)
{
addr = address + i;
// read 16 bytes of data from the ROM ...
for (x = 0; x < 16; x++)
{
SetAddress(addr + x); [COLOR="#008000"]// tells the ROM the byte we want ...[/COLOR]
d[x] = ReadByte(); [COLOR="#008000"]// reads the byte back from the ROM[/COLOR]
}
Serial.print(address + i,HEX);
Serial.print(" ");
[COLOR="#008000"]// now we'll print each byte in hex ...[/COLOR]
for (y = 0; y < 16; y++)
{
Serial.print(hex[ (d[y] & 0xF0) >> 4 ]);
Serial.print(hex[ (d[y] & 0x0F) ]);
}
[COLOR="#008000"] // and print an ASCII dump too ...[/COLOR]
Serial.print(" ");
for (y = 0; y < 16; y++)
{
char c = '.';
if (d[y] > 32 && d[y]<127) c = d[y];
Serial.print(c);
}
Serial.println("");
}
[COLOR="#008000"]// All done, so lockup ...[/COLOR]
while (true) {delay(10000);}
}