ARDUINO ARCADE ROM DUMPER

[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 & quot;);}
else {serial.print (“1”;);}
if (a1 == 0) {serial.print (“0”);}
else {serial.print (“1”;);}
Eğer (A0 == 0) {Serial.Print (“0 – & gt;”);}
else {serial.print (“1 – ve gt;”);}

// İkili ASCII çıkışında yazma 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”);}

Eğer (indirimsiz == 255) {Serial.println (“ROM” okundu;);}
Serial.end ();
}
}
—————————————–
Son PDE Programı

Minicom veya benzeri programı kullanarak PC’de seri verilerini kaydedebilirsiniz.
Bir Editörün Kullanılması Şimdi Doğru Günlük dosyasını düzeltin, böylece ilk satır:
00000000 -> xxxx

ve son satır:
11111111 -> XXXX

Lütfen dosyanın yalnızca 1 Cicle’u (256 satır) içerdiğini doğrulayın.

Şimdi bu ASCII .TXT dosyasını ikili dosyada dönüştürmek zorundayız.
Linux’u kullandığımdan beri, Gambas Programlama Dili’ne () bu dönüşümü yapmak için küçük bir program.
Ancak, Windows kullanıcısı Visual Basic veya diğer dillerde bağlantı kurabilir.
Sadece nibble bitlerini okuyun, nibble değeri (00-0f) oluşturun, çıkış .hex dosyasında ikili değer yazın.
İşte kaynak:

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
Gambas programının başlangıcı
—————————————————-
Genel alt ana ()
Dim Ingresso akışı olarak
Dim uscita akış olarak
Dim Stringa dize olarak
Dizge olarak Dim O0
Dim O1 dize olarak
Dim O2 dize olarak
Dize olarak loş o3
Bayt olarak dim valore
ingresso = açık “; /home/enzo/temp/datafile.txt” Giriş için
uscita = açık “; /home/enzo/temp/datafile.hex” Çıkış oluşturmak için
EOF değilken (Ingresso)
Satır girişi #ingresso, stringa
o3 = orta $ (stringa, 13, 1)
O2 = orta $ (Stringa, 14, 1)
O1 = orta $ (stringa, 15, 1)
O0 = orta $ (stringa, 16, 1)
Valore = 1 * Val (O0) + 2 * Val (O1) + 4 * Val (O2) + 8 * Val (O3)
#Uscita, chr $ (valore);
Uyuşturmak
Close ingresso
Uscita yakın
SON
—————————————————- ———–
Gambas Programının Sonu

Sorularınız için benimle iletişime geçebilir:
Vincenzo femia
enzofemia@gmail.com
Reggio Calabria, İtalya.

Leave a Reply

Your email address will not be published. Required fields are marked *