[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 programUsing Minicom or similar program you can log serial data on PC.
Using an editor now correct log file so that first line is:
00000000 -> XXXXand last line is:
11111111 -> XXXXPlease 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 programFor questions can contact me:
Vincenzo Femia
enzofemia@gmail.com
Reggio Calabria, ITALY.
I did something like this a few years ago for an Atari ROM; I love the flexibility of arduino.
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.
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.
The other problem is that the method HaD uses to render each example makes it some what difficult to apply this one.
Very nice!
I took the liberty of simplifying the code a bit – it can be found at ( http://pastie.org/1926444 ).
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!
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);
}
}
I dont’ know why “lesser” and “greater” signs don’t appears in post.
So, usage is: convert “lesser” inputfile.txt “greater” outputfile.bin
About my last post:
Usage is: convert outputfile.bin
Also “” don’t appear
It’s a HTML thing. The greater and less than are used for HTML <Tags>
To get around it use < = < and > = >
and " = "