Hombre, para crear un emulador, primero tienes que conocer muy a fondo la maquina que quieres emular (y eso es lo mas dificil de conseguir: informacion precisa no solo de la forma de operar del hardware, si no de los ciclos de reloj exactos que lleva cada operacion)
Por ejemplo, si estas emulando una CPU tendras que emular todas las instrucciones del procesador con fidelidad, llevando el tiempo que consume cada instruccion y añadiendo ciclos de reloj extras, si se accede a un dispositivo lento (por ejemplo, en el ordenador spectrum, la RAM de video es compartida por la CPU y la ULA, teniendo esta prioridad y penalizando en un 20% si no recuerdo mal, en los accesos del procesador)
Evidentemente, esa temporizacion hay que mantenerla para todo el hardware de la maquina emulada, pero tambien hay que relacionarla con el hardware emulador.
Lo que se suele hacer, es que el emulador procese todas las instrucciones y operaciones hasta completar un frame (tambien se puede utilizar el tiempo que se tarda en dibujar una linea en pantalla).
Por ejemplo, si una maquina trabaja con video PAL y actualiza la pantalla 50 veces por segundo, conociendo el reloj del sistema, se puede averiguar el numero de ciclos de reloj en 1 segundo/50 frames y ejecutar todas las instrucciones hasta completar ese numero de ciclos y luego salir fuera del emulador para permitir que el sistema emulado, visualice los graficos, lea un PAD o se sincronice.
Si el emulador trabaja mas rapido que la maquina original, tendremos una emulacion satisfactoria, pero si trabaja mas lento, se pueden recurrir a diversos trucos para acelerarlo, como la recompilacion dinamica, que consiste en traducir el codigo maquina a emular a codigo maquina de la maquina emuladora.
Esto tiene el inconveniente de que si una instruccion es modificada durante el tiempo de ejecucion (por ejemplo, en el spectrum no era raro esto), el codigo emulado no será correcto y el emulador fallará, pero se suele ganar bastante en velocidad porque se evitar tener que interpretar las instrucciones maquina.
Offtopic:
Por cierto, estuve mirando el formato del FOF para adaptarlo a mi programa musical y utiliza un fichero MIDI para el tema de pulsar las notas. Me ha costado lo suyo poder interpretar este fichero correctamente, porque desconocia el formato MIDI y el FoF está escrito en python, lenguaje que yo desconozco.
Pero con la ayuda de un editor hexadecimal, algo de info que encontré en una web y una poca dosis de intuicion, he conseguido interpretar bien los ficheros, incluidos los del pack de Guitar Hero que incluyen unos ficheros MIDI un tanto "raros"
.
A ver si puedo instalar el entorno de compilacion para PS2 y crear un programa similar al FoF para PS2.