2 ポイント 投稿者 GN⁺ 2025-01-27 | 1件のコメント | WhatsAppで共有

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件のコメント

 
GN⁺ 2025-01-27
Hacker Newsのコメント
  • MC68030の未文書化命令を発見した体験を共有している。この命令はA1レジスタの値を変更し、read-modify-writeバスサイクルを実行する

    • この命令はCPU設計者が意図的に作ったものではなく、不正命令である可能性がある
    • CPUは通常、不正命令を検出して例外を発生させる。しかし、特定の状況では例外が発生しないことがある
    • MC68030のマニュアルによれば、不正命令は有効な命令のビットパターンと一致しないビットパターンを含む
    • マニュアルによれば、命令は3ワードで構成され、最初のワードは正常だが、2番目のワードで異常なビットが発生する
  • CAS命令のエミュレーションに関するバグ報告が多かったことに触れている

    • King of FightersでSBCD命令のキャリーフラグを誤ってチェックしていたバグを覚えている
    • SNKは68000チップの神のような存在だった
  • 過去のAmiga 2000と68000プロセッサに関する思い出を共有している

    • 68020、68030、RISCアーキテクチャに対する興奮に触れている
    • 今では自然言語でコンピュータと会話できる時代になったことを強調している
  • ほとんどのCPUには未文書化命令があり、68kも例外ではない

    • 当時は多くの人がx86/PCに注目しており、こちらのほうがよりオープンで安定したアーキテクチャだった
    • 8088と8086のマイクロコードは解析・研究されている
  • MC68030の未文書化命令の正確な動作を理解するための試みが必要だとしている

    • A1の結果値は元のA1値、A7値、プログラムカウンタによって変わる可能性がある
    • MAMEはこのバグをROM上でパッチし、Classic IIが起動できるようにしている
  • MacデバッガUIの効率性に感心している

    • Amigaの変換速度を向上させることはできないだろう
  • この命令がコピー防止目的で使われていたのか、すべての68030で発生するのか気にしている

    • 現代のMacでは不可能そうだ。最近のAppleの技術文書はあまり良くない
  • '040/060もこの「未文書化命令」をサポートしているのか気にしている