Mac 68Kエミュレータ

Mac 68Kエミュレータ（マック ろくはちケー エミュレータ）は、PowerPCプロセッサを搭載したMacintosh向けClassic Mac OSの全バージョンに組み込まれていたソフトウェアエミュレータである。このエミュレータでは、それまで使われていた68k用にプログラムされた全てのアプリケーション、システムコードを実行することができた。このエミュレータはユーザーから見て完全にシームレスに動作し、またプログラマから見てもそれなりにシームレスに利用できた。この点から見て、Mac OSは2種類のハードウェアアーキテクチャに対応したオペレーティングシステム (OS) として最初の成功例であると言える。
起源.
最初のバージョンはGary Davidianの手による。元はモトローラ88000CPUで使用するために作られたもので、AppleのRISCターゲット･プラットフォームの初の試作品向けに作成されたが、このプラットフォームは実用化されなかった
動的再コンパイル (DRE, Dynamic REcompile) を利用するバージョンがのちにによって開発された。トラウトはその後、ConnectixにおいてSpeed Doubler（より高速なPowerPC 68kエミュレータが入っている）、CVGS (Virtual Game Station)、Microsoft Virtual PCといったエミュレーション・プロジェクトに参加して成功を収めた。
実装.
全てのバージョンで68020/68030例外スタックフレームを含む68EC040命令セットの「ユーザー」サブセットをエミュレートした。Apple Developer Documentによると68KエミュレータはMacintosh Centris 610（モトローラ68LC040搭載システム）に非常によく似た動作環境を提供するとしている。
初期のバージョンでは各命令を逐一デコードしPowerPCの同等の命令を実行していたが、PCI Power MacではDREを採用してパフォーマンスを向上させた。DREでは、繰り返し現れるコードを予め高速なPowerPCネイティブの命令にコンパイルしたうえでローカルにキャッシュする。エミュレータが同じ680x0のコードを認識すると、事前にキャッシュしておいたPowerPCのコードを実行することでコンパイル処理を省略する。このエミュレータでは理論上、いかなる680x0実機よりも速く680x0命令を実行できるようになっていた。68LC040実機に浮動小数点演算命令がなかったことが幸いしてこれは比較的簡単に達成できたが、それでも印象深い特徴となった。
このエミュレーションがここまでの成功を収めた理由の一つに、Classic Mac OSのAPIの多くが元々680x0プロセッサのトラップとして実装されていたことが挙げられる。このため、APIの呼び出しは680x0におけるエラーと同じ方法で処理されていた。実際には、エラー処理をハードウェアベクタで行い、ハードウェアベクタからROMまたはRAM上にあるOSルーチンが呼び出されていた。エミュレータではこのようなトラップをネイティブのPowerPCコードで置き換えられたため、エミュレーションの必要があるコードはアプリケーション自体のコードだけで、アプリケーションから呼び出されるAPIは全てPowerPCコードによる速度向上の恩恵を受けることができた。また、この機能はAppleがOSをPowerPCへ移植する際にも利用できた。最初は最もタイム・クリティカルな機能だけをネイティブコードで記述しておき、他の部分はエミュレーションに任せておくことができた。OSの大部分がネイティブコードで置き換えられるにつれ、OSの速度は徐々に向上していった。
プログラマの観点から見ると、PowerPCへの移植はほとんど困難を伴わなかった。これはエミュレーションの開始・終了が自動化されていたためである。この機能はUniversal Procedure Pointer (UPP) と呼ばれる新しいタイプのポインタにより実現されている。68kのコードからは、このポインタはコードを指す普通のポインタと同じように見え、また同じように扱える。しかし、実際にはその後にデータ構造が続いており、そこには特別なトラップ命令と、呼び出されるコードの命令セットを表すフラグが格納されている。PowerPCのコードでは、UPPはCallUniversalProc()関数に渡されて呼び出しが行われる。68kエミュレータはその後、対象のISAに合わせて引数の順序を変更したり、必要に応じてエミュレーションの開始・終了を行ったりする。Classic Mac OS向けコンパイラではマクロを定義しておくと自動的にUPPが使用されるようになっていた。また、PowerPCシステムライブラリには、ネイティブコードと68k用コードのいずれかを透過的に呼び出すためのスタブが含まれていた。これにより、プログラマはデュアルアーキテクチャに僅かな労力だけで対応できた。またOSと同様、アプリケーションに680x0とPowerPCの両方のコードを混ぜることも非常に容易であった。