ROM Hacking
Contingut
Introducció
Eines
scanmem
$ sudo apt-get install scanmem
Com utilitzar-lo:
scanmem en teoria és fàcil de funcionar, tot i que encara no he pogut canviar el valor dels punts per a dos jocs de advancemame: pacplus i galaxian. Per provar scanmem anem a fer el programa més senzill possible:
prova.c:
#include <stdio.h>
int main()
{
char ch;
int i = 350;
puts("Typing Program");
puts("Type away:");
for(;;)
{
ch=getchar();
i++;
printf("%d\n", i);
}
return(0);
}
$ gcc -o prova prova.c $ ./prova
$ ps aux | grep prova joan 15228 0.0 0.0 2008 280 pts/1 S+ 20:50 0:00 ./prova $ sudo scanmem
I en aquest cas concret és fàcil trobar el valor i canviar-lo.
High Score (Feb 2016)
Advance Mame
Tinc instal.lat el AdvanceMame a la RPi i al portàtil. En el portàtil, per fer córrer AdvanceMame sense fullscreen (i així poder tenir en una altra finestra alguna eina), he de ficar en la configuració (/home/joan/.advance/advmame.rc):
#device_video_output fullscreen device_sdl_fullscreen no
$ advmame pacplus
$ ps aux | grep advmame joan 10443 13.0 0.4 168156 16444 pts/1 Sl+ 20:01 0:04 advmame pacplus
$ sudo scanmem 0> pid 10443 info: maps file located at /proc/10443/maps opened. info: 23 suitable regions found. 0> 460 info: 01/23 searching 0xa2db000 - 0xa3b1000...........ok ... info: 22/23 searching 0xb774c000 - 0xb774e000...........ok info: 23/23 searching 0xbfdc9000 - 0xbfdea000...........ok info: we currently have 28 matches. 28> > ..........info: we currently have 4 matches. 4>
MAME
Tinc instal.lat el MAME a la RPi i al portàtil. En el portàtil, per fer córrer el MAME sense fullscreen (i així poder tenir en una altra finestra alguna eina):
$ mame -window -mouse 1942
No em funcion el tema de canviar el score (TBD), però en canvi sí que funciona canviar el número de crèdits, que és més fàcil. A mame4all (RPi), en el galaga88 he aconseguit canviar els crèdits (que està limitat fins a 9). Si vull ficar més crèdits que 9 no funciona.
gneogeo
Ho he provat amb el Alpha Mission de NeoGeo. Puc canviar el número de crèdits.
1> set 0x41 info: setting *0x176ac4 to 41... 1> set 0x54 info: setting *0x176ac4 to 54... 1> set 65 info: setting *0x176ac4 to 41... 1> set 4 info: setting *0x176ac4 to 4... 1> set 10 info: setting *0x176ac4 to a... 1> set 0xa info: setting *0x176ac4 to a...
Si fico 65 apareix un 41 (que és el seu valor en hex). El que mana és el que diu a info.
Si vull ficar 10:
1> set 0x10 info: setting *0x176ac4 to 10... 1> set 10 info: setting *0x176ac4 to a...
Si ho fico amb hex funciona. Però si ho fico amb decimal no, apareix un 0 , però en la variable hi ha un 10. De manera que quan fico dos crèdits, apareix un 12. Per tant, té certa lògica, i hem de pensar en clau hexadecimal. Deu ser per això que no funciona canviar el score: ho hem de pensar en clau hexadecimal.
Si el score és 500, potser hauria de buscar 0x01F4 (o potser 0xF401)
Entenent els fitxers cfg dels jocs (MAME)(TBD)
Parteixo de fitxers cfg que s'ha canviat en la configuració de uprighe a cocktail. Vull saber on s'emmagatzema aquesta informació. Ho faig per a tres roms: lnc, locomotn i gyruss.
$ cmp -l lnc_u.cfg lnc_c.cfg | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'
000003D6 03 02
0000046C 00 40
$ xxd lnc_u.cfg
$ xxd lnc_c.cfg
0000460: 0010 0000 0000 0038 0040 0000 0000 0000
0000460: 0010 0000 0000 0038 0040 0040 0000 0000
$ cmp -l locomotn_u.cfg locomotn_c.cfg | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'
0000049E 00 08
00000524 0F 07
00000674 01 03
00000678 01 03
$ xxd locomotn_u.cfg
$ xxd locomotn_c.cfg
0000490: 0000 0000 0000 0000 0038 0008 0000 0000
0000490: 0000 0000 0000 0000 0038 0008 0008 0000
$ cmp -l gyruss_u.cfg gyruss_c.cfg | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'
000006AB 00 04
$ xxd gyruss_u.cfg
$ xxd gyruss_c.cfg
00006a0: 0000 0000 0000 0038 0004 0000 0000 0000
00006a0: 0000 0000 0000 0038 0004 0004 0000 0000
Veig que la clau està en algun dels bytes de valor 38. Després ve una paraula, i després una altra. Si aquesta última és 0, és un upright (valor per defecte). Si aquesta última és igual que l'anterior, és cocktail. El problema està en què el que ve després del 38 no ho sé interpretar: hi ha molts 38, i només un d'ells es correspon al tipus de cabinet. Jo entenc que el 38 són els DIP Switch. Per ex, mirar si el gyruss té tots aquests DIP switch:
$ xxd gyruss_c.cfg | grep 0038 0000150: 0000 0002 0000 0000 0000 0000 0038 00f0 .............8.. 0000200: 0000 0000 0000 0038 000f 000f 0000 0000 .......8........ 00002b0: 0002 0000 0000 0000 0000 0038 0003 0003 ...........8.... 00002e0: 4000 0039 0000 0000 0000 0000 0038 0004 @..9.........8.. 0000300: 0039 0000 0004 0000 0000 0038 0008 0008 .9.........8.... 0000320: 0000 0000 0000 0000 0038 0070 0070 0000 .........8.p.p.. 0000380: 0000 0038 0080 0000 0000 0000 0039 0000 ...8.........9.. 00003a0: 0002 0000 0000 0000 0000 0038 0001 0000 ...........8.... 0000510: 0000 0000 0000 0038 00f0 00f0 0000 0000 .......8........ 00005c0: 0038 000f 000f 0000 0000 0039 0000 0002 .8.........9.... 0000670: 0000 0000 0038 0003 0003 0000 0000 0039 .....8.........9 00006a0: 0000 0000 0000 0038 0004 0004 0000 0000 .......8........ 00006c0: 0000 0000 0038 0008 0008 0000 0000 0039 .....8.........9 00006e0: 0000 0038 0070 0070 0000 0000 0039 0000 ...8.p.p.....9.. 0000730: 0000 0039 0000 0000 0000 0000 0038 0080 ...9.........8.. 0000760: 0000 0000 0038 0001 0000 0000 0000 0039 .....8.........9
High Score (Oct 2016)
Centipede 16543 14532 14320 13210 $ cp centiped.nv centiped.nv.bak $ cd mame4all/nvram/ $ scp pi@192.168.1.35:/home/pi/mame4all/nvram/centiped.nv . ghex centiped $ cp centiped.nv centiped.nv.bak i els primers bytes són: 43 65 01 32 ... per tant 43 65 01 -> 01 65 43, que és el high score canvio el high score a 543 $ scp centiped.nv pi@192.168.1.35:/home/pi/mame4all/nvram scp centiped.nv pi@192.168.1.35:/home/pi/mame4all/nvram 43 65 01 32 54 01 20 43 01 05 0A 04 però en aquest fitxer res de res. ============= miro la rom directament: centiped.zip centiped.310 comença en el byte 269 i acaba en el 280 43 65 01 $ zip -0 centiped.zip centiped.211 centiped.212 centiped.307 centiped.308 centiped.309 centiped.310 wrong CRC expected: 44 e4 0f a4 found: c4 d0 49 9f he aconseguit rebaixar el high score. Puc fer un nou récord i ficar les inicials, i quan acabo la partida, aquest es guarda en el fitxer nvram/centiped.nv. Tanmateix, no es genera el fitxer hi/centiped.hi. I efectivament, quan torno a arrencar una nova partida, el high score està rebaixat, però no s'ha guardat el nou high score. NOTA: centiped està al fitxer hiscore.dat. Com és que no es guarda? ===== Per tant, les roms candidates a què es pugui guardar el hi són aquelles que apareixen en la carpeta hi/ Per exemple, galaxian.hi. Vaig a provar aquest. galaxian.zip El hi per defecte és 0 no es genera el fitxer nvram/galaxian.nv sí que es general el fitxer hi/galaxian.hi Tanmateix, quan arrenco una segona partida, el hi continua sent 0. En el fitxer galaxian.hi hi ha 6 bytes (3 words) que són 0: 00 00 00 Poso 00 00 30 ara torno a jugar i faig la puntuació de 520. Ara sí que ha guardat les dades a galaxian.hi 20 05 00 però es veu que quan jugo no llegeix la puntuació i sempre és 00 En aquest cas el problema és que no es genera el fitxer nvram, que és el que manté el valor de la ram després de que apagui la màquina. ===== a mame4all/ exiteix el fitxer hiscore.dat!! *http://highscore.mameworld.info/avstut.htm *http://highscore.mameworld.info/bellstut.htm Space Invaders funciona. És una rom que està en el fitxer hiscore.dat, i per tant guarda el hiscore. Efectivament, miro invaders.hi i ha guardat el highscore de 390 (90 03) nvram/invaders.nv no existeix. Funcionen, i tenen el hi inicialment a 0==== invaders galxwars yosakdon =========== En el cas de galaxian (que també apareix en el fitxer hiscore.dat), guardava les dades a galaxian.hi, però el problema és que quan arrengo la rom no deu llegir aquest fitxer. 1942: està a hiscore.dat. El problema és que el hiscore està a 40000. Miraré de canviar-lo. 0:e800:190:00:00 0:e9c0:1:1e:1e 0:e040:8:00:00 0:e028:1:01:01 fitxer 1942.hi byte 1: 00 00 04 00-> 00 00 00 04 els bytes on es troba el 40000 són 1, 3f, 152, 172, 182, 194 però n'hi ha prou en canviar l'últim: 04 00 per 00 04. No queda dividit per 100 sinó per 10, i el hiscore passa a ser de 4000. Deixa ficar inicials, i guarda bé el hiscore. Només m'ha calgut tocar el 1942.hi. === aliens 0:1e30:38:00:48 50000 48000 ... he rebaixat per 100 tots els hi deixa ficar les inicials, i a més he rebaixat els hi (aquest és el primer que ho he aconseguit). === Resumint, totes les roms que estan a hiscore.dat funcionen bé. El tema és que hi ha jocs que és difícil de batre els récords, i aleshores he de mirar com puc rebaixar el hiscore. A vegades tocant el fitxer .hi n'hi ha prou.
Gyruss: funciona bé. Està inicialment a 10000, però aquest hi es pot batre fàcilment.