La tendencia actual en muchos equipos electrónicos es que estos se asemejan cada día mas a las ordenadores, pues televisores de última generación (LCD’s, retroproyectores, etc.),televisores, equipos de audio, DVD, cámaras digitales, reproductores de mp3 ,teléfonos,etc incorporan en su electronica , memorias con el software grabado en su interior..Es así como en los electrodomésticos actuales se incluye unos circuitos de memoria del tipo EEPROM los cuales en su gran mayoría manejan la serie 24XX , 93Cxx pero también memorias clásicas memorias como son las estándar 27C64 y 27C128.
Muchas de los fallos que presentan los equipos electrónicos, donde también incluimos casi todos los antiguos juegos en formato cartucho, se deben a problemas en las memorias EEPROM que utilizan.
En efecto, una memoria puede resultar dañada y dejar de funcionar correctamente, pero en la mayoría de los casos, el problema es que se ha alterado o perdido su contenido o información binaria, es decir, los datos que tenía grabados en su interior. Eso es lo que mayormente provoca fallos de funcionamiento en el equipo que la utiliza.
Lo interesante es que reescribiendo el contenido original de la memoria, ya sea en la misma o en una nueva, el mal funcionamiento del equipo desaparece y la avería queda resuelta.Ademas no solo nos podemos limitar a copiar el contenido origina, pues adelantándonos un paso más incluso podemos incluso cambiar el contenido original por otro que nos interese.
El autor del programador que vamos ver, Robson Couto, tomó la decisión de fabricarse su propio cartucho cuando se compró una consola SNES, descubriendo al poco tiempo que la mayoría de los cartuchos que se venden actualmente para esta consola supuestamente «originales» en realidad no lo son pues tienen la ROM cambiada y los vendedores pretenden cobrarlo a precio original sin por supuesto carecer de los derechos del software original .
Couto , molesto con esta actitud ,entendió que se no deberia sobrevalorar algo que en esencia no es demasiado licito pues no se puede vender software del que no se posee licencia, por muy antiguo que sea, así que decidió crear sus propios cartuchos usando para ello su Arduino Mega para programar la memoria EEPROM, que es realmente la memoria donde se almacena el juego dentro de cada cartucho.
Para gestionar la grabación de la EEPROM con su Arduino, eligió el lenguage Python para hacer el programa de grabación de las memorias EEPROM , las cuales, por cierto se pueden encontrar por un módico precio en ebay.
Robson ha necesitado hacer bastante trabajo de programación e ingeniería inversa para conseguirlo, pero finalmente lo consiguió y ha decidido compartirlos con toda la comunidad tanto los esquemas del circuito como sobre todo el software que permite hacerlo funcionar.
¿Cómo se fabrican los cartuchos de repro (normalmente) que hay disponibles en el mercado?
- Se busca un cartucho de juego aburrido (deportes especialmente);
- Se graba una EPROM con el archivo ROM deseado;
- Se cambia la ROM del cartucho con la ROM programada.
Bien, pero entonces ¿por qué no todos están haciendo sus propias repros ?
Pues por el precio , dado que un programador no es tan barato,ya que incluso los chinos tampoco lo son ( ademas dependiendo del lugar habra que pagar impuestos,etc)
Todo tiene una relación costo-beneficio y los fabricantes / hackers están siempre creando herramientas super útiles con materiales baratos. En 2014, se fijo el cartucho de Mega Drive utilizando chips BIOS que se encuentran en la chatarra. Escribir memoria flash no es trivial, hay un cierto algoritmo, pero sigue siendo un proceso relativamente simple, asi que escribir en una memoria EPROM no debería ser mas complicado.
El programador
Una EPROM también es una memoria,y en realidad es aún más fácil de programar que las memorias flash. Para escribir un byte en EPROM tenemos que seguir lo siguientes pasos:
- Seleccione la dirección a través de los pines A0, A1, A2 … y así sucesivamente
- Poner el byte de datos para ser escrito en Q0 pines, Q1, Q2 … etc,
- Dar un pulso de al menos 50ms con una tensión de 13V en el pin Vpp
- Repetir el proceso para toda la memoria ( en caso de de la eprom 27C801 son 8 * 1024 * 1024 = 8388608 direcciones)
- También, debe ser observado que el Eprom necesita ser alimentado 6V cuando está programado(motivo por el que se ha incluido un interruptor en el esquema de mas abajo aunque se puede utilizar en su lugar un simple puente simple y cambiar manualmente Vcc cuando era necesario).
Para continuar es sumamente interesante comprender el pinout de una memoria típica con las típicas señales de control : VSS,Enable y GVPP
Los 13 voltios son proporcionados por un módulo de refuerzo ( boost) que puede conseguirse ya montado el cual básicamente es un convertidor DC-DC de 5V a 12V, pero claramente se puede usar una simple fuente de 12 voltios,aunque esto hará necesario conexiones externas al montaje
De la salida de 13V del modulo Boost , gracias a un regulador LM317 y dos resistencias de 1K ajustable y una de 220 ohmios , podemos obtener los 6V para alimentar el circuito en modo programación ,aunque claramente también se podría haber optado por un simple LM 7806 , regulador que como sabemos no necesita ajustes.
Por ultimo ,para conmutar la señal de programación G/VPP que conectaremos al pin 24 del zocalo ZIF necesitamos dos circuitos de conmutación cuyas salidas conectaremos a dicho pin. Ambos circuitos están basados en dos transistores de pequeña señal NPN y PNP (por ejemplo BC557 para el PNP y un BC547pra NPN) alimentandos por 13v y 5V respectivamente usando como señales de control las señales 3(13V) y 5(5v) del Arduino Uno
A continuación se muestra el esquema final del programador:
Como vemos el circuito gira alrededor de un zocalo ZIF de inserción nula para que no dañe las patas de la EPROM , y se conectan 30 pines del Arduino UNO al bus de direcciones de 20 bits (son los pines numerados con A0 ,A1,,..A19) y el bus de datos de 8 bits (son los pines numerados con q0,q1,..q7) de la EEPROM.
Las conexiones que se usan en este circuito son casi todas las salidas binarias del bus de expansión del Arduino Mega:
Las conexiones entre el zocalo ZIF y el arduino Mega utilizadas son las siguientes:
27c801 |
ARDUINO MEGA |
1-A19 | 39 |
2-A16> | 40 |
3-A15 | 37 |
4-A12 | 34 |
5-A7 | 29 |
6-A6 | 28 |
7-A5 | 27 |
8-A4 | 26 |
9-A3 | 25 |
10-A2 | 24 |
11-A1 | 22 |
12-A0 | 5 |
13-Q0 | 5 |
14-Q1 | 6 |
15-Q2 | 7 |
16-VSS | GND |
17-Q3 | 8 |
18-Q4 | 9 |
19-Q5 | 10 |
20-Q6 | 11 |
21-Q7 | 12 |
22-ENABLE(NEGADO) | 2 |
23-A10 | |
24-G/vPP | VER CIRCUITO |
25-A11 | 33 |
26-A9 | 31 |
27-A8 | 30 |
28-A13 | 35 |
29-A14 | 36 |
30-A17 | 41 |
31-A18 | 38 |
31/VCC | 5V ó 6V |
El montaje podemos soldarlo directamente en un escudo de prototipos para un Arduino Mega que enchufaremos encima del propio Arduino
Como comentábamoses muy interesante usar un zócalo ZIF, lo cual hará mas facil conectar y quitar la Eprom.
Software
Obviamente el circuito montado sin sw no podemos hacer nada , así que el autor ha escrito tanto un script ,como un sketch para ayudar a la lectura o grabacion de la Eeprom usando para ello un script en Python que lee los datos de un archivo y los nvía estos al Arduino Mega, que recibe los datos y los escribe en la memoria
Python 3 y pyserial son necesarios para cargar datos a la eprom pues como vemos el sw en realidad se compone de dos partes:
- El script en python para leer el fichero y enviarlo al Arduino por el puerto serie y también para leer el contenido de la EEPROM via peticion al Arduinoi
- Un sketch para Arduino para permitir leer y escribir en la Eeprom, donde como hemos comentado ,para la programación, se debe aplicar un vpp de 12V y un vcc de 6V a la eprom
Los archivos del proyecto están disponibles en el repositorio de github del autor.
Ahora usted ya sabe que puede programar EPROMS con sólo un Arduino Mega y algunos componentes adicionales( y no se preocupe si se equivoca,!pues puede borrarlos simplemnte liberando la ventanita y exponiendo esta con luz UV ! )
Fuente aqui