6.1 Al moverse la pantalla (realizando un scroll) a veces aparece partida o agitada
6.2 La animación y el sonido se entrecortan
6.3 El modo gráfico es demasiado pequeño o tan grande que no cabe en el monitor
6.4 La pantalla del PC aparece de color negro al ejecutar el emulador
6.5 El emulador muestra un mensaje del tipo "VESA 2.0 requerido.
Desde que hace unos ocho años apareció el primer emulador para PC de una máquina llamada Spectrum, creado por Pedro Gimeno, la situación ha cambiado enormemente. Aquel primer emulador estaba escrito en lenguaje ensamblador y permitía cargar directamente las cintas del Spectrum al PC mediante el puerto paralelo. Aún recuerdo con qué ilusión jugaba al Abu Simbel y al Ant Attack en mi antiguo 386, cuando todavía no creía que aquello fuera posible. Desde entonces han aparecido multitud de emuladores, cubriendo prácticamente todas las máquinas, consolas y computadoras que han existido desde 1980 hasta bien entrados los 90. De esta forma, con nuestras potentes máquinas actuales podemos seguir disfrutando de aquellos juegos que tan buenos ratos nos hicieron pasar. En este documento trataré de explicar de la forma más simple posible el funcionamiento de estos programas, en detrimento del rigor técnico; de esta forma, todo lo comentado aquí puede ser aplicado a la mayoría de los emuladores.
Un emulador no es más que un programa como otro cualquiera. Este programa ejecutado en una máquina (por ejemplo, un PC) es capaz de traducir las órdenes de otro programa diseñado para otra máquina muy distinta (por ejemplo, una consola SuperNintendo); de esta forma mediante el emulador nuestro PC será capaz de ejecutar las instrucciones de un juego de SuperNintendo.
Obviamente es necesario disponer del software de SuperNintendo para poder ejecutarlo (por ejemplo, un cartucho con el juego Super Mario World), ya que sin programas el emulador es una máquina inútil. Aquí encontramos el primer problema: ¿ cómo hacer que el emulador lea un cartucho de SuperNintendo ?. El emulador debe ser capaz de "sortear" las limitaciones del hardware en el que se ejecuta ya que, en nuestro caso, el PC carece de zócalo para insertar cartuchos, y menos de SuperNintendo. Pues bien, es necesario transferir la información del cartucho a un fichero que pueda ser leido por el emulador en el PC. Para conseguir esto hay que construir un dispositivo hardware que por un lado lea el cartucho y por otro se conecte al PC para que éste reciba la información. Esta clase de dispositivos no se encuentran en los comercios y son prototipos diseñados por gente que conoce muy bien el hardware de ambas máquinas (PC y SuperNintendo).
Un caso algo más sencillo es el del Spectrum: éste almacena los programas en cintas de audio normales y corrientes, con lo que tan sólo necesitamos grabar esa cinta en un fichero de audio .WAV mediante una tarjeta de sonido, un cable, un cassette y el programa adecuado (por ejemplo, el WaveStudio o el CoolEdit), y ya tendremos el programa en nuestro PC (en realidad no es un proceso tan sencillo, pero no profundizaremos en detalles por ahora).
Lógicamente, si alguien ha transferido ya los datos a un fichero, no es necesario volver a hacerlo. Esto es especialmente interesante cuando tenemos acceso a Internet, ya que encontraremos la mayoría de los cartuchos, cintas, discos, etc... en forma de fichero listos para ser descargados y ejecutados por un emulador.
Todos sabemos que una computadora consta de varios dispositivos hardware (físicos) que tienen como objeto realizar una determinada función. Por ejemplo, el chip gráfico se encarga de mostrar imágenes por pantalla, el de audio de emitir sonidos, etc... todos ellos gobernados por el procesador principal (por ejemplo, un Pentium o un K6). Estos componentes poseen unas patillas por las cuales reciben órdenes codificadas numéricamente. Un ejemplo hipotético: imagine que tenemos un chip gráfico en nuestro PC modelo "gfx4PC" que entiende los siguientes códigos:
12: borrar la pantalla
18: avanzar el cursor
27: borrar un caracter
Si el procesador principal le envía el siguiente programa: 18,27,27,12 ejecutará las órdenes correspondientes a los códigos, que en nuestro caso, primero avanzará el cursor, borrará dos caracteres y luego borrará la pantalla. Pero resulta que en nuestra SuperNintendo el chip gráfico es de un fabricante distinto y un modelo "SNESgfx", y que los códigos que entiende son:
87: borrar la pantalla
50: avanzar cursor
76: borrar un caracter
El mismo programa que teníamos en el PC si lo ejecutamos en una SuperNintendo no hará absolutamente nada (o no hará lo que se pretendía), porque el "código máquina" es distinto, y lo mismo pasará si intentamos ejecutar el código de una SuperNintendo en un PC.
¿ Y qué podemos hacer para solucionarlo ? Si construimos el siguiente programa en un PC podemos hacer que las tres ordenes del chip gráfico "SNESgfx" sean comprendidas por el "gfx4PC":
Si recibimos un 87 entonces envía un 12 al gfx4PC
Si recibimos un 50 entonces envía un 18 al gfx4PC
Si recibimos un 76 entonces envía un 27 al gfx4PC
Éste programa será ejecutado por el procesador principal, y es precisamente un emulador. El programa irá leyendo los datos del fichero con el programa escrito para la SuperNintendo, encontrará las instrucciones y las traducirá (por ejemplo, usando una tabla con las equivalencias) y enviará las órdenes correctas al chip del PC. Obviamente, las cosas no son tan sencillas porque típicamente el número de instrucciones para controlar un procesador sobrepasa la centena, y si tenemos en cuentra que en una misma máquina podemos encontrar alrededor multitud de chips diferentes, la cosa se complica bastante. Además hemos de tener en cuenta que hay cosas que el chip gráfico de una SuperNintendo puede hacer y el PC no, por ejemplo rotar los colores de la pantalla, o dibujar figuras transparentes. De esta forma, para traducir un sólo codigo de la SuperNintendo que diga "dibuja esta figura transparente" debemos usar varios códigos para provocar el mismo efecto en el PC (por ejemplo, 1.coger la figura, 2.hacer una operación aritmética con el fondo y 3.dibujarla). Esto es lo que ralentiza la emulación y como consecuencia los programas que en una SuperNintendo a 7 MHz de velocidad corren rápidamente, en un Pentium a 100 MHz pueden ir algo lentos.
Estos emuladores generalmente se distribuyen en forma de ficheros comprimidos con extensión .ZIP. Para utilizarlos, una vez descargados de Internet, debemos utilizar una utilidad para descomprimir archivos ZIP, como por ejemplo el PKUNZIP o el WinZIP. Si utilizamos el programa PKUNZIP, que está basado en MS-DOS, deberemos teclear esta orden en una sesión MS-DOS:
pkunzip -d fichero.zip
Tras lo cual se crearán varios ficheros en el directorio actual. Es MUY importante introducir el parámetro -d para descomprimir toda la jerarquía de subdirectorios que pueda contener el fichero comprimido. Para poder usar el programa descompresor pkunzip.exe cómodamente, debe copiarlo a un directorio de búsqueda del sistema, como por ejemplo C:\WINDOWS\COMMAND si usa Windows 95/98 ó C:\DOS si está usando MS-DOS.
Por ejemplo, para utilizar el emulador PaCifiST, el cual está en forma de fichero comprimido en el CD-ROM con el nombre pcst048.zip, y meterlo en una carpeta llamada ATARI en el disco duro que tiene la letra C:, debemos hacer lo siguiente:
Debido a la complejidad de las máquinas emuladas, muchos emuladores permiten activar o desactivar ciertas características de las mismas, bien para facilitar la compatibilidad con ciertos programas, bien para permitir una ejecución fluida en una máquina PC demasiado lenta. Existen dos tipos de emuladores teniendo en cuenta la forma de cambiar su configuración:
De entre los parámetros que debemos configurar necesariamente podemos encontrar:
Una vez ejecutado el emulador, y si todo va bien, pueden suceder tres cosas:
Es muy importante señalar aquí que cada emulador admite un formato de fichero distinto. Por ejemplo, un fichero que tiene la extensión .TAP es una cinta de Spectrum y sólo puede ser utilizada por emuladores de Spectrum, un fichero de extensión .SMD contiene un cartucho de Sega MegaDrive, y así con decenas de archivos distintos. Lea la documentación que acompaña al emulador para averiguar que tipos de archivos utiliza y cómo cargarlos.
Su utilización suele ser mucho más simple que la de los emuladores para MS-DOS. Generalmente vienen comprimidos en un fichero .ZIP (lea la sección anterior para saber cómo descomprimirlos), pero también son comunes los ficheros autoinstalables con extensión .EXE. De esta forma con sólo ejecutar tal fichero, el emulador se descomprimirá e instalará en Windows. Para ejecutarlo sólo debe hacer doble click en el icono del fichero ejecutable .EXE que ha sido instalado. Una vez hecho esto se abrirá una ventana con una barra de menús. El comportamiento de estos emuladores es equivalente al de los emuladores para MS-DOS que muestran un menú y se configuran desde el mismo. Lea la sección anterior para averiguar más sobre esto. Es igualmente importante LEERSE LA DOCUMENTACIÓN QUE ACOMPAÑA AL EMULADOR.
Al intentar emular una máquina podemos encontrarnos con distintos problemas, derivados de las diferencias (en ocasiones muy grandes) entre la máquina emulada y la máquina que ejecuta el emulador:
En el monitor las imágenes se muestran mediante un rayo de electrones que va recorriendo la pantalla de arriba a abajo a una determinada velocidad (típicamente, recorre la pantalla 60 veces por segundo, es decir, 60 Hz). Normalmente el ordenador manda los cuadros (fotogramas) al monitor cuando el haz de electrones se encuentra volviendo del final de la pantalla al principio, para que en la siguiente pasada aparezca el dibujo completo. Si dibujamos algo mientras el haz se encuentra en la mitad de la pantalla, ocurrirá que empezará a dibujar por la mitad y en ese instante tendremos media pantalla con el dibujo anterior y otra media con el dibujo que queremos mostrar. Esto provoca un efecto de "pantalla partida" que suele ser muy molesto cuando vamos avanzando con un personaje en un juego.
Ahora supongamos que la TV a la que tenemos conectada nuestra SuperNintendo tiene una frecuencia de refresco de 50 Hz; la consola sabe que debe dibujar los fotogramas justo al principio del barrido y para eso debe esperar un período de 1/50 segundos entre fotogramas. Pero nuestro monitor de PC tiene una frecuencia de 75 Hz ¿ qué ocurrirá entonces ? pues que debería actualizar los fotogramas pasados 1/75 segundos y sin embargo lo hace cada 1/50 porque estamos ejecutando un programa diseñado para una SuperNintendo, por lo que se pierde la sincronización con el barrido del haz de electrones y aparece el molesto efecto de "pantalla partida".
La solución implementada en muchos emuladores consiste en provocar un retardo en la emulación para que el haz vuelva al principio y entonces dibujar la pantalla. Mientras se espera, el procesador no hace nada y como consecuencia la emulación es más lenta (ya que de otro modo podrían aprovecharse esos instantes para calcular operaciones necesarias para emular la máquina). Esta opción suele ser nombrada "VSync" del inglés "Vertical Synchronisation" (Sincronización Vertical). Otra posible solución sería cambiar la frecuencia de refresco del monitor del PC para que se ajuste a la de la máquina que queremos emular, sin embargo no todos los monitores son capaces de mostrar todas las frecuencias (en especial las más bajas, de 50 Hz). Además, en los modos gráficos acelerados (VESA 2.0) esto no es posible hacerlo, ya que siempre trabajan con frecuencias de 75 Hz.
Suele ser debido a la falta de potencia del PC necesaria para emular correctamente cierta máquina, y por sorprendente que parezca ocurre con mucha frecuencia. Por ejemplo, mi antiguo Pentium a 133 MHz era incapaz de ejecutar de forma fluida juegos de SuperNintendo a pesar de que esta máquina corre a 7 MHz. El motivo es el anteriormente expuesto: hay funciones de la SuperNintendo que no tienen equivalente en el PC y deben traducirse en largas secuencias de instrucciones. Como consecuencia, el PC no puede calcular y dibujar de forma fluida todos los fotogramas ("frames") de un determinado juego, siendo necesario saltarse algunos ("frameskip") para que el juego ejecute a la misma velocidad que en una SuperNintendo. A este tipo de cálculos se le llama de tiempo real, porque los fotogramas se calculan mientras estamos jugando. El efecto de saltarse fotogramas es el de una animación "a golpes". Otra solución a este problema es bajar la calidad del sonido, desactivar en el emulador algunas de las características que el PC no puede hacer por sí solo y requieren grandes cálculos del procesador principal (por ejemplo dibujar "transparencias"), escoger un modo gráfico que use menos colores, etc... Por supuesto el sonido también puede verse afectado por la falta de potencia de cálculo, resultando en cortes frecuentes o "crujidos".
En un ordenador las imágenes se componen mediante un mosaico de puntos rectangulares (pixels). La tarjeta gráfica es la encargada de proporcionar los modos gráficos que permiten distintas formas de representación. El modo gráfico consta de dos parámetros: la resolución y el número de colores. La resolución se mide en número de puntos (pixels) tanto horizontales como verticales (por ejemplo 320x240). El número de colores se mide según el tamaño de la información asignada al respecto en cada punto (por ejemplo 24 bits=8 bits para el rojo, 8 para el verde y 8 para el azul, lo que da un total de más de 16 millones de colores posibles). El problema surge cuando nuestro PC no tiene un modo gráfico igual al de la máquina emulada. Por ejemplo, los modos gráficos más comunes en el PC son:
A) 320x240 a 8,16 ó 24 bits
B) 400x300 a 8,16 ó 24 bits
C) 640x480 a 8,16 ó 24 bits ... según aumentamos la resolución, el tamaño de los puntos disminuye, ya que la superficie de la pantalla del monitor permanece constante.
Y sin embargo una SuperNintendo tiene un modo gráfico de 256x256 a 8 bits. De esta forma si el emulador usa el modo A para representar una pantalla de SuperNintendo, ocurrirá que habrá líneas que no lleguen a mostrarse (en concreto 256-240=16 líneas verticales). Si usamos el modo B la pantalla aparecerá demasiado pequeña, porque sobran líneas y columnas. Además existe el problema de la relación de aspecto: un punto en la pantalla de la SuperNintendo no es exactamente un cuadrado, su dimensión horizontal es aproximadamente el doble que su dimensión vertical, por lo que al representarla en un PC los gráficos aparecerán "alargados" verticalmente, ya que en el PC cada punto es casi un cuadrado. Como primera solución podemos optar por tocar los controles del monitor para "alargar" horizontalmente la imagen, de forma que se asemeje a la imagen obtenida en una SuperNintendo real. Sin embargo algunos emuladores son capaces de "trucar" el chip grafico para crear nuevos modos gráficos que se adapten mejor a la máquina emulada. Por ejemplo, si fuera posible crear un modo gráfico de 256x256 a 50 Hz el problema estaría completamente solucionado. En muchos casos esto es posible, pero estos modos gráficos tienen la contrapartida de ser mucho más lentos que los modos estándar acelerados (VESA 2.0).
Lo mismo ocurre con el color: si nuestra SuperNintendo puede representar simultáneamente 32.000 colores en pantalla y el modo gráfico del PC tan sólo permite 256 colores (8 bits) la representación no podrá ser fiel al original.
Esto puede ser causa de varios síntomas. El primero y más frecuente ocurre cuando el emulador usa una resolución que el monitor no puede visualizar y es debido a que los monitores admiten cierto rango de frecuencias horizontales (por ejemplo desde 30 KHz a 54 KHz). Este número indica el número de barridos horizontales que realiza el haz de electrones en un segundo y es distinto de la frecuencia vertical aunque guarda una relación directa (ver aquí abajo). A cada resolución le corresponde una frecuencia que varía según:
a) El tamaño del cuadro en pixels. A más tamaño, más frecuencia horizontal necesitamos.
b) La posición de la imagen en la pantalla. Cuanto más a la izquierda, más frecuencia horizontal.
c) La frecuencia de refresco (vertical). La frecuencia horizontal aumenta según es mayor el ratio de refresco.
Si la resolución que utiliza el emulador (por ejemplo 512x384 a 74 Hz) utiliza una frecuencia horizontal de 60 KHz, el monitor del ejemplo no puede visualizar nada y pueden pasar dos cosas: o bien se pone en modo suspendido (se apaga) o muestra la imagen muy borrosa y corrompida (llena de líneas con basura). Ante esto lo único que podemos hacer es escoger una resolución que se adapte a nuestro monitor, configurando el emulador de la manera adecuada, o bien ajustar la resolución mediante los drivers de nuestra tarjeta para que, por ejemplo bajando el refresco vertical, pueda situarse entre el rango permitido por el monitor (esto sólo lo pueden hacer algunos drivers). O también podemos comprarnos un monitor mejor (informaros bien sobre las características técnicas la próxima vez que vayáis a comprar uno). Un rango de frecuencias horizontales aceptable es de 30-60 KHz, y cuanto más mejor. Ojo que el límite inferior también es importante porque hay resoluciones que requieren una frecuencia muy baja, por ejemplo 300x200 a 50 Hz.
El estándar VESA 2.0 se corresponde con un conjunto de modos gráficos acelerados y de unas funciones que son comunes a todas las tarjetas gráficas. Muchas de las tarjetas gráficas antiguas no disponen de soporte para este estándar, por lo que es necesario instalar unos "drivers" o controladores que proporcionen los modos VESA 2.0. Si su tarjeta tiene un chip basado en S3 (Trio64, Virge,...) puede utilizar el controlador que proporciona S3. Si no posee este tipo de tarjeta, debe instalar un controlador VESA genérico, como el SciTech Display Doctor para Windows o MS-DOS. Para activar el soporte VESA usando uno de estos controladores deberá cargarlo en memoria una sóla vez, antes de utilizar cualquier emulador.
Miguel Barrio Orsikowsky
<sinclairmania@pagina.de>