Emulador de NES FCE Ultra (y otros) al 100%

emulador-de-nes-fce-ultra-y-otros-al-100

src="http://www.linux-bg.org/data_images/games/nes.gif">

Hace tiempo escribí aquí como instalar y configurar el
emulador de NES FCE Ultra pero
en los últimos años ha tenido muchos avances y
modificaciones además de que he aprendido algunos trucos para
sacarle el máximo rendimiento posible. Quiero compartir estos
trucos porque es un tanto dificil encontrar información sobre
esto y la que hay es muy confusa, así se ahorrarán
bastantes dolores de cabeza a los que quieran usar este emulador.

FCE Ultra es un emulador de style="font-weight: bold;">NES (Nintendo Entertainment System)
libre que se puede ejecutar en múltiples plataformas, su
principales características son que posee una gran fidelidad
para emular los juegos, tiene sonido, una velocidad de ejecución
decente (cuando esta bien configurado), permite jugar a pantalla
completa y puede emular la gran mayoría de los juegos que
salieron para ese sistema, incluso los mas avanzados
gráficamente como kirby’s
adventure
.

Definitivamente es el mejor emulador de style="font-weight: bold;">NES que podemos encontrar en linux y
tal vez en cualquier otra plataforma. Lamentablemente el proyecto
murió pero la última versión que salió es
bastante buena y fue la href="http://www.zophar.net/unix/nes.html">0.98.12, la
página del proyecto también desaparecio pero aún
es posible bajarlo de otros lugares como zophar’s domain ( target="_blank" href="http://www.zophar.net/">www.zophar.net).

En esta versión el emulador ya no utiliza style="font-weight: bold;">svgalib sino la librería SDL
que es algo así como el DirectX de windows pero libre y
multiplataforma, así que hay que tener instalado SDL para poder
usar FCE Ultra. La
instalación de FCEU es
muy sencilla, en caso de bajarlo en forma de código fuente se
compila con el clásico:

cellpadding="2">
style="vertical-align: top; background-color: rgb(192, 192, 192);">$
./configure
$ make
$ make install

El último paso es opcional y recomiendo compilarlo con
optimizaciones exportando la variable CFLAGS, yo utilizo una muy
básica:

cellpadding="2">
style="vertical-align: top; background-color: rgb(192, 192, 192);">$
export CFLAGS=”-O2 -march=athlon”


Pero esto ya es al gusto de cada quien, los gentooseros saben mucho de
CFLAGS.

Luego viene la parte interesante, con lo que me estuve peleando durante
semanas, y era que corría demasiado lento y al correrlo en
fullscreen no ocupaba toda la pantalla y de pronto el sonido se
desincronizaba. Lo de la lentitud lo solucioné parcialmente
corriéndolo con la opción style="font-style: italic;">-soundq 0 que es para la calidad
del sonido, en este caso calidad “baja”, aunque en realidad se escucha
bien. Pero aún no corría suficientemente rápido,
después de investigar un poco me enteré que SDL tiene
varios drivers de video, por default utiliza el style="font-weight: bold;">x11 que es un poco lento porque los
gráficos pasan a través de unos buffers del servidor X,
pero hay otro llamado DGA (Direct Graphics Access) que es una
extensión del servidor X que permite a ciertas aplicaciones
comunicarse directamente con la tarjeta de video.

Para habilitar este modo hay que exportar la variable style="font-style: italic;">SDL_VIDEODRIVER asi:

cellspacing="2">
$ export
SDL_VIDEODRIVER=dga


Quiero hacer notar que esto afectará a todas las aplicaciones
que utilicen SDL al correrlas desde la shell donde estemos trabajando,
si alguna no corre bien bastará con volver a exportar la
variable poniendo x11 en vez
de DGA. Otro problema con DGA es que parece que no funciona bien cuando
esta habilitada la aceleración 3D, pero si tenemos una tarjeta
de video con esta característica no necesitamos DGA.

style="width: 264px; height: 273px;" alt=""
src="http://membres.lycos.fr/emulcenternet/images/emulation/fce_ultra.jpg">

Para que funcione el driver dga de SDL hay que correr el style="font-weight: bold;">FCEU como root o bien activar el bit
suid para ejecutarlo con privilegios de root con cualquier usuario asi:

style="font-style: italic;">

cellpadding="2">
style="vertical-align: top; background-color: rgb(192, 192, 192);">$
chown root fceu
$ chmod +s fceu

Otra forma sería por medio de
sudo
pero esta es la más rápida (y la mas
insegura), yo utilizo un grupo y activo permisos de ejecución
solo para ese grupo desactivando todos los demás permisos para
los otros usuarios, pero aún así la forma mas seguro es a
través de sudo. Luego
viene el problema de la pantalla, muchas veces al ejecutar style="font-weight: bold;">FCEU el juego no ocupa toda la
pantalla sino que aparece dentro de una pequeña pantalla
centrada y bordes negros alrededor. Este problema es debido a las
resoluciones soportadas por X.org
o XFree86 y se soluciona
poniendo lo que se conoce como un “ModeLine”.

Los ModeLines dependen del monitor (al menos con monitores CRT) y
consisten en una serie de numeros, estos números se calculan por
medio de algún programa, hay muchos de ellos pero mi
método preferido es utilizar la página href="http://xtiming.sourceforge.net/">xtiming.sourceforge.net
para generar ModeLines, los datos que nos pide los podemos sacar del
manual del monitor o bien del log de X.org o XFree86. Para obtener
estos datos de X.org o XFree86 hay que tener habilitada la
extensión ddc en el archivo de configuración respectivo
que está en /etc/X11 y
se llama XF86Config o
XF86Config-4 en el
caso de XFree86 y xorg.conf
en el caso de X.org. Esto se ve mas o menos asi:

cellspacing="2" cellpadding="2">
style="vertical-align: top; background-color: rgb(192, 192, 192);">Section “Module”
   Load “ddc”
   Load “freetype”
   Load “extmod”
   Load “glx”
   Load “glcore”
   Load “dri”
   Load “dbe”
   Load “xtrap”
EndSection

style="font-style: italic;">
Lo importante es que tenga la línea style="font-weight: bold;"> Load “ddc”, la extensión style="text-decoration: underline;">ddc sirve para detectar
ciertos parámetros del monitor como frecuencia de refresco
horizontal y vertical pero con algunas tarjetas de video no funciona
muy bien, si tu escritorio te está dando muy baja
resolución seguramente es porque ddc no está adivinando
los valores correctos del monitor y tendrás que sacarlos del
manual o investigar en internet.

Ahora corremos de nuevo el servidor X ya con style="text-decoration: underline;">ddc habilitado para ver los
datos del log o si ya estaba habilitado el ddc desde antes no
será necesario y nos vamos directamente a ver el archivo style="font-style: italic;">/var/log/XFree86.0.log o style="font-style: italic;"> /var/log/Xorg.0.log. Ahí
vamos a encontrar unas líneas que dicen mas o menos esto
(será diferente según el monitor y la tarjeta de video):

cellspacing="2" cellpadding="2">
style="vertical-align: top; background-color: rgb(192, 192, 192);">(II)
TRIDENT(0): Monitor name: Acer V551
(II) TRIDENT(0): Serial No: 11274
(II) TRIDENT(0): Ranges: V min: 50 V max: 120 Hz, H min: 30 H max: 54
kHz, Pix Clock max 60 MHz

De estos datos lo que nos interesa son los rangos (Ranges) verticales
(V min y V max), los horizontales (H min y H max) y el Pix Clock, que
son precisamente los datos que nos piden en la página
xtiming.sourceforge.net, también nos piden otros datos pero se
pueden dejar en blanco, excepto la resolución. La
resolución de un NES real, si no me equivoco, es de 256×240
pixeles pero esa es una resolución que no todos los monitores
soportan ya que es demasiado baja, así que para mantener la
proporción utilizo una resolución de 512×480.

Después de meter los datos del monitor en el style="font-weight: bold;">xtiming no arrojará una
línea parecida a esta:

cellspacing="2" cellpadding="2">
style="vertical-align: top; background-color: rgb(192, 192, 192);">ModeLine
“512×480″ 37.7 512 536 656 704 480 482 494 520

Esa línea hay que copiarla al style="text-decoration: underline;">XF86Config o style="text-decoration: underline;">xorg.conf en la seccion
“Monitor” y quedará algo parecido a esto:

cellspacing="2" cellpadding="2">
style="vertical-align: top; background-color: rgb(192, 192, 192);">Section
“Monitor”
   #HorizSync 31.5 – 48.5
   #VertRefresh 50.0 – 70.0
   ### Uncomment if you don’t want to default to DDC:
   HorizSync 30.0 – 54.0
   VertRefresh 50.0 – 120.0
   Identifier “Monitor0″
   DisplaySize 283 212
   ModeLine “512×480″ 37.7 512 536 656 704 480 482 494
520
   Option “dpms”
EndSection

De ahí lo único importante para nosostros es insertar la
línea de ModeLine.

Otro problema que a veces surge con FCEU
es que a veces el sonido se distorsiona, esto no lo he podido
solucionar del todo, pero parece que se arregla o por lo menos tarda
mucho mas en presentarse modificando el valor de la opción
soundbufsize, hay que tener cuidado con esta opción porque si se
pone un valor muy grande el sonido estará retardado respecto a
la acción.

style="width: 272px; height: 264px;" alt=""
src="http://www.beemulated.net/graphics/screen-fceultra-ikari32.jpg">

Entonces ya teniendo todo correctamente configurado podemos ejecutar style="font-weight: bold;">FCEU asi:

cellspacing="2" cellpadding="2">
style="vertical-align: top; background-color: rgb(192, 192, 192);">$
export SDL_VIDEODRIVER=dga $ fceu -soundq 0 -xres 512 -yres 480 -fs 1
-soundbufsize 70 /ruta/juego

Las opciones de FCEU vienen
bien explicadas en la documentacion del mismo. Lo del driver DGA de SDL
y los ModeLines funciona también para otros emuladores que
estén basados en SDL, en especial el style="font-weight: bold;">xmame y el style="font-weight: bold;">Visual Boy Advance, donde se nota
mucho el incremento en velocidad.

Para el xmame cada juego tiene
diferentes resoluciones y habrá que crear ModeLines para cada
una de ellas. Con zsnes no
funciona muy bien DGA pero corre rápido si se pone una
resolución baja o utilizamos los modos OpenGL teniendo una
tarjeta aceleradora de 3D.

En general esto es todo lo que necesitamos para correr cualquier
emulador basado en SDL a full speed y full screen, espero que les sirva
esta información.


Deja un comentario