La Web del Programador: Comunidad de Programadores
 
    Pregunta:  11920 - COMO PROGRAMAR UN EMULADOR EN ASM
Autor:  atari Jaguar 64
Hola !
Muchas gracias por leer esta pregunta y nas gracias por contestrar.
Vereis "se" programar en C/Pascal/ y algo de ASM, me defiendo basntate bien creo, y me gustaria programar un emulador de algo sencillo, pero aparte de conseguir info sobre la makina a emular, no se q mas hacer ni por donde empezar me gustaria q me ayudaseis muchas gracias.

  Respuesta:  Juan Mellado
Hace ya bastantes años hice un emulador de Spectrum para PC (un 286 por aquella época) escrito completamente en ensamblador, tal vez te ayude un poco mi experiencia al respecto.

Lo primero es conocer "perfectamente" las dos máquinas: la emulada y en la que correrá el emulador. Y esto incluye hardware (micro, registros, interrupciones, excepciones, memoria, puertos, vídeo, ...) y software (sistema operativo). Repito: "perfectamente".

Necesitarás una copia de la ROM de la máquina original, pero ten cuidado con esto ya que suelen estar licenciadas y sujetas a copyright. Lo mejor es que la consideres como un fichero independiente que utiliza el emulador.

Básicamente deberías hacer tres "grandes cosas":

- Reservar memoria. Un bloque con el mismo tamaño de memoria que la máquina emulada y en la que cargues la ROM a partir de la misma posición en la que se encuentra en la máquina emulada.

- Un intérprete del micro a emular. Es decir, una estructura con los registros del micro a emular incluyendo el Program Counter, el Stack Pointer, los Flags, ... y un proceso que recorra la memoria , extraíga los mnemónicos y los ejecute como si fuera el micro original actualizando la estructura de registros y la memoria.

- Y una "máquina virtual" montada sobre el intérprete que detecte los accesos a recursos hardware específicos de la máquina emulada.

Esto último requiere una explicación más detallada. Vamos a ver, clasifica los mnemónicos en varios tipos: los que leen/escriben de memoria, los que leen/escriben de puertos, los que habilitan/deshabilitan interrupciones, etc... Y luego, "simplemente" comprueba a, por ejemplo, qué dirección de memoria intentan acceder. Si intentan escribir en la ROM no les dejes. Si intentan escribir en la memoria de vídeo "emúlala" redireccionando la escritura a la memoria de vídeo de la máquina en la que se ejecuta el emulador. Si intentan acceder a un puerto redirecciona el acceso al correspondiente puerto en la máquina en la que se ejecuta el emulador (si se puede). Y así sucesivamente.

Espero haberte servido de ayuda, ánimo.

Saludos, Juan

  Respuesta:  Juan Mellado
Hace ya bastantes años hice un emulador de Spectrum para PC (un 286 por aquella época) escrito completamente en ensamblador, tal vez te ayude un poco mi experiencia al respecto.

Lo primero es conocer "perfectamente" las dos máquinas: la emulada y en la que correrá el emulador. Y esto incluye hardware (micro, registros, interrupciones, excepciones, memoria, puertos, vídeo, ...) y software (sistema operativo). Repito: "perfectamente".

Necesitarás una copia de la ROM de la máquina original, pero ten cuidado con esto ya que suelen estar licenciadas y sujetas a copyright. Lo mejor es que la consideres como un fichero independiente que utiliza el emulador.

Básicamente deberías hacer "tres grandes cosas":

- Reservar memoria. Un bloque con el mismo tamaño de memoria que la máquina emulada y en la que cargues la ROM a partir de la misma posición en la que se encuentra en la máquina emulada.

- Un intérprete del micro a emular. Es decir, una estructura con los registros del micro a emular incluyendo el Program Counter, el Stack Pointer, los Flags, ... y un proceso que recorra la memoria , extraíga los mnemónicos y los ejecute actualizando la estructura y la memoria.

- Y una "máquina virtual" montada sobre el intérprete que detecte los accesos a recursos hardware específicos de la máquina emulada.

Esto último requiere una explicación más detallada. Vamos a ver, clasifica los mnemónicos en varios tipos: los que leen/escriben de memoria, los que leen/escriben de puertos, los que habilitan/deshabilitan las interrupciones, etc... Y luego, "simplemente" comprueba a, por ejemplo, qué dirección de memoria intentan acceder. Si intentan escribir en la ROM no les dejes. Si intentan escribir en la memoria de vídeo "emúlala" redireccionando la escritura a la memoria de vídeo de la máquina en la que se ejecuta el emulador. Si intentan acceder a un puerto redirecciona el acceso al correspondiente puerto en la máquina en la que se ejecuta el emulador (si se puede). Y así sucesivamente.

Espero haberte servido de ayuda, ánimo.

Saludos, Juan