Siempre he querido escribir un emulador desde cero, pero me he resistido durante mucho tiempo porque es probablemente el proyecto de programación más avanzado que he querido hacer. Escoger un sistema para emular no es una opción fácil; el primer proyecto estándar de emulador parece ser un emulador CHIP-8. Así que después de leer mucha documentación, decidí escribir un emulador de Game Boy minimalista, sin soporte para mapeadores personalizados o sonido, al que llamé proyecto Cinoop.
|
etiquetas: emulador , desde cero , game boy , cinoop , código abierto
Hay muchas cosas que pueden servir de "prueba de fuego" todo depende de a que se oriente el interes del programador y las herramientas que use no es lo mismo hacer un juego con opengl en c que usar unity3d.
Lo importante al final es aprender y que sea un proyecto que le haga superarse.
Evidentemente esto se aprende, ya que la teoria de compiladores ha sido un trabajo incremental de muchas personas, pero dista mucho de ser algo trivial.
¿Intentaste tú programar alguno por casualidad?
En alguna ocasión he programado en código máquina a nivel de electrónica no de informática, que en el fondo es lo mismo, tienes que dar órdenes al microprocesador de turno para que este haga equis cosa.
Realmente un compilador es un traductor, te voy a poner el ejemplo de una instrucción para un micro con arquitectura MIPS32, que tiene de bueno que es RISC
Por ejemplo, la siguiente instrucción en ensamblador para esta arquitectura.
addi $r1, $r2, 15E
Esta misma instrucción la puedes introducir manualmente en binario directamente a través de las patillas del procesador.
addi = 001000 (La operación u operaciones a hacer, opcode)
$r1 = 00001 (Registro 1)
$r2 = 00010 (Registro 2)
15E = 0000000101011110 (Valor numérico, 350)
00100000001000100000000101011110 (32)
Es una simple traducción de la instrucción en ensamblador a código máquina, claro que hay que saber los opcodes específicos de cada micro, lo mismos con la estructura de las instrucciones y demás, pero eso no es problema si son micros comunes ya que vas a encontrar toda la documentación que quieras y más.
Como puedes ver es una instrucción de 32 bits ya que el micro es de 32 bits, aunque no tiene porque ser siempre así, ya que el puerto de entrada y salida (I/O) del micro puede ser serie, aunque lo normal sigue siendo la transmisión en paralelo, también hay micros que para ahorrar patillaje lo dividen en 2 o más ráfagas de datos (latch)
Cada bit de la instrucción hay que introducirlo por cada una de pines de entrada y salida de datos del micro de forma simultánea, al mismo tiempo. (latch)
De todas formas, la prueba de fuego de todo programador creo que debería ser escribir un código fácil de mantener y testear... Y esto si que no es trivial, el resto son detalles de implementación, para mi modo de ver.
Otra cosa es que luego quieras añadirle más y más funciones a la función básica del compilador.
Un coñazo más que otra cosa