Emulador de GB – 1: Introducción

Hola!

Este es mi primera vez escribiendo en un blog así que quiero presentarme. Me llamo Diego Juodziukynas, vivo en Argentina y programo desde hace muchos años. Estudié Ingeniería en Informática y en algún momento hice páginas web y aplicaciones mobile, pero en general los proyectos que no tienen que ver con gaming me aburren, así que desde 2013 trabajo programando videojuegos. Además de mi trabajo, como creo que le pasa a muchas de las personas que programan, tengo algunos proyectos/experimentos personales y uno es un emulador de GameBoy, y de eso se van a tratar los primeros posts en este blog. Quizás escriba sobre desarrollo de videojuegos cada tanto, pero en particular me llamó la atención la poca información que existe en español sobre desarrollo de emuladores.

¿Qué es y cómo emular una consola?

Emular es hacer un programa que pueda ejecutar juegos escritos para el hardware original. Idealmente el emulador tiene que hacer por software lo mismo que hacen todos los componentes físicos de la consola y además sincronizacar la comunicación entre ellos, con todas sus peculiaridades. Por ejemplo, si una instrucción del procesador tiene un bug, el emulador tiene que reproducir ese comportamiento, porque algunos juegos pueden depender de la existencia de ese bug para funcionar bien. Digo “idealmente” porque se puede hacer algo funcional sin emular el 100% del hardware, de hecho mi emulador probablemente esté lejos del ideal cuando lo considere terminado. Se dice que un emulador es mas “preciso” mientras mas se parezca su funcionamiento al hardware real. Para leer un poco más sobre esto y sobre preservación recomiendo empezar por acá (en inglés): Accuracy takes power

Emulador de NES

Esto es sobre el desarrollo de un emulador de GameBoy, pero esta no es la primera vez que me pongo a programar un emulador. Hace muchos años intenté hacer uno de NES/Family, sin lograr buenos resultados. No tenía experiencia en este tipo de proyectos, no sabía tanto de C++ como creía, el código que escribí era demasiado complicado para lo que tenía que hacer, no tenía una forma cómoda de testear y debuggear, y quería algo portable, sin muchas dependencias y rápido. Y también quería que funcionara bien en la consola Dingoo A320. Es decir, era demasiado ambicioso.

Antes de empezar el emulador de GB mi idea era arreglar el de NES, pero no supe por dónde empezar y decidí arrancar algo nuevo un poco más simple, tratando de no repetir los problemas del anterior. El dia que tenga el emulador de GB en un estado usable probablemente vuelva a intentar hacer uno de NES desde cero.

Primeros pasos

Para poder ejecutar el juego más simple hay que emular bastante bien la mayoría de los componentes y puede ser un poco abrumador para empezar, pero de todas formas hay un orden bastante lógico que se puede seguir. El componente con el que conviene empezar, y quizás el más parecido a un programa normal, es la CPU.

Los juegos se programaban usando las instrucciones disponibles de la CPU, así que emularla es escribir código que haga lo mismo que esas instrucciones, y el emulador las tiene que ejecutar en el orden definido en el juego. Por ejemplo: la CPU tiene varias instrucciones que suman 2 valores, entonces hay que hacer funciones que sumen dos valores. Después para ejecutar un juego hay que ver que instrucciones llama el código original, y ahí el emulador tiene que ejecutar la función programada equivalente.

Para los otros componentes también hay que hacer lo mismo que hace el hardware, pero no hay una lista de instrucciones a emular.

Assembly

Los juegos de esa época se escribían en lenguaje ensamblador dependiente del procesador de la consola, y todo se hacía conociendo en detalle todo el hardware. Saber o al menos entender algún lenguaje ensamblador es útil para escribir un emulador, pero no es 100% necesario y tampoco hace falta saber usarlo. Yo conozco algunos lenguajes de ese tipo y estoy aprendiendo el de GameBoy ahora, pero no sabría usarlo para escribir un programa o juego completo, y me lleva bastante tiempo leer código y entender qué está haciendo.

Links útiles

Hay muuucha información sobre el GameBoy, incluso hay mucha información sobre escribir un emulador de GameBoy, pero no encontré cosas en español. Dejo algunos de los links más útiles que estoy usando por si a alguien le interesa hacer lo mismo después de leerme (cómo dije antes, en inglés, porque casi no hay información en español sobre el tema):

C++ / SFML

Lo estoy haciendo en C++ y estoy usando SFML 2.5 para input, output y manejo de ventanas. Lo aclaro para que se entienda mejor si pongo muestras del código, pero creo que la idea se va a entender de todas formas. Elegí C++ porque ya lo conozco y quiero aprender mas sobre optimizar en este lenguaje. Está siempre la discusión de si otros lenguajes de más alto nivel pueden dar los mismos resultados que C++ en cuanto a performance, pero no tiene nada que ver esa discusión con que haya decidido usarlo.

SFML lo elegí porque lo conozco también, y porque para lo que tengo que hacer me alcanza.

Se pueden hacer emuladores con cualquier otro lenguaje así que si alguien quiere empezar el propio puede intentarlo con lo que ya sabe y contarme como le va. Hay en otros lenguajes de bajo nivel como Rust, C o Assembler de x86, o en lenguajes de más alto nivel como C#, JavaScript o Ruby.

Formato de los posts

La idea de los posts va a ser contar un poco mi experiencia haciendo el emulador, con consejos y razonamientos que usé para tomar algunas decisiones que me parezcan importantes. El emulador todavía lo estoy desarrollando y falta bastante para que funcione bien (unos 30 juegos son jugables y hay varios errores gráficos), así que esto no va a ser una guía que se pueda seguir, las cosas que decida en un post pueden cambiar en otro y algunas cosas van a estar mal y las corregiré cuando me de cuenta.

Actualmente ya tengo bastante desarrollado, así que los primeros posts van a ser un intento por recordar las cosas (buenas y malas) que hice hasta ahora. No voy a poner muchos ejemplos o código porque las cosas que hice fueron evolucionando y durante las primeras semanas no usé ningún tipo de versionado, pero creo que el proceso es más interesante que un resumen del estado actual. Si escribo varios posts y logro alcanzar al estado actual del emulador voy a empezar a escribir posts con más información, más código y más capturas actuales. En el próximo post voy a empezar a hablar del desarrollo, en particular sobre la CPU.

Dudas y sugerencias

No voy a explicar el 100% de las cosas que haga o use porque los posts se volverían muy largos y perdería el enfoque, pero si querés que hable en mas detalle de algo puntual dejame un comentario y voy a intentar hacer un post sobre el tema.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Crea un sitio web gratuito con WordPress.com
Empieza ahora
A %d blogueros les gusta esto: