Mac 68k エミュレータ[ 1 ]は、 PowerPC 用のクラシック Mac OS のすべてのバージョンに組み込まれたソフトウェア エミュレータです。このエミュレータにより、元々 680x0 ベースの Macintosh モデル用に作成されたアプリケーションやシステム コードを実行できるようになりました。Connectix の RAM Doubler [ 2 ] などいくつかの例外を除き、このエミュレータは、PowerPC用にコンパイルされた同じプログラムと比較してパフォーマンスが低下する以外に目立った影響なく、すべてのソフトウェアを実行しました。
最初のバージョンは、 Apple がRISCターゲット プラットフォームを初めて開発しようとして失敗に終わった際に使用されたMotorola 88000 CPUで使用するために最初に作成された Gary Davidian によって書かれました。[ 3 ] [ 4 ]動的再コンパイルを使用した後のバージョンは、後にVirtual Game StationやVirtual PCなどのConnectixでの成功したエミュレーション プロジェクトに携わったEric Trautによって開発されました。Traut が Connectix に入社する前、Connectix はさらに高速な PowerPC 68k エミュレータを含むSpeed Doublerをリリースしていました。
このエミュレータのすべてのバージョンは、 68020/68030例外スタック フレームを使用して、68EC040命令セットの「user」サブセットをエミュレートしました。 Apple の開発者向けドキュメントによると、このエミュレータは、Motorola 68LC040マイクロプロセッサをベースとしたシステムである Macintosh Centris 610に最も近いオペレーティング 環境を提供していました。[ 5 ]初期バージョンでは、各命令をデコードして、同等の一連の PowerPC 命令を即座に実行することでエミュレートしていました。PCI PowerMacでは、パフォーマンスを向上させるために動的再コンパイルエミュレータが使用されました。動的再コンパイルは、コードの共通部分を、より高速な PowerPC ネイティブのシーケンスに「再コンパイル」してローカルにキャッシュすることで機能します。エミュレータは、同じ 680x0 コードのシーケンスを認識し、以前にキャッシュされた PowerPC コードを実行して、再度変換するのを回避することができました。このエミュレータは、理論的には、実際の 680x0 が実行できる速度よりも高速に 680x0 コードをエミュレートすることができました。 68LC040には浮動小数点命令がなかったため、この偉業は若干容易になったものの、その印象は損なわれなかった。
このエミュレーションが成功した理由の一つは、Mac OS の多くのAPI が元々 680x0 プロセッサ上でトラップとして実装されていたことです。そのため、API の呼び出しは 680x0 によってエラー状態と同等と認識され、ハードウェア ベクトルのいずれかを介してエラーを処理する必要がありました。このベクトルは、ROM または RAM からオペレーティングシステム ルーチンを検索して実行します。エミュレータでは、このようなトラップをネイティブ PowerPC コードに置き換えることができたため、エミュレートされるコードはアプリケーション自体のみとなり、アプリケーションが呼び出すシステム API はネイティブ PowerPC コードで高速化できました。これにより、Apple はOS を PowerPC に移植する時間を確保することができました。当初は、時間的に重要な部分のみがネイティブ コードで書き直され、OS の大部分はエミュレーションされたままでした。徐々に OS の大部分がネイティブに書き直され、OS は時間とともに高速化していきました。
プログラマにとって、PowerPCへの移行は比較的容易でした。エミュレータが自動的に起動および停止されたためです。これは、ユニバーサルプロシージャポインタ(UPP)と呼ばれる新しいタイプのポインタを使用して実現されました。68kコードの場合、このポインタは通常のコードポインタのように見え、そのように使用できました。しかし、実際には、特別なトラップ命令と、呼び出されたコードの命令セットアーキテクチャ(ISA)を示すフラグを含むデータ構造につながっていました。PowerPCコードからは、このUPPをCallUniversalProc()関数に渡して呼び出すことができました。68kエミュレータは、渡されたパラメータを該当するISAに適した順序で提示したり、必要に応じてエミュレータを起動および停止したりするなど、詳細な処理を行いました。Mac OSのコンパイラは、適切なマクロが使用されると、このようなUPPを自動的に作成し、PowerPCシステムライブラリには、必要に応じてネイティブ関数または依然として68k関数を透過的に呼び出すためのネイティブスタブが含まれていました。これは、プログラマーにとってデュアルアーキテクチャを扱うのにほとんど手間がかからず、OSと同様に、アプリケーション自体も680x0とPowerPCのコードを比較的簡単に混在させることができたことを意味する。
エミュレータは、クラシック Mac OSのすべての PowerPC バージョンに組み込まれていたため、 Mac OS XのClassic 環境にも含まれていました。そのため、 SheepShaverなどの PowerPC Macintosh エミュレータは、クラシック Mac OS を実行する際にもこのエミュレータを使用します。クラシック環境以外のネイティブ Mac OS X では、このエミュレータは使用されませんでした。