ROM Hacking

De wikijoan
Salta a la navegació Salta a la cerca

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.