9月4日、php-net.pro(ゲーム・AI系の技術記事を扱うメディア)が「An LLM ported a 1993 Amiga game to Godot by reading its 68000 assembly」と題した記事を公開した。この記事では、AnthropicのClaude Sonnet 4が1993年製AmigaゲームのM68kアセンブリコード7万行超を読み解き、Godot 4へ移植した実験について詳しく紹介されている。
1993年のイラク産ゲームが30年越しに現代へ
Rabah Shihab氏は1993年、バグダッドでAmiga 500(RAM 512KB、ハードドライブなし、1日数時間しか電力が使えない環境)上で、68000アセンブリのみを使ってプラットフォームゲーム「Babylonian Twins」を開発した。元記事ではイラク初の商用ゲームと紹介されているが、Commodoreの経営破綻と経済制裁の影響でほぼ流通しなかった。2010年にC++(約3万4,000行)でiOS移植版を手書きし、200万ダウンロードを超えた。
今年、同氏はこのゲームを題材に、Claude Code(ターミナルとファイルシステムへのアクセスを持つエージェント環境)を使った制御実験を実施した。
実験の3ステップと所要時間
実験は3段階で構成された。
- 2010年のC++エンジンをGodot 4へ移植:空のプロジェクトから操作可能なキャラクターまで21分、macOS・iOS・Android向けにエクスポートできる状態まで2時間15分で完了
- 1993年の68000アセンブリ26ファイル、合計72,758行をAmigaの50Hzタイミングで移植:後述するバイナリ一致検証や逆算解析を含む、本実験の中核となる工程
- 1993年版ゲームを現代版の中に第2の起動オプションとして組み込む:作業開始21:58から翌23:43にかけて、1晩で完了
なお「1晩」はステップ3の組み込み作業の所要時間を指す。ステップ1の移植は2時間15分、ステップ2のアセンブリ移植プロセスはそれぞれ別工程として実施されたものであり、全工程を合算した期間ではない。
ステップ2の核心:72,758行の移植プロセス
ステップ2では、26ファイル・合計72,758行に及ぶ68000アセンブリ(Motorola社が開発したCPUアーキテクチャ。Amiga 500をはじめ1980〜90年代の多くのホームコンピュータに採用された)を読み解き、Amigaの50Hzタイミングに基づく動作をGodot 4上で再現する作業が行われた。
移植前の準備として、モデルはまず1993年のソースをApple Silicon上のvasm(オープンソースのマルチターゲットアセンブラ)で再アセンブルし、出荷済みバイナリとバイト単位で一致させた。インポートから最初の一致ビルドまで15分。
このプロセスでモデルは、オリジナル開発で使われたアセンブラ「ASM-One」とvasmの間にある5つの方言差異を吸収する前処理パスを自ら記述した。さらにds.b 800の巻き戻しブロック内のorgバグ(コッパーリストを含む全体が944バイトずれる問題。コッパーリストとはAmigaのグラフィックチップが画面走査に同期して実行する命令列で、グラデーションや色サイクルといった視覚効果に使われる)も修正した。
残った108バイトの不一致については「出荷ディスクはゲーム実行後のメモリスナップショットである」と結論付けた。コードがそれらの変数を読む前に書いているため、新規アセンブル時のゼロ値は無害だという推論だ。Shihab氏本人もこの主張を自分では検証していないと認めている。
レベルのフォーマット解析も特筆に値する。ヘッダーのないタイルマップをコードがバイトを読む順序から逆算し、全5レベルを1パスで解読。Shihab氏が2020年に撮影した全レベルの画像とピクセル単位でゼロ差異で一致した(スカイグラジエントと水の色サイクルという2つのコッパーエフェクトを考慮した上で)。
さらに、「ドアはマップデータとして描かれている」というShihab氏自身の33年来の思い込みを覆した。実際にはドアはランタイムにコードがマップへスタンプするものであり、エディタでは一切描かれていなかった。
バグも「教育的」だった
モデルが導入したバグの一部は興味深い。
- 衛兵の押し判定に上限が欠落し、13タイル上にいる兵士が岩盤越しにダメージを与えた
- 隠しタイルレイヤーを正確にレンダリングしすぎた結果、全秘密通路がゲーム開始直後から開放状態になった
- ドアリスト
p1,p2,p3,p4を1つのキーとしてパースしたため、チュートリアルの出口が永遠に開かなかった - ステレオ/モノの誤りで全サウンドが半分になった
最もコストのかかったバグは、Shihab氏自身がリクエストした「長距離ツイン入れ替え」機能に起因するもので、調査の結果、オリジナルの近接チェックが距離制限ではなく2つの彫像タイルが重なることを防ぐ保護機構だったことが判明した。
リリース作業もモデルが担当
移植後、モデルは11言語×5ピクセルサイズのスクリーンショット生成、ストアテキスト、アイコン作成、ブラウザ自動化によるSteamworksのフォーム入力まで実施した。ログインと最終的な送信ボタンはShihab氏が行った。
また、15年分のGoogle Playレビューをスクレイピングして「レベル1のドアを通れない」という1つ星レポートを発見。これは実際のバグで、出口を歩いて通るプロンプトが18レベル中2レベルにしか存在しなかった。修正はバージョン2.0.3としてリリースされた。
成果物の現状
- 1993年オリジナル版:33年越しにitch.ioで無料公開。FS-UAE・WinUAE(いずれもAmiga実機環境をPCで再現するエミュレータ)および実機で動作
- Babylonian Twins: Definitive Edition:iOS・Android配信中、Steamデモ公開済み、フルリリースは今秋(1993年版を起動オプションとして内包)
- 出荷物にAmigaコードは一切含まれない:データはPNG・WAV・JSONに変換済み、動作はGDScriptで再実装
Shihab氏の評価は冷静だ。「決めるのは自分だった。AIは自分が追いきれない速さで動いた。間違っていた箇所も含めて」。
詳細はAn LLM ported a 1993 Amiga game to Godot by reading its 68000 assemblyを参照していただきたい。