Estructura de los juegos de NeoGeo para Wii VC y cómo crear un game.bin para inyectarlo en un WAD

ÚLTIMA ACTUALIZACIÓN DEL HILO: 04-11-2020 11:00 AM (GMT -05:00)

Primero que nada por favor disculparme por crear un hilo de un tema que ya existe, éste hilo es una aclaración clara de la estructura de los juegos de NeoGeo lanzados para la Wii en formato Virtual Console (Consola Virtual), con fines educativos.

Muchas gracias a @corsarioxxx por facilitarme los datos de la estructura de los juegos de NEOGEO y cómo inyectarlos.

Cuando encuentre más información este hilo tendrá actualizaciones en forma de edits.

Bueno, sin más que hablar, empecemos a hablar sobre la estructura de los juegos de NeoGeo de VC de Wii.

De cada WAD de NeoGeo de Wii VC, al extraerlos para ver su contenido, nos encontraremos con los siguientes archivos:

00000000.app --> Este es el archivo del banner. Contiene un archivo banner.bin, icon.bin y sound.bin. Como es evidente cada juego tendrá el suyo. RECORDAR QUE UN BANNER MAL HECHO CAUSARÁ QUE NUESTRA Wii TENGA UN BRICK TOTAL, Y NO SERÁ CULPA MÍA NI DE @corsarioxxx, ASÍ QUE ASEGÚRENSE DE HACERLO BIEN!!!!
00000001.app --> Podemos llamarlo "main.dol" (o programa / emulador)
00000002.app --> contiene el archivo wwwlib-rvl.lz7 (Este archivo es igual en cada juego de NeoGeo Wii VC)
00000003.app --> contiene el archivo WiiNTLG-Regular.ttc (Este archivo es igual en cada juego de NeoGeo Wii VC)
00000004.app --> Este es el archivo con los botones del menú HOME. En sus WADs inyectados de NeoGeo de Wii VC, @corsarioxxx usualmente utiliza una versión modificada del archivo para que no tenga el botón del "Manual electrónico" (o Guía del usuario digital). Este archivo fue hecho por un usuario de GBAtemp (creo que fue RadioShadow, lo siento no me acuerdo el nombre)
00000005.app --> Este archivo contiene los archivos home.csv, Opera.arc y html.arc. El archivo html.arc es el archivo del manual electrónico. No podemos eliminarlo ni sacarlo porque el archivo necesita existir, :( sin embargo, podemos reemplazarlo por un archivo ficticio muy pequeñito con el fin de guardar un poco de espacio en nuestra Wii. :) (Por ejemplo, un archivo de 16bytes tal como lo hizo DevilKenMasters)
00000006.app --> En varios juegos (tales como KOF94 y Blue's Journey), se encuentran el archivo "game.bin", el config.dat y el memcard.dat. El archivo game.bin podría estar en el archivo 00000005.app (tal como en Metal Slug)
00000007.app --> Este es el "apploader" (o NAND loader, cargador de NAND)

Archivo TMD --> En ese archivo podemos encontrar el tamaño y sha (en valores hexadecimales) de los archivos de la aplicación. También encontramos el ID (desplazamiento 0190) y la región. En este ejemplo, el ID del juego es EMAL (45 4D 41 4C en valor hexadecimal) y la región se establece en “03” 80 0D. (Región libre)

Valores de región:
00 – Japón (NTSC-J)
01 – USA (EE. UU.) (NTSC-U)
02 – Europa (PAL)
03 – Región Libre (Region Free)
Ver imagen:
Imagen

Archivo Ticket (TIK) --> Encontramos el ID del juego, necesitamos el mismo ID en el archivo TMD y en éste archivo (offset 01E0)
Ver imagen:
Imagen

Archivo CERT --> ¿? No sé exactamente la función de este archivo. Lo siento

Estructura general de los juegos de NeoGeo (de toda la vida...):

- Archivos P: Programa M68K (código del juego y de los gráficos)
- Archivos M: Programa Z80 (controlador del sonido)
- Archivos V: Muestras del sonido
- Archivos S: Texto (Letras)
- Archivos C: Sprites (Objetos / Gráficos)

Estructura general del archivo game.bin:

Encabezado (Cabecera) de 64 bytes + Juego + BIOS

Significados:

- Encabezado (Cabecera): Contiene el tamaño en hex de cada grupo de archivos (encabezado / cabecera, archivos P, M, V, S, C, y el BIOS)
- Juego: P + M + V + S + C ¡En ese orden de archivos, de lo contrario NO FUNCIONARÁ EL JUEGO!
- BIOS: Podemos usar diferente BIOS de NeoGeo.

En ésta imagen podremos ver en dónde se ubican los tamaños en hex de cada uno de los tipos de archivos (encabezado, P, M, V, S, C, y el BIOS):
Imagen

Más adelante explicaré sobre cómo dar valores en hex de los tamaños de los juegos a la cabecera.

Con en fin de inyectar un juego de NeoGeo en un "juego original de NeoGeo para Wii VC" necesitamos hacer algunas modificaciones a los romsets de MAME / NeoRAGEx, de lo contrario tendremos problemas al inyectarlo.

CÓMO MODIFICAR TU ROMSET DE MAME / NEORAGEX PARA INYECTARLO A UN WAD DE NEOGEO Wii VC:

- Archivos P: Éste es el archivo que contiene el programa M68K (código del juego y de los gráficos), pero éste está desordenado (tipo ROM de MAME). Para que funcione tendremos que hacer un "intercambio de bytes (byte swap) modo A" a ese archivo para que pase del "modo juego de MAME" al "modo ordenado", utilizando el programa uCON64. Podéis descargarlo desde el link: https://ucon64.sourceforge.io/ (yo recomiendo descargar la versión Visual C++).

En el caso de que nuestro archivo P1 sea de 2 MB (2 Megabytes), tendremos que intercambiar el orden de los megabytes para que funcione el juego en Wii VC. Así, si el orden de los megabytes es A+B, siendo A = (1 Megabyte) + B = (1 Megabyte), debemos cortar el archivo en 2 partes de 1 Megabyte cada uno, luego dar la vuelta el orden de éstos, y luego hacer al archivo resultante un intercambio de bytes modo A, así nos quedaría B+A, tal como @corsarioxxx se dio cuenta en el archivo game.bin "original" del WAD de Metal Slug

Mira este ejemplo: cortamos el archivo P1 de 2 MB con un programa, en 2 partes de 1 MB cada uno, nos dejaría con los archivos "p1.bin.001" y "p1.bin.002", siendo el archivo p1.bin.001 como el megabyte A, y el archivo p1.bin.002 como el megabyte B. Unimos de nuevo estos archivos, pero invirtiendo el orden de éstos, siendo Megabyte B + Megabyte A.

El comando en el CMD para unir archivos sería: copy /b p1.bin.002+p1.bin.001 p1nuevo.bin

Podemos encontrar el archivo P1 --> 1 MB y el archivo P2 --> 2 MB, en ese caso sólo unimos los archivos P1 + P2 y luego aplicar un intercambio de bytes (byte swap) modo A. (Podemos unir archivos con muchísimas maneras diferentes, editores hexadecimales, ventana de comandos DOS, o alguna herramienta de unión / fusión de archivos)

- Archivos M: Éste es el archivo que contiene el programa Z80 (controlador del sonido). No necesitamos hacer ninguna modificación en éstos.

- Archivos V: Éste es el grupo de archivos que contiene las muestras del sonido del juego. No necesitamos hacer ninguna modificación en éstos, así que sólo las unimos.

- Archivos S: Éste es el grupo de archivos que contienen el texto (las letras) del juego. No necesitamos hacer ninguna modificación en éstos, así que sólo las unimos.

- Archivos C: Éste es el grupo de archivos que contienen los gráficos del juego. Éste es el punto en donde tenemos que hacer más pasos. ¡¡¡Vamos a trabajar con archivos C de NeoGeo DECODIFICADOS / DESCIFRADOS / DESENCRIPTADOS / DESCOMPRIMIDOS!!! Por defecto usamos romsets de MAME, y cuando tengamos problemas gráficos usaremos romsets de NeoRAGEx.

Los archivos C siempre van en pares, por ejemplo C1-C2, C3-C4, etc., no encontraremos NINGÚN JUEGO con un número impar de archivos C.

Tenemos que hacer dos pasos:

- Convertir los archivos C de Neo Geo a Neo Geo CD:

MÉTODO PARA LOS QUE BUSCAN SOLUCIONES FÁCILES:

1. Descarga primero el pack de tools (herramientas) de NeoGeo hechos por @kikex-box para SpekSNK a través de este link de MediaFire:
http://www.mediafire.com/file/5lwu66ess ... 1.zip/file
2. Descomprimimos el archivo ZIP y abrimos el programa "NG to NGCD.exe"
3. Seleccionamos el modo "Neo-Geo > Neo-Geo CD"
4. Seleccionamos los archivos de gráficos correspondientes a convertir y guardamos los nuevos archivos resultantes de cada conversión siguiendo esta tabla:
- Los archivos C1 y C2 se convierten a CC1.bin
- Los archivos C3 y C4 se convierten a CC2.bin (si es que existen)
- Los archivos C5 y C6 se convierten a CC3.bin (si es que existen)
- Los archivos C7 y C8 se convierten a CC4.bin (si es que existen)
5. Cerramos el programa, y unimos todos estos nuevos archivos en un nuevo archivo.
El comando en CMD para unir estos archivos sería: copy /b cc1.bin+cc2.bin+cc3.bin+cc4.bin cc.bin

MÉTODO PARA LOS PROFESIONALES EN PROGRAMACIÓN:

1. Lee dos bytes de tu archivo C1 (ej. 30 70)
2. Intercambia los bytes de la parte 1 (escriba el valor intercambiado a nuestro nuevo archivo 70 30)
3. Lee dos bytes de tu archivo C2 (ex 10 1E)
4. Intercambia los bytes de la parte 3 (escribir el valor intercambiado después de los datos del paso 2, 1E 10)
Será como: 70 30 1E 10
5. Repite los pasos del 1 al 4 hasta que termines con tu par de archivos C.
6. Comienza con el siguiente par de archivos C y haz lo mismo.
7. Unimos todos los archivos nuevos convertidos en un solo archivo. En caso de que tengamos C1-C2, C3-C4 tendremos los datos de la conversión C1-C2, podemos llamarlo C'1, y los datos de la conversión C3-C4, podemos llamarlo C'3.
Unimos estos dos archivos: C'1 + C'3 y con esto obtendremos la conversión de gráficos C a NEOGEO CD (Bueno, para Neo Geo CD no necesitamos unir esos archivos, pero para nuestro propósito lo hacemos...)

EJEMPLO: (valores hex no reales)
C1: 30 70
Imagen
C2: 10 1E
Imagen
Conversión de C a NeoGeo CD: 70 30 1E 10
Imagen

- Intercambio de bytes (byte swap) especial:

MÉTODO PARA LOS QUE BUSCAN SOLUCIONES FÁCILES:

1. Descarga primero el "NeoGeo Byte Swapper" por @Waninkoko a través de este link de MediaFire:
http://www.mediafire.com/file/hxp3w8n7w ... r.zip/file
2. Descomprimimos el archivo ZIP, cortamos el archivo cc.bin que obtuvimos al unir las conversiones a NeoGeo CD, la pegamos en la carpeta del ejecutable swapper.exe, y luego abrimos el CMD en la carpeta del archivo ejecutable swapper.exe
3. Escribimos el siguiente comando en el CMD y presionamos Enter: swapper.exe cc.bin
4. Cuando diga "SUCCEDED!!", nos dará un nuevo archivo llamado "cc.bin.new". Ese archivo cc.bin.new vamos a usar para el nuevo game.bin, borramos el archivo cc.bin original, renombramos el archivo cc.bin.new a c.bin y listo.

MÉTODO PARA LOS PROFESIONALES EN PROGRAMACIÓN:

Ok, este es el último paso. Tenemos que hacer un intercambio de bytes (byte swap) especial, no es el mismo que el de otras veces...
Necesitamos tomar 4 bytes cada vez y reorganizarlos siguiendo esa estructura:
- Byte 1 mover a la posición del 3er (tercer) byte
- Byte 2 mover a la posición del 1er (primer) byte
- Byte 3 mover a la posición del 4to (cuarto) byte
- Byte 4 mover a la posición del 2do (segundo) byte

Mira esto: 70 30 1E 10 (NeoGeo CD) --> 30 10 70 1E (Wii VC)
Imagen

NOTA: Recordar que hay algunos juegos con un orden de archivos C no estándar, y después de reorganizar los bytes es necesario hacer un rompecabezas desconocido con esos archivos y encontrar el orden adecuado, cada juego raro/extraño tiene una combinación personalizada. Ejemplos: Fatal Fury 2, Kizuna Encounter, The King Of Fighters ‘96

- BIOS: Son los últimos 131.072 bytes del archivo game.bin

Podemos usar la BIOS de NeoGeo de VC "original" o podemos reemplazarla con otra BIOS. @corsarioxxx sugiere Uni-BIOS v2.3, pero también puedes usar el Uni-BIOS v4.0 (sí, la última versión del Uni-BIOS de NeoGeo funciona.) Algunas versiones antiguas/viejas no funcionan (o he fallado probándolas). En caso de que escojas usar un Uni-BIOS tendrás el "menú de trucos" (CHEAT MENU) y la opción de escoger entre el modo "Arcade" o el modo "Console" además de la región de la máquina. (Europe / Europea (PAL) – U.S.A. / EE. UU. (NTSC-U) – Japanese / Japonesa (NTSC-J)).

Tienes que saber:
Hay incompatibilidad entre el Uni-BIOS y los juegos con el "icono de guardado" (save icon)
En el modo Arcade, no podemos insertar créditos, por lo tanto ¡no podemos iniciar el juego! (Pasó lo mismo hace tiempo con el emulador de la NeoGeo para la Nintendo DS (NeoDS), ese problema se resolvió en esa consola, pero en nuestro caso no podemos modificar el emulador de la Wii (00000001.app/main.dol))
En caso de que queramos utilizar nuestro propio BIOS (MAME/NeoRAGEx), necesitaremos hacer un "intercambio de bytes (byte swap) modo A" al BIOS para que funcione (mira el punto Archivos P)

- Generar el nuevo archivo game.bin:

Siguiendo todos los pasos anteriores, podemos obtener nuestro encabezado (cabecera) personalizado, nuestro "juego" y el BIOS.
Ahora sólo tenemos que unirlos todos en un solo archivo y llamarlo "game.bin" Fácil, ¿no es así?
El comando en CMD para unir los archivos necesarios para el game.bin sería: copy /b cabecera.bin+p.bin+m.bin+v.bin+s.bin+c.bin+bios.bin game.bin
¡¡¡¡¡¡¡¡¡¡¡Repito que el orden de los archivos del game.bin ES IMPORTANTÍSIMO!!!!!!!!!!!!!

Luego de hacer el nuevo archivo game.bin, lo único que nos falta es inyectarlo: necesitamos modificar el tamaño del archivo game.bin en nuestro 00000005.app o 00000006.app (depende de dónde está el archivo game.bin... siempre está en el archivo app más grande). ¡¡¡Haciendo esta modificación podremos usar "cualquier" tamaño de juego!!! (Más o menos)
Por otra parte, en caso de que queramos guardar algo de espacio, podemos reemplazar el manual electrónico (archivo html.arc) por un archivo muy pequeñito con el mismo nombre (podría ser un archivo de 16bytes, tal como "DevilKen" lo hizo en su "Nuevo inyector de VC" (“New VC injector”)
Nota: Para descomprimir y comprimir el archivo 5.app o 6.app para obtener el game.bin original e inyectar nuestro game.bin de nuestro juego podemos usar el U8 Tool de HowardC o el U8 extractor y el U8 Estructure Copier de @gally

Espero que con esta información te ayude y que comiences tu camino al mundo de las inyecciones de NeoGeo a Wii Virtual Console.

NOTA IMPORTANTE: ¡¡¡Recuerda!!! ¡¡¡Los juegos de la Virtual Console (VC) se guardan en la memoria NAND de nuestra consola Wii (512 MB) y cuando nosotros queremos jugar un título, todos los archivos se cargan en la memoria!!! ¡¡¡Eso significa que tenemos un límite en la carga de juegos de VC!!! Después de muchos tests y muchas pruebas, el archivo WAD más grande (más pesado) que @corsarioxxx pudo hacer funcionar en su Wii pesaba 61,3 MB (64.352.548 bytes), donde el archivo game.bin pesaba 49,3 MB (51.773.504 bytes) "Real Bout of Fatal Fury Special"

Nueva compresión en el game.bin, ahora es "game.bin.z"

En el archivo WAD oficial de The King Of Fighters ‘95, hay un archivo comprimido llamado game.bin.z Cuando este archivo se descomprime usando la herramienta SimplyZip de Dirk Paehl en modo ZLIB, obtengo un archivo con 50,3 MB (52.822.080 bytes)

El nuevo encabezado (cabecera) del game.bin.z es:
Imagen

Y la nueva estructura del game.bin.z es: Encabezado (Cabecera) + S + C + V + BIOS + P + M

Saludos, @saulfabreg :D :) ;)
@saulfabreg te has dejado la parte útil [+risas] no recortes tanto [+risas]

Saludos
corsarioxxx escribió:@saulfabreg te has dejado la parte útil [+risas] no recortes tanto [+risas]

Saludos

Hola @corsarioxxx, el hilo lo acabo de actualizar, pero te digo falta "un poquiiiiiiito" más de información, específicamente de la cabecera.
Saludos
Si, ahora has dejado +- bien la traducción y explicación del archivo original. Falta agregar que eso es así en la "primera generación" de juegos. Más tarde agregan compresión, cambian el orden de los archivos y diferente manera de tratar la cabecera. Dan paso a algunos juegos un poco más grandes, pero vaya, no mucho más. (Ganando espacio, eso sí)
El super programa de Devilkenmaster hace todas esas modificaciones automáticamente en la primera generación.

En el vídeo tutorial que hice en su momento del modo con compresión se pueden apreciar perfectamente la mayoría de los pasos.

La parte chunga que tengo aparcada es sobre los últimos juegos del 2012/2013 con compresión y codificación AES CBC y ivec (o como se escriba). El archivo del juego tiene una cabecera que empieza por "CR00"
En estos últimos es donde Nintendo logró meter los juegos "gordos", creo que utilizando espacio en la nand como si fuese la "RAM", (es un suponer)
@corsarioxxx Hilo actualizado. Avísame si quieres más info sobre esto, especialmente la estructura de los game.bin.z, la codificación AES de los juegos "nuevos" de NeoGeo y el encabezado de los game.bin.z, también de las generaciones de los emuladores de NeoGeo de Wii VC.
Saludos ;)
EDIT: Ya puedo añadir imágenes!!! :D :D :D mira de nuevo el hilo, he puesto imágenes directamente
saulfabreg escribió:@corsarioxxx Hilo actualizado. Avísame si quieres más info sobre esto, especialmente la estructura de los game.bin.z, la codificación AES de los juegos "nuevos" de NeoGeo y el encabezado de los game.bin.z, también de las generaciones de los emuladores de NeoGeo de Wii VC.
Saludos ;)
EDIT: Ya puedo añadir imágenes!!! :D :D :D mira de nuevo el hilo, he puesto imágenes directamente


[qmparto] [qmparto] [qmparto]


Si logras desarrollar esto y me puedes explicar como aplicarlo en la decodificación/codificación del archivo sería la bomba: (no me refiero a una traducción al castellano)
(Es en concreto específico para el Shock Troopers)

(Código by aluigi - Jun 15, 2012)
"the files have the CR00 magic at the beginning and the rest is encrypted with AES using a key and an ivec."

idstring "CR00"
#getdstring IVEC 0x10   # ivec or hash or what?
savepos OFFSET
get SIZE asize
math SIZE -= OFFSET
encryption aes "\x88\x2A\x16\xFB\x4E\x08\xD9\x9C\x19\x2D\x98\x68\xEB\xA3\xB7\x99" "\xF4\xC1\x23\xF2\xF3\xAD\x49\xA1\xC3\xC7\xD4\xB1\xE2\x91\x65\x2D"
# "\xD1\xF4\x55\xF2\x0F\x10\x5D\x8A\x0C\x8C\xD3\xFA\x56\x32\x30\xE5" ivec xored with first 16 bytes?
log "test.dat" OFFSET SIZE


idstring "CR00"
getdstring IVEC 0x10
savepos OFFSET
get SIZE asize
math SIZE -= OFFSET
set IVECX binary "\xD1\xF4\x55\xF2\x0F\x10\x5D\x8A\x0C\x8C\xD3\xFA\x56\x32\x30\xE5"
string IVEC ^= IVECX
encryption aes_128_cbc "\x88\x2A\x16\xFB\x4E\x08\xD9\x9C\x19\x2D\x98\x68\xEB\xA3\xB7\x99" IVEC
log "test.dat" OFFSET SIZE



Saludos
5 respuestas