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:

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 (http://gambas.sourceforge.net/) 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:

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
END
-------------------------------------------------------------
End of Gambas program

For questions can contact me:
Vincenzo Femia
enzofemia@gmail.com
Reggio Calabria, ITALY.

Comments

  1. davisr says:

    I did something like this a few years ago for an Atari ROM; I love the flexibility of arduino.

  2. lostalaska says:

    That’s pretty damn sweet! I just got an Arduino UNO in the mail on Monday and started playing around with it the last couple of evenings. It seems like the only limit to these things is your imagination, time and some skillful coding… and I do love my emulation of vintage systems.

  3. GCL says:

    Oh cute! Also amazing.
    I’ve done some other work with that family of Signetics PROM devices. (Other then using an Arduino or its relatives for reading them.)

    The device is a “1K BIT TTL BIPOLAR PROM” and is useful for arcade games as our friend discovered, and several other things.

  4. GCL says:

    The other problem is that the method HaD uses to render each example makes it some what difficult to apply this one.

  5. zhazam says:

    Very nice!

    I took the liberty of simplifying the code a bit – it can be found at ( http://pastie.org/1926444 ).

  6. Enzo says:

    I appreciate Zhazam’s work about code simplify.
    I own Arduino from few weeks and haven’t studied much about his syntax! :-)
    By the way, in first istance I tried to send to PC bynary data instead of ASCII data (about this, I forgot to delete an unused “output” variable in my code), but I experienced receiving random data, so I decides to send ASCII data (serial.print instead of serial.write).
    Can anyone explain this strange results using serial.write?
    My last consideration is: but, it is so difficult to insert 82s129 read possibilities in commercial Eprom programmers? (I own Willem and GeniusG540 and none of them can do that).
    Greetings to all!

  7. Enzo says:

    After long time, because I’m learning also C programming, I add now a conversion program written in C too.
    Usage: convert output_file.bin

    Here is the source:
    #include
    main()
    {
    /*Conversion from txt file to bin*/
    int c,n,d4,d3,d2,d1,d,j;
    for (j=0; j<256; ++j)
    {
    n=d=d4=d3=d2=d1=0;
    while ((c=getchar())!='\n')
    {
    if ((n==12) && (c=='1'))
    d4=8;
    if ((n==13) && (c=='1'))
    d3=4;
    if ((n==14) && (c=='1'))
    d2=2;
    if ((n==15) && (c=='1'))
    d1=1;
    ++n;
    }
    d=d1+d2+d3+d4;
    printf("%c",d);
    }
    }

  8. Enzo says:

    About my last post:
    Usage is: convert outputfile.bin

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 96,478 other followers