Imagen de avatar Jacob Cervantes
Jacob Cervantes

Hacking MAME for Linux – SF Mini Mix

Después de bastante tiempo de haber abandonado el proyecto MAME, me animé a meterle algo de código al emulador. No me tardé mucho pero tampoco me fue sencillo ya que desde hace 7 o mejor dicho casi 8 años no me metía en el código fuente.

Cabe señalar que NO soy el desarrollador oficial del proyecto ya que el MAME TEAM no aceptó -por allá del año 2002– mi parche que permitía emular 3 nuevos juegos, uno de ellos fue Metal Slug 4 que estaba de moda en los salones de videojuegos. Posteriormente compilé una nueva versión del emulador con las mejoras que había propuesto y lo nombre JICLMAME, funciona sólo para Microsoft Windows pero como los cambios que añadí son parte del core, no hay ningún problema en portar hacia otro sistema operativo como Linux, Mac OS, etc.

En esta ocasión añadí un juego que ya funciona desde hace tiempo en las mas nuevas versiones del emulador, me refiero al juego Street Fighter Gem Mini Mix, es un juego muy divertido el cual me gusta mucho y que realmente no lo llegué a ver en todos los salones de video juego salvo en algunos.

Estas notas que a continuación describo NO son la guía oficial de como añadir drivers o juegos que funcionen exitosamente en el emulador pero quizá te puedan ayudar para intentar hacer algo. Necesitas el pcb (la tarjeta madre)  del juego para conocer acerca del “hardware” me refiero al cpu de vídeo, sonido, controles y dipswitches que usa el juego y si no la tienes, deberás investigar en los manuales de la pcb. Por otro lado si ya sabes que el juego usa, por ejemplo, un cpu de un sistema como CPS2 (Capcom Play System 2) , inclusive el Z80, quizá puedas probar con lo que ya esta implementando en el emulador lo cual no es muy sencillo ya que tienes que descifrar muchas cosas, pero quizás te funcione.

En primera instancia hay que descargar y descomprimir el código fuente de xmame, lamentablemente ya no es posible obtenerlo del sitio oficial http://x.mame.net, voy a abrir más delante un fork y un sitio web para darle seguimiento.

Hay que tener en cuenta que necesitamos conocimientos entre avanzados de lenguaje C, manejo de la memoria, hardware,  punteros entre otras loqueras.

¿Por qué no usar una nueva versión de un emulador de MAME hermano para Linux?

Porque las nuevas versiones van creciendo de tamaño y van necesitando más recursos de cpu y memoria y yo lo que quiero es seguir usando el emulador en mi computadora de siempre, es una cuestión de decisión personal.

¿Qué es lo que sabemos de nuestro juego que posiblemente vamos a emular?

El hardware es: cpu 68000 @ 16 MHz y el famoso cpu Z80 @ 8MHz , el audio: Q-Sound @4MHz (CPS2)

La orientación del juego es horizontal a una resolución de 384×224 con una frecuencia de 59.629403Hz

También necesitamos el rom con los dumps que le pertenecen, para nuestro caso son:

name size crc set flags sha1
pcfu.03 524288 ac2e8566 sgemf 5975aae46bded231c0f478f40c7257434ade36b0
pcf.04 524288 f4314c96 sgemf c40ed74039bf0096eb3648b7243a8e697638e0a6
pcf.05 524288 215655f6 sgemf 242c0f4401520f2a3b0deafc3a807b18b987e496
pcf.06 524288 ea6f13ea sgemf 1bc924a8a9da1d2ad7667685cdb92fe317a39aba
pcf.07 524288 5ac6d5ea sgemf 9ce8e4668b565658597a868830545fb75a5eeaa6
pcf.13m 4194304 22d72ab9 sgemf 653efd95c34b4b9d2ab0d219f41a99ca84e12214
pcf.15m 4194304 16a4813c sgemf bf5fce6008214f353414d1b64bea4ed0c7673670
pcf.17m 4194304 1097e035 sgemf 4bd51e4e9447af27d2cac1f6d2201e37c949912b
pcf.19m 4194304 d362d874 sgemf 30c42af18440496cc05e4418e4efa41172ae4ced
pcf.14m 1048576 0383897c sgemf aba14afa1d0c971afcee4317f480e88117d77b5e
pcf.16m 1048576 76f91084 sgemf 3d1e32467f2aa5dd6fb96bd5c866ecc9691660fc
pcf.18m 1048576 756c3754 sgemf be2f709b90222a567f198f851cf07ffb0ad433d7
pcf.20m 1048576 9ec9277d sgemf b7ceeaca30dfcdf498b61a6961f0aa1a068b8ec4
pcf.01 131072 254e5f33 sgemf c413ec0630b9bdd15e64f42893eba8958a09b573
pcf.02 131072 6902f4f9 sgemf 9bfe4ddade3c666076d26a2b545120f6d059fd7c
pcf.11m 4194304 a5dea005 sgemf 3ae79baf6ff5bd527f82b26f164c7e3c65423ae2
pcf.12m 4194304 4ce235fe sgemf 795b94557e954cc0e45fd3778b609064d57a34a2

Adicionalmente necesitamos un extra dump para que el juego pueda ser emulado exitosamente, este dump lo pueden descargar de la siguiente liga http://www.arcadeathome.com/dl2.phtml?misc/pcfux.zip

Pueden googlear para encontrar el rom sgemf que es nuestra versión de rom que necesitaremos, tiene un tamaño de 15 M. Posteriormente lo descomprimen a un directorio y añaden a ese directorio el archivo dump extra que acabamos de descargar de arcadeathome, es importante hacer notar que tienen que renombrar el directorio sgemf a sfmhack y si lo desean pueden comprimir (zippear, zip) este directorio.

Como el juego que vamos añadir es parte del ya no tan nuevo Sistema de Capcom versión 2(CPS2), entonces tenemos que definir una macro en el archivo raizEmuladorDir/src/drivers/cps2.c la cual ya esta declarada en el archivo de cabecera raizEmuladorDir/src/romload.h

El código que hay que añadir tiene que ser algo como esto, depende del rom que MAME quieras que emule, el nombre del rom es sfmhack ,ya que es una versión de street figther gem mini mix hackeada por un servidor.

ROM_START( sfmhack )  /* street fighter mini mix hacked by jacob @ frenesssi.wordpress.com*/
ROM_REGION( CODE_SIZE, REGION_CPU1, 0 )      /* 68000 code */
ROM_LOAD16_WORD_SWAP( “pcfu.03″, 0×000000, 0×80000, CRC(ac2e8566) SHA1(5975aae46bded231c0f478f40c7257434ade36b0) )
ROM_LOAD16_WORD_SWAP( “pcf.04″,  0×080000, 0×80000, CRC(f4314c96) SHA1(c40ed74039bf0096eb3648b7243a8e697638e0a6) )
ROM_LOAD16_WORD_SWAP( “pcf.05″,  0×100000, 0×80000, CRC(215655f6) SHA1(242c0f4401520f2a3b0deafc3a807b18b987e496) )
ROM_LOAD16_WORD_SWAP( “pcf.06″,  0×180000, 0×80000, CRC(ea6f13ea) SHA1(1bc924a8a9da1d2ad7667685cdb92fe317a39aba) )
ROM_LOAD16_WORD_SWAP( “pcf.07″,  0×200000, 0×80000, CRC(5ac6d5ea) SHA1(9ce8e4668b565658597a868830545fb75a5eeaa6) )ROM_REGION16_BE( CODE_SIZE, REGION_USER1, 0 )
ROM_LOAD16_WORD_SWAP( “pcfux.03″, 0×000000, 0×80000, CRC(652b7647) SHA1(03259f536e8c988b288de5e13df8b2ee22d8a168) )

ROM_REGION( 0×1400000, REGION_GFX1, 0 )
ROMX_LOAD( “pcf.13m”,   0×0000000, 0×400000, CRC(22d72ab9) SHA1(653efd95c34b4b9d2ab0d219f41a99ca84e12214) , ROM_GROUPWORD | ROM_SKIP(6) )
ROMX_LOAD( “pcf.15m”,   0×0000002, 0×400000, CRC(16a4813c) SHA1(bf5fce6008214f353414d1b64bea4ed0c7673670) , ROM_GROUPWORD | ROM_SKIP(6) )
ROMX_LOAD( “pcf.17m”,   0×0000004, 0×400000, CRC(1097e035) SHA1(4bd51e4e9447af27d2cac1f6d2201e37c949912b) , ROM_GROUPWORD | ROM_SKIP(6) )
ROMX_LOAD( “pcf.19m”,   0×0000006, 0×400000, CRC(d362d874) SHA1(30c42af18440496cc05e4418e4efa41172ae4ced) , ROM_GROUPWORD | ROM_SKIP(6) )
ROMX_LOAD( “pcf.14m”,   0×1000000, 0×100000, CRC(0383897c) SHA1(aba14afa1d0c971afcee4317f480e88117d77b5e) , ROM_GROUPWORD | ROM_SKIP(6) )
ROMX_LOAD( “pcf.16m”,   0×1000002, 0×100000, CRC(76f91084) SHA1(3d1e32467f2aa5dd6fb96bd5c866ecc9691660fc) , ROM_GROUPWORD | ROM_SKIP(6) )
ROMX_LOAD( “pcf.18m”,   0×1000004, 0×100000, CRC(756c3754) SHA1(be2f709b90222a567f198f851cf07ffb0ad433d7) , ROM_GROUPWORD | ROM_SKIP(6) )
ROMX_LOAD( “pcf.20m”,   0×1000006, 0×100000, CRC(9ec9277d) SHA1(b7ceeaca30dfcdf498b61a6961f0aa1a068b8ec4) , ROM_GROUPWORD | ROM_SKIP(6) )

ROM_REGION( QSOUND_SIZE, REGION_CPU2, 0 ) /* 64k for the audio CPU (+banks) */
ROM_LOAD( “pcf.01″,   0×00000, 0×08000, CRC(254e5f33) SHA1(c413ec0630b9bdd15e64f42893eba8958a09b573) )
ROM_CONTINUE(         0×10000, 0×18000 )
ROM_LOAD( “pcf.02″,   0×28000, 0×20000, CRC(6902f4f9) SHA1(9bfe4ddade3c666076d26a2b545120f6d059fd7c) )

ROM_REGION( 0×800000, REGION_SOUND1, 0 ) /* QSound samples */
ROM_LOAD16_WORD_SWAP( “pcf.11m”,   0×000000, 0×400000, CRC(a5dea005) SHA1(3ae79baf6ff5bd527f82b26f164c7e3c65423ae2) )
ROM_LOAD16_WORD_SWAP( “pcf.12m”,   0×400000, 0×400000, CRC(4ce235fe) SHA1(795b94557e954cc0e45fd3778b609064d57a34a2) )
ROM_END

Hacking MAME for Linux

En segmento de código anterior se definen varias cosas importantes como la carga de los dumps de un rom los cuales se dividen para el procesador, usuario, efectos o gfx’s y sonido, estos dumps tienen varias formas de ser validados como la suma CRC, SHA1. Deben de coincidir con los dumps del rom que se está intentado emular, si no es así MAME te indicará con un error al momento que intentes emular el juego. No entro en más detalles ya que técnicamente hay varias cosas que explicar y esto da para varios posts, como por ejemplo la expansión de las macros ROM_LOAD, ROM_START, ROM_END, ROM_REGION, etc.

En el mismo archivo que estamos editando cps2.c , añadimos al final de él una entrada como la siguiente:

GAME( 1997, sfmhack,    0,       cps2, sfmhack,   cps2, ROT0,   “Capcom”, “Super Gem Fighter Mini Mix Hacked by jacob (US 970904)”, 0 )

Esta definición de la expansión de la macro tiene varios parámetros:

*el año.

*el nombre del driver o controlador.

*el nombre del rom padre si es que existe alguno, si no se especifica con un 0 (cero),

*el cuarto parámetro indica el driver o controlador para el sistema de hardware que necesita para ser emulado, en este caso cps2.

*el quinto parámetro establece el nombre de las definiciones y como serán mapeados los puertos de entrada que usará el rom específicamente como controles de mando y dipswitches, estos se definen a tiempo de ejecución y se construye dinámicamente un puntero a una función como por ejemplo : construct_ipt_sfmhack.

*el sexto parámetro indica el nombre del driver que va ser inicializado en este caso cps2, esto sirve para desencriptar el acceso al rom entre otras cosas importantes.

*el séptimo parámetro permite definir cómo rotará el juego a 90, 180, 270. Básicamente consiste en 3bits (X,Y,XY) y eso está definido por varias macros que después comentaré, por ejemplo pacman tiene que rotar a 90 ya que es de orientación vertical.

*el octavo parámetro define la empresa que desarrolló el juego.

*el noveno elemento establece un nombre amigable para el rom.

* el último elemento define el estado del rom , esto permite saber si funciona , si no está emulado al 100%, si tiene problemas de sonido, etc. de igual forma hay macros para esto. Como en nuestro caso es un rom que estoy añadiendo sé que no hay problemas y pondré un 0 (cero).

A continuación hay que añadir en raizEmuladorDir/src/mamedriv.c la siguiente linea:

DRIVER ( sfmhack )

la cual define un  array de drivers que se van añadiendo recursivamente, quizá les interese verificar el código fuente.

En el archivo de cabecera raizEmuladorDir/src/driver.h se define la macro para el paso anterior que he descrito

#define GAME(YEAR,NAME,PARENT,MACHINE,INPUT,INIT,MONITOR,COMPANY,FULLNAME,FLAGS)        \
game_driver driver_##NAME =                                     \
{                                                                                       \
__FILE__,                                                               \
#PARENT,                                                                \
#NAME,                                                                  \
system_bios_0,                                                  \
FULLNAME,                                                               \
#YEAR,                                                                  \
COMPANY,                                                                \
construct_##MACHINE,                                    \
construct_ipt_##INPUT,                                  \
init_##INIT,                                                    \
rom_##NAME,                                                             \
(MONITOR)|(FLAGS)                                               \
};

Existen muchas cuestiones que describir pero ya será para otro post mas técnico y formal, esto es sólo una pequeña introducción informal y puesto que lo interesante es ver el resultado, les dejo algunos pantallazos:

Hacking MAME for Linux

¡Enhorabuena hemos añadido un nuevo juego a nuestro querido emulador favorito de arcades MAME!

Nota:

A fin de año es muy posible que deje en línea los binarios y fuentes del emulador como software libre 100%, ya que es un trabajo derivativo del proyecto MAME el cual he bautizado como JICLMAME for Linux y merece su propio sitio web porque de aquí se separa como un proyecto aparte.

Referencias:

http://cps2shock.retrogames.com/techinfo.html

http://caesar.logiqx.com/php/emulator_game.php?id=m1_linux&game=sgemf

http://www.solvalou.com/subpage/arcade_roms/S/sgemf

Tags: , , , , , ,

Deja un comentario