68030の誤った命令がMac Classic IIの起動を可能にした話
- AppleはMacintosh Classic IIのROMでミスを犯しており、これは起動を妨げる可能性があった。しかし、Motorola MC68030 CPUが未定義命令を実行したことでクラッシュが回避され、起動に成功していた。
MAMEとMacエミュレーション
- MAMEはさまざまなアーケードゲームをサポートするエミュレータであり、68000ベースのMacモデル向けとして最も完成度の高いエミュレータの1つと評価されている。
- 筆者はMAMEを使ってMac Classic IIの問題を解決しようとしたが、24ビットアドレスモードでは正常に起動する一方、32ビットアドレスモードでは起動に失敗した。
24ビット vs 32ビットアドレスモード
- Motorola 68000プロセッサは24本のアドレスラインを備えており、Appleは余った8ビットをフラグ保存に使用していた。
- 新しいマシンとプロセッサは32ビットのアドレス空間をサポートしており、この互換性問題を解決するために2つのモードが提供された。
問題の原因分析
- MAMEでClassic IIが32ビットモードで起動失敗する理由を見つけるため、デバッガを使ってコードを追跡した。
- Appleの技術文書によると、0000000Fは例外が発生したことを意味し、00000001はバスエラーを示す。
ROMコード分析
- ROMのコード内で誤ったアドレスにアクセスする命令を発見した。
- この命令はA1レジスタに誤ったアドレスを保存し、その結果Sad Macエラーが発生する。
ハードウェアとの違い
- 実機では、その誤った命令がA1の値を変更して有効なアドレスにしていた。
- MAMEのエミュレータはこの命令を適切に処理できず、A1が誤ったアドレスのままになっていた。
結論
- AppleはClassic IIのROMで発生しうるバグを認識しておらず、68030の誤った命令がそれを隠していた。
- MAMEはこの問題を解決するため、ROMのバグにパッチを当ててClassic IIが起動するようにした。
- この事例は、エミュレータがハードウェアについて新たな事実を発見できることを示している。
1件のコメント
Hacker Newsのコメント
MC68030の未文書化命令を発見した体験を共有している。この命令はA1レジスタの値を変更し、read-modify-writeバスサイクルを実行する
CAS命令のエミュレーションに関するバグ報告が多かったことに触れている
過去のAmiga 2000と68000プロセッサに関する思い出を共有している
ほとんどのCPUには未文書化命令があり、68kも例外ではない
MC68030の未文書化命令の正確な動作を理解するための試みが必要だとしている
MacデバッガUIの効率性に感心している
この命令がコピー防止目的で使われていたのか、すべての68030で発生するのか気にしている
'040/060もこの「未文書化命令」をサポートしているのか気にしている