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
#includeint 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.