How to read old EPROMs with the Arduino

I’m struggling with a health issue at the moment so I’m doing some some small projects to stay sane…

I’ve been helping a friend fix old pinball games which typically make use of 8-bit micros like the 6800 or 6502. Often we want to know what’s on these old ROM chips that even some modern device readers can’t easily scan. I built a shield for Arduino that can read them by listing the file over the serial link. The only components other than the Arduino Uno and a prototyping shield were a couple of 74HCT573s and a 24-pin socket.

EPROM reader shieldHere is a schematic for the shield, which used the prototyping board that you can buy from makershed.com.

Scan 43This circuit makes use of 11 of the Arduino’s pins. Eight pins are used to make a data bus which can be input or output, and three pins are used to control the circuit. A pair of 74HCT573 octal latches are used to store up to 16 bits of the address that you wish to read from. I actually wired all of the input pins on the high byte latch for possible future expansion.

Reading from a location involves first disabling the output buffers of the EPROM by setting ~OE to high, and then latching first the low byte and then the high byte of the address by pulsing the LE lines of the latches high in turn. After that the data lines are changed to inputs and the ~OE line is taken low. The data at the desired location is then read, and the ~OE line is returned to high again. By following this procedure, all the memory locations in the ROM can be read in turn.

Various old ROMs have different pinouts and they range from 1K, 2K, or 4K in size. Some also need other supply voltages as well as 5V. The TMS2716 that we were initially trying to read required 5V, -5V and 12V. The pins 18-21 tend to vary in functionality for these old ROMs so its best to consult a data sheet and wire it up as needed.

You can find the full Arduino code “readrom.ino” at my repository here. When you run it, you interact using the serial console and the command “m startaddr endaddr” is used to list memory contents, where the addresses are given in hex.