Lilith.
⌕
編集イラスト: Geminiがカンファレンスバッジ用にゲームボーイのエミュレーターを書いた だが最も手強いバグを見つけたのは本物のゲームだった
Lilithのイラスト · 編集リミックス

今年のGitHub Universeでは、首から下げたバッジでゼルダが遊べる。かつてGoogleでGo言語を率いたSteve Franciaが、Geminiの助けを借りてバッジ上でNESエミュレーターを動かし、さらにゲームボーイとゲームボーイカラーにも対応させた。昨年も同様のバッジをハックしたSimon Willisonが、この取り組みを紹介した。

RP2350搭載のバッジで『夢をみる島』が60フレームで動く

バッジの名前はBadger。230 MHzで動くデュアルコアのRP2350チップ、320 × 240ピクセルのカラー液晶、16 MBのフラッシュ、8 MBのPSRAMを備える。OSはMicroPythonベースのMonaOS 4.0だ。Franciaはイベントの数日前に、「hack this」と書かれたカードと一緒にバッジを受け取った。

最も手っ取り早いのは、既製のC製エミュレーターを書き込むことだった。Franciaによれば約20分で済むが、そうするとバッジ本来のアプリやBluetoothでの連絡先交換、会場を回る赤外線スタンプラリーが使えなくなる。そこで彼は、MicroPythonの中で動く普通のアプリとしてエミュレーターを作ることにした。ただし通常のMicroPythonは毎秒10万〜20万命令程度しか処理できず、NESにはその約10倍が必要だ。

突破口は、型付きのPythonを直接ARMの機械語に変換するViperモードだった。最初のNESエミュレーターは約1,100行で、作者によればゼルダを毎秒約32フレームで動かせる。ゲームボーイカラーはさらに難しかった。CPUのSM83は512命令あり、NESの56命令とは桁が違う。それでもFranciaは、CPUのエミュレーションが12 ms未満、描画が3 ms未満で、60 Hzの1フレーム16.6 msに収まると報告している。バッジを上下逆さにすると、タッチボタンがコントローラーになる。

ループを書いたのはモデル、判断と計測は人間

ゲームそのものより興味深いのは、Franciaが珍しく細かく説明している役割分担だ。彼によれば、Gemini 4 Argonは6502 CPU、グラフィックチップ、メモリバンク切り替えを説明したプロンプトから内側のループを下書きした。Franciaは4つのメモリポインターを軸にした設計を決め、Viperのカーネルを整え、すべての数値を実機でUSB経由で計測した。残ったバグは、実際に動かして初めてわかる類いのものだったという。

ゲームボーイでは、それが文字どおりの意味で当てはまった。『ポケットモンスター クリスタル』は起動すると枠が空のまま表示された。このゲームはフォントを高速にコピーするため、スタックポインターをROMに向けるからだ。Franciaは、ハードウェアがそんなことを許すとは知らなかったと認めている。『ゼルダの伝説 夢をみる島DX』では、下に歩くと1フレームだけ主人公が半分に割れた。エミュレーターがゲームボーイカラーの倍速モードを考慮していなかったためだ。300 MHzへのオーバークロックを試すと、バッジは完全にフリーズした。

開発者にとっては、ここに実践的な型がある。AIのおかげで、ゲームボーイのハードウェアを知らない人でも、わずかな時間で動くコアにたどり着けた。だが本当の試験は、16.6 msという時間予算と、あらゆる誤った思い込みを容赦なく暴いた90年代のカートリッジの山だった。

Geminiがどれだけコードを書いたか、作者は明かしていない

記事からは、コードのうちどれだけがモデル由来で、Franciaがどれだけ書き直したのかはわからない。ループが動くまでに何回失敗したのかという記録もない。それがない以上、このプロジェクトは、モデルが単独でエミュレーターを書けることの証明というより、熟練エンジニアの見事な実演と見るべきだ。

ありふれた制約もある。バッジにはスピーカーがないため、NES版は音が出ない。コードはオープンソースだが、ゲームは同梱されておらず、各自が合法的に入手したROMを用意する必要がある。カンファレンスバッジ向けの数日楽しめるおもちゃであって、プラットフォームではない。

Viperの技が広まるかは、ほかのバッジハッカー次第

Franciaはリポジトリと、ゲームボーイからNESエミュレーターに逆輸入してそちらも高速化した5つの技を公開した。最初のシグナルは、ほかのバッジ所有者やMicroPythonのコミュニティがそれを取り入れるかどうかだ。

2つ目のシグナルは、仕事の進め方に関わる。似たプロジェクトがプロンプトの記録やモデルが書いたコードの割合を公開するようになれば、昨年のバッジでWillisonがClaude Codeを使って実践したように、AIが本当に何週間も節約した場面と、作業をデバッグに移しただけの場面を比べられるようになる。

Lilithの判定

Geminiはすべてのプロンプトを通過するゲームボーイを書き上げたが、そこへオーキド博士が空っぽの枠を連れて現れた。AIのコードが本当に動くかを知りたいなら、モデルの隣に、説明書を読まず容赦もしない四半世紀前のカートリッジが要る。