Como el tema ha salido en el hilo sobre el PowerPak para SNES (
http://www.elotrolado.net/hilo_snes-powerpak_1320964), pues voy a poner un pequeño tutorial sencillo para poder parchear la mayoría de las ROMs de SNES para que no detecten por software en qué máquina se están ejecutando y así poder jugar el juego en cualquier consola.
Como ejemplo voy a usar el
Secret of Mana de SNES, ya que fue el primer juego al que le apliqué este parche hace años a petición de un jugón. Necesitaremos para ello sólo la ROM y un editor hexadecimal (cualquier vale, pero recomiendo Hexworkshop)
1- Abrimos la ROM con el editor hexadecimal y buscamos en ella una de las siguientes cadenas hexadecimales:
1)
AF 3F 21 00 (es la más común)
2)
AD 3F 21 3)
A5 3F (muy improbable)
2- En nuestro ejemplo, encontramos la cadena 1 SOLO una vez en la posición del archivo 0x7B2E1 (en decimal es el byte número 504545). Es en esta instrucción donde el código pregunta a la SNES qué hardware de video está usando y lo más probable es que nos aparezca la cadena 1 ó 2. En cualquier caso, SOLO una de ellas es la que aparecerá en cada juego.
3- Una vez localizada, nos hemos de asegurar de que es realmente la instrucción que estamos buscando y no son datos o cualquier otra instrucción. Para ello, miramos los bytes que vienen a continuación, que han de ser
29 10 ó
29 10 00.
4- Una vez que nos hemos asegurado que aparece la secuencia de bytes correcta, comprobamos los dos siguientes bytes de nuevo, que han de ser
C9 10 (si en el paso 3 encontramos
29 10) ó
C9 10 00 (si en el paso 3 encontramos
29 10 00)
5- Si todo lo anterior se cumple, entonces tendremos algo así en el archivo:
Pues lo único que tenemos que hacer para convertirlo en multiregión es cambiar
29 10 por
29 00 y
C9 10 por
C9 00. Así se queda de esta forma:
6- Guardáis el archivo de la ROM y ya la tenéis para jugar en cualquier SNES o SFC con el PowerPak. Obviamente, también sirve para haceros vuestros propios cartuchos y que puedan ser usados en la consola correspondiente.
7- Para probar que lo habéis hecho bien, abrid la ROM con el SNES9x 1.51 y en el diálogo de abrir ROM, elegir la opción de "Force NTSC" y probar a ver si el juego se puede jugar normalmente. Probad también a hacer lo mismo poniendo "Force PAL", y así veréis que se puede jugar en ambos casos.
El método éste no es infalible, puesto que cada programador habrá hecho como crea conveniente la detección del hardware; un ejemplo que no podréis cambiar con estos pasos que os he dado es el
Donkey Kong Country.
Para parchear éste necesitaréis de un debugger (como el Snes9x 1.51 de Geiger que podéis encontrar aquí:
http://geigercount.net/crypt/snes9x1.51.ep10r2.7z); en este caso, los pasos son:
1- Abrir la ROM con el debugger.
2- Una vez cargada la ROM, en la ventana que os aparece, apretáis el botón "Breakpoints" y ponéis lo que véis en esta imagen:
3- Le dais a "OK" y en la ventana de debug, a "Run".
4- Esperáis que se pare la ejecución del juego automáticamente; esto se hará JUSTO cuando el código del juego va a comprobar sobre qué hardware se está ejecutando; entonces le dais a "Step Over" un par de veces o tres para que vaya avanzando línea a línea y mostrando qué instrucciones se ejecutan. En el caso del DKC, veréis esto:
5- Aquí veréis qué código se está ejecutando para que se detecte una región o otra. El truco para que sea multiregión es sustituir la instrucción del tipo "LDA" para que cargue el mismo valor que en las instrucciones de tipo "BIT" o "CMP". Para decirlo claramente, en nuestro ejemplo vemos que la siguiente instrucción al "LDA" es "BIT #$0010", por tanto, para hacerlo multiregión hay que sustituir "LDA $2027,x" por "LDA #$0010"; si pusiera "CMP #$0030", pues pondríamos "LDA #$0030".
PERO ESTA SUSTITUCIÓN NO SE PUEDE HACER EN EL DEBUGGER.6- Ya hemos localizado que la instrucción a cambiar es:
$80/E961 BD 27 20 LDA $2027,xy hay que sustituirla por LDA #$0010, que tiene esta forma:
$80/E961 A9 10 00 LDA #$0010Así que con el editor hexadecimal nos vamos a la dirección correspondiente del archivo (¡¡OJO!! Para saber la dirección del archivo hay que saber si la ROM es LoROM ó HiROM, y usar una calculadora como ésta:
http://fusoya.eludevisibility.org/la/download/la103.zip) o bien buscamos la cadena de bytes que nos ha dado el debugger:
BD 27 20 (más fácil es esto segundo).
7- En el editor hexadecimal, en nuestro ejemplo, sustituiremos la cadena hexadecimal
BD 27 20 por
A9 10 00 y guardamos el archivo. Así ya tenemos el DKC multiregión.
CONCLUSIÓN:El primer método que propongo es mucho más fácil y sencillo para gente sin experiencia en programación de la SNES ni ensamblador, pero el segundo método es INFALIBLE, vale con cualquier juego, puesto que consiste en analizar el código convenientemente y buscar una forma de que el código siempre detecte la versión correcta. La solución más drástica en este caso es también sustituir todas las instrucciones por NOPs (cuyo byte hexadecimal es EA): abrís el editor hexadecimal y sobreescribís cada byte del código que hace la detección por EA.