User Tools

Site Tools


doc:appunti:hardware:raspberrypi_mame_console

Console MAME con Raspberry Pi

Il pannello di controllo della console MAME

Come costruire una console per il retrogaming utilizzando un Raspberry Pi e gli emulatori open source più famosi, come MAME e FinalBurn Alpha.

Allo stato attuale (2019) questa realizzazione non utilizza le versioni più recenti né dell'hardware né del software, tuttavia il risultato è soddisfacente e perfettamente giocabile con diversi giochi arcade degli anni '80 e alcuni giochi della famosa piattaforma Neo Geo degli anni '90.

Il lavoro necessario ha riguardato la costruzione del pannello, il cablaggio dei joystick e dei pulsanti, la configurazione dell'interfaccia Mini-PAC, la scelta e la configurazione degli emulatori fra quelli disponibili, la configurazione di Emulation Station per l'interfaccia di presentazione e avvio dei giochi. Infine la selezione delle ROM più interessanti e giocabili nonché alcune configurazioni ad-hoc richieste da qualche ROM.

Queste le componenti hardware e software utilizzate:

  • Raspberry Pi 2 Model B - CPU 900MHz quad-core ARMv7-A Cortex-A7, 1 Gb RAM.
  • Mini-PAC Standard - Interfaccia USB, simula una tastiera e può collegare fino a 32 input digitali (pulsanti o joystick).
  • Retropie 3.0 - È la distribuzione che include tutte le componenti software necessarie per il retrogaming (ad eccezione delle ROM), è basata su Raspbian Wheezy 7.8.
    • Emulation Station v2.0.1A - È l'interfaccia che consente di scegliere il gioco da eseguire mostrando le miniature e la descrizione.
    • AdvanceMAME 1.2 - Emulatore basato su MAME 0.106, supporta circa 6100 giochi.
    • MAME4ALL Pi - Emulatore basato MAME 0.37b5, supporta circa 2200 giochi.
    • PiFBA - Emulatore di giochi Neo-Geo basato su FinalBurn Alpha 0.2.96.71.
    • SNES - Emulatore Super Nintendo LibRetro Snes9X (lr-snes9x-next). Basato su Snes9X 1.52+ con ottimizzazioni e supporto LibRetro.
    • SCUMM - Emulatore di giochi ScummVM versione 1.7.0 (2014-07-21).
    • RetroArch - Libreria LibRetro che dovrebbe consentire di configurare gli input (tasti e joystick) una volta sola per tutti gli emulatori. Purtroppo l'adozione da parte dei vari emulatori è ancora scarsa, infatti l'abbiamo usata solo per configurare l'emulatore SNES.
  • ROM - Ci siamo procurati una collezione di ROM per MAME versione 0.106 o superiore, quindi con Clrmamepro abbiamo preparato le ROM esattamente come richiesto dalla due implementazioni di MAME: versione 0.106 e 0.37b5.

Il Pannello di Controllo

All'interno del pannello di controllo è alloggiata un'Interfaccia Mini-PAC, quindi il tutto si presenta al computer (in realtà un Raspberry Pi 2) come una semplice tastiera USB, ma capace di gestire la pressione multipla dei tasti di due giocatori.

Ho realizzato il pannello di controllo in legno compensato di pioppo da 10 mm; il materiale non è molto adatto: praticando i grandi fori da 28 mm si scheggia facilmente, inoltre è morbido al tal punto che anche con un unghia è possibile lasciare un segno profondo. Probabilmente un pannello in MDF sarebbe stato molto meglio.

Lo studio preliminare per la disposizione dei pulsanti e dei joystick è stato fatto su pezzi di cartone usando i modelli trovati su www.slagcoin.com. L'obiettivo era avere una console per due giocatori adatta in futuro ad essere inserita in un cabinet da tavolo con un monitor da 17“ o 19”, quindi larga circa 50 cm. Inoltre ho cercato di dare abbastanza spazio per appoggiare il palmo della mano, senza però esagerare con le dimensioni.

I vari pezzi sono stati incollati con colla vinilica e avvitati con viti da 20 mm.

Studio preliminare per la disposizione dei pulsanti La strutttura completata Interno della struttura Compensato in pioppo: si scheggia facilmente Prova pulsanti prima della verniciatura

L'hardware: Raspberry Pi 2

Sebbene la prima versione del Raspberry possa far girare diversi giochi MAME, le maggiori performance del Pi 2 consentono di far girare bene anche gran parte dei titoli Neo-Geo.

Alcune letture interessanti riguardo l'overclock:

Il software: RetroPie 3.0

Quasi tutto il lavoro di integrazione del software è stato fatto dal RetroPie Project, si tratta di una distribuzione per trasformare il Raspberry Pi in una console per il retrogaming. La distribuzione viene fornita come immagine da copiare sulla SD-card, esiste anche in versione specifica e ottimizzata per il Raspberry Pi 2. Nella distribuzione sono integrati diversi software, tra cui:

  • Sistema opetativo Raspbian basato su Debian Wheezy.
  • Emulation Station: il front-end per sfogliare la collezione dei giochi e lanciarli.
  • RetroArch: implementazione della libreria libretro che consente ad emulatori diversi di utilizzare un device di input (joistick, tastiera, ecc.) facendo una sola configurazione.
  • MAME: emulatore di molteplici piattaforme hardware. L'immagine SD-card di Retropie 3.0 include MAME nelle due varianti AdvanceMAME e MAME4ALL Pi.
  • Neo-Geo: emulatore della scheda che ebbe notevole successo nelle sale giochi a partire dal 1990. Nella SD-card di Retropie 3.0 si trova l'implementazione PiFBA, FBA-libretro e GnGeo-Pi. Si tratta di ottimizzazioni per il Raspberry Pi di FB Alpha e GnGeo rispettivamente.
  • Numerosissimi altri emulatori di svariate piattaforme: Atari 2600, Commodore 64, ZX Spectrum, ScummVM, ecc.

Gli emulatori in Retropie 3.0

È importante capire che in Retropie 3.0 sono presenti diversi emulatori che - sebbene supportino in alcuni casi gli stessi giochi - possono differire in termini di performance, completezza di emulazione e contenuto dei romset (gli archivi zip contenenti i giochi). In particolare ci interessano i due emulatori basati su MAME (AdvanceMAME 1.2 e MAME4ALL Pi) e l'emulatore Neo-Geo FB Alpha.

In Retropie 3.0 l'emulatore AdvanceMAME 1.2 (basato su MAME 0.106) supporta circa 6100 giochi mentre MAME4ALL Pi (basato MAME 0.37b5) ne supporta circa 2200. Sebbene AdvanceMAME sia più recente e completo, si è preferito utilizzare i giochi basati su MAME4ALL perché tale implemetazione è più ottimizzata e performante sul Raspberry Pi 2.

È importante capire anche su quale engine e versione è basato ogni emulatore, perché da questo dipende quali romset sono utilizzabili e quale deve essere il loro contenuto. Per fare un esempio: il gioco galaga3.zip deve contenere file diversi e con nomi diversi a seconda che si usi il motore MAME 0.37b5 oppure il motore MAME 0.106. Questo è il motivo per cui i romset devono essere messi in directory diverse a seconda dell'emulatore con cui vanno usati.

Per fortuna per ogni implementazione è possibile ottenere un DatFile, cioè l'elenco completo dei romset supportati e del loro esatto contenuto, completo di checksum. Il software clrmamepro è in grado di ricostruire i romset esatti a partire da un DatFile e da una collezione non organizzata di romset, effettuando le necessarie operazioni di selezione dei singoli file, eventuale rinomina e creazione degli archivi zip.

Emulator Based on engine ROM path
AdvanceMAME 1.2 MAME 0.106 /home/pi/RetroPie/roms/mame-advmame/
MAME4ALL Pi MAME 0.37b5 /home/pi/RetroPie/roms/mame-mame4all/
PiFBA FB Alpha 0.2.96.71 /home/pi/RetroPie/roms/neogeo/

In Retropie 3.0 sono presenti anche alcune implementazioni alternative per MAME e Neo-Geo:

Alternative Based on engine Alternative to
AdvanceMAME 0.94.0 MAME 0.92u2000 AdvanceMAME 1.2
FBA-libretro FB Alpha PiFBA
GnGeo-Pi GnGeo PiFBA

Ecco dove ottenere i DatFile per i tre emulatori che ci interessano. In generale gli eseguibili basati su MAME sono in grado di generare essi stessi l'elenco, mentre per FB Alpha è necessario scompattare il file distribuito insieme all'eseguibile:

AdvanceMAME /opt/retropie/emulators/advmame/1.2/bin/advmame -listxml
MAME4ALL Pi /opt/retropie/emulators/mame4all/mame -listinfo
PiFBA /opt/retropie/emulators/pifba/fba_029671_clrmame_dat.zip

Altri emulatori interessanti

Sono da considerare almeno altre due piattaforme giochi: SCUMM e Super Nintendo Entertainment System. La prima divenne famosa grazie ai giochi di avventura della Lucasfilm Games (Maniac Mansion, Zak McKracken, ecc.). La seconda invece, costruita alla fine degli anni ottanta, ebbe grande successo per Super Mario World e Street Fighter 2; su di essa sono stati implementati la gran parte dei videogiochi dell'era 16 bit.

Piattaforma Emulatore scelto Note
SCUMM ScummVM È la versione 1.7.0 (2014-07-21), l'unica presente in Retropie 3.0. Supporta i giochi anche in qualità più avanzata, cioè quelli creati per hardware FM-TOWNS.
SNES lr-snes9x-next (LibRetro Snes9X) Basato su Snes9X 1.52+, con numerose ottimizzazioni ed hack per renderlo più veloce. È stato aggiunto il supporto a LibRetro per la configurazione dei comandi.

Emulation Station

Il front-end scelto da Retropie 3.0 per l'avvio dei giochi è Emulation Station.

Joystick e tastiera

Al primo avvio dell'immagine SD-card di Retropie 3.0 si viene guidati nella configurazione del dispositivo di input. Se si ha un joystick USB sarà sufficiente premere i tasti indicati a video.

I tasti sono nominati secondo la convenzione del controller della PlayStation 3:

PS3 Controller

Avendo un controller differente si dovranno mappare i tasti che hanno una funzione equivalente:

D-Pad Up, Down, Left, Right Sono i tasti principali per controllare la direzione.
Start Nel retrogaming solitamente viene usato per iniziare il gioco con un solo giocatore.
Select Nel retrogaming solitamente utilizzato per simulare l'inserimento della moneta.
A, B I due principali pulsanti di azione (sparo, ecc.).
X, Y Pulsanti per azioni aggiuntive.
Left Bottom, Right Bottom
Left Top, Right Top
Left Thumb, Right Thumb
Left Analog Up, Down, Left, Right
Right Analog Up, Down, Left, Right

La configurazione viene salvata nel file /home/pi/.emulationstation/es_input.cfg.

La procedura può essere ripetuta premendo il tasto Menu (Start) e poi scegliendo Configure Input. Presumibilmente se si elimina il file la procedura di configurazione viene ripetuta al boot successivo.

Ecco un esempio del contenuto del file:

<?xml version="1.0"?>
<inputList>
  <inputAction type="onfinish">
    <command>/opt/retropie/supplementary/emulationstation/scripts/inputconfiguration.sh</command>
  </inputAction>
  <inputConfig type="joystick" deviceName="MY-POWER CO.,LTD. USB Joystick">
    <input name="start" type="button" id="9" value="1"/>
    <input name="up" type="axis" id="1" value="-1"/>
    <input name="a" type="button" id="1" value="1"/>
    <input name="b" type="button" id="2" value="1"/>
    <input name="down" type="axis" id="1" value="1"/>
    <input name="right" type="axis" id="0" value="1"/>
    <input name="select" type="button" id="8" value="1"/>
    <input name="left" type="axis" id="0" value="-1"/>
    <input name="pagedown" type="button" id="7" value="1"/>
    <input name="pageup" type="button" id="6" value="1"/>
  </inputConfig>
</inputList>

Nel file di configurazione i pulsanti corrispondono agli input type=“button” e l'id è il valore mostrato da jstest. Il joystick - che in jstest è riportato come asse analogico - viene associato a input di type=“axis” oppure di type=“hat”, la corrispondenza tra numerazione di jstest e quella assegnata da Emulation Station non è chiara.

Opzioni command line

Per modificare le opzioni con cui viene eseguito Emultation Station è necessario editare lo script /usr/bin/emulationstation, oppure lo script /etc/profile.d/10-emulationstation.sh. Ad esempio può essere utile passare l'opzione --gamelist-only in modo che vengano elencati solo i giochi nei rispettivi file gamelists.

Emulatori disponibili

Per disabilitare (nascondere) alcuni emulatori dall'interfaccia di Emulation Station è possibile rimuovere ROM e/o script dalle diretcory /home/pi/RetroPie/roms/ oppure commentare le relative sezioni <system> dal file /etc/emulationstation/es_systems.cfg.

La configurazione di Emulation Station che si trova in Retropie 3.0 consente di riconfigurare al volo l'emulatore semplicemente premendo un tasto entro un secondo dall'avvio di un gioco. La funzione è abbastanza critica perché un tasto di gioco può essere premuto involontariamente durante quel timeout (ricordiamo che l'interfaccia Mini-PAC simula una normale tastiera) pertanto, invece di avviare l'emulatore, verrebbe eseguita la procedura di riconfigurazione. Senza una tastiera collegata è complicato e noioso uscire da tale procedura, basata sulla modalità testo e il programma dialog.

Per disattivare questa possibilità è necessario modificare lo script /opt/retropie/supplementary/runcommand/runcommand.sh, individuando e commentando la riga:

IFS= read -s -t 1 -N 1 key </dev/tty

Modifica di gamelist.xml

I metadati di un gioco (descrizione, immagine miniatura, rating, ecc.) sono salvati in alcuni file .xml (uno per ogni emulatore) nelle directory /home/pi/.emulationstation/gamelists/.

Emulation Station modifica i metadati dei giochi nel gamelist.xml (es. il tag <lastplayed>) sovrascrivendo il file. Pertanto non si pssono modificare questi file quando il programma è in esecuzione altrimenti si rischia di perdere le modifiche fatte. Killare il programma o uscire con la voce apposita del Main Menu, quindi interrompere il loop che lo riavvia automaticamente tenendo premuto un tasto (è richiesta una tastiera collegata).

Ricordarsi che Emulation Station viene eseguito autmaticamente al boot utilizzando il seguente schema:

  1. /etc/inittab contiene una entry che esegue un login automatico dell'utente pi sul terminale tty1.
  2. /etc/profile.d/10-emulationstation.sh provvede ad eseguire emulationstation se il terminale è tty1.
  3. /usr/bin/emulationstation è in realtà un wrapper Bash, che esegue il binario di Emulation Station in loop. Il loop può essere interrotto premendo un tasto.

Nel Menu RetroPie ci sono diverse voci che è opportuno nascondere una volta effettuate tutte le configurazioni, lasciando ad esempio solo il Configure WiFi e Show IP Address. Nella directory /home/pi/RetroPie/retropiemenu/ si possono rinominare i vari file .rp in .rp.disabled per ottenere lo scopo.

Per modificare l'aspetto della lista dei giochi si può modificare il tema predefinito (si chiama simple) oppure si può crearne uno nuovo. Qui la scarsa documentazione sui temi.

La directory è /etc/emulationstation/themes/simple/, c'è un file generale ed uno per ogni sistema (emulatore). Modificando il file generale è stato ad esempio possibile disabilitare l'opzione forceUppercase per la descrizione del gioco, che crea dei problemi con le lettere accentate.

Diminuendo l'altezza della textlist gamelist è stato possibile correggere un problema della lista dei giochi: l'ultimo elemento in basso viene mostrato parzialmente se l'altezza del box non è esattamente multiplo dell'altezza del font (issue #174).

Aggiustando le varie misure (sono espresse come percentuale rispetto alla dimensione dello schermo) è stato possibile anche ingrandire l'immagine preview.

TODO

  • FIXME Emulation Station, Main Menu: disabilitare Scraper, UI Settings, Configure Input (issue #518).

Interfaccia Mini-PAC

L'interfaccia Mini-PAC ha un connettore a pettine da 40 poli al quale si possono collegare pulsanti e joystick. Si collega all'host tramite porta USB ed emula una tastiera senza alcun limite di tasti premuti contemporaneamente.

La mappatura dei tasti predefinita è adatta all'emulatore MAME (qui una versione PDF), ma con il software opportuno è possibile riprogrammarla.

L'interfaccia ha anche un connettore ausiliario al quale è possibile collegare una trackball (dispositivo a due assi) e uno spinner (dispositivo ad un asse).

Qui lo Schema di collegamento Mini-PAC.

Una comoda funzione è la possibilità di utilizzare una combinazioni di tasti, ad esempio per impostazione predefinita permere Start 1 e Start 2 contemporaneamente equivale al tasto ESC. Questo consente di risparmiare pulsanti ed evitare pressioni accidentali di tasti speciali.

Riprogrammare i pulsanti

Ogni pulsante collegato alla Mini-PAC produce il codice di un equivalente tasto della tastiera. Inoltre esiste una speciale funzione SHIFT per cui la pressione contemporanea di due pulsanti produce codici tastiera aggiuntivi. Per impostazione predefinita la funzione SHIFT è associata al pulsante START1.

L'impostazione predefinita dei tasti è quasi perfetta (segue lo schema di MAME), tuttavia qualche miglioramento è possibile. Ad esempio la combinazione START1 + START2 equivale alla pressione di ESC (che fa uscire dall'emulatore) potrebbe essere premuta per sbaglio quando due giocatori chiedono contemporaneamente la funzione Continue di alcuni giochi. Inoltre sul nostro pannello avevamo montato un pulsante collegato direttamente ad ESC, ma era troppo facile premerlo per sbaglio.

Per questo si sono riprogrammati alcuni pulsanti in questo modo:

  • Rimossa la funzione di tasto ESCAPE dal pulsante P2-B.
  • Cambiato il pulsante con funzione SHIFT da P1-START a P2-B.
  • Associato il tasto Enter alla combinazione di pulsanti SHIFT + P1-START.

Per riprogrammare l'interfaccia occorre il software WinIPAC, che purtroppo funziona solo con Windows (provato su Windows 7). Il programma con l'emulazione GNU/Linux + Wine si avvia, riconosce la pressione dei pulsanti, ma non funziona la riprogrammazione (neanche dando permessi rw a tutti sul device USB). Qui una copia del programma: winipac_setup.exe.

  1. Avviare WinIPAC con Esegui come Amministratore.
  2. Dal menu Tools, Options selezionare il modello 32 Input Boards.
  3. Dal menu Tools, Test Mode verificare che la Mini-PAC sia riconosciuta e che i pulsanti funzionino.
  4. Dal menu Mode passare al modo Keys Assignments Editor (non occorre salvare).
  5. Dal menu View selezionare As Table.
  6. Cliccare l'etichetta gialla P1/2 SHIFT, quindi cliccare sull'etichetta verde P2-B, questo riassegna la funzione SHIFT dal pulsante P1-START al pulsante P2-B. Verificare che l'assegnamento sia andato a buon fine passando il puntatore del mouse sull'etichetta gialla.
  7. Cliccare sotto l'etichetta verde P2-B, fare click destro e scegliere None. In questo modo il pulsante P2-B non produce più il codice del tasto ESCAPE, ma serve solo come SHIFT.
  8. Cliccare sotto l'etichetta viola P1-START e premere Enter sulla tastiera per associare quel tasto alla combinazione pulsanti SHIFT + P1-START.
  9. Cliccare su Program per riprogrammare l'interfaccia Mini-PAC.

Configurazione dei tasti

In Retropie 3.0 sono presenti diversi emulatori (versioni diverse, fork con varie ottimizzazioni, ecc.). Essendo programmi diversi ognuno può essere configurato in maniera indipendente, soprattutto nella funzione dei tasti. Esiste il progetto libretro che dovrebbe risolvere questo problema: una configurazione centralizzata utilizzata da tutti gli emulatori. Peccato che quelle che interessano a noi, MAME4ALL e PiFBA, non la supportino.

Configurazione di RetroArch

Nel nostro caso RetroArch viene usato solo dall'emulatore SNES, nella implementazione lr-snes9x-next.

La configurazione di questo front-end consentirebbe di effettuare una sola configurazione dei dispositivi di input (joystick/tastiera) per tutti gli emulatori che supportano la libreria libretro. Peccato che le due implementazioni di MAME presenti nella SD-card RetroPie 3.0 non supportino libretro e nemmeno PiFBA che è l'emulatore predefinito dei giochi Neo-Geo!

Dal menu RetroPie si esegue Configure RetroArch Keyboard/Joystick; è necessaria una tastiera per completare l'operazione.

La configurazione del joystick viene salvata nel file /opt/retropie/configs/all/retroarch-joypads/<joystick_name>.cfg.

La configurazione della tastiera viene salvata in /opt/retropie/configs/all/retroarch.cfg. Rispetto alla configurazione predefinita bisogna disabilitare (commentare) la riga input_reset = alt altrimenti il Player1/Button2 (che MAME vuole mappato sul tasto Left-Alt) provoca il reset del gioco. Inoltre si può attivare l'opzione input_pause_toggle = p.

Significato dei tasti sulla tastiera

Questi i principali tasti predefiniti nei due emulatori che ci interessano: MAME4ALL e PiFBA:

MAME4ALL Funzione PiFBA
5 Inserisci moneta giocatore 1 (Select) Tab
6 Inserisci moneta giocatore 2 N/A
1 Start giocatore 1 (Start) Return
2 Start giocatore 2 N/A
ESC Esci dall'emulatore ESC
Arrows Giocatore 1, Up, Down, Left, Right Arrows
L-Ctrl Giocatore 1, pulsante azione n.1 L-Ctrl
L-Alt Giocatore 1, pulsante azione n.2 Space
Space Giocatore 1, pulsante azione n.3 L-Alt
L-Shift Giocatore 1, pulsante azione n.4 L-Shift
Z Giocatore 1, pulsante azione n.5 Z
X Giocatore 1, pulsante azione n.6 X
R,F,D,G Giocatore 2, Up, Down, Left, Right N/A
A Giocatore 2, pulsante azione n.1 N/A
S Giocatore 2, pulsante azione n.2 N/A
Q Giocatore 2, pulsante azione n.3 N/A
W Giocatore 2, pulsante azione n.4 N/A
N/A (I) Giocatore 2, pulsante azione n.5 N/A
N/A (K) Giocatore 2, pulsante azione n.6 N/A

Nel mondo MAME si è formato un certo consenso sulla mappatura dei tasti della tastiera rispetto ai controlli dei videogiochi. Si può consultare la struttura inputport_defaults_digital del file sorgente inptport.c della libreria mame2003-plus-libretro.

MAME4ALL non ha niente di predefinito per i pulsanti n. 5 e 6 del secondo giocatore, si può utilizzare la mappatura dei tasti dell'interfaccia I-PAC (e Mini-PAC) che associa i pulsanti ai tasti I e K rispettivamente.

:!: L'emulatore PiFBA non ha la funziona pause, quindi non sarà possibile mettere in pausa i giochi Neo-Geo. Pare che esista un service mode attivabile con L+R+SELECT (vedi il readme.txt). Il tasto select lo abbiamo associato al TAB (cioè il tasto Inserisci moneta giocatore 1 di MAME), ma L+R come si ottengono?

:!: C'è un bug in PiFBA così come distribuito nell'immagine SD-Card di RetroPie 3.0: i tasti per il giocatore 2 non funzionano! Vedere questo post e quest'altro. La soluzione quick and dirty è sostituire l'eseguibile /opt/retropie/emulators/pifba/fba2x con quello che si trova a questo link.

Per riconfigurare PiFBA in modo che utilizzi la stessa logica di MAME4ALL è sufficiente editare il file /opt/retropie/configs/fba/fba2x.cfg:

[Keyboard]
# Get codes from /usr/include/SDL/SDL_keysym.h
A_1=306
B_1=308
X_1=32
Y_1=304
L_1=122
R_1=120
START_1=49
SELECT_1=53
LEFT_1=276
RIGHT_1=275
UP_1=273
DOWN_1=274
QUIT=27
#player 2 keyboard controls, disabled by default
A_2=97
B_2=115
X_2=113
Y_2=119
L_2=105
R_2=107
START_2=50
SELECT_2=54
LEFT_2=100
RIGHT_2=103
UP_2=114
DOWN_2=102

Per configurare anche GnGeo-Pi con la stessa mappa tasti di MAME basta editare il file $HOME/.gngeo/gngeorc (viene creato automaticamente alla prima esecuzione dell'emultatore) e mettere:

# Key configuration
# order : A,B,C,D,START,COIN,UP,DOWN,LEFT,RIGHT
# please see SDL_keysym.h for key definition

# MAME-like configuration for player 1
# p1: L-Ctrl,L-Alt,Space,L-Shift,1,5,up,down,left,right
p1key 306,308,32,304,49,53,273,274,276,275
p1control A=K306,B=K308,C=K32,D=K304,START=K49,COIN=K53,UP=K273,DOWN=K274,LEFT=K276,RIGHT=K275,MENU=K27

# MAME-like configuration for player 2
# p2: a,s,q,w,2,6,r,f,d,g
p2key 97,115,113,119,50,54,114,102,100,103
p2control A=K97,B=K115,C=K113,D=K119,START=K50,COIN=K54,UP=K114,DOWN=K102,LEFT=K100,RIGHT=K103,MENU=K27

MAME

Le due implementazioni di MAME presenti in Retropie 3.0 (AdvanceMAME e MAME4ALL Pi) non supportano RetroArch, quindi la configurazione del joistick/tastiera va fatta separatamente per ogni emulatore.

In realtà sono presenti due versioni di AdvanceMAME: la 0.94.0 e la 1.2. Nella configurazione predefinita si usa la 1.2 che è ottimizzata per Raspberry Pi 2. Questa impostazione può essere cambiata in /opt/retropie/configs/mame-advmame/emulators.cfg.

Le ROM vanno copiate nelle rispettive directory (compariranno due sezioni MAME nell'interfaccia di Emulation Station):

  • /home/pi/RetroPie/roms/mame-advmame/
  • /home/pi/RetroPie/roms/mame-mame4all/

Con AdvanceMAME e MAME4ALL Pi è possibile configurare gli input (tastiera/joypad) interattivamente, serve avere una tastiera collegata:

  1. Dopo aver avviato il gioco premere il tasto Tab
  2. Selezionare Input: General
  3. Evidenziare l'azione da mappare e premere Invio, quindi premere il tasto desiderato. Per aggiungere un secondo input (es. la stessa azione si esegue con un tasto della tastiera e con un pulsante del joystick): premere di nuovo Invio e quindi premere il tasto del joystick. Se si desidera rimuovere tutti gli input assegnati: premere Invio e quindi premere Esc.

Le configurazioni di AdvanceMAME 1.2 vengono salvate all'uscita del programma nel file

  • /opt/retropie/configs/mame-advmame/advmame-1.2.rc

La sintassi è documentata in doc-advmame, ecco un estratto:

input_map[coin1] keyboard[0,5] or joystick_button[0,8]
input_map[start1] keyboard[0,1] or joystick_button[0,9]
input_map[ui_cancel] keyboard[0,esc] or joystick_button[0,10]
input_map[ui_select] keyboard[0,enter] or joystick_button[0,11]
input_map[p1_button1] keyboard[0,lcontrol] or joystick_button[0,1]
input_map[p1_button2] keyboard[0,lalt] or joystick_button[0,2]
input_map[p1_button3] keyboard[0,space] or joystick_button[0,0]
input_map[p1_button5] keyboard[0,z] or joystick_button[0,6]
input_map[p1_button6] keyboard[0,x] or joystick_button[0,7]
input_map[p1_button7] keyboard[0,c] or joystick_button[0,4]
input_map[p1_button8] keyboard[0,v] or joystick_button[0,5]

Alcuni giochi richiedono una configurazione speciale (dal menu si accede a Input: This Game), in quel caso la riga di configurazione è come le precedenti, ma preceduta dal nome del romset, ad esempio lemmings/input_map[p1_trackball_left] ….

Alcuni giochi hanno dei controlli diversi dal joystick digitale: cursori, palette, trackball. Per default vengono emulati dal joystick:

input_map[p1_dial_left] keyboard[0,right] or joystick_digital[0,1,0,0]
input_map[p1_dial_right] keyboard[0,left] or joystick_digital[0,1,0,1]
input_map[p1_paddle_left] keyboard[0,right] or joystick_digital[0,1,0,0]
input_map[p1_paddle_right] keyboard[0,left] or joystick_digital[0,1,0,1]
input_map[p1_trackball_left] keyboard[0,right] or joystick_digital[0,1,0,0]
input_map[p1_trackball_right] keyboard[0,left] or joystick_digital[0,1,0,1]
input_map[p1_trackball_up] keyboard[0,down] or joystick_digital[0,1,1,0]
input_map[p1_trackball_down] keyboard[0,up] or joystick_digital[0,1,1,1]

FIXME Con AdvanceMAME e il joystick USB Lioncast Fighting Stick non si riesce ad emulare bene i controlli di tipo dial, paddle e trackball (es. nei giochi Arkanoid, Out Run e Lemmings rispettivamente). Quando il joystick viene riconosciuto come stick dall'emulatore, l'input non è usabile perché produce un movimento saltellante e non fluido, invece se viene riconosciuto come hat funziona correttamente. Per vedere come viene riconosciuto il joystick si utilizza il tool advj di MAME, per passare da una configurazione all'altra si deve riprogrammare il joypad (vedi paragrafo apposito).

Le configurazioni di MAME4ALL Pi vengono salvate in un file binario (non è un file di testo):

  • /opt/retropie/configs/mame-mame4all/cfg/default.cfg

Per cancellare le impostazioni salvate da ciascun gioco (NVRAM, record) basta svuotare le directory:

  • /opt/retropie/configs/mame-{advmame|mame4all}/{nvram|hi}

Configurazione AdvacenMAME

Una funzione desiderabile è la possibilità di uscire dall'emulatore con il solo tasto ESC, senza il menu di conferma (come già avviene in MAME4ALL Pi). Con l'interfaccia Mini-PAC abbiamo associato il codice di ESC solo alla pressione combinata dei tasti SHIFT + START 2, in modo tale che non ci sia il rischio di uscire per sbaglio.

Editare il file di configurazione /opt/retropie/configs/mame-advmame/advmame-1.2.rc e impostare:

misc_safequit no

Configurazione MAME4ALL

Le impostazioni effettuate dal menu accessibile con il tasto TAB vengono salvate nella directory /opt/retropie/configs/mame-mame4all/cfg/. Viene creato un file per ogni gioco (es. outrun.cfg) e un file con le impostazioni predefinite per tutti i giochi chiamato default.cfg. Purtroppo non si tratta di file di testo modificabili.

Tasti speciali

AdvanceMAME
F12 Salva una schermata in $HOME/.advance/snap/.
TAB Apre il menu AdvanceMame.
F1 Help tastiera.
ESC Esce dall'emulatore.
MAME4ALL
TAB Menu
LibRetro Snes9X
F1 Menu

Neo-Geo

In Retropie 3.0 sono presenti tre emulatori di Neo Geo: GnGeo-Pi, PiFBA e FBA-libretro. Per impostazione predefinita viene utilizzato PiFBA, per cambiare impostazione modificare il file /opt/retropie/configs/neogeo/emulators.cfg.

ATTENZIONE: PiFBA di RetroPie 3.0 ha un bug per cui i tasti del giocatore 2 non funzionano. Vedere sopra per una soluzione.

Qui la guida agli emulatori Neo-Geo in Retropie.

Le ROM vanno messe nella directory /home/pi/RetroPie/roms/neogeo/, per creare l'archivio di ROM si può usare Clrmamepro e il .DAT file fba_029671_clrmame_dat.zip contenuto in /opt/retropie/emulators/pifba/. In alternativa tutti i .DAT file utili per Retropie sono scaricabili qui: master.zip.

Il file di configurazione per mappare correttamente i tasti del joystick è:

  • /opt/retropie/configs/fba/fba2x.cfg

Sembra che non sia possibile mappare l'azione QUIT su un pulsante del joystick, per fortuna esiste la combinazione SELECT + START per uscire dall'emulatore.

Per chi volesse utilizzare GnGeo-Pi al posto di PiFBA, la mappatura della tastiera è in $HOME/.gngeo/gngeorc (vedi sopra).

SNES

In Retropie 3.0 per Raspberry Pi 2 si trovano diversi emulatori per la Super Nintendo Entertainment System. Alcuni di questi sono compilati insieme alla libreria Libretro il cui scopo è quello di centralizzare la mappatura dei controlli (tastiera, joystick, ecc.) e renderla disponibile a tutti gli emulatori. Gli emulatori Libretro hanno il nome che inizia per lr-.

lr-snes9x-next Versione predefinita per il Raspberry Pi 2. Basata sulla versione 11.52+ di Snes9X, con supporto LibRetro.
pisnes Basato su un porting di Snes9X 1.39 (cioè una vecchia versione) ottimizzata per Raspberry Pi.
snes9x Snes9x è un emulatore freeware e portabile su diverse piattaforme.
lr-armsnes È un fork di pocketsnes che ha l'obiettivo di sfruttare al massimo le moderne architetture Arm.
lr-catsfc
lr-pocketsnes

L'emulatore predefinito viene configurato in /opt/retropie/configs/snes/emulators.cfg.

File di configurazione

Per la configurazione dei controlli (tasti, joystick, ecc.) vedere Configurazione di RetroArch. Il file con le impostazioni è /opt/retropie/configs/all/retroarch.cfg. In particolare si è personalizzato quanto segue (per avere più o meno lo stesso comportamento dell'emulatore MAME):

input_exit_emulator = escape
input_pause_toggle = p
input_reset = nul
input_menu_toggle = f1
input_enable_hotkey = nul

Inoltre si sono disabilitati i due seguenti comandi che altrimenti erano mappati su left e right:

input_state_slot_increase = nul
input_state_slot_decrease = nul

Infatti muovendo il joystick a destra o a sinistra compariva un messaggio in sovraimpressione con la dicitura Save slot: N dove N è un numero. In quel modo si selezionava uno degli slot per il salvataggio del gioco, ma questa azione non è prevista con il nostro pannello di controllo (eventualmente si possono associare altri tasti presenti sulla tastiera). Se si vuole invece disattivare del tutto i messaggi in sovraimpressione si deve impostare video_font_enable = false.

Conviene mappare l'azione input_menu_toggle = f1 (oppure tab) in /opt/retropie/configs/all/retroarch.cfg, in modo da poter accedere al menu dell'emulatore solo con una tastiera collegata. Per salvare una schermata del gioco (screenshot): Quick Menu > Take Screenshot. L'emulatore salverà lo screenshot nella directory /home/pi/RetroPie/roms/snes/ con un nome del tipo RetroArch-0105-095130.png.

Se dal menu dell'emulatore si sceglie di salvare la configurazione corrente, viene creato il file /opt/retropie/configs/snes/snes9x_next_libretro.cfg. Tali impostazioni sono specifiche per l'emulatore lr-snes9x-next e vengono applicate dopo quelle indicate in /opt/retropie/configs/all/retroarch.cfg.

ScummVM

ScummVM è un motore per far girare alcuni tipi di giochi. È stato originariamente sviluppato per i giochi della Lucas Arts che usavano il sistema di sviluppo SCUMM, ma adesso è in grado di farne girare molti di più. In generale si tratta di avventure grafiche e quindi, a differenza di MAME che può essere utilizzato esclusivamente con il joystick, è praticamente obbligatorio utilizzare tastiera e mouse.

Durante l'esecuzione di ScummVM si possono utilizzare alcuni tasti o combinazioni, ecco le principali:

Ctrl-F5 Accede al menu di controllo.
Ctrl-Q Esci immediatamente dal gioco e dall'emulatore.
Alt-S Salva uno screenshot del gioco, viene salvato in /home/pi/.
Middle-Click Con una pressione lunga del pulsante centrale del mouse compare la tastiera virtuale.

Il motore SCUMM fu portato su diverse piattaforme tra cui Commodore 64, MS-DOS, Amiga e il potente (per quel tempo) Fujitsu Towns, una console a 32 bit chiamata FM-TOWNS Marty. In generale le caratteristiche hardware delle piattaforme sono:

Piattaforma Colori Musica
VGA/DOS 256 Tracce MIDI
V2/DOS 16
FM-TOWNS/FM-TOWNS 256 Tracce CD

L'engine ScummVM è un grado di eseguire i giochi per queste piattaforme, emulando l'hardware originale. In generale la qualità migliore è quella dei giochi per FM-Towns, con grafica VGA a 256 colori e tracce da CD-Audio (convertite in file mp3 per l'uso su questo emulatore).

Molti dei giochi SCUMM furono tradotti in varie lingue, ma in generale la ROM (in realtà i file che costituiscono il gioco) contengono una sola lingua.

I file che compongo il gioco vanno scompattati in una directory dentro /home/pi/RetroPie/roms/scummvm/, quindi - dopo aver avviato l'interfaccia ScummVM GUI - si esegue l'operazione Aggiungi gioco…. La virtual machine cerca di indovinare dai file stessi il titolo del gioco, la piattaforma hardware e la lingua, ma a volte sbaglia e i parametri vanno modificati a mano.

Dopo aver aggiunto il gioco nella GUI, viene creato un file .svm nella directory radice delle rom. Il file ha lunghezza zero ed ha un nome che è un ID univoco per titolo-piattaforma-lingua, del tipo monkey-vga-it.svm. Questo consente di aggiungere i giochi nella $HOME/.emulationstation/gamelists/scummvm/gamelist.xml e presentarli correttamente in EmulationStation.

I giochi aggiunti nella GUI vengono salvati nel file /home/pi/.scummvmrc.

Alcuni giochi contengono dei meccanismi di protezione (richiesta codici, ecc.), in alcuni casi l'emulatore è in grado di saltarli o accetta qualunque codice inserito. Vedere questo e altri dettagli sui singoli giochi nella pagina Playing a game with ScummVM.

Gestione delle ROM

Un concetto fondamentale per le ROM di MAME è che ogni versione dell'emulatore ha bisogno di uno specificio set di ROM, cioè le ROM di un determinato gioco staranno in un determinato archivio zip (ad esempio arkanoid.zip), ma il contenuto di questo archivio potrebbe essere diverso a seconda della versione di MAME a cui si riferisce. Ecco il motivo per cui si trovano collezioni di ROM del tipo ROMS.-.MAME.v0.109.full, dove 0.109 è la versione di MAME su cui quelle ROM dovrebbero funzionare.

In generale tuttavia il contenuto degli zip cambia di poco da una versione di MAME all'altra e sarebbe assurdo mantenere innumerevoli romset per ogni versione di MAME utilizzata. Questo è il motivo dell'esistenza del programma Clrmamepro, il cui principio di funzionamento è il seguente:

  1. Data una particolare versione di MAME si deve recuperare il file .DAT dei romset supportati, cioè l'elenco dettagliato di tutti i giochi, le ROM contenute in ogni gioco, i nomi dei file che le contengono, il checksum, ecc. Solitamente tale elenco si estrae direttamente dall'eseguibile di MAME con il comando mame -listxml. Alcune implementazioni più vecchie (ad esempio MAME4ALL Pi, basata sulla versione 0.37b5) supportano invece l'opzione -listinfo, che produce un file in formato diverso, ma comunque compatibile con Clrmamepro.
  2. In una directory si salvano tutti i romset disponibili, senza particolare attenzione a quale versione appartengono, se ci sono duplicati, ecc.
  3. Con le due condizioni di cui sopra è possibile ricostruire (eventualmente in modo parziale) il romset adatto alla versione di MAME che si ha a disposzione.

Il programma è per Windows, ma gira bene anche su GNU/Linux tramite emulazione Wine (verificato con la versione 4.023 a 32bit).

Questa è una buona guida introduttiva specifica per Retropie: Managing ROMs. Qui una Guida CMPRO in italiano.

Molti giochi emulati da MAME sono cloni di altri: condividono con il parent (originale) molte delle ROM e differiscono solo per alcune di esse. Quando Clrmamepro crea un romset può operare rispetto ai cloni in tre modi diversi:

Non-merged Sets Originali e cloni stanno in archivi zip separati e indipendenti. Lo svantaggio è che file zip differenti possono contenere duplicati delle stesse ROM, sprecando spazio. Tuttavia ciascun file è usabile in modo indipendente.
Split Sets Originali e cloni sono separati e non c'è duplicazione di ROM: i cloni funzionano solo se sono accompagnati dall'originale.
Merged Sets Originali e cloni sono contenuti nello stesso archivio zip. Si riduce il numero di file su disco.

La procedura seguente, da eseguire in Clrmamepro, consente di ottenere una collezione di file .zip con le ROM adatte alla versione di MAME che intendiamo usare:

  1. Avviare il programma e cliccare sul pulsante Add DatFile…, indicare il file .DAT relativo alla versione di MAME da usare. Aggiungere il file alla cartella PROFILES come suggerito. Il file compare provvisoriamente sotto la cartella NEW DATFILES.
  2. Selezionare il .DAT appena caricato e cliccare su Load / Update. Utilizzare le impostazioni di default, accettare la soluzione automatica di eventuali problemi (pulsante OK TO ALL).
  3. Cliccare su Settings, selezionare ROM-Paths dal menu a discesa e indicare una cartella nella quale ricostruire il ROMset in questione. Gli archivi in questa directory saranno eventualmente eliminati, modificati o aggiunti durante l'operazione di Scan. Inizialmente questa directory potrebbe anche essere vuota.
  4. In Settings selezionare Add-Paths e aggiungere una o più directory contenenti gli archivi zip dei ROMset. Possono contenere archivi alla rinfusa, duplicati e organizzati in sottodirectory.
  5. Sempre in Settings selezionare Sample-Paths e indicare una directory con gli archivi zip dei campioni audio (wav). ATTENZIONE il contenuto di questa directory viene alterato durante la fase di Scan: i file e gli archivi inutili vengono eventualmente rimossi.
  6. Chiudere la finestra Settings e cliccare su Scanner, eventualmente disattivare la checkbox Samples se non abbiamo una directory contenente campioni audio aggiuntivi. Analogo discorso vale per i file CHD (Compressed Hunks of Data) che sono dump di CD-ROM o hard disk, solitamente contenuti in sottodirectory il cui nome corrisponde al nome dell'archivio zip.
  7. ATTENZIONE Se si attiva la funzione di Fix, l'operazione New Scan ricostruisce i ROMset nelle ROM-Paths e gli archivi dei sample nelle Sample-Paths, ovviamente alterandone il contenuto. Non viene invece alterato il contenuto delle Add-Paths.
  8. Accertarsi che tutti i check siano attivi (soprattutto Checksum, che attiva il controllo del CRC32). Attivare tutti i fix desiderati, i più importanti sono Missing, Unneeded e Name.
  9. Cliccare New Scan…. Al termine dell'operazione una finestra riassume gli eventuali errori: archivi mancanti, ROM mancanti o errate. Chiudere la finestra Scanner.

Note su emulazione giochi

Gioco ROM Note
Track & Field trackfld.zip Funziona meglio con l'emulatore AdvanceMame: il suono è fedele e la risposta dei tasti è adeguata. Con l'emulatore MAME4All invece gli effetti sonori sono riprodotti male e non si riesce ad ottenere buoni risultati con i due tasti RUN (è impossibile superare il salto in lungo!).
Out Run outrun.zip Funziona meglio con l'emulatore MAME4All. Con AdvanceMAME gli effetti sonori sono difettosi e l'emulazione non è fluida. Attenzione ai tasti! Oltre al pulsante 1 e 2 (acceleratore e freno, rispettivamente) ci sono anche i pulsanti 3 e 4: marce basse e marce alte rispettivamente! Con le marce basse è impossibile superare i 193 km/h, cioè è impossibile completare il primo livello.
Off the Wall offtwall.zip Utilizzabile con l'emulatore MAME4All. La variante 2/3-player upright prevede due giocatori affiancati con lo schermo verticale, la versione 2-player cocktail (ROM offtwalc.zip) prevede invece due giocatori ai lati opposti dello schermo posto in orizzontale.
In ogni caso per giocare in 2 giocatori il secondo deve usare i tasti del giocatore 3, cioè le azioni Start, Up, Down, Left, Right, Action1 sono attivate dai tasti 3, I, K, J, L, RCTRL.
Quindi è opportuno, solo per questo gioco, riprogrammare i tasti scambiando quelli del giocatore 3 con quelli del giocatore 2 (che sono rispettivamente: 2, R, F, D, G, A).
Per entrare nel menu di configurazione di MAME4All premere il tasto Tab.
È opportuno anche impostare Dip SwitchesControls su Joysticks invece di Whirly-gigs (che sono i controlli analogici di Atari). Altrimenti c'è il rischio che i tasti emulino gli input analogici, con svariati problemi (inversione degli assi orizzonatale e verticale, sensibilità, ecc.).

Joypad Lioncast Fighting Stick

ATTENZIONE: Questo controller ha il difetto di presentarsi come joystick analogico, pur essendo digitale. L'emulazione in MAME quindi non è ottimale. Per un miglior funzionamento è opportuno riprogrammarlo come joystick digitale, ma la programmazione non sopravvive allo spengimento.

Si tratta di un dispositivo USB venduto come controller per PlayStation 2 e 3 oppure per PC. Viene identificato in questo modo da lsusb:

ID 0e8f:0003 GreenAsia Inc. MaxFire Blaze2

Il joypad ha due tipi di controlli: un joystick digitale a 4 posizioni e 12 pulsanti, per vedere quali codici genera è possibile lanciare il comando:

jstest /dev/input/js0

Il joystick, sebbene sia digitale, viene riportato sul bus USB come un controllo analogico con due assi, l'asse 4 (orizzontale) assume solo tre valori: -32767 con il joystick a sinistra, 0 con il joystick al centro e 32767 a destra. L'asse 5 (verticale) si comporta in maniera analoga. Anche i pulsanti sono identificati da un numero e il loro valore è OFF (rilasciato) oppure ON (premuto).

Gli assi controllati dal joystick sono configurabili: l'impostazione predefinita li associa agli assi 4 e 5 (il LED verde è acceso). Questa impostazione non è compatibile con MAME4ALL Pi; se si tenta di riprogrammare l'input (tasto TAB, ecc.) infatti l'emulatore non sente il movimento del joystick.

Per aggirare il problema è possibile riprogrammare il joypad: tenendo premuto il pulsante TURBO e premendo il tasto HOME si spenge il led verde e gli assi controllati dal joystick diventano 0 e 1. Purtroppo qusta programmazione non è permanente e va fatta ad ogni accensione o riavvio del Raspberry.

Questa è la mappatura dei controlli:

Joystick Left, Right Axis 4: -32767, 0, 32767
Joystick Up, Down Axis 5: -32767, 0, 32767
A (circle) Button 1
B (cross) Button 2
X (triangle) Button 0
Y (square) Button 3
Select Button 8
Start Button 9
L1, R1 Buttons 4, 5
L2, R2 Buttons 6, 7
L3, R3 Buttons 10, 11
doc/appunti/hardware/raspberrypi_mame_console.txt · Last modified: 2020/02/07 17:00 by niccolo