Emulador NeoGeo a la RPi

De wikijoan
Salta a la navegació Salta a la cerca

Introducció

Instal.lació

Com es comenta dono permisos al frame buffer device.

$ sudo chmod 777 /dev/fb0

Per mi no se si és important, però ho faig per si de cas.

post recent:

Gngeo-Pi is compliant with roms set of mame 0.138.

Descarrego la última versió (0.8) de:

Descomprimeixo i instal.lo directament sobre /home/pi:

wget -O gngeo-pi-0.85.tar.gz https://github.com/ymartel06/GnGeo-Pi/blob/master/releases/sources/gngeo-pi-0.85.tar.gz?raw=true
tar xvfz gngeo-pi-0.85.tar.gz -C /home/pi/
./configure --host=arm-linux --target=arm-linux --disable-i386asm --prefix="/home/pi/gngeo-pi-0.85/installdir"
make
sudo make install

I l'executable és

/home/pi/gngeo-pi-0.85/installdir/bin/arm-linux-gngeo

Help:

/home/pi/gngeo-pi-0.85/installdir/bin/arm-linux-gngeo --help

La manual page està a:

man /home/pi/gngeo-pi-0.85/installdir/share/man/man1/arm-linux-gngeo.1

LLegim detingudament la manual page:

Like MAME, the memory layout of each game is defined by a driver, which
       is simply a plain text description of the game's characteristics needed
       by   the   emulator.    The   driver   database   is    installed    in
       /usr/local/share/gngeo/romrc.   If a new program is wanted to be run in
       gngeo, it must be added to that database.

The simplest form of operation is the following:
$ gngeo <game>
       where <game> is the MAME name of a Neo-Geo ROM set corresponding  to  a game.

$ gngeo <file>
       where <file> point to a zip that contain the Neo-Geo ROM set.

By  default,  gngeo  looks  for  the  BIOS images and ROM collection in
       /usr/share/gngeo.  This can be changed with the -i or --rompath option.
       For example:
       $ gngeo -i /home/flurbly/neogeo/roms mslug2

The ROM location, as well as any other options, can be persistently set
       in  the  $HOME/.gngeo/gngeorc.   A  sample  gngeorc  can  be  found  in
       /usr/share/doc/gngeo;  copy  it into your .gngeo directory and adapt it
       to your needs.

Configuració

Seguint les instruccions, la meva configuració serà:

cd /home/pi
mkdir roms_neogeo

Copiem la bios image en el mateix directori que contindrà les roms:

$ mv neogeo.zip roms_neogeo/

(nota: no tots els fitxers neobios.zip que es troben per la xarxa funcionen).

Faig una prova amb dues roms. Copio les roms al directori adient:

$ scp mslug.zip pi@192.168.1.35:/home/pi/roms_neogeo
$ scp garoun.zip pi@192.168.1.35:/home/pi/roms_neogeo
...

Fixar-se que aquestes ROMs són bastant pesades.

-d, --romrc=[path]
              Give the path to locate the romrc file.  This defines the layout
              of the games and is required to run any Neo-Geo games.

Aquest fitxer el trobem a /home/pi/gngeo-pi-0.85. És la base de dades de tots els jocs. Si volem jugar a un joc que no estigui a la llista, s'haurà d'actualitzar.

Invoquem el programa, encara que sabem que de moment no funcionarà:

$ /home/pi/gngeo-pi-0.85/installdir/bin/arm-linux-gngeo -d /home/pi/gngeo-pi-0.85 -i /home/pi/roms_neogeo mslug
The ROM location, as well as any other options, can be persistently set
       in  the  $HOME/.gngeo/gngeorc.   A  sample  gngeorc  can  be  found  in
       /usr/share/doc/gngeo;  copy  it into your .gngeo directory and adapt it
       to your needs

NOTA: l'opció -d fa referència al directori on es troba el datafile: gngeo_data.zip. És possible que el tingui a /home/pi/gngeo-pi-0.85/installdir/share/gngeo/gngeo_data.zip. En qualsevol cas, en comptes de fer servir l'opció -d el millor és definir el fitxer de configuració /home/pi/.gngeo, on hi ha l'opció datafile. El mateix podem dir per al directori on es troben les roms: no cal utilitzar l'oopció -i, sinó fer servir la directiva rompath i biospath que es troba en el fitxer de configuració. Recordar que el fitxer neogeo.zip és la bios, i és obligatori.

El fitxer de configuració d'exemple està a ~/gngeo-pi-0.85/sample_gngeorc. El copiem a .gngeo

mkdir /home/pi/.gngeo
cp /home/pi/gngeo-pi-0.85/sample_gngeorc /home/pi/.gngeo/gngeorc
joe /home/pi/.gngeo/gngeorc
...
rompath /home/pi/roms_neogeo
biospath /home/pi/roms_neogeo
datafile /home/pi/gngeo-pi-0.85/installdir/share/gngeo/gngeo_data.zip

i després hi ha molts altres temes relacionats amb la visualització i la configuració del teclat/joystick.

Invoquem:

$ /home/pi/gngeo-pi-0.85/installdir/bin/arm-linux-gngeo -d /home/pi/gngeo-pi-0.85 mslug

Efectivament està funcionant el fitxer de configuració /home/pi/.gngeo/gngeorc doncs en invocar l'executable surten llsitades totes les opcions que s'han definit en aquest fitxer.

Les instruccions bàsiques per començar a jugar són:

  • Press 3 to give Player 1 a credit, 4 to give Player 2 a credit. Press 1 to start player 1, 2 to start player 2. Up down left and right control player 1, and z, x, a, and s map to the Neo Geo’s A B C and D buttons.

I és que el sistema NeoGeo funciona amb 4 botons (A, B, C i D) a part del joystick.

ROMs

Jocs importants de NeoGeo:

  • King of Fighters 98
  • Metal Slug X
  • Metal Slug – Super Vehicle-001
  • Samurai Shodown 2
  • Blazing Star
  • Fatal Fury Special (set 1, set 2)
  • Magical Drop III
  • Neo Turf Masters
  • Pulstar
  • Street Hoop
  • The Last Blade (set 1, set 2)
  • Windjammers
  • Waku Waku 7
  • King of Monsters

Les ROMs per a gngeo han de ser compatibles amb la versió 0.138 de MAME. No sé si és aquest el cas, però al final tinc un joc de ROMs que funciona, l'he tret de:

NeoGeo Set Part 01
NeoGeo Set Part 02
NeoGeo Set Part 03
NeoGeo Set Part 04

que es descomprimeixen tots junts com a Neo-Geo.

NOTA. En el cas de què hagués tingut problemes amb la versió de les ROM, hi ha un programa, clrmamepro, que funciona amb wine, i que pot fer la conversió entre versions de ROM.

Snapshots de les ROMs

En aquesta direcció hi ha molts recursos per descarregar, snapshots de les diferents consoles.

Registre:

  • username: joanillo
  • joanqc@gmail.com
  • jq****

Resolució 640x480

Més Configuració

Per tal de què es vegi el joc a pantalla sencera hi ha l'opció scale2x. Jugo amb les diferents configuracions. (Fer una còpia de com queda al final rl fitxer .gngeo/gngeorc)

Configuració original del teclat:

# Qwerty configuration:

# Key configuration
# order : A,B,C,D,START,COIN,UP,DOWN,LEFT,RIGHT
# please see SDL_keysym.h for key definition
# or push F4 during game : the keysym code of
# keys will be printed (also work for joysticks)
# same thing as joypads for hotkeys

# Azerty configuration:
# p1: w,x,q,s,&,",up,down,left,right
# p2: l,m,o,p,é,',NUM 8,NUM 5,NUM 4,NUM 6
#p1key    119,120,113,115,38,34,273,274,276,275
#p2key    108,109,111,112,233,39,264,261,260,262

# Qwerty configuration:
# p1: z,x,a,s,1,3,up,down,left,right
# p2: l,;,o,p,2,4,NUM 8,NUM 5,NUM 4,NUM 6

# p1: z,x,a,s,1,3,up,down,left,right
# p2: l,;,o,p,2,4,NUM 8,NUM 5,NUM 4,NUM 6
p1control A=K122,B=K120,C=K97,D=K115,START=K49,COIN=K51,UP=K273,DOWN=K274,LEFT=K276,RIGHT=K275,MENU=K27
p2control A=K108,B=K59,C=K111,D=K112,START=K50,COIN=K52,UP=K264,DOWN=K261,LEFT=K260,RIGHT=K262,MENU=K27

A NeoGeo hi ha 4 botons que es fan servir, i en la meva màquina els hauria de fer servir. En les màquines NeoGo originals els botons ABCD estan alineats amb una mica de corba.

Integració amb el frontend joanillo_arcade_frontend

Puc cridar a l'emulador fent que entri a un joc directament, o entrant al menú principal de l'emulador:

$ /home/pi/gngeo-pi-0.85/installdir/bin/arm-linux-gngeo -d /home/pi/gngeo-pi-0.85 mslug

El problema està en què després de jugar a un joc, amb la tecla ESCAPE surto del joc, i em quedo en el menú principal de l'emulador. Aleshores he d'anar a EXIT i ENTER. La integració amb joanillo_arcade_frontend significa que desde el frontend he de llençar al joc, i quan surti del joc (amb la tecla ESCAPE oiginalment, que s'ha de canviar a la tecla 0), he de tornar al front-end, sense passar pel menú.

Per aconseguir aquesta funcionalitat s'ha de fer canvis en el codi i recompilar el codi. Les diferents proves que s'han fet estan en un document. Els canvis que s'han de fer finalment són els següents.

El primer que vull és que la tecla 0 serveixi per sortir del joc i tornar al front-end (originalment és el ESCAPE):

fitxer emu.c sí
línia 495
                switch (scancode) {
                                        case SDLK_0:
                                        neo_emu_done = 1;
                                        break;
                    case SDLK_ESCAPE:
                    neo_emu_done = 1;
                    break; // ESC

fitxer event.c (aquest és el canvi important)
línia 217
        case SDLK_ESCAPE:
            return 1;
            break;
case SDLK_0:
return 1;
break;

Ara vull que en sortir del joc també es surti de l'emulador (i per tant tornarà al front-end, si crido a l'emulador des del front-end):

prova 10: menu.c línia 1014
int menu_event_handling(struct GN_MENU *self) {
        //static SDL_Event event;
        GN_MENU_ITEM *mi;
        int a; 
        LIST *l;
        return MENU_EXIT; //nova línia
        switch (wait_event()) {
...

La clau està en introduir la línia return MENU_EXIT;, és a dir, no deixo entrar en el bucle.

Treure tota la verbositat de les opcions quan comença el joc: (TBD) deu estar a main.c, línia 88

   cf_init(); /* must be the first thing to do */
   cf_init_cmd_line();
   cf_open_file(NULL);

Canviar el nivell de joc per defecte

Dins del joc, amb F3 accedeixo al test. Vaig a DIP SOFT o algo així, i aleshores puc canviar opcions de joc per defecte com ara el level. El tema és que el nivell per defecte de Kings of Fighter està a 4, que és massa difícil, i ho deixo a 2. Hauria de revisar el level per a tots els jocs, per ex, canviant-los a nivell 0 o 1. (amb el botó 3 entrem, i 4/5 canviem i guardem, crec).

La configuració del joc es guarda en un fitxer de configuració per cada joc. Per ex, per a Metal Slug:

~/.gngeo/mslug.nv 

Per tant, aquesta carpeta també s'ha de copiar per tal de no haver de repetir tota la feina de canviar el nivell de dificultat dels jocs.

Modificació dels botons

/usr/include/SDL/SDL_keysym.h
      SDLK_0                  = 48,
        SDLK_1                  = 49,
        SDLK_2                  = 50,
        SDLK_3                  = 51,
        SDLK_4                  = 52,
        SDLK_5                  = 53,
        SDLK_6                  = 54,
        SDLK_7                  = 55,
        SDLK_8                  = 56,
        SDLK_9                  = 57,

#p1control A=K122,B=K120,C=K97,D=K115,START=K49,COIN=K51,UP=K273,DOWN=K274,LEFT=K276,RIGHT=K275,MENU=K27
p1control A=K51,B=K52,C=K53,D=K54,START=K49,COIN=K50,UP=K273,DOWN=K274,LEFT=K276,RIGHT=K275,MENU=K27

Això implica que si vull tindre el botó D hauré de tenir 7 botons en comptes de 6, i que el START i el COIN han de ser botons diferents. Això implica un canvi en la configuració del mame4all i en el disseny dels CPOs. Seran 3 botons a dalt i 4 a baix. Per al mame4ll, com que sobra un botó, puc fer-lo servir de PAUSE.

El CPO (Control Panel Overlay) per a un sol jugador quedarà:

ESC   START COIN
   *    *    *

 *   *    *     *
 A   B    C     D
CAT  FAV  EMU   PAUSE

creat per Joan Quintana Compte, gener 2015