Las siglas ROM significan Read Only Memory (memoria de sólo lectura). Es una memoria de semiconductor no destruible, es decir no se puede escribir en ella y es no volátil (mantiene los datos cuando se interrumpe la corriente).

La memoria de sólo lectura es utilizada normalmente como medio de almacenamiento de datos. Casi todo el hardware lleva el código que necesita para empezar a funcionar grabado en una ROM. Podemos decir que donde hay algún procesador hay una ROM, algunos inclusos llevan la ROM incluida. Por ejemplo las BIOS de los ordenadores actuales son memorias ROM.
Este medio de almacenamiento tiene como ventaja que no se necesitan unidades de disco para almacenarse y como inconveniente que son más difíciles de actualizar y que está muy ligado al hardware que acompaña.
Las memorias ROM son más lentas en lectura que las memorias RAM así que la mayoría de las veces el contenido de la ROM se copia en RAM y se ejecuta desde ahí.

En el caso de las máquinas de pinball, las ROMs son los chips donde se almacena el programa principal y los datos necesarios para su funcionamiento como gráficos, efectos o músicas.

Por extensión, la palabra ROM puede utilizarse también para referirnos al archivo de datos que contenga la imagen de una memoria ROM.

Los tipos de memoria ROM se pueden clasificar en los siguientes tipos:

- Memorias PROM (Programmable Read Only Memory). La memoria de sólo lectura programable se puede programar con un programador PROM. Esta memoria sólo se puede programar una vez.

 - Memorias EPROM (Erasable Programmable Read Only Memory) Memoria de sólo lectura borrable/programable. Esta memoria puede borrarse con luz ultravioleta, y luego reprogramarse de nuevo sin problema.

 - Memorias Flash o EEPROM (Electrically Erasable Programmable Read Only Memory) Memoria de sólo lectura programable y borrable electrónicamente.
Esta memoria no necesita de luz ultravioleta para ser borrada, sino que se puede borrar directamente en el programador.

Generalmente las ROMS de máquinas pinball son de tipo EPROM (2716,2732,2764,27c010,27Cxxx) aunque en la mayoría de los casos se pueden sustituir por sus EEPROMs equivalentes (28Cxxx). 

Después del rollo teórico vamos a ver cómo realizar las dos operaciones que más nos pueden interesar con las memorias ROM

1- Lectura de una memoria ROM específica. (Salvaguarda de los programas de máquinas antiguas)

2- Grabación de una memoria ROM específica. (Actualización a la versión de ROM más moderna o a una versión 'home' en máquinas americanas)

Para empezar con el trabajo de campo necesitamos una serie de herramientas.
La principal es un aparato lector/programador de EPROMs.
Yo recomiendo utilizar el programador WILLEM, es económico, muy versátil y puede con todo tipo de chips EPROM, FLASH, PIC en todo tipo de formatos. Existe con puerto paralelo y también una versión más reciente con puerto USB.

Si queréis comprar un programador WILLEM tenéis varias fuentes, lo mejor es utilizar tu buscador favorito para encontrar la mejor oferta, también suelen aparecer en ebay.

Incluso si alguno es muy manitas se lo puede construir él mismo, hay abundante información en la red para ello.

Instalación del sistema

Lo segundo que se necesita es un ordenador con puerto paralelo (en caso de que no dispongamos de un willem usb), en el que instalaremos el programa que sirve para manejar el willem. Por ejemplo, lo descargaremos de http://www.sivava.com/
Después descomprimiremos el programa en un directorio. Para que funcione correctamente copiaremos los archivos DLPORTIO.DLL, DLPORTIO.SYS y io.dll al directorio c:\windows\system32.
Conectaremos el willem al puerto paralelo, y le daremos alimentación, enchufando el transformador o conectando el cable USB al PC dependiendo de la versión del willem y ya podemos empezar a trabajar.

1. Lectura de una memoria ROM.

Empezaremos leyendo una memoria de una máquina para guardarla. Esta memoria puede usarse para tener un backup del programa de la máquina, que luego puede usarse para emular la máquina con Pinmame o para hacerle cambios y volver a grabarla en la máquina original; por ejemplo podríamos cambiar algún efecto de sonido por otro o cambiar la música de fondo. Más difícil es tocar el programa para que la máquina funcione de otra forma o tenga otras reglas. Para hacer esto cómodamente haría falta el código fuente del programa, ya que desensamblar a código máquina y meter mano ahí es una tarea que necesita mucho tiempo y esfuerzo.

Vamos a utilizar de ejemplo las placas CPU y de sonido de una pinball "Clown" (Inder 1988):

En la imagen señalados en amarillo vemos cuales son los integrados de memoria ROM. Hay una en la placa de CPU que contiene el código principal, y cuatro en la placa de sonido que contienen los efectos de sonido y la música de esta máquina y una que contiene el código que utiliza la CPU de esta placa para reproducir el sonido.

Por curiosidad, la CPU que utilizan estas placas es un Z80, que es el que utilizan la gran mayoría de máquinas de pinball electrónicas españolas por ser el más usado en la época; tambien es el mismo procesador que utilizaban ordenadores antiguos de 8 bits como el Spectrum o el Amstrad, además de muchos juegos de arcade que están basados en este chip. Y como el Z80 está perfectamente
emulado, no debería ser muy difícil incluir estas máquinas en la emulación del PinMame.

Para leer la ROM lo primero que hay que hacer es extraer el integrado de la placa. Como hacer esto dentro de la máquina es más difícil recomiendo extraer la placa de la máquina primero (desconectando todos los cables y sacándola de los pivotes blancos que la sujetan con una pestaña). Antes de sacar los chips de la placa os recomiendo marcarlos con letras (a,b,c, etc) para recordar en que posición están y no confundir los chips unos con otros después, si disponemos del esquema eléctrico de las placas es bueno usar la misma nomenclatura que utiliza el fabricante para identificar las distintas roms. Para extraer la ROM de la placa utilizaremos un destornillador plano, que insertaremos entre la ROM y el zócalo y lo giraremos poco a poco para que vaya saliendo sin forzarla, aquí hay que ser cuidadoso pues es fácil doblar e incluso romper alguna patilla, hay también herramientas específicas para la extracción de chips que son como una especie de tenaza que agarra al chip por los extremos y permite extraerlo de una forma más segura. Hay que fijarse en la posición del chip, para luego no insertarlos al revés.
Todos los chips tienen una hendidura que nos muestra el principio para no equivocarnos.


 

Una vez que la tengamos fuera, tenemos que identificar el tipo de ROM que es para poder leerla correctamente. Como normalmente tienen una pegatina, despegaremos el extremo hasta que veamos el modelo marcado en el chip .

En nuestro caso la ROM de la placa CPU es una 27C64 y las de la placa de sonido son una 27C64 y cuatro 27512.

Arrancamos el programa del Willem y seleccionamos el tipo de ROM que queremos leer (en nuestro caso una 27C64). El programa nos indicará como tenemos que colocar los interruptores DIP para configurar el willem para esa memoria:


Ahora insertamos el 27c64 en el el zócalo ZIF (Zero Insertion Force). Cuidado, hay que tener cuidado de no equivocarse en la posición del chip. El chip tiene una pequeña hendidura que nos muestra cual es la parte delantera. En este caso hay que poner el chip como nos indica el willem la marca hacia arriba y el chip en la parte baja del ZIF. Cuidado con esto porque un chip al revés es con bastante probabilidad un chip frito.




Una vez correctamente colocado sólo hay que pulsar el botón de lectura para que nos lea la ROM. Después de esto pasaremos al buffer que nos mostrará el contenido de la memoria:

 

Si el contenido del buffer es todo 00 o todo FF la lectura es incorrecta. A mí me ha pasado que he tenido que levantar un poco el chip antes de cerrar el ZIF para que hiciera buen contacto y me leyera correctamente el contenido.
Para asegurarnos que lo que hemos leído es correcto, pulsaremos varias veces el botón "verificar" para que vuelva a leer la ROM y la compare con lo que tenemos en el buffer. Si nos da el OK todas las veces es que nuestra lectura es correcta y si no hay que volver a leer la ROM, recolocando el chip
generalmente.

Una vez que nos hemos asegurado que nuestra lectura es la buena, hay que grabarlo a disco poniendo al fichero el nombre con la letra que hemos marcado la ROM anteriormente (p.e. clown_a.bin, clown_b.bin, etc). Luego pasaremos al siguiente chip, si es el mismo modelo podemos mantener la configuración del willem, si cambiamos a otro modelo hay que cambiar el interruptor DIP como nos indique el willem.

Cuando terminemos con todos los chips podremos respirar tranquilos, habremos salvado el código de nuestra máquina pinball.

Tambien hay que acordarse de crear un fichero de texto para colocarlo junto a las roms y que nos de información de a que integrado de las placas corresponde cada fichero y su checksum y tipo de memoria. Ahí si queréis podéis incluir información de la máquina, créditos o lo que queráis que para
eso os lo habéis currado.

Aquí tenéis el fichero con las ROMs extraídas en este ejemplo: clown_roms.zip

Curiosidad. Si queréis escuchar las músicas y los sonidos de esta ROM, podéis hacerlo con el programa GoldWave. www.goldwave.com (este es el que he utilizado yo pero cualquier otro editor de audio que permita cargar formatos planos de audio especificando bits y velocidad de muestras, vale perfectamente). Abrimos cualquiera de las roms (c,d,e o f) que contienen sonido, y seleccionamos tipo telephony, 4 bits, 8000 hz. Le damos al play y a escuchar. Podemos incluso modificar algún efecto o música. Para hacer esto tenemos que buscar un sonido que sea de la misma duración exacta que el que queremos sustituir (ya que no podemos tocar el código) y pegarlo encima del otro sobrescribiéndolo sin modificar la duración del archivo. Luego podremos grabarla en una nueva ROM para nuestra máquina.

2. Grabación de una memoria ROM

Para este ejemplo vamos a actualizar una Indiana Jones. Esta parte es bastante fácil. Tendremos que conseguir de internet la última versión o la versión que queramos instalar en nuestra máquina. La máquina de ejemplo tiene instaladas la versión L-5 de código y la L-2 de sonido. Vamos a actualizar a L-7 de código y L-3 de sonido.

0

En el manual comprobamos que la Indiana Jones utiliza en todas las roms el modelo 27c040, necesitamos 2. El problema es que estos chips son EPROMs y para borrarlos necesitaremos luz ultravioleta intensa. Así que procuraremos conseguir chips nuevos o que estén borrados. Tambien podremos comprar un borrador de luz UV. Y la otra opción es encontrar el modelo 28c040 EEPROM
equivalente que se puede borrar en el programador sin más problemas.

Descargamos las versiones que necesitamos por ejemplo de http://www.ipdb.org/machine.cgi?id=1267. Luego abriremos el programa de grabación y seleccionaremos el archivo de la ROM L-7.

 

Al hacerlo el programa nos indicará el checksum del archivo. Para asegurarnos que es correcto podemos comprobar el checksum que nos da Williams en http://www.planetarypinball.com/mm5/Williams/tech/roms/indyjones.html. Aquí vemos que el checksum es A607 el mismo que nos da el willem, así que todo es correcto. Ahora colocaremos el interruptor DIP en la posición del 24c040 y el chip en el zócalo ZIF con la muesca hacia arriba.

Y ahora solo habrá que darle al botón de programar. Cuando termine, pulsaremos el botón de verificar varias veces para comprobar que nuestra grabación es buena. Si por cualquier causa no ha grabado bien, lee el chip grabado para ver si ha recogido algo, si sigue en blanco prueba de nuevo colocándolo bien. Si ha grabado algo, tendrás que borrarlo o utilizar otro. Si todo ha salido bien, enhorabuena, (si es un 27c040 tendremos que taparle la ventanita para evitar borrados accidentales) y ya solo hay que cambiar el chip viejo por el nuevo y a disfrutar de nuestra pinball reprogramada.


Tutorial realizado por effect