Archivo de la categoría: Arcade

Hackear una ROM de Gameboy

He tenido bastantes problemas para emular los juegos de Gameboy en la Raspberry Pi. Finalmente el emulador Fednafen es el que funciona, tal y como se hace en Pimame. El mundo de los emuladores es bastante complicado. Para entender cómo funciona una ROM por dentro y cómo se programa un emulador que trabaje con estas ROMs se tiene que estudiar la arquitectura del Z80, conocer el ensamblador, y técnicas avanzadas de depuración en lenguaje C. Pero aquí vamos a hacer una cosa relativamente sencilla.

Se trata de hacer un pequeño hack de una rom de Gameboy. Se trata de poner un libro dentro de la ROM, concretamente meter diferentes artículos y textos del gran filósofo catalán Francesc Pujols, aquél que dijo que un día Los catalanes iríamos por el mundo y lo tendríamos todo pagado.

Parto de una rom que ya es un libro, un libro en polaco: Ziarno_Prawdy_-_Book_by_Andrzej_Sapkowski_polish.gbc. Aunque no tengo ni puñetera idea de polaco, arranco la rom con el emulador y la idea está clara: con los botones puedes navegar por los diferentes capítulos, puedes ir al principio, y tienes dos modos de lectura: línea a línea, o página a página. La idea es localizar las posiciones de memoria donde está la información relevante, y substituirlo por la información (los bytes) que interesa.

Digo que este proyecto es bastante sencillo porque tenemos 5 capítulos con un tamaño concreto y me tengo que limitar a estas posiciones y bloques de información. Lo chulo sería poder meter más capítulos, de longitud variable, y poder navegar por todos los capítulos. Pero para hacerlo se tendría que desensamblar el código y entender cómo funcionan los jumps a los diferentes capítulos, y esto sí que sería interesante y más difícil.

Bien, manos a la obra. Uso la utilidad xxd como lector de ficheros binarios, que a una salida hexadecimal y en la parte derecha se puede localizar la información textual relevante.

0004040: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0004050: 2020 2020 2020 2020 2020 2041 6e64 727a Andrz
0004060: 656a 2053 6170 6b6f 7773 6b69 2020 2020 ej Sapkowski
0004070: 2020 2020 2020 2020 2020 2020 2020 2020
0004080: 2020 2020 205a 6961 726e 6f20 5072 6177 Ziarno Praw
0004090: 6479 2020 2020 2020 2020 2020 2020 2020 dy

En este bloque hemos localizado el título y el autor. El llibro se llama Ziarno Prawdy y el autor es Adrzej Sapkowski (un nombre muy polaco). La posición del autor empieza en 405b (hex), que es 16475 bytes en decimal. Y donde acaba Prawdy es la posición 4091 hex = 16529. Por tanto, son 16529-16475=54 bytes, que yo substituiré por «EL PENSAMENT I LA FILOSOFIA DE FRANCESC PUJOLS«. Con esta técnica hemos de substituir el título y el autor, el menú, y los diferentes capítulos (hay 5 capítulos).

Muestro un ejemplo de código en lenguaje C para substituir en un fichero binario unos bytes por otros en una posición determinada. Un ejemplo sencillo sería:

#include
#include
#include

int main()
{
int posicio = 10;
int tamany;

char *str = «En un lugar de la Mancha»;
printf(«%d\», strlen(str));
tamany = strlen(str);

int counter;
FILE *ptr_myfile;

ptr_myfile=fopen(«b.gbc»,»r+b»);
if (!ptr_myfile)
{
printf(«Unable to open file!»);
return 1;

}

fseek(ptr_myfile,sizeof(char)*posicio,SEEK_SET);
fwrite(str, 1, sizeof(char)*tamany, ptr_myfile);

fclose(ptr_myfile);
return 0;
}

Partiendo de este ejemplo que funciona ya podemos hacer toda la substitución de las cadenas.

0004040: 0000 0000 0000 0000 0000 0000 0000 0000 …………….
0004050: 2020 2020 2020 2020 2020 2045 4c20 5045 EL PE
0004060: 4e53 414d 454e 5420 4920 4c41 2046 494c NSAMENT I LA FIL
0004070: 4f53 4f46 4941 2044 4520 4652 414e 4345 OSOFIA DE FRANCE
0004080: 5343 2050 554a 4f4c 5320 2020 2020 2020 SC PUJOLS
0004090: 2000 2020 2020 2020 2020 2020 2020 2020 .
00040a0: 492e 2042 494f 4752 4146 4941 0a0a 4c27 I. BIOGRAFIA..L’
00040b0: 6573 6372 6970 746f 722c 2070 6f65 7461 escriptor, poeta
00040c0: 2069 2066 696c c3b2 736f 6620 6361 7461 i fil..sof cata
00040d0: 6cc3 a02c 2046 7261 6e63 6573 6320 5075 l.., Francesc Pu

I el hack ha funcionado como se puede ver (y leer) en la foto. En cualquier caso, la Gameboy no es la mejor consola para leer libros, y por otra parte como era de esperar los acentos no funcionan. Puedes descargar el código entero en la wiki.

Arcade en la discoteca Cocoa de Mataró

El viernes pasado se alquilaron máquinas arcade en la discoteca Cocoa de Mataró. Fue una experiencia interesante, las máquinas estuvieron encendidas des de las 12 hasta las 6 de la madrugada. La gente se lo pasó en grande con los juegos clásicos. El público era de veintitantos, eran de otra generación, je, je. Ya bien entrada la noche, alguno pasado de vueltas mamporreaba joystick con todas sus fuerzas como si fuera el cambio de marcha, en fin.

Se sacaron una cuantas conclusiones. Por ejemplo, cuando se trata de un evento como este, con poca luz y con la gente con poca paciencia, de nada sirve ofrecer un catálogo de 1000 juegos y tener que explicar una y otra vez como van los botones. Si con seis botones ya era difícil, ni imaginar qué pasaría con 9 botones y más juegos y emuladors. En este caso, lo simple es lo mejor.

Consolas de la infancia: Temco (Pong)

Estas últimas Navidades saqué de un cajón de casa el juego del Pong que todavía conservo de cuando éramos pequeños. Se trata del modelo Temco T-800 que mis padres trajeros de Andorra, debía ser a finales de los años 70, no puedo recordar exactamente el año. En aquella época disfrutamos mucho con el juego, era una auténtica novedad. Conectábamos la consola (en aquella época no existía la palabra consola) a la tele en blanco y negro (las teles sólo eran en blanco y negro), y procedíamos al ritual de la sintonización (para buscar el canal en que la visión era más nítida, sin ruido).

Para mis hermanos y yo aquel juego, que jugamos más que nada en Bagà, era el Temco. No sabíamos lo que era el Pong. El PONG (http://es.wikipedia.org/wiki/PONG) fue uno de los primeros videojuegos comerciales y domésticos, que popularizó Atari allá por el año 72. Poco más tarde salieron otras versiones y licencias, como el Temco, que incorporaba a parte del Tennis, el juego del Hockey (como se puede ver en la foto) y del Squash.

En casa ya no disponemos de tele con entrada de antena analógica, o sea que fuimos a casa de la vecina para que nos dejase una. Para Maria y Pere esto de sintonizar la tele y buscar el canal fue toda una novedad. Se lo pasaron en grande jugando al Temco, y en seguida le cogieron el tranquillo. Jugar al Temco fue una de las actividades programadas para la Nochebuena del 31 de enero. Hicimos una pequeña competición: cuartos de finales, semifinales y final. La final la jugamos Jan Santandreu i yo mismo, que finalmente ganó él. A ver si puedo organizar un torneo más serio de Temco con amigos y sobrinos.

Uno de los propósitos para este año 2015 será hacer un mueble que incorpore una tele de tubo, y programar un emulador lo más fiel posible al Temco original. Será mi pequeño homenaje a estas consolas primitivas. En próximos posts habrá más información al respeto. De momento tengo que conseguir una pequeña tele de tubo de 14 pulgadas. La mesita ya la tengo, una mesita redonda donde tendré que practicar un agujero cuadrado para inquibir la mesa, y cortar un vidrio redondo. Con dos potenciómetros y un botón Arcade tendría que ser suficiente para controlar el juego. El sistema tendrá un front-end para poder escoger los cuatro juegos y las diferentes opciones, y desde el frontend se tendrá que lanzar las partidas de los diferentes juegos.

Máquina de marcianitos. Proyecto Pimame/PiPlay (Arcade bartop cabinet)

Uno de los recuerdos de mi infancia fueron las máquinas de marcianitos que había en los bares. De cuando en cuando conseguíamos 25 pesetas y podíamos jugar una partida. Entonces, cuando tenía 12 años, no sabía ni qué eran los juegos Arcade… para nosotros eran las máquinas de marcianitos, y basta. Con el tiempo, evidentmente, los juegos se fuero sofisticando a todos niveles: gráficos, sonido,… Paralelamente, en casa jugábamos al Spectrum, cargando los juegos desde las cintas de cassette. Y entonces llegó la era del PC doméstico que lo cambió todo.va canviar tot

Para los que somos de mi generación (40 y pico), las máquinas de los bares representan todo un mundo de recuerdos y vivencias asociados a un mundo en que la electrónica de consumo lo estaba cambiando todo (relojes digitales, coches teledirigidos, …).

Han pasado muchos años, el mundo de los videojuegos ha evolucionado muchísimo, es una industria tan potente com el cine. Cada vez la gente ve menos televisión y va menos al cine (cosa impensable hace tiempo), y la sociedad en que vivimos se caracteriza por una gran variedad de dispositivos conectados a Internet, con una gran y diversa oferta de ocio.

Una gente al entorno del proyecto MAME (Multi Arcade Machine Emulator,) ha emulado las ROMs originales de aquellas máquinas Arcade a diversas plataformas, concretamente al PC. Una ROM es el chip donde estaba el software (firmware) que hacía correr el juego. Este software en código máquina se puede traducir a líneas de código a otras plataformas y lenguajes de programación. Esto es lo que hacen los emuladores. Por tanto, ahora todo el mundo puede jugar a los juegos de los as ’70, ’80 y ’90 en su PC. I así lo hice hará unos tres años en una máquina Linux, cuando descubrí el proyecto MAME y ya pensé entonces en construirme una máquina Arcade.

En estos tres años también han pasado muchas cosas, y concretamente la eclosión del hardware libre, representado por dos proyectos paradigmáticos como son el Arduino y la Raspberry Pi (entre otros). I lo bueno del caso es que el proyecto MAME se ha portado y optimizado a la plataforma de la Raspberry Pi, con todas las ventajas que esto supone de cara construirse un mueble Arcade (presupuesto, espacio, consumo,…). Esta tarea se ha hecho gracias a Shea Silverman y al proyecto PiMAME, que ahora se llama PiPlay.

Así pues este curso pasado me puse manos a la obra y para el verano ya tenía a punto mi mueble bartop con más de 1000 juegos clasificados por categorías (plataforma, galería, shooter, puzzle, fighting, …) i jugabilidad (preferidos, muy buenos, buenos, malos). El proyecto ha sido muy variado y divertido, e incluye entre otras:

  • Construcción del mueble (cortar las maderas, pulir, pintar,…)
  • Configuración de la Raspberry Pi y de MAME
  • Programación de un front-end propio (más detalles en este post)
  • Interfície joystick-USB. Aunque funciona correctamente esta solución, se ha de explorar la posibilidad de configurar el joystick i los 6 botons sólo con los pines GPIO de la RPi. El resultado sería más sencillo y rápido de implementar.
  • Fuente de alimentación 12V-5V
  • Metacrilato, adhesivos
  • Matriz de LEDs para la markee
  • Pantalla plana, conversor HDMI-VGA
  • Amplificador de sonido. La salia de sonido en la Raspberry Pi no es muy buena, y esto se nota a la hora de amplificar el sonido. En este aspecto faltan más pruebas a ver si hay posibilidad de obtener un sonido más limpio.

Después de muchas horas de trabajo, calculo que el presupuesto es de unos 250 euros. La bona noticia es que hay margen para automatizar/mejorar todo el proceso, por ejemplo utilizando una máquina CNC per cortar las maderas.

Aquí puedes ver el vídeo del mueble acabado.

Para más información:

Joanillo Arcade Frontend. Un simple frontend para PiMAME/PiPLAY

Joanillo Arcade FrontendAl final he decidido hacerme mi propio front-end para la máquina arcade que me estoy construyendo, basada en PiMAME / PiPLAY. La historia es muy larga, y ahora no es el momento de explicarla. El caso es que AdvMENU, que es el front-end propuesto en el proyecto PiMAME, a mi no me funciona con mi configuración de teclas y la interficie de joystick que me fabriqué en su día, basado en V-USB. El caso es que no soy la primera persona que tiene problemas con la configuración de AdvMenu. Resumiendo, una cuestión que tendría que ser fácil de resolver se convierte en un problema irresoluble. Después de desestimar AdvMENU (y después de compilar desde las fuentes la versión 2.7 y de modificar y modificar el fichero advmenu.rc) consideré la posibilidad de instalar otro front-end para emuladores Arcade que se pudiese instalar bien en la Raspberry Pi. Los requisitos eran que funcionase bajo Linux/Raspberry Pi, y que no necesitase el servidor X de la RPi (lo que desestima el popular front-end Wahcade). Después de analizar las diferentes soluciones, la noticia mala fue que llegué a la conclusión de que tenía que programar mi propio front-end… que al final es una noticia buena, pues por fin tendría un front-end simple y eficiente, con tan sólo las funcionalidades que necesito, que funciona con mi configuración de botones, y que se adapta al diseño y filtros de ROMs a mi gusto.

El resultado es un código C++ de 700 líneas, que utiliza SDL de forma nativa, igual de bien en el portátil que en la Raspberry Pi, donde no hay que arrancar el entorno gráfico. Se puede navegar de forma fácil por la clasificación de los juegos (All Favourites, Bad, Good, Very good, Prefered), y por las categorías de los juegos (Platform, Shooter, Gallery,…). El fichero de configuración es muy simple, resources/romlist.txt, con una línea para cada ROM. Se ha programado a chorro, en muy poco tiempo, seguro que hay cosas a mejorar, pero la lista TODO ha quedado realmente pequeña. Este front-end sólo está pensado para los juegos de MAME (mame4all), por tanto si alguien lo quiere utilizar encontrará a faltar cambiar a otros emuladores. De todas formas, sería fácil hacer la adaptación y disponer de un botón para el cambio de emulador.

Sin embargo, el bartop que estoy construyendo se basa en la simplicidad (un solo joystick y tan solo seis botones, que están mapeados a las teclas ‘0’,…, ‘5’). Y esta simplicidad queda reflejada en el código fuente. Esto hace que lanzar una ROM y volver al front-end sea mucho más rápido (mucho más rápido que con AdvMenu), con una mejor experiencia de usuario. También se ha conseguido una solución elegante para ir a la consola de Linux, o para apagar la Raspberry Pi de forma correcta antes de apagar el interruptor.

En resumen, un front-end para MAME muy simple pero con un diseño correcto, que no tiene ni de largo todas las opciones del proyecto AdvMENU, pero que tampoco se encuentran a faltar.

Puedes descargarte el código fuente de:
http://wiki.joanillo.org/index.php/Fitxer:Joanillo_arcade_frontend.zip

Y aquí tienes un vídeo demostrativo de cómo funciona el front-end y de sus opciones básicas: