[Vincenzo] wanted to read some 82S129 bipolar proms, and why not, they were very common in the 1980’s arcade scene. The problem is that its kind of an odd ball part now, and typically only (even) more expensive EPROM programmers can read them. An Arduino, breadboard and some quick scripting quickly takes care of that problem with this Arcade Rom Reader.
You stick the prom in your breadboard, and wire it up to the appropriate ports and pins of the Arduino, which bit bangs the prom and returns the results though the serial connection of the Arduino. using a terminal program on the PC side you capture the text and use a script to convert the ascii values into a binary nibble format and save as hex.
This makes it much easier for us to dump roms from old arcade boards, because you never know when you might run across an old Polybius arcade board on your next outing to the salvage or scrap yard.
Join us after the break for all the details and as always comments!
82S129 bipolar proms are very common in ’80 Arcade Jamma boards. Unluckly, only more expensive EPROM programmers can read them. I used an Arduino Duemilanove to dump 82S129 contents to PC for backup use.
I used a breadboard to connect 82S129 pins to Arduino. Please follow this schematic:
Arduino pins ——> 82S129 pin (function)
+5v 16 Vcc
GND 8 GND
Digital 2 5 A0
Digital 3 6 A1
Digital 4 7 A2
Digital 5 4 A3
Digital 6 3 A4
Digital 7 2 A5
Digital 8 1 A6
Digital 9 15 A7
Digital 10 12 O1
Digital 11 11 O2
Digital 12 10 O3
Digital 13 9 O4
GND 13 CE1
GND 14 CE2
Here is pde program to send in Arduino:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
Begin pde program
————————————————
/*
82s129 Arduino reader
By Vincenzo Femia (enzofemia@gmail.com)
*/
byte indirizzo=0;//”indirizzo” is Italian for “address” 🙂
boolean a0=0;//address bits
boolean a1=0;
boolean a2=0;
boolean a3=0;
boolean a4=0;
boolean a5=0;
boolean a6=0;
boolean a7=0;
//
boolean o0=0;//data bits
boolean o1=0;
boolean o2=0;
boolean o3=0;
byte output=0;
void setup()
{
//pin0 & pin1 reserved for serial communication
pinMode(2,OUTPUT);//set pins for address
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,INPUT);//set pins for data (it’s a nibble)
pinMode(11,INPUT);
pinMode(12,INPUT);
pinMode(13,INPUT);
}
void loop()
{
for (indirizzo=0; indirizzo<256; indirizzo++)// from 00 to FF address
{
a0=bitRead(indirizzo,0);//read status bit of address...
a1=bitRead(indirizzo,1);
a2=bitRead(indirizzo,2);
a3=bitRead(indirizzo,3);
a4=bitRead(indirizzo,4);
a5=bitRead(indirizzo,5);
a6=bitRead(indirizzo,6);
a7=bitRead(indirizzo,7);
//...and set output
if (a0==1) {digitalWrite(2,HIGH);}
else {digitalWrite(2,LOW);}
if (a1==1) {digitalWrite(3,HIGH);}
else {digitalWrite(3,LOW);}
if (a2==1) {digitalWrite(4,HIGH);}
else {digitalWrite(4,LOW);}
if (a3==1) {digitalWrite(5,HIGH);}
else {digitalWrite(5,LOW);}
if (a4==1) {digitalWrite(6,HIGH);}
else {digitalWrite(6,LOW);}
if (a5==1) {digitalWrite(7,HIGH);}
else {digitalWrite(7,LOW);}
if (a6==1) {digitalWrite(8,HIGH);}
else {digitalWrite(8,LOW);}
if (a7==1) {digitalWrite(9,HIGH);}
else {digitalWrite(9,LOW);}
//Wait so outputs can be set by 82S129
delay (50);
o0=digitalRead(10);//read bit from data outputs
o1=digitalRead(11);
o2=digitalRead(12);
o3=digitalRead(13);
Serial.begin(9600);//Setting serial communication
//Write in binary ASCII address read and "->”
if (a7==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (a6==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (a5==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (a4==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (a3==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (a2==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (a1==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (a0==0) {Serial.print(“0 -> “);}
else {Serial.print(“1 -> “);}
//Write in binary ASCII output nibble
if (o3==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (o2==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (o1==0) {Serial.print(“0”);}
else {Serial.print(“1”);}
if (o0==0) {Serial.println(“0”);}
else {Serial.println(“1”);}
if (indirizzo==255) {Serial.println(“ROM has been read”);}
Serial.end();
}
}
—————————————–
END pde program
Using Minicom or similar program you can log serial data on PC.
Using an editor now correct log file so that first line is:
00000000 -> XXXX
and last line is:
11111111 -> XXXX
Please verify that file contains only 1 cicle of reads (256 lines).
Now we have to convert this ASCII .txt file in binary file.
Since I use Linux I write in Gambas programming language () a little program to do this conversion.
However Windows user can port it in visual basic or other languages.
Simply it read nibble bits, build nibble value (00-0F), write binary value in output .hex file.
Here’s the source:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Begin of Gambas program
————————————————–
PUBLIC SUB Main()
DIM ingresso AS Stream
DIM uscita AS Stream
DIM stringa AS String
DIM o0 AS String
DIM o1 AS String
DIM o2 AS String
DIM o3 AS String
DIM valore AS Byte
ingresso = open “/home/enzo/temp/datafile.txt” FOR INPUT
uscita = open “/home/enzo/temp/datafile.hex” FOR OUTPUT CREATE
WHILE NOT Eof(ingresso)
LINE INPUT #ingresso, stringa
o3 = Mid$(stringa, 13, 1)
o2 = Mid$(stringa, 14, 1)
o1 = Mid$(stringa, 15, 1)
o0 = Mid$(stringa, 16, 1)
valore = 1 * Val(o0) + 2 * Val(o1) + 4 * Val(o2) + 8 * Val(o3)
PRINT #uscita, Chr$(valore);
WEND
CLOSE ingresso
CLOSE uscita
KONIEC
————————————————————-
End of Gambas program
For questions can contact me:
Vincenzo Femia
enzofemia@gmail.com
Reggio Calabria, ITALY.
No Responses