Bueno, para empezar, estoy intentando usar el parche VGA del Skies of Arcadia utilizando el Codebreaker, os explico mis avances.
Para empezar algo de información de como es el inicio de un juego en Dreamcast:
Los juegos de dreamcast tienen dos archivos indispensables en el arranque: IP.BIN y 1ST_READ.BIN.
El IP.BIN hace las veces de bootloader y parece ser que se comunica directamente con la BIOS al arranque de la consola. Este fichero es importante para nosotros, ya que aquí es donde se asignan cosas como la salida de video (RGB, VGA, etc).
El segundo, el 1ST_READ.BIN es más importante aún ya que es el ejecutable de la consola y tiene información de bastantes cosas.
Según pude leer en el blog de Japanese_Cake (el descubridor de los parches VGA) la salida de video en los juegos en los que no se puede forzar (Resident Evil: Code Veronica, Skies of Arcadia, etc) viene forzada en el propio 1ST_READ.BIN, por lo que no importa que modifquemos el IP.BIN, siempre sacará una imagen PAL. La solución es modificar el 1ST_READ.BIN con ayuda de un debugger y un emulador para que no haga caso de esto y poder lanzar el formato de imagen que nosotros le digamos.
Lo primero que hice fue investigar como narices funciona exactamente el Codebreaker, parece ser que al arranque del disco que vayamos a cargar, inyecta la información al binario 1ST_READ.BIN permitiendo modificar algunas cosas, como por ejemplo cambiar el POV del motor 3D que se ejecuta, lo cual nos permite hacer el ya conocido formato panorámico deformando la imágen de salida para que se pueda ver bien en 16:9 aunque la resolución interna sea de 4:3.
El funcionamiento del Codebreaker es relativamente sencillo, por ejemplo, en el siguiente código:
02502A88 3F400000
Los primeros 8 dígitos son las que indican al programa cuantos bits hay que inyectar y donde, y dentro de estos 8 dígitos los 2 primeros indican la cantidad de información que se va a modificar y los 6 restantes la dirección hexadecimal de donde se van a inyectar:
02 -> Número de pares de bytes que se van a inyectar, son dos, ya que cada byte son 2 digitos hexadecimales. Si quisiesemos inyectar 16 dígitos, esto sería 04, 24 serían 06 y así sucesivamente.
502A88 -> Dirección donde se va a inyectar la información. Realmente la dirección es 8C502A88, pero el 8C se omite.
Los segundos 8 dígitos es la información que se va a inyectar, pero ¡muy importante! en formato little endian, esto es, si en el hexadecimal tienen este orden: AABBCCDD en el código del Codebreakers el orden sería DDCCBBAA.
Sabiendo esto, fui rápidamente al 1ST_READ.BIN con el parche VGA de Japanese_cake y lo comparé con el del Skies of Arcadia normal, y encontré estas diferencias:
O, lo que es lo mismo, debemos inyectar:
En 000187F0: 224F03D2 0B420900 264F0B00 09000900 60A5388C
En 0037A560: 224F05D2 0B420900 05D20820 008B03D2 264F0B00 23600900 20272A8C 31000000 38000000
Lo cual nos quedaría en el Codebreaker estos códigos:
Códigos Codebreaker VGA SoA:
0A0287F0 8C38A560 00090009 000B4F26 0009420B D2034F22
1238A560 00000038 00000031 8C2A2420 00096023 000B4F26 D2038B00 2008D205 0009420B D2054F22
o
020287F0 D2034F22
020287F4 0009420B
020287F8 000B4F26
020287FC 00090009
02028800 8C38A560
0238A560 D2054F22
0238A564 0009420B
0238A568 2008D205
0238A56C D2038B00
0238A570 000B4F26
0238A574 00096023
0238A578 8C2A2720
0238A57C 00000031
0238A580 00000038
Lo he probado tanto con el Action Replay (forzando NTSC) y en Codebreaker y... no ha funcionado
Por tanto os pido ayuda, a ver si podemos conseguir la salida VGA en nuestros GDs originales!
Un saludo!
EDITO:
He descubierto
esta web donde se explica el funcionamiento de los códigos. Parece ser que para que los códigos funcionen para más de 4 bytes (32 bits) deberían tener la siguiente estructura:
Lo que nos dejaría esto:
03000005 8C0287F0 8C38A560 00090009 000B4F26 0009420B D2034F22
03000009 8C38A560 00000038 00000031 8C2A2720 00096023 000B4F26 D2038B00 2008D205 0009420B D2054F22
El cual he probado y... no va
EDITO2:
He probado añadiendo 0000803D 00000031 usando Demul y el cheatengine y ¡va!.
Esto último apunta al IP.BIN, para forzar el flag del VGA. Lamentablemente, no puedo probarlo en hardware real ¿alguien podría?
Los códigos son:
VGA:
020287F0
D2034F22
020287F4
0009420B
020287F8
000B4F26
020287FC
00090009
02028800
8C38A560
0238A560
D2054F22
0238A564
0009420B
0238A568
2008D205
0238A56C
D2038B00
0238A570
000B4F26
0238A574
00096023
0238A578
8C2A2720
0238A57C
00000031
0238A580
00000038
0000803D
00000031