RG350 FBA mod
Versión de FBA mejorada
La modificación realizada en FBA que se describe en este artículo ya no merece la pena desde que apareció la versión que puede encontrarse aquí y del que se habla en este foro. El artículo se mantiene ya que ilustra el proceso de modificación de un OPK por medio de un script wrapper que puede resolver muchas necesidades.
Descripción del problema¶
FBA permite rotar la pantalla para poder jugar más cómodamente los juegos verticales (modo TATE). De hecho detecta automáticamente este tipo de juegos y los muestra rotados por defecto. El problema es que lo hace hacia la parte izquierda de la consola y al menos en la RG350/M resultaría más cómodo que lo hiciera hacia la derecha donde están los botones en lugar de la cruceta.
Por ejemplo al arrancar 1941 aparece así:
En la versión r19 de FBA están duplicados todos los settings para poder ajustar los juegos verticales de forma independiente:
En concreto en Default Vertical Run Game settings
podemos encontrar el parámetro para rotar la pantalla. Allí nos interesa poner el valor -180
en el parámetro Rotate vertical game
:
Tras hacerlo, si lanzamos el juego desde el interfaz propio de FBA conseguimos la orientación deseada:
Hasta aquí bien. El problema viene cuando integramos FBA en frontends como SimpleMenu o PyMenu. En esos casos el emulador se lanzará por linea de comando pasando como argumento la ruta de la ROM. Cuando se lanzan así los juegos, FBA no aplica los ajustes que hemos podido hacer en su interfaz propio. Así siempre se van a ver girados hacia la izquierda.
Como en otros artículos, a partir de aquí voy a mostrar detalles técnicos del problema que hay debajo de lo anterior y cómo se ha hecho la modificación del emulador. Si no te interesan y sólo quieres aprovechar la modificación del emulador puedes saltar hasta el apartado Utilización del mod de FBA.
Descripción técnica del problema¶
En el Readme que hay dentro del OPK puede leerse lo siguiente:
FBA SDL could be used as a standalone application when invoked with
rom zip with full path as a parameter:
./fbasdl.dge ./roms/dino.zip
Full path and extension are obligatory.
Commandline interface
---------------------
FBA SDL can also be invoked with command line options.
The options are as follows;
./fbasdl.dge <game> [<parameters>]
<game> - The game's romname with full path and extension.
--no-sound - Just be silent
--sound-sdl - Use SDL for sound (mutex syncro)
--sound-sdl-old - Use SDL for sound
--sound-ao - Use libao for sound
--samplerate=<Hz> - Valid values are: 11025, 16000, 22050, 32000 and 44100
--sense=<value> - Analog sensitivity: 0..100
--showfps - Show frames per second while play
--vsync - Syncronize video refresh on 60Hz
--68kcore=<value> - Choose Motorola 68000 emulation core.
0 - C68k, 1 - Musashi M68k, 2 - A68k
Example:
./fbasdl.dge ./roms/dino.zip --sound-sdl --samplerate=44100 --68kcore=0
Así pues como vemos, el ejecutable que hay dentro del OPK (fbasdl.dge
) está preparado para aceptar parámetros. Aquí podemos detectar dos problemas:
- El emulador sólo tiene un lanzador (fichero
.desktop
en el interior del OPK) que es el que sirve para abrir el interfaz propio de FBA. Necesitaríamos el típico lanzador que tienen la mayoría de los emuladores que muestra un explorador de ficheros para seleccionar la ROM que luego se pasa como argumento al ejecutable. - Entre las opciones que vemos en el Readme no parece estar contemplada la que sirve para rotar la pantalla.
Vamos a ocuparnos de estos problemas uno a uno.
1. Nuevo lanzador con explorer¶
Lo primero que hacemos es bajar el OPK. Vamos a partir de éste.
A continuación lo desenlatamos para ver su interior. En Windows creo que se puede utilizar WinRAR o 7Zip (no lo tengo claro). En Linux lo haremos por linea de comando:
$ unsquashfs fba-RG350-r19-8e351b8b.opk
Parallel unsquashfs: Using 4 processors
9 inodes (241 blocks) to write
[=====================================================================================================================================|] 241/241 100%
created 8 files
created 2 directories
created 0 symlinks
created 0 devices
created 0 fifos
Si miramos lo que hay en el interior del OPK vemos que efectivamente sólo contiene un lanzador:
$ ls -l
total 29972
-rw-rw-r-- 1 edumoreno edumoreno 193 ene 4 2020 default.gcw0.desktop
-rw-rw-r-- 2 edumoreno edumoreno 795 ene 4 2020 fba_icon.png
-rwxrwxr-x 1 edumoreno edumoreno 30666200 ene 22 03:50 fbasdl.dge
-rw-rw-r-- 1 edumoreno edumoreno 8819 ene 22 03:46 readme.txt
drwxrwxr-x 2 edumoreno edumoreno 4096 ene 4 2020 skin
Visualizando el fichero default.gcw0.desktop
(es un fichero de texto) el lanzador lo único que hace es ejecutar FBA sin argumentos, es decir el binario fbasdl.dge
:
[Desktop Entry]
Name=FBA-RG350
Comment=Arcade machine emulator
Exec=fbasdl.dge
Terminal=false
Type=Application
StartupNotify=true
Icon=fba_icon
Categories=emulators;
X-OD-NeedsDownscaling=true
Lo primero que haremos es renombrar el fichero para reservar el nombre default.gcw0.desktop
para el lanzador que crearemos a continuación. También cambiaremos el parámetro Name
por FBA UX
para indicar que este lanzador es el que lanza el interfaz (UX = User eXperience) propio de FBA. Así pues terminaremos con un fichero de nombre fba_ux.gcw0.desktop
y el siguiente contenido:
[Desktop Entry]
Name=FBA UX
Comment=Arcade machine emulator
Exec=fbasdl.dge
Terminal=false
Type=Application
StartupNotify=true
Icon=fba_icon
Categories=emulators;
X-OD-NeedsDownscaling=true
Ahora creamos un segundo .desktop
para ejecutar FBA como un emulador más convencional con selección previa de ROM. Crearemos un fichero de nombre default.gcw0.desktop
y el siguiente contenido:
[Desktop Entry]
Name=FBA Explorer
Comment=Arcade machine emulator
Exec=fbasdl.dge %f
Terminal=false
Type=Application
StartupNotify=true
Icon=fba_icon
Categories=emulators;
X-OD-NeedsDownscaling=true
En él vemos que el comando a ejecutar tiene previsto el argumento %f
donde se insertará el fichero de la ROM seleccionada con el explorador de ficheros.
Una vez hechos estos cambios volvemos a enlatar el OPK. En Linux lo haremos con el siguiente comando:
$ mksquashfs squashfs-root/ fba-RG350-r19-mod.opk -all-root -noappend -no-exports -no-xattrs
Si sustituimos el OPK original instalado en la consola por el que acabamos de re-ensamblar con el comando anterior, veremos que ahora nos aparecen dos lanzadores en GMenu2X:
El que tiene la etiqueta FBA UX
se comportará como el original y el nuevo FBA Explorer
mostrará un explorador de ficheros como la mayoría de los emuladores:
Con esto tendríamos resuelto el primer problema dado que ahora launchers como SimpleMenu, PyMenu o EmulationStation podrán integrar este OPK modificado de FBA para ejecutar los juegos.
2. Localizar opción para rotar pantalla¶
El segundo problema podía no haber tenido solución pero hubo suerte. Como veíamos, según el Readme no parecía haber un parámetro que permitiera controlar la rotación de la pantalla por linea de comando. A pesar de ello echando un vistazo al código fuente de FBA encontramos la siguiente estructura en el fichero src/sdl-dingux/main.cpp:
static struct option long_opts[] = {
{"sound-sdl-old", 0, &options.sound, 3},
{"sound-sdl", 0, &options.sound, 2},
{"sound-ao", 0, &options.sound, 1},
{"no-sound", 0, &options.sound, 0},
{"samplerate", required_argument, 0, 'r'},
{"frameskip", required_argument, 0, 'c'},
{"vsync", 0, &options.vsync, 1},
{"scaling", required_argument, 0, 'a'},
{"rotate", required_argument, 0, 'o'},
{"hwscaling", required_argument, 0, 'h'},
{"sense", required_argument, 0, 'd'},
{"showfps", 0, &options.showfps, 1},
{"no-showfps", 0, &options.showfps, 0},
{"create-lists", 0, &options.create_lists, 1},
{"68kcore", required_argument, 0, 's'},
{"z80core", required_argument, 0, 'z'},
};
Esto parece indicar que hay más opciones sin documentar en el Readme. Así pues sin revisar más a fondo el código, haciendo una prueba incorporando la opción rotate
al .desktop
de tipo Explorer se comprueba que es efectiva. Concretamente lo que hay que añadir al comando de ejecución es:
Exec=fbasdl.dge %f --rotate=2
El valor 2 se obtiene de observar el valor que toma el parámetro FBA_ROTATE
en los ficheros que aparecen en /media/data/local/home/.fba/configs
y que son los que aplican cuando ejecutamos los juegos desde el interfaz propio de FBA (FBA UX
).
Ya sabemos cómo podemos indicar por linea de comando cómo rotar la pantalla. Ahora tenemos un último problema y es que este parámetro sólo nos interesa para los juegos en vertical. Si ponemos este argumento en los juegos horizontales, veremos la pantalla de esta forma:
Una opción sería crear un tercer .desktop
con la opción (dejando el que hemos creado antes sin la opción) y utilizar ese lanzador para los juegos verticales pero esto nos obligaría a separar en secciones distintas los juegos verticales de los horizontales en los frontends como SimpleMenu. La solución por la que se ha optado aquí es intercalar un pequeño script que analice si el juego es vertical o no y en función de eso aplique la opción --rotate=2
o no. La forma de averiguar si el juego es vertical será declarándolo en un pequeño fichero de texto en el directorio de las ROMs.
Lo primero que haremos será modificar el default.gcw0.desktop
para que en lugar de ejecutar el binario del emulador directamente se ejecute un pequeño script:
[Desktop Entry]
Name=FBA Explorer
Comment=Arcade machine emulator
Exec=v_detector.sh %f
Terminal=false
Type=Application
StartupNotify=true
Icon=fba_icon
Categories=emulators;
X-OD-NeedsDownscaling=true
Finalmente incorporaremos dentro del OPK el script que discrimina los juegos verticales como hemos comentado. Su nombre será v_detector.sh
y su contenido el siguiente:
#!/bin/sh
V_GAMES_FILE=$(dirname "$1")/vertical_games.txt
if [ -f "$V_GAMES_FILE" ]
then
V_GAME_NAME=$(basename "$1")
if grep -q $V_GAME_NAME $V_GAMES_FILE
then
./fbasdl.dge $1 --rotate=2
else
./fbasdl.dge $1
fi
else
./fbasdl.dge $1
fi
No hay que olvidarse de dar permiso de ejecución (+x
) al script anterior.
$ chmod +x v_detector.sh
Con todos estos cambios, volvemos a empaquetar el OPK como hemos visto antes:
$ mksquashfs squashfs-root/ fba-RG350-r19-mod.opk -all-root -noappend -no-exports -no-xattrs
Lo instalamos en la consola y a partir de ahora sólo tendremos que incluir el nombre del fichero de la ROM (extensión .zip
incluida) en un fichero de nombre vertical_games.txt
en el mismo directorio donde se encuentren las ROMs. Por ejemplo algunos de los juegos candidatos a encontrarse en este listado son:
1941.zip
19xx.zip
dimahoo.zip
mercs.zip
varth.zip
Utilización del mod de FBA¶
Vamos a dar instrucciones para utilizar el emulador FBA modificado a lo largo de este artículo.
Una versión empaquetada con todas las modificaciones ya hechas puede descargarse de aquí.
Una vez instalado en la consola, veremos que ahora aparecen dos lanzadores (al menos en GMenu2X):
El lanzador FBA UX
se comporta como el habitual, es decir muestra el interfaz propio de FBA donde podemos hacer el ajuste de la rotación de la pantalla (y muchos otros) antes de lanzar los juegos. El nuevo FBA Explorer
será el que nos permitirá seleccionar la ROM por medio del explorador de archivos de GMenu2X, de la misma forma que hacen la mayoría de los emuladores:
Si queremos que el juego rote la pantalla -180º para que se puedan utilizar los controles de la parte derecha de la pantalla, sólo tendremos que crear un fichero de texto de nombre vertical_games.txt
en el mismo directorio donde se encuentren las ROMs, e incorporar a él los nombres de las ROMs que queramos girar, uno por línea y con la extensión .zip
incluida. Por ejemplo:
Si todo va bien, al ejecutar uno de estos juegos desde FBA Explorer
o desde SimpleMenu veremos lo siguiente y podremos utilizar los controles de la parte derecha de la consola: