[Proyecto] BootCD para Dreamcast (Modo panorámico, VGA y Region free)

Prime Day: 36 horas de ofertas exclusivas (alta gratis en Prime)
1, 2, 3
Hola a todos,

Desde que salieron los parches VGA para los DinoCrisis, RE: CV, Skies of Arcadia y demás, me ronda la cabeza que sería ideal hacer un bootcd que inyectase el 1ST_READ.BIN parcheado al juego original, para poder usar nuestros originales y no tener que recurrir a Dreamshell y HDD Mod, GDEMUs o ripeos varios.
El autor de los parches (japanese cake) me comentó que tenía esto en mente cuando lanzó los primeros parches, pero parece ser que lo ha dejado de lado, por lo que, quizá, sea el momento de hacerlo por mi mismo.

Ya puestos, y cargado de ambición, también intentaría hacer el mejor BootCD para la consola que parchease también los juegos para que tuviesen modo panorámico e intentar hacer que funcionen los juegos de otras regiones.

Realmente no tengo ni idea de la viabilidad de esto, he estado mirando por internet y parece factible, pero si alguien tiene ideas y quiere echarme una mano, sería más que bienvenido!

Un saludo!
ChepoXX
MegaAdicto!!!
3.641 mensajes
desde ago 2003
Suena a una idea muy interesante, te animo que sigas con la misma
@gatoh ánimo, buena idea, yo lo buscaba para el VGA del skies of arcadia...
gatoh
#foe
849 mensajes
desde mar 2005
en Martorell
Editado 6 veces. Última: 31/05/2017 - 00:23:54 por gatoh.
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:

Imagen
Imagen

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:
0300nnnn

aaaaaaaa


Group write code. nn specifies how many 32 bit values follow. aaaaaaaa is the addrsss to write to. The values following this code are written to address aaaaaaaa. E.g:

03000004

8c012000

11111111

22222222

33333333

44444444

The effect is as follows: With a count of 00000004 codes, to address 8c012000:

8c012000 = 11111111

8c012004 = 22222222

8c012008 = 33333333

8c01200c = 44444444


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? :D 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
Sema81
MegaAdicto!!!
1.021 mensajes
desde mar 2007
en Sevilla
@gatoh Si no recuerdo mal, a la hora de parchear el Skyes of arcadia, además de aplicar el parche de japanese-cake, había que habilitar la salida vga en el IP.BIN.

When building an Dreamcast image (CDI/GDI/etc.), make sure the VGA flag is set in the boot file (AKA IP.BIN).


Yo recuerdo que al aplicar el parche y probarlo con el GDEMU no me funcionaba. Luego esa misma imagen parcheada, la volví a parchear con el parche genérico para habilitar VGA (entiendo que el que le dice al IP.BIN que es compatible) y ya sí funcionó.

A lo mejor van por ahí los tiros. Siento no poder ayudarte más.

Por cierto, muy interesante tu explicación del funcionamiento del Code breaker.
Gromber
MegaAdicto!!!
21.578 mensajes
desde feb 2006
Editado 6 veces. Última: 1/06/2017 - 12:59:04 por Gromber.
lo he probado en action replay, y sigue saliendo el mensaje del vga, he probado engañando con un interruptor y nada, blanco y negro, aunque no tengo practica con el vga trick

supongo que convertiste el código de cheatengine a codebreaker, a ver si alguien lo prueba con el mismo.
gatoh
#foe
849 mensajes
desde mar 2005
en Martorell
Editado 1 vez. Última: 1/06/2017 - 18:45:15 por gatoh.
Gromber escribió:lo he probado en action replay, y sigue saliendo el mensaje del vga, he probado engañando con un interruptor y nada, blanco y negro, aunque no tengo practica con el vga trick

supongo que convertiste el código de cheatengine a codebreaker, a ver si alguien lo prueba con el mismo.


Gracias por probarlo. Estoy sin dreamcast real hasta el sábado!
Yo uso Codebreaker y Action Replay, tengo ambos cd's funcionando version sparrow.
En el emulador con el cheat engine, si solo ponemos el código que apunta al IP.BIN:

0000803D
00000031

Que en Demul sería

2C00803D
00000031


Ya no aparece el mensaje de el cable es incorrecto, pero emite la señal en entrelazado. Si añadimos los otros ya emite a 60Hz y 30FPS y en progresivo. ¿podrías probar solo activando el código que acabo de poner?
En caso de que no vaya, prueba en la dirección 0000803E, es decir:

0000803E
00000031


Con estos códigos en principio debería saltarse la comprobación del flag VGA, tal y como se puede comprobar aquí.

Muchisimas gracias!
Gromber
MegaAdicto!!!
21.578 mensajes
desde feb 2006
Editado 3 veces. Última: 1/06/2017 - 19:37:33 por Gromber.
no pirulan. Mi Skies of Arcadia es original.
gatoh
#foe
849 mensajes
desde mar 2005
en Martorell
Editado 2 veces. Última: 1/06/2017 - 19:47:07 por gatoh.
Gromber escribió:no pirulan. Mi Skies of Arcadia es original.


Vaya, gracias por probarlo!

Uhm, no entiendo porque no funciona, pero creo que se me ocurren dos teorías:

1) El Action replay es incapaz de escribir en sectores de la memoria tan bajos (por debajo del 0x8C010000) ¿quizá el Codebreaker si pueda?
2) La información del VGA flag no la está leyendo del IP.BIN, sino del IP0000.BIN, que se encuentra en otra región del disco con esta información duplicada. Quizá Demul no haga caso a este archivo, pero el hardware real si. Tengo que investigar en que posición de la memoria se encuentra, esta noche con Demul lo miro.

Un saludo.
Ánimo @gatoh, muy interesante esta tarea... y "titánica".
Yo ahora tengo la blanquita en "talleres", asi que no puedo ayudar, sorry.
Pero sigo el hilo atentamente
1, 2, 3