El emulador Mac 68k [1] es un emulador de software integrado en todas las versiones del sistema operativo Mac OS clásico para PowerPC . Este emulador permitía ejecutar aplicaciones y códigos de sistema que originalmente se escribieron para los modelos Macintosh basados en 680x0 . Con algunas excepciones, en particular RAM Doubler de Connectix , el emulador ejecutaba todo el software sin ningún impacto notable, salvo un menor rendimiento en relación con el mismo programa cuando se compilaba para PowerPC.
La primera versión fue escrita por Gary Davidian, quien la había creado originalmente para su uso en la CPU Motorola 88000 , utilizada en el primer intento fallido de Apple de crear una plataforma de destino RISC . [2] [3] Una versión posterior, que utilizaba recompilación dinámica , fue desarrollada por Eric Traut , quien más tarde trabajó en proyectos de emulación exitosos en Connectix, como Virtual Game Station y Virtual PC . Antes de la llegada de Traut allí, Connectix había lanzado Speed Doubler, que incluía un emulador PowerPC 68k aún más rápido.
Todas las versiones de este emulador emulaban el subconjunto "usuario" del conjunto de instrucciones 68EC040 con un marco de pila de excepción 68020/68030. Los documentos de los desarrolladores de Apple indican que el emulador proporcionaba un entorno operativo que se parecía mucho al del Macintosh Centris 610 , un sistema basado en el microprocesador Motorola 68LC040 . [4] Las primeras versiones lo emulaban decodificando cada instrucción y ejecutando inmediatamente una serie de instrucciones PowerPC equivalentes. Para los PowerMacs PCI , se utilizó el emulador de recompilación dinámica para mejorar el rendimiento. La recompilación dinámica funciona "recompilando" secciones comunes del código en secuencias más rápidas, nativas de PowerPC, que se almacenaban en caché localmente. El emulador podía reconocer la misma secuencia de código 680x0 y ejecutar el código PowerPC almacenado previamente en caché para evitar hacer la traducción nuevamente. Este emulador era teóricamente capaz de emular código 680x0 más rápido de lo que cualquier 680x0 real era capaz de ejecutarlo. El 68LC040 no tenía instrucciones de punto flotante, lo que hacía que esta hazaña fuera ligeramente más simple pero no menos impresionante.
Una de las razones por las que esta emulación tuvo tanto éxito es que muchas de las API para Mac OS se implementaron originalmente como trampas en el procesador 680x0; por lo tanto, llamar a una API era reconocido por el 680x0 como el equivalente a una condición de error, lo que haría que manejara ese error a través de uno de sus vectores de hardware. A su vez, este vector buscaría y ejecutaría la rutina del sistema operativo desde la ROM o RAM. En el emulador, dichas trampas podían reemplazarse por código nativo de PowerPC, por lo que el único código que se emulaba era la propia aplicación, y cualquier API del sistema a la que llamara podía acelerarse con código nativo de PowerPC. Esto también le dio tiempo a Apple para trasladar el sistema operativo al PowerPC. Al principio, solo los aspectos críticos en cuanto al tiempo se reescribían en código nativo, dejando gran parte del sistema operativo emulado. Gradualmente, la mayor parte del sistema operativo se reescribió para que fuera nativo, por lo que el sistema operativo se hizo más rápido con el tiempo.
Para el programador, la transición al PowerPC fue bastante sencilla, porque el emulador se iniciaba y se detenía automáticamente. Esto se logró utilizando un nuevo tipo de puntero llamado Puntero de Procedimiento Universal (UPP). Para el código de 68k, este puntero parecía ser un puntero de código común y podía utilizarse como tal. Sin embargo, en realidad conducía a una estructura de datos que contenía una instrucción trap especial y banderas que indicaban la arquitectura del conjunto de instrucciones (ISA) del código llamado. Desde el código PowerPC, este UPP podía pasarse a la función CallUniversalProc() para llamarlo. El emulador de 68k se ocupaba entonces de detalles como presentar los parámetros pasados en el orden correcto para la ISA en cuestión, así como iniciar y detener el emulador según fuera necesario. Los compiladores para Mac OS creaban estos UPP automáticamente cuando se utilizaban las macros adecuadas , y las bibliotecas del sistema PowerPC contenían stubs nativos para llamar de forma transparente a funciones nativas o aún de 68k según fuera necesario. Esto significaba que manejar la arquitectura dual requería muy poco trabajo por parte del programador y, al igual que el sistema operativo, las aplicaciones mismas podían mezclar y combinar códigos 680x0 y PowerPC con bastante facilidad.
Debido a que estaba integrado en todas las versiones PowerPC del Mac OS clásico , el emulador también formaba parte del entorno Classic en Mac OS X. Por lo tanto, los emuladores PowerPC para Macintosh, como SheepShaver, también utilizan el emulador cuando ejecutan el Mac OS clásico. El Mac OS X nativo fuera del Classic nunca utilizó el emulador.