This is a simple sketch + Python script for reading 32-pin EPROMs/EEPROMs with an Arduino Mega 2560. Use cases include dumping BIOS chips, firmware extraction, archival, etc.
It supports most DIP-32 EEPROMs and EPROMs (like the BIOS chips found in many i486/Pentium PCs).
Warning: Ensure your chip operates at 5V, as this reader will damage 3.3V chips!
Limitations:
- This tool cannot write to chips, as EEPROMS generally require about 12V for writing and EPROMS need to be erased with UV light.
- An Arduino UNO does not have enough pins without I/O expanders
- Only tested on a Mega 2560, but may work with other boards
The datasheet for the SST29EE020 EEPROM is also included, which follows a common pinout.
You will need an Arduino Mega 2560, a small breadboard and ~30 jumper wires. Below is a wiring diagram for a DIP-32 EPROM:
╭─────── ROM pins ───────╮
│ │
▼ ╭──────╮ ╭──────╮ ▼
──── NC ■│1 ╰──╯ 32│■ VDD ──── +5V
D46 ──── A16 ■│2 31│■ WE# ──── +5V
D45 ──── A15 ■│3 30│■ NC ────
D42 ──── A12 ■│4 29│■ A14 ──── D44
D37 ──── A7 ■│5 28│■ A13 ──── D43
D36 ──── A6 ■│6 27│■ A8 ──── D38
D35 ──── A5 ■│7 26│■ A9 ──── D39
D34 ──── A4 ■│8 DIP-32 25│■ A11 ──── D41
D33 ──── A3 ■│9 24│■ OE# ──── D3
D32 ──── A2 ■│10 23│■ A10 ──── D40
D31 ──── A1 ■│11 22│■ CE# ──── D2
D30 ──── A0 ■│12 21│■ DQ7 ──── D29
D22 ──── DQ0 ■│13 20│■ DQ6 ──── D28
D23 ──── DQ1 ■│14 19│■ DQ5 ──── D27
D24 ──── DQ2 ■│15 18│■ DQ4 ──── D26
GND ──── VSS ■│16 17│■ DQ3 ──── D25
▲ ╰────────────────╯ ▲
│ │
╰────────────── Arduino pins ──────────────╯
The WE (write enable) pin is active-low, meaning pulling it high will disable writing on EEPROM chips.
You can also run python dump.py --wiring or open wiring.txt to view the same wiring diagram.
- Python 3.x
- PySerial
- Arduino IDE
- A computer running Linux, Windows, or macOS
Open parallel_eprom_reader.ino in Arduino IDE, select your board and upload the sketch.
First, install PySerial with pip:
pip install pyserial
After wiring the chip and flashing the sketch, plug the Arduino into your computer and run the dump.py Python script:
python dump.py --chip-kilobytes <chip size in KB> --filename dump.bin --port <Arduino serial port>
You can list your computer's serial devices with the following utility:
python -m serial.tools.list_ports
Example for a 128KB EPROM/EEPROM on Linux:
python dump.py --chip-kilobytes 128 --filename bios.bin --port /dev/ttyACM0
The script should output something like:
Connecting to /dev/ttyACM0....
Requesting 131072 bytes from Arduino...
/ Reading...
Successfully saved 131072 bytes to bios.bin
The output file size should match the chip size (e.g. a 128KB file for a 128KB chip). If the output file is all 0xFF or 0x00, double-check wiring and control pins.