Como funcionan los emuladores

Si usas la computadora para jugar, es muy probable que en algún momento hayas usado uno o más emuladores o que te hayan recomendado usar uno para jugar a ciertos juegos que no son de PC.

Y así, muchos por primera vez, y otros rememorando su infancia, jugaron a juegos de Nintendo, Sega Génesis/Mega drive, PlayStation y muchos otros sistemas.

Claro, para quien no tiene un perfil muy técnico, los emuladores son algo comparable a la magia, pues es de manera milagrosa que pueden jugar a estos juegos, pero no saben cómo. A quien le gusta investigar más, en poco tiempo seguro se entusiasma y empieza a probar cuanto emulador llega a sus manos y a probar cuanta ROM llega a sus manos. Pero, ¿sabes realmente como funciona un emulador por dentro?

En este artículo vamos a tratar de explicar de forma sencilla, que es un emulador, cuán complejo es escribir un emulador, porque algunos juegos no funcionan o funcionan mal en algunos emuladores y si es legal o no usar un emulador.

¿Que es un emulador?

Como dijimos antes, para algunos, un emulador es programa simple que hace magia y permite correr jueguitos. Pero en si un emulador es mucho más que eso.

Podríamos decir que un emulador es un programa que nos permite ejecutar un programa de otro ordenador o sistema (que incluye consolas de videojuegos también) en un hardware o sistema distinto para el que fue hecho.

El eslabon entre los juegos de oitros sistemas y la PC

Contrario a lo que algunos puedan pensar, un emulador no convierte un juego para correrlo en una PC o Celular, sino que es un programa que recrea virtualmente en tu ordenador o Móvil/Tablet el entorno en el que ese programa corría originalmente, sea esto un pc u otro ordenador o dispositivo. Hacer un programa que haga todo esto, es algo muy complejo.

De modo que, si pensabas que un emulador es un programa “simple”, creenos que en realidad no es así. Para que tengas una idea más clara de la complejidad, veamos (sin ponernos muy técnicos) como funcionan.

¿Cómo funcionan los emuladores?

Incluso las consolas de videojuegos, aún las más simples, son ordenadores, y contienen uno o más procesadores. Los programas para dichas computadoras, son listas de instrucciones que son interpretadas por el sistema y le dicen que hacer a cada procesador. Pero sólo sirven para el sistema para el que fueron escritas.

Para explicarlo mejor, imaginemos que tenemos una lista de instrucciones para que una costurera que habla español pueda hacernos una campera. Estas instrucciones indican como cortar la tela, como se tiene que unir y que terminaciones darle, pero no explica como coser, como medir la tela, o como se hacen las distintas terminaciones, porque la costurera ya sabe cómo hacerlo.

Un programa es parecido a esa lista de instrucciones. Esta escrito para el idioma y las capacidades del sistema en el que se va a ejecutar.

Ahora supongamos que le entregáramos esa misma lista de instrucciones y moldes para hacer una campera, a un carpintero que sólo habla ruso. El carptintero seguramente es muy habil con las manos y podria llegad el caso inerpretar los moldes. Pero hay varios impedimentos para que el pueda hacer una campera con esa lista de instrucciones. No sólo el idioma es una barrera, sino que también, como las habilidades del carpintero no incluyen la costura. Por lo tanto, tendremos que traducir las instrucciones a un lenguaje que entienda, y además, tendremos que explicarle cómo cortar, coser y hacer los demás pasos.

Esto último, es lo que hace un emulador. Se encarga de traducir las instrucciones para que un sistema para el que no fue pensado originalmente, pueda entender y ejecutar esa lista de instrucciones que son los programas o juegos a emular.

Los métodos de emulación

No existe una única forma de convertir esa lista de instrucciones. Dependiendo del sistema a emular y de lo que se quiera lograr con el mismo, los autores han tomado y siguen tomando distintas estrategias o técnicas para emular el hardware por software. Veamos las dos tecnicas de emulación principales.

La primera, es la que utulizaron los primeros emuladores que conocimos, aunque es una técnica que usan muchos emuladores modernos. Se los conoce como emuladores de bajo nivel (conocidos como LLE por las iniciales de Low Level Emulator), pues emulan el hardware completamente por software, tratando de recrear el funcionamiento hasta el ultimo detalle.

Para esto, el programa crea virtualmente uno o más procesadores virtuales, sean estos la CPU, el chip de vídeo o sonido u otros; y cada uno se encargaba de ejecutar las instrucciones que estaban en el programa en código máquina. Cada procesador virtual es una pieza de código pensado para que responda de la misma forma que el chip real cuando se le envíen las instrucciones.

Ejecutar este código de esta forma, requiere una mayor capacidad de procesamiento, pues por cada instrucción del hardware original, se ejecutan muchas (muchísimas de verdad) más en el ordenador que ejecuta el emulador. Además, solo utilizamos la CPU para ejecutar las instrucciones de todos los chips emulados. Esto explica porque, muchos emuladores van tan lento, en particular en hardware limitado en recursos. Con este método se logra una emulación casi perfecta del hardware original, aunque se necesite un hardware que sea varias veces más potente que el original y muchas optimizaciones en el código del emulador para lograr una velocidad decente.

La otra téctica es la emulacion de alto nivel (conocida como HLE por las iniciales de High Level Emulation). Estos logran una mayor velocidad, aunque en algunos casos sacrificando compatibilidad, al menos al principio.

La emulación de alto nivel, en lugar de recrear el hardware escribiendo por código procesadores virtuales que sean 100% fieles al funcionamiento del original, utilizan algunos metodos para poder ejecutar el código, pero aprovechando mejor el hardware donde se ejecuta el emulador.

Una de esas técnicas es la recompilación dinámica del codigo del CPU. Esta técnica, permite que el emulador convierta cada línea de instrucciones en código nativo y optimizado para el ordenador donde se corre el emulador, a medida que se va ejecutando el juego.

Con esto se obtiene una mejora considerable en la performance del emulador pues se requieren menos tiempo del procesador para ejecutar cada instrucción, aunque algunos programas o juegos que usen trucos ocultos de la plataforma pueden no funcionar o funcionar de forma incorrecta (al menos no al principio, ni por las buenas).

Otro metodo consiste en utilizar el hardware nativo en lugar de emularlo. Esto ayuda en en dispositovos que tienen un hardware que pueda ser comparable, como tarjetas 3d, o chips de sonido. Los programas usualmente al momento de generar gráficos, o tocar sonidos, u otras funciones, realizan llamadas al procesador de audio (SPU), de vídeo (GPU), otros chips o dispositivos del ordenador y les dice que tienen que hacer. Otros hacen llamadas a librerías estándares del sistema, que interactuan con duchios chips en alto nivel. El emulador intercepta esas llamadas y las convierte en llamadas al hardware real de audio o vídeo u otro, del ordenador donde se ejecuta el emulador, logrando un incremento muy grande en la velocidad de ejecución, pues, por ejemplo, emular un chip de audio o vídeo 3d por código es increíblemente lento.

En cambio, al utilizar el hardware real, aunque haya que traducir las instrucciones, se obtiene una velocidad de ejecución muy alta.

La emulación de alto nivel se vio por primera vez en el increíblemente veloz en su tiempo, el UltraHLE, emulador de Nintendo 64. Este emulador, en lugar de escribir el chip gráfico de la N64, interceptaba las llamadas al chip y las convertía en llamadas a la placa de vídeo. Esto permitía que el proceso de gráficos, en lugar de ser interpretado por un chip 3d virtual (con la lentitud que ese proceso involucra), sea ejecutado en un hardware dedicado a ese tipo de operaciones en el pc donde se corre el emulador.

Por esa razón, este emulador podía ejecutar juegos a velocidades increíbles en un hardware donde cualquier otro emulador con emulación de bajo nivel conseguía velocidades escasas. Otra ventaja que tiene esta técnica, en particular en consolas con gráficos en 3d, es que se logran mejores resoluciones que en el hardware original, e incluso algunos permiten reemplazar las texturas del juego por otras texturas de mayor calidad, logrando gráficos muy mejorados con relación al original.

¿Cuál de estas técnicas de emulación es la mejor? La realidad es que no existe un modo perfecto o mejor. Ambos tienen sus ventajas y desventajas. Incluso hay emuladores que utilizan ambas técnicas para emular diferentes partes de la máquina. Las ventajas de ambos sistemas son:

– En LLE se pueden lograr emular juegos que hacen uso del hardware de forma avanzada.
LLE permite llegar a tener una emulación fiel al original
– En HLE, se logran mejores tiempos de ejecución y mejores gráficos que en los sistemas originales.

Por el lado de las desventajas:

– La velocidad de ejecución de un emulador LLE, puede ser extremadamente lenta, en particular si se emulan chips muy complejos.
– Lograr una emulación 100℅ fiel en LLE requiere mucho (muchísimo) trabajo y conocimiento del hardware original, incluidas las funciones no documentadas.
– Si bien HLE resuelve el problema de la velocidad de ejecución, requiere mucho trabajo de ingeniería inversa (más adelante explicamos que es), pruebas y errores para comprender todas las formas posibles en las que una función o método debería funcionar.

En ambos tipos de emuladores, son comunes los bugs de regresión, es decir, que una versión nueva vuelve a hacer que falle algo que funcionaba bien antes. Por eso en algunos casos, ciertos juegos funcionan sólo con X versión de un emulador y no con más recientes.

¿Es posible lograr una emulación perfecta?

La complejidad de escribir un emulador, que tratamos de explicar de forma más o menos sencilla, explica porque algunos juegos no funcionan.

Muchos autores empiezan tratando de emular las funciones o instrucciones más comúnmente utilizadas, pues les garantiza una buena compatibilidad.

El camino a la emulación perfecta esta lleno de glitches

Pero, algunos juegos, utilizan en ocasiones técnicas no documentadas o trucos ingeniosos, que funcionan perfecto en el hardware real, pero que no son sencillos de recrear por código.

Aun así no es imposible, pero, como se imaginarán, lleva mucho trabajo y pruebas lograr una emulación completa y perfecta.

¿Son fáciles de usar?

Depende. Muchos emuladores han hecho más foco en que la emulación funcione, antes que en una interface de usuario amigable.

Muchos emuladores, en particular los que están en etapa experimental, tienen interfaces de usuario crípticas, muy despojadas, y en algunos casos, la configuración del emulador se hace modificando archivos en un editor de texto. Otras están llenas de mensajes de debut y pantallas que no tienen sentido para un usuario normal. Y la documentacion o ayuda en algunos casos no es la mejor.

Las primeras versiones del RPCS3 no eran muy amigables que digamos

Y aunque es así en varios emuladores, hay que reconocer que muchos otros, en particular en los últimos tiempos, han creado interfaces un poco más fáciles de usar.

Cabe que tengamos en cuenta que, en el fondo, un emulador es un programa extremadamente complejo que puede requerir el cambio de parámetros avanzados. Algunos son complicados de funcionar, en particular si son muy exigentes con relación al hardware.

La nueva interface de RPCS3 es mucho mejor

De modo que, si tus conocimientos de computación no son muy avanzados, esto podría ayudarte a profundizar en los mismos.

Ah, y nunca está de más saber inglés, pues el 99% de los emuladores, tienen la interface, documentación y soporte (con suerte) en dicho lenguaje únicamente.

¿Son legales los emuladores?

Bueno, es un área un tanto gris. Supongamos que alguien copie exactamente un dispositivo electrónico y lo comercialice. ¿Es legal o no?
En la década de 1980, ColecoVision saco su Módulo de Expansión 1, que era directamente un clon de la Atari 2600. Obviamente, se enfrentó a una demanda legal por parte de Atari, acusándolos de copiar su hardware.

ColecoVision Expansion Module 1

Sorprendentemente, Atari perdió, porque Coleco pudo demostrar que lo hizo con piezas que cualquiera podía comprar en una tienda de electrónica y no utilizando copias de chips de Atari. Este precedente hizo que las consolas de videojuegos (y muchísimos otros dispositivos electrónicos) lleven chips especiales para que no puedan ser copiarlos fácilmente.

Siendo que el emulador es una reproducción o copia virtual del hardware original la pregunta es: ¿aplica lo mismo? Es decir, ¿Es legal? En estos casos depende de cómo se haya programado en emulador.

Por ejemplo, si el emulador fue hecho utilizando el software de desarrollo de la consola (o computadora), se convertiría en ilegal si se distribuyera con dichas librerías, pues están protegidas por derechos de autor. Es por eso que, además de no incluir juegos, los emuladores no incluyen copias del BIOS (memoria de inicio) de los dispositivos que emulan, ni de otras librerías no licenciadas que hayan utilizado en su desarrollo.

Por otra parte, muchos emuladores se han realizado haciendo ingeniería inversa del hardware original. Esta ingeniería, en este caso en particular, es un conjunto de técnicas que permiten a los desarrolladores entender cómo funciona el hardware y reproducir su funcionamiento en una simulación. Leyes de diversos países permiten la ingeniería inversa en ciertas circunstancias.

Ahora bien, las ROMs, BIOS, y archivos o imágenes de software de los sistemas emulados, son otro tema. La mayoría de dichos archivos tienen derecho de autor, muchos de los cuales continúan aún vigentes.

Entender esos puntos nos ayuda a entender porque existen tantos emuladores y porque se los puede descargar sin problemas, mientras que es normal que haya reclamos y sitios de ROMs cerrados o que den de baja archivos por pedidos legales de diversas compañías.

Como nota de color, a veces la emulación es más complicada por cuestiones legales que técnicas, incluso para las grandes empresas. Por ejemplo, la retro compatibilidad de la Xbox One, impide que muchos juegos sean compatibles, principalmente porque algunas distribuidoras les interesa vender remasterizaciones que poner disponibles las versiones originales.

Que esperar de un emulador

Entendiendo los puntos anteriores, queda claro porque es tan difícil escribir un emulador. Pero hay otros puntos a tener en cuenta.

Por una parte, los emuladores, en su gran mayoría, son programados por pequeños equipos independientes de entusiastas. Eso hace que muchos emuladores surjan, pero, si no hay coordinación dentro del equipo, o si se pierde la motivación, con el tiempo se abandona el proyecto. Otras cosas que hacen que los autores de emuladores pierdan el interés, son las críticas, insultos y exigencias de los usuarios, que muchas veces ven a los autores como sus esclavos.

Por tanto, si te interesa un proyecto de emulación y quieres que continúe, te damos algunos consejos:

– Si eres un programador experto, ofrécete a colaborar. Muchos proyectos utilizan GitHub, de modo que colaborar es más simple.
– Si no eres un programador experto, trata de aprender revisando el código fuente y compilando tú mismo el emulador. Es divertido para aprender, y quien te dice, que el día de mañana puedas colaborar con tu código.
– También si no tienes mucha experiencia programando, puedes ayudar escribiendo un front end para ayudar a utilizarlo de forma más sencilla a los que no saben mucho.
– Si no sabes programar, puedes colaborar con el proyecto dando las gracias en la página del proyecto, indicando en los lugares apropiados los errores que encuentres, y donando algo de dinero si puedes hacerlo (fíjate de hacerlo solo en la página oficial)
– Por último, cabe advertir que como los emuladores son aplicaciones muy complejas, algunos pueden ser difíciles de entender cómo funcionan o como se los debe configurar. Y es muy probable que no tengan la interface en español. Así que, mejor práctica inglés.

Y como siempre, Google (o Duck Duck Go) siempre es tu amigo, al momento de buscar guías de configuración o r0mz.

Conclusión

Tras todo este cholazo que escribí, deberías tener una idea muy clara de lo difícil que es escribir un emulador; y, por tanto, sentir gratitud por aquellos cráneos que hacen posible que, gracias a su esfuerzo, podamos seguir jugando a estos viejos juegos nuevamente.

De modo que, sin importar si conocías los emuladores o no, esperamos disfrutes de este mundo apasionante.

¡Feliz emulación!

One Reply to “Como funcionan los emuladores”

  1. Me gustaría un artículo que explicase cómo funciona un emulador a nivel de código puro y duro, o sea explicando como conseguir que el código emula la GPu de una consola, con ejemplos reales de código y explicando las líneas que lo componen, si no es mucho pedir claro.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *