[TUTORIAL] Parchear los juegos de SNES para multi-región

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:
Imagen
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:
Imagen

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:
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:
Imagen

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,x
y hay que sustituirla por LDA #$0010, que tiene esta forma:
$80/E961 A9 10 00 LDA #$0010

Así 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.
Gracias por el post. Me voy un poco offtopic, pero sabrias si con este cartucho, es posible salvar savestates, al estilo los cartuchos de GBA?

Es que lo que mas me gusta de los emuladores es salvar en cualquier punto.
Toma ya!! Eso si es triunfar magno y encima super rápido!!. A ver si este fin de semana me pongo a "jugar" con el editor. Muchas gracias!!!! [beer]

[plas]
Un tuto a la altura de tus traducciones. Muchas gracias ;)
Interesante por lo menos hasta yo creo que podría parchear mis roms tranquilamente [sonrisa]

PS: Errata.
Gracias por el tutorial.

magno escribió: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.


Un poco tarde para FFantasy6 xD
FFantasy6 escribió:Un poco tarde para FFantasy6 xD


¿Por qué?


solbadguy0308 escribió:Interesante, aunque menos, hasta yo creo que podría parchear mis roms tranquilamente


¿Por qué es menos interesante?

O no sé leer o me he levantado espeso hoy XD
magno escribió:¿Por qué?


Porque hice el cartucho hace dos días y (como siempre) no miré lo de las regiones.
FFantasy6 escribió:Porque hice el cartucho hace dos días y (como siempre) no miré lo de las regiones.


Ah, ¿pero era cierto que te habías hecho el cartucho? Jaja, pos yo pensé que era un vacile :D De todas formas, si le pusiste mi traducción, ese parche ya lo lleva.

Oye, y ¿por qué no cuelgas unas fotos para ver cómo te quedó? En el hilo de "El club de los tornillos" vendría al pelo para echarle un ojo.
magno escribió:Ah, ¿pero era cierto que te habías hecho el cartucho? Jaja, pos yo pensé que era un vacile :D De todas formas, si le pusiste mi traducción, ese parche ya lo lleva.

Oye, y ¿por qué no cuelgas unas fotos para ver cómo te quedó? En el hilo de "El club de los tornillos" vendría al pelo para echarle un ojo.


xD

Tu parche no lo lleva xD, lo aplique sobre la rom pal y me salta el aviso.

La foto la pondré cuando haga la pegatina :)
magno escribió:
solbadguy0308 escribió:Interesante, aunque menos, hasta yo creo que podría parchear mis roms tranquilamente


¿Por qué es menos interesante?

O no sé leer o me he levantado espeso hoy XD


Ya he corregido, perdón.
FFantasy6 escribió:xD

Tu parche no lo lleva xD, lo aplique sobre la rom pal y me salta el aviso.

La foto la pondré cuando haga la pegatina :)


Mi parche lo lleva SEGURO (lo acabo de comprobar). Además, puedes ver que es una de las últimas cosas que añadí en la última versión que colgué en mi web.
XD
magno escribió:Mi parche lo lleva SEGURO (lo acabo de comprobar). Además, puedes ver que es una de las últimas cosas que añadí en la última versión que colgué en mi web.
XD


Hombre, seguro no, que hace dos días hice el cartucho y sale el aviso [+risas]
Eso será porque no bajaste el último parche de mi web XD

EDITO: Estoy comprobando a ver si es que el parche que tengo en mi disco duro no lo subí [+risas]
magno escribió:EDITO: Estoy comprobando a ver si es que el parche que tengo en mi disco duro no lo subí [+risas]


Capaz eres XD
FFantasy6 escribió:
magno escribió:EDITO: Estoy comprobando a ver si es que el parche que tengo en mi disco duro no lo subí [+risas]


Capaz eres XD



¿Ves? ¡Pues sí era capaz, sí! [flipa]
Resulta que no subí la modificación a la web (el último parche es del 2006, así que es imposible que la tenga porque el cartucho me lo hice en el 2007 ó 2008, creo recordar... y sí lleva esa modificación), así que me voy a flagelar un poco y a subirlo a la web esta tarde... si es que estoy en el mundo para que haya de tó...
15 respuestas