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
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:
¡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: Capcom, emuladores, jacobnix, JICLMAME, Linux, MAME, SF