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:
./configure
$ make
$ make install
El último paso es opcional y recomiendo compilarlo con
optimizaciones exportando la variable CFLAGS, yo utilizo una muy
básica:
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:
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.
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;">
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:
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):
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:
“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:
“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.
src="http://www.beemulated.net/graphics/screen-fceultra-ikari32.jpg">
Entonces ya teniendo todo correctamente configurado podemos ejecutar style="font-weight: bold;">FCEU asi:
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.








