He tingut bastants problemes per emular els jocs de Gameboy a la Raspberry Pi. Finalment l’emulador Fednafen és el que funciona, tal i com es fa a Pimame. El món dels emuladors és bastant complicat. Per entendre com funciona una ROM per dins i com es programa un emulador que treballi amb aquestes ROMs s’ha d’estudiar l’arquitectura del Z80, conèixer l’ensamblador, i tècniques avançades de depuració amb llenguatge C. Però aquí anem a fer una cosa relativament senzilla.
Es tracta de fer un petit hack d’una rom de Gameboy. Es tracta de ficar un llibre a dins de la ROM, concretament ficar diferents articles i textos del gran filòsof català Francesc Pujols, aquell que va dir que que Els catalans aniríem pel món i ho tindríem tot pagat.
Parteixo d’una rom que ja és un llibre, un llibre en polonès: Ziarno_Prawdy_-_Book_by_Andrzej_Sapkowski_polish.gbc. Encara que no tinc ni punyetera idea de polonès, arrenco la rom amb l’emulador i la idea està clara: amb els botons pots navegar pels diferents capítols, pots anar a l’inici, i tens dos modes de lectura: línia a línia, o pàgina a pàgina. La idea és localitzar les posicions de memòria on està la informació rellevant, i substituir-ho per la informació (els bytes) que interessa.
Dic que aquest projecte és bastant senzill perquè tenim 5 capítols amb un tamany concret i m’he de limitar a aquestes posicions i blocs d’informació. Allò xulo seria poder ficar més capíols, de longitud variable, i poder navegar per tots els capítols. Però per fer-ho s’hauria de desensamblar el codi i entendre com funcionen els jumps als diferents capítols, i això sí que seria interessant i més difícil.
Bé, mans a l’obra. Faig servir la utilitat xxd com a lector de fitxers binaris, que dóna una sortida hexadecimal i a la part dreta es pot localitzar la informació textual rellevant.
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 aquest bloc hem localitzar el títol i l’autor. El llibre es diu Ziarno Prawdy i l’autor és Adrzej Sapkowski (un nom ben polonès). La posició de l’autor comença a 405b (hex), que és 16475 bytes en decimal. I on acaba Prawdy és la posició 4091 hex = 16529. Per tant, són 16529-16475=54 bytes, que jo substituiré per “EL PENSAMENT I LA FILOSOFIA DE FRANCESC PUJOLS“. Amb aquesta tècnica hem de substituir el títol i autor, el menú, i els diferents capítols (hi ha 5 capítols).
Mostro un exemple de codi amb llenguatge C per substituir en un fitxer binari uns bytes per uns altres en una posició determinada. Un exemple senzill seria:
#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;
}
Partint d’aquest exemple que funciona ja podem fer tota la substitució de les cadenes.
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 funcionat com pots veure (i llegir a la foto). En qualsevol cas, la Gameboy no és la millor consola per llegir llibres, i d’altra banda com era d’esperar els accents no funcionen. Pots descarregar el codi sencer a la wiki: