Questa breve premessa è in realtà la sintesi di un post che ho scritto sempre qui su Arcade Italia il 05/12/2016.
Fino a qualche tempo fa l'emulazione su Raspberry era, a mio giudizio, piuttosto inconsistente a causa di due limiti tecnici non da poco: la scarsa potenza di calcolo e l'assenza di un'uscita video analogica di qualità (a meno di ricorrere ad adattatori che, oltre ad introdurre lag, invalidavano la compattezza, praticità e convenienza del Raspberry rispetto ad altre piattaforme). Un esempio è proprio questo.
Oggi tuttavia la situazione è radicalmente cambiata: la terza incarnazione del Raspberry Pi sembra finalmente avere la potenza di calcolo necessaria per emulare bene gran parte dei classici arcade fino ai primi anni '90, in alcuni casi anche con shaders e "optional" vari.
Per quanto riguarda l'uscita analogica, ci sono state di recente alcune "tappe evolutive" davvero fondamentali:
- il progetto Gert's VGA 666: una piccola scheda che, collegata alla porta GPIO del Raspberry, è in grado di fornire un segnale VGA diretto, ovvero un segnale video analogico in qualità RGB privo di lag!
- un binomio "esplosivo" di nuove funzionalità del firmware: la possibilità di creare delle modalità video non standard e addirittura di attivarle e modificarle "al volo".
Alla concreta possibilità di avere, oggi, un'emulazione pixel-perfect anche su Raspberry Pi (fino ad ora prerogativa di alcuni PC dotati di schede video opportunamente modificate). E non solo.
AdvanceMAME girava già piuttosto bene su Raspberry Pi 3, ma su PC era anche in grado di replicare precisamente le modalità video di ciascuna ROM emulata. Qualche tempo fa mi sono chiesto: perché non provare a contattare Andrea Mazzoleni (sviluppatore del progetto Advance) per informarlo di queste novità in ambito Raspberry? L'ho fatto, e il buon Andrea non solo non mi ha (ancora) denunciato per stalking, ma dopo una piacevole corrispondenza oggi con AdvanceMAME offre il pieno supporto al Raspberry Pi anche per la generazione delle modalità video pixel-perfect!
"Allora, bando alle ciance e dicci come fare!"
OK, lasciatemi solo dire però che il testo che segue include operazioni sul cui esito non mi assumo alcuna responsabilità.

Perché il pixel-perfect?
Fatte le (doverose) premesse, ricordo quindi che il fine ultimo di questa guida è quello di compilare, installare e far girare su Raspberry Pi 3 l'ultima versione di AdvanceMAME con una configurazione tale da consentire, su TV catodico o monitor arcade, la replica di modalità video con risoluzione e refresh identici (o il più possibile fedeli) a quelle delle schede JAMMA originali. Ciò significa, ad esempio, fare in modo che sul Raspberry collegato a un TV catodico, la ROM Bad Dudes vs Dragon Ninja sia emulata in AdvanceMAME con risoluzione (256x240), profondità di colori, proporzioni e "velocità" (57.410000 Hz) esattamente corrispondenti a quelle della scheda JAMMA reale. Qualora non sia possibile replicare una determinata modalità video (ad esempio perché non supportata dal nostro TV) AdvanceMAME ne creerà automaticamente una il più possibile simile.
I vantaggi di questa soluzione rispetto ad un PC con ArcadeVGA potranno anche essere soggettivi (consumi, dimensioni, silenziosità ecc.) ma, date le dimensioni ridotte del Raspberry, finalmente è lecito sognare un bartop a tubo catodico in grado di riprodurre quasi alla perfezione il feeling da sala giochi.

La modalità video della scheda JAMMA di "Bad Dudes vs Dragon Ninja" è 256x240 (H) 57.410000 Hz

...e la modalità video generata da AdvanceMAME sul mio Raspberry collegato al TV catodico è esattamente la stessa!

Componenti
- Raspberry Pi 3 con tastiera e alimentatore
- scheda micro-SD da almeno 4Gb
- Gert's VGA 666
- cavo VGA > SCART
- TV a tubo catodico con ingresso SCART RGB, preferibilmente multistandard (PAL 50Hz e NTSC 60Hz) o monitor arcade
- PC (o Mac) con lettore di schede micro-SD (solo per la prima configurazione)
- Monitor con ingresso HDMI (solo per la prima configurazione)
Prima di iniziare
- Questa guida è aggiornata per Raspbian Stretch LITE e AdvanceMAME 3.5.
- Utilizzare la linea di comando per le operazioni descritte in questa guida potrebbe sembrare complicato per un utente alle prime armi, ma è un'ottima occasione per apprendere le basi di Linux (e Debian, una delle sue distribuzioni più diffuse, da cui è derivato lo stesso sistema operativo Raspbian); cercherò nei limiti del possibile di spiegare anche i comandi di base come il login, l'utilizzo del prompt ecc. ma il consiglio comunque è quello di partire da un'installazione pulita e di fare in piena libertà tutte le prove necessarie. Le operazioni descritte nella guida sono tutto sommato semplici e piuttosto brevi, a renderla "lunga" sono soprattutto i commenti, finalizzati però sia a prevenire (nei limiti del possibile) eventuali problemi, sia a spiegare davvero quello che stiamo facendo: dai un pesce a un uomo e lo nutrirai per un giorno; insegnagli a pescare e lo nutrirai per tutta la vita.
- In ambito Linux (e quindi Raspberry) è frequente compilare il codice sorgente per ottenere l'eseguibile di un programma; dunque anche se sul sito ufficiale è disponibile l'eseguibile di AdvanceMAME, ho preferito ignorarlo descrivendo anche la procedura di compilazione dei sorgenti, dato che potrebbe tornarvi utile in futuro (magari anche per altri progetti). Naturalmente tutte le operazioni di configurazione restano invariate.
- Raspberry Pi 3 richiede un alimentatore micro-USB in grado di erogare 5V e 2.5A per funzionare correttamente. Prima di acquistarlo, verifichiamo se in casa ce n'è già uno (magari di un tablet o di uno smartphone) con le stesse caratteristiche. Utilizzare un alimentatore di potenza inferiore potrebbe causare problemi: se durante le operazioni sul monitor in alto a destra dovesse apparire l'icona di un fulmine giallo, significherà che il Raspberry Pi 3 è sottoalimentato (e che potrebbe riavviarsi inavvertitamente!).
Installazione, configurazione e aggiornamento di Raspbian LITE
Scarichiamo il sistema operativo Raspbian in versione LITE dal sito ufficiale: https://www.raspberrypi.org/downloads/raspbian/.
Decomprimiamo l'archivio ZIP: all'interno troveremo l'immagine ISO.
Scriviamo (NON copiamo) l'immagine ISO sulla nostra scheda micro-SD: esistono vari software per tale scopo su Windows, Mac o Linux; possiamo fare riferimento al paragrafo WRITING AN IMAGE TO THE SD CARD in questa pagina della documentazione ufficiale.
Colleghiamo il Raspberry ad Internet: il collegamento cablato, che consiglio a chi è alle prime armi, non dovrebbe richiedere configurazioni particolari (mentre per il WiFi bisogna armeggiare un po'). Siamo pronti per il primo avvio: inseriamo la scheda SD con il sistema operativo nel Raspberry e colleghiamo tastiera (niente mouse), monitor HDMI ed alimentatore. Il Raspberry si accenderà e vedremo scorrere la sequenza di boot del sistema operativo Raspbian.

Dopo questa sequenza in perfetto stile "Matrix" ci verrà chiesto di effettuare l'accesso tramite username (pi) e password (raspberry).
Al primo avvio è buona prassi ricorrere all'utility raspi-config per espandere il filesystem, configurare la tastiera italiana ed impostare data e ora (per non incorrere in anomalie di aggiornamento o compilazione). Quindi come indicato nella documentazione ufficiale di raspi-config digitiamo
Codice: Seleziona tutto
sudo raspi-config
La prima cosa da fare è espandere il filesystem per sfruttare tutto lo spazio disponibile sulla scheda SD: per fare ciò selezioniamo l'opzione EXPAND FILESYSTEM e seguiamo le istruzioni.
Conviene poi impostare il layout della tastiera italiana, altrimenti sarà quasi impossibile lavorare correttamente: selezioniamo INTERNATIONALISATION OPTIONS > CHANGE KEYBOARD LAYOUT e seguiamo tutte le istruzioni a monitor.
Verifichiamo infine che la data e l'ora del Raspberry siano corrette in INTERNATIONALISATION OPTIONS > CHANGE TIMEZONE.
Ora usciamo dal programma (pulsante Finish a fondo pagina) e, qualora non ci venga proposto, riavviamo il Raspberry con
Codice: Seleziona tutto
sudo reboot
Effettuato nuovamente l'accesso, prima di proseguire è bene verificare se vi sono aggiornamenti importanti per il sistema operativo o i suoi componenti. Per questo digitiamo
Codice: Seleziona tutto
sudo apt-get update
Codice: Seleziona tutto
sudo apt-get upgrade
ATTENZIONE - AGGIORNAMENTO DEL FIRMWARE: per generare e cambiare "al volo" le modalità video (il fine principale di questa guida) AdvanceMAME ha bisogno che il firmware del Raspberry sia aggiornato. Effettuare questa operazione è piuttosto semplice ma si tratta anche dell'unica vera parte "rischiosa" del procedimento, che una volta avviata NON dovrà essere interrotta. Per aggiornare il firmware si usa l'utility rpi-update digitando
Codice: Seleziona tutto
sudo rpi-update
Lanciamo quindi
Codice: Seleziona tutto
sudo reboot
Se siete arrivati fin qui senza fare danni: congratulazioni, ve la state cavando bene.

Iniziamo davvero: compilazione ed installazione di AdvanceMAME (e AdvanceMESS e AdvanceMENU)
Installiamo innanzitutto gli strumenti necessari per il download e la compilazione del codice sorgente di AdvanceMAME sul nostro Raspberry, facendo attenzione a digitare correttamente tutti i nomi dei vari pacchetti (git, autoconf ecc.) seguiti da un carattere di spazio:
Codice: Seleziona tutto
sudo apt-get install git autoconf automake libsdl2-dev libasound2-dev libfreetype6-dev zlib1g-dev libexpat1-dev libslang2-dev libncurses5-dev
Finita l'installazione, possiamo finalmente procedere con il download del codice sorgente di AdvanceMAME direttamente dal repository GitHub ufficiale, utilizzando lo strumento git che abbiamo appunto installato poc'anzi:
Codice: Seleziona tutto
git clone https://github.com/amadvance/advancemame.git
Codice: Seleziona tutto
cd advancemame
Innanzitutto lanciamo lo script che predispone automaticamente il file di configurazione necessario per la compilazione dei sorgenti sul nostro Raspberry:
Codice: Seleziona tutto
sh autogen.sh
Codice: Seleziona tutto
./configure
Codice: Seleziona tutto
make -j3
Se la compilazione è andata a buon fine, ad un certo punto vedremo il prompt lampeggiare senza particolari messaggi di errore. Ciò significa che nella cartella dei codici sorgenti sono stati creati i file binari di AdvanceMAME, AdvanceMESS e AdvanceMENU che possono essere eseguiti sul nostro Raspberry (equivalenti ai .EXE su DOS o Windows, per intenderci).
Lanciamo ora lo script di installazione, che copierà tutti i file eseguibili nelle cartelle giuste per far funzionare tutto correttamente.
Codice: Seleziona tutto
sudo make install
Codice: Seleziona tutto
cd ..
advmame robby

Configurazione di AdvanceMAME per il pixel-perfect (ovvero: dove avviene la magia)
È arrivato il momento di specificare il tipo di monitor (TV o arcade) utilizzeremo, affinché AdvanceMAME possa sapere entro quali limiti tecnici (risoluzione, refresh ecc.) dovrà attenersi per la somministrazione delle modalità video il più possibile fedeli a quelli delle schede originali.

a) se utilizziamo un TV catodico con cavo VGA-SCART
Se vogliamo utilizzare il Raspberry con AdvanceMAME su un vecchio televisore a tubo catodico, sarà preferibile selezionare manualmente prima tutte le modalità video effettivamente supportate dal nostro TV: tra queste AdvanceMAME proporrà poi automaticamente quella migliore per la ROM emulata, variando se necessario risoluzione orizzontale e clock al fine di garantire l'esperienza visiva più fedele possibile.
Entriamo nella cartella nascosta di configurazione di AdvanceMAME
Codice: Seleziona tutto
cd .advance
Codice: Seleziona tutto
sudo nano advmame.rc
Codice: Seleziona tutto
device_video_clock 4-100 / 15-16 / 50-60
Codice: Seleziona tutto
display_adjust xclock
Codice: Seleziona tutto
sudo poweroff
Rimuoviamo la scheda micro-SD dal Raspberry e colleghiamola al nostro PC. Si apriranno due volumi:
- per uno dei due, Windows (non riconoscendo il filesystem di Linux) chiederà la formattazione: noi ovviamente NON procederemo, e da bravi ragazzi cliccheremo su ANNULLA.
- sull'altra partizione della scheda SD, perfettamente leggibile in Windows (o Mac) troveremo il file di configurazione principale chiamato config.txt.
Apriamolo con un editor di testo (meglio con Notepad++ o BBedit) ed alla fine del file aggiungiamo
Un momento, ma che stiamo facendo?Codice: Seleziona tutto
device_tree=bcm2710-rpi-3-b.dtb dtparam=i2c_arm=off dtparam=i2s=off dtparam=spi=off dtparam=uart0=off dtparam=uart1=off dtoverlay=vga666 enable_dpi_lcd=1 display_default_lcd=1 hdmi_timings=320 1 20 30 35 204 1 12 12 16 0 0 0 60 0 6400000 1 dpi_group=2 dpi_mode=87
Semplificando: con le prime 6 righe "liberiamo" i pin del connettore GPIO del Raspberry dalle altre risorse, per consentire alla scheda VGA 666 di funzionare correttamente; il comando dtoverlay=vga666 ne abilita il driver e le successive due righe lo impostano come periferica video principale.
Le ultime tre righe sono molto importanti: con hdmi_timings impostiamo un modo video "personalizzato" di 240p che ci consentirà di vedere correttamente il Raspberry sul TV catodico, mentre con le successive diciamo al Raspberry di utilizzare il modo video personalizzato che abbiamo creato poco sopra.
Queste funzionalità video avanzate sono state introdotte solo di recente (vabé, ormai quasi un annetto fa, comunque al tempo della creazione del mio topic) e per questo richiedono che il firmware del Raspberry sia un minimo aggiornato per funzionare.
Vedete come tutto torna? Proseguiamo!
Se tutto è filato liscio, dovremmo vedere la sequenza di accensione del Raspberry sul canale AV-1 del nostro televisore!
Ci siamo quasi, dobbiamo fare un'ultima configurazione di AdvanceMAME: sul TV sarà un po' scomodo, ma in questo caso non abbiamo alternative.
Dopo il login apriamo l'utility di configurazione dei modi video di AdvanceMAME digitando
Codice: Seleziona tutto
advv
Ci ritroveremo davanti ad un lungo elenco di modalità video (tutte quelle possibili su AdvanceMAME): le modalità indicate in rosso saranno certamente NON supportate dal nostro TV e per questo le potremo ignorare, mentre quelle in blu dovrebbero essere supportate (sulla base dei valori di massima impostati con l'opzione device_video_clock nel file di configurazione dell'emulatore, ricordate?). Spostandoci dunque con i tasti direzionali (frecce) su uno dei modi video supportati, con il tasto INVIO vedremo "la magia": il Raspberry cambierà risoluzione (e refresh rate) al volo riproducendo la modalità video selezionata, lasciandoci anche la possibilità di centrare un minimo l'inquadratura con le frecce direzionali. Un altro INVIO salverà le impostazioni per tale modalità.
Ritornati all'elenco principale, selezioniamo (spuntiamo) con la BARRA SPAZIATRICE la modalità appena testata, marcandola come effettivamente valida e funzionante sul nostro televisore.
È molto importante ripetere queste operazioni per OGNI modalità video supportata dal nostro TV: più modalità avremo prima testato e poi selezionato, migliore sarà la resa a schermo con le varie ROM (perché AdvanceMAME avrà più scelta nella proposizione della modalità video più adeguata). Prendiamoci dunque tutto il tempo necessario per effettuare queste operazioni con calma!
Al termine premiamo il tasto F2: in questo modo salveremo l'elenco di tutte le modalità video selezionate e supportate dalla nostra configurazione, dando appunto ad AdvanceMAME la possibilità di "attingervi" per proporre, a seconda della ROM caricata, quella più fedele al gioco originale (con gli opportuni aggiustamenti di risoluzione orizzontale e clock, come dichiarato prima nel file di configurazione con l'opzione display_adjust xclock).
Ritornati al prompt digitiamo nuovamente
Codice: Seleziona tutto
advmame robby

b) se siamo felici possessori di un cabinato con monitor arcade
Se intendiamo utilizzare il Raspberry all'interno di un cabinato e quindi su un vero monitor arcade, non sarà necessario selezionare manualmente prima le modalità video supportate, ma potremo lasciare che sia direttamente AdvanceMAME a generarle al volo.
Finalmente è arrivato il momento di collegare il Raspberry al monitor! Spegniamo il Raspberry con
Codice: Seleziona tutto
sudo poweroff
Rimuoviamo la scheda micro-SD dal Raspberry e colleghiamola al nostro PC. Si apriranno due volumi:
- per uno dei due, Windows (non riconoscendo il filesystem di Linux) chiederà la formattazione: noi ovviamente NON procederemo, e da bravi ragazzi cliccheremo su ANNULLA.
- sull'altra partizione della scheda SD, perfettamente leggibile in Windows (o Mac) troveremo il file di configurazione principale chiamato config.txt.
Apriamolo con un editor di testo (meglio con Notepad++ o BBedit) ed alla fine del file aggiungiamo
Un momento, ma che stiamo facendo?Codice: Seleziona tutto
device_tree=bcm2710-rpi-3-b.dtb dtparam=i2c_arm=off dtparam=i2s=off dtparam=spi=off dtparam=uart0=off dtparam=uart1=off dtoverlay=vga666 enable_dpi_lcd=1 display_default_lcd=1 hdmi_timings=320 1 20 30 35 204 1 12 12 16 0 0 0 60 0 6400000 1 dpi_group=2 dpi_mode=87
Semplificando: con le prime 6 righe "liberiamo" i pin del connettore GPIO del Raspberry dalle altre risorse, per consentire alla scheda VGA 666 di funzionare correttamente; il comando dtoverlay=vga666 ne abilita il driver e le successive due righe lo impostano come periferica video principale.
Le ultime tre righe sono molto importanti: con hdmi_timings impostiamo un modo video "personalizzato" di 240p che ci consentirà di vedere correttamente il Raspberry sul TV catodico, mentre con le successive diciamo al Raspberry di utilizzare il modo video personalizzato che abbiamo creato poco sopra.
Queste funzionalità video avanzate sono state introdotte solo di recente (vabé, ormai quasi un annetto fa, comunque al tempo della creazione del mio topic) e per questo richiedono che il firmware del Raspberry sia un minimo aggiornato per funzionare.
Vedete come tutto torna? Proseguiamo!
Se tutto è filato liscio, dovremmo vedere la sequenza di accensione del Raspberry sul nostro monitor!
Ci siamo quasi, dobbiamo fare un'ultima configurazione di AdvanceMAME: invece di inserire le frequenze-limite manualmente (come faranno i possessori di TV multistandard per "spingere" il più possibile) possiamo ricorrere direttamente all'utility
Codice: Seleziona tutto
advcfg
Selezioniamo il tipo di monitor arcade in nostro possesso e seguiamo le istruzioni a video.
Potremo fare riferimento ai valori standard per le varie tipologie di monitor arcade (15 kHz, 16 kHz, 25 kHz o 31.5 kHz) oppure inserire manualmente (opzione custom) all'interno del programma l'intervallo di frequenze supportate dal nostro monitor (in tal caso consultiamo le specifiche tecniche sul manuale).
Al termine, advcfg inserirà automaticamente nel file di configurazione advmame.rc le frequenze del monitor arcade e l'opzione display_adjust generate_yclock. Come anticipato, questa opzione farà sì che sia direttamente AdvanceMAME a generare automaticamente la modalità video più fedele a quella originale ("generate"), adattando, se proprio necessario, la risoluzione verticale ("y") e poi il refresh ("clock").
(Naturalmente è possibile adottare questo stesso approccio anche sul TV catodico, ma sulla base della mia esperienza la preselezione manuale di tutte le modalità video supportate porta a risultati più efficaci per i televisori).
Ritornati al prompt digitiamo nuovamente
Codice: Seleziona tutto
advmame robby
