Un pequeño tutorial para personalizar las ROMs de tus pinballs de Williams/Bally con sistema WPC

 
 

WPC son las iniciales de "Williams Pinball Controller", el sistema de control usado por Williams para sus pinballs desde 1990 hasta 1999. Son casi 50 modelos los fabricados con este sistema, incluyendo títulos tan conocidos como The Addams Family, Indiana Jones, Twilight Zone, Medieval Madness, etc.

Las memorias ROM son los chips donde se almacena el programa principal y los datos necesarios para el funcionamiento del pinball como gráficos, efectos o músicas. Realmente sería más adecuado hablar de EPROMS, que a diferencia de una ROM, se pueden borrar con luz ultravioleta y volver a grabar. Esta es una gran ventaja ya que permite actualizaciones, la pega es que pueden llegar a borrarse con el tiempo.

Tal vez en alguna ocasión te habrás sentido tentado a modificar el contenido de las ROMs de tus pinballs, quizás para modificar el tedioso mensaje "Say no to drugs",  para cambiar alguna pésima traducción o simplemente para personalizar tu pinball.

Para hacer estos cambios basta con un editor hexadecimal, una programadora de EPROMs y algo de tiempo y paciencia, ahora bien nos encontraremos con un gran obstáculo que se llama "checksum".
El "checksum" es el algoritmo que usa el WPC para chequear la integridad del contenido de las ROMs. Es un número de 4 cifras hexadecimales que se calcula a partir del contenido de la ROM.
Dentro de los auto chequeos que hace el WPC cuando arranca está el test del checksum; si falla este test el pinball no arrancará (el sistema lo interpreta como memoria corrompida).

Por tanto, si modificamos el contenido de una ROM tenemos que modificar también el checksum o el pinball no arrancará.
A la hora de cambiar el checksum hay una pequeña dificultad, calcularlo es sencillo porque es un algoritmo estándar y hay muchos programas que lo hacen, el problema es que al poner un nuevo checksum, el checksum vuelve a cambiar (porque modificamos una posición de memoria) y ya no vale el que hemos puesto (es el pez que se muerde la cola). 
Afortunadamente hay un truco que salva el problema...


Instrucciones para modificar Imágenes ROM WPC:

1) Carga la imagen ROM en un editor hexadecimal.
2) Realiza las modificaciones que quieras hacer en la imagen ROM.
3) Pon el checksum original a cero, son dos posiciones de memoria localizadas en 0x7FFEE & 0x7FFEF.
4) Calcula el nuevo checksum (usa el programa de Bill Ung, localizado en http://www.ufopinball.com/Bill/).
5) Escribe el nuevo checksum en las direcciones 0x7FFEE & 0x7FFEF.
6) Calcula la siguiente resta: (0xFFFF - checksum), es decir restar el nuevo checksum al número hexadecimal 0xFFFF (los editores hexadecimales suelen tener calculadora hexadecimal, también vale la calculadora de Windows en su versión científica)
7) Localiza dos bytes consecutivos en la memoria que estén a 0xFF (con un poco de suerte serán de una zona no utilizada)
8) En la posición que hayas encontrado, escribe el resultado calculado en el paso 6
¡este es el truco, escribimos el complementario de checksum en alguna zona de memoria no usada!
9) Salva la imagen y vuelve a calcular el checksum, debería coincidir con el obtenido anteriormente en el paso 4.

Para fijar ideas un caso práctico, por ejemplo, si quieres cambiar una ROM 9.2 de la Twilight Zone para que diga "SAY YO TO DRUGS"
Estos serían los pasos:

1) Carga la imagen ROM en un editor hexadecimal.
2) Busca la palabra "DRUGS"
3) Localiza el  "NO" anterior.
4) Cambia la  'N' por una 'Y' (en TZ 9.2 está en la dirección 0x3A90B.)
5) Ahora vete al final de la imagen a la dirección 0x7FFEE donde deberías ver el checksum original que vale 0x9392.
6) Escribe 0x0000 como nuevo checksum.
7) Salva la imagen
8) Calcula el nuevo checksum, a mi me sale 0x9278.
9) Carga la imagen de nuevo en el editor hexadecimal y vuelve a la posición del checksum.
10) Escribe el nuevo checksum.
11) Localiza alguna zona sin usar dentro de la imagen de la ROM que contenga 0xFFFF. Yo usé las direcciones 0x7FF8E y 0x7FF8F.
12) Resta 0xFFFF menos el nuevo checksum, sale 0x6D87 (0xFFFF - 0x9278 = 0x6D87).
13) Escribe este resultado en la localización del paso 11, en este caso, 0x7FF8E y 0x7FF8F.
14) Salva la imagen y recalcula el checksum. Debe coincidir, en caso contrario algo estás haciendo mal.
---
Grant Schenck
schenck@compuserve.com


Artículo realizado por Juaney
A partir de
http://www.shivasite.com/forums/article.php?a=284
http://213.198.3.130/pinball/romchange/?lng=eng

¡Gracias effect por los enlaces!