Эмулятор Mac 68k [1] — это программный эмулятор, встроенный во все версии классической Mac OS для PowerPC . Этот эмулятор позволял запускать приложения и системный код, которые изначально были написаны для моделей Macintosh на базе 680x0 . За несколькими исключениями, в частности, RAM Doubler от Connectix , эмулятор запускал все программное обеспечение без заметного влияния, за исключением более низкой производительности по сравнению с той же программой при компиляции для PowerPC.
Первая версия была написана Гари Дэвидианом, который изначально создал ее для использования на процессоре Motorola 88000 , использовавшемся в первой неудачной попытке Apple создать целевую платформу RISC . [2] [3] Более поздняя версия, использующая динамическую перекомпиляцию , была разработана Эриком Траутом , который позже работал над успешными проектами эмуляции в Connectix, такими как Virtual Game Station и Virtual PC . До прихода Траута Connectix выпустила Speed Doubler, который включал еще более быстрый эмулятор PowerPC 68k.
Все версии этого эмулятора эмулировали «пользовательское» подмножество набора инструкций 68EC040 с кадром стека исключений 68020/68030 . Документы разработчиков Apple указывают, что эмулятор предоставлял операционную среду, наиболее близко напоминающую среду Macintosh Centris 610 , системы на базе микропроцессора Motorola 68LC040 . [4] Ранние версии эмулировали его, декодируя каждую инструкцию и немедленно выполняя ряд эквивалентных инструкций PowerPC. Для PCI PowerMacs использовался эмулятор динамической перекомпиляции для повышения производительности. Динамическая перекомпиляция работает путем «перекомпиляции» общих разделов кода в более быстрые, родные для PowerPC последовательности, которые были локально кэшированы. Эмулятор мог распознавать ту же последовательность кода 680x0 и запускать ранее кэшированный код PowerPC, чтобы избежать повторной трансляции. Этот эмулятор был теоретически способен эмулировать код 680x0 быстрее, чем любой реальный 680x0 мог его запустить. У 68LC040 не было инструкций с плавающей запятой, что немного упрощало этот трюк, но не делало его менее впечатляющим.
Одной из причин, по которой эта эмуляция была настолько успешной, является то, что многие API для Mac OS изначально были реализованы как ловушки на процессоре 680x0; поэтому вызов API фактически распознавался 680x0 как эквивалент состояния ошибки, что заставляло его обрабатывать эту ошибку через один из своих аппаратных векторов. В свою очередь, этот вектор искал и запускал процедуру операционной системы из ПЗУ или ОЗУ. В эмуляторе такие ловушки могли быть заменены собственным кодом PowerPC, поэтому единственным эмулируемым кодом было само приложение, и любой вызываемый им системный API мог быть ускорен с помощью собственного кода PowerPC. Это также дало Apple время для переноса ОС на PowerPC. Сначала только критические по времени аспекты были переписаны в собственном коде, оставив большую часть ОС эмулируемой. Постепенно большая часть ОС была переписана в собственную, поэтому ОС со временем стала быстрее.
Для программиста переход на PowerPC был сделан довольно безболезненно, потому что эмулятор запускался и останавливался автоматически. Это было достигнуто с помощью нового типа указателя, называемого универсальным указателем процедуры (UPP). Для кода 68k этот указатель казался обычным указателем на код и мог использоваться как таковой. Однако на самом деле это приводило к структуре данных, которая содержала специальную инструкцию прерывания и флаги, указывающие архитектуру набора инструкций (ISA) вызываемого кода. Из кода PowerPC этот UPP мог быть передан в функцию CallUniversalProc( ) для ее вызова. Затем эмулятор 68k занимался такими деталями, как представление переданных параметров в правильном порядке для рассматриваемой ISA, а также запуск и остановка эмулятора по мере необходимости. Компиляторы для Mac OS создавали такие UPP автоматически при использовании соответствующих макросов , а системные библиотеки PowerPC содержали собственные заглушки для прозрачного вызова собственных или все еще 68k функций по мере необходимости. Это означало, что работа с двойной архитектурой требовала от программиста совсем немного работы, и, как и в случае с ОС, сами приложения могли довольно легко смешивать и сопоставлять код 680x0 и PowerPC.
Поскольку он был встроен во все версии PowerPC классической Mac OS , эмулятор также был частью среды Classic в Mac OS X. Поэтому эмуляторы PowerPC Macintosh, такие как SheepShaver, также используют эмулятор при запуске классической Mac OS. Собственная Mac OS X за пределами Classic никогда не использовала эмулятор.