開発者が Doom ビデオゲームを Apple の Lightning - HDMI アダプタで実行できるように移植し、その動作を示すビデオを公開しました。
これが可能なのは、Lightning - HDMI アダプタに、ビデオ信号とデータの圧縮、解凍、および Lightning と HDMI 規格間の変換を行う小型コンピュータが内蔵されているためです。
YouTubeにアップロードされたデモ動画では、50ドルのアダプターでゲームが驚くほどスムーズに動作する様子が確認できます。ゲームはMacBookのディスプレイにレンダリングされ、ドングルには永続ストレージがないため、ラップトップからメモリを「借りている」だけで、すべての処理はドングル自体で行われます。この小さなアダプターに埋め込まれたチップが、Doomが発売された1990年代のほとんどのPCよりも処理能力が高いと考えると、驚きです!
Lightning - HDMIアダプタに搭載されているチップセットは、iOSの簡易版(SecureROM、iBoot、XNUをカーネルとして搭載)で動作します。このチップセットは、ビデオストリームを解凍してHDMI信号に変換する役割を担っており、ドングルからHDMIケーブルを介してテレビや対応ディスプレイに出力できます。
開発者はYouTubeのコメントで次のように説明した。
製品版ファームウェアのユーザー空間は極めて最小限です。RAMディスクはありますが、ファイルシステムではなく、静的にコンパイルされたMach-O(Apple OS用のELFのようなもの)です。内部開発バンドルには、ファイルシステムと多数の実行ファイル/共有ライブラリを備えた適切なRAMディスクが含まれています。
そして:
ここでのMacは、ドングルに永続的なストレージがないため、そのようなファームウェアを読み込むだけです。端末の1つに出力されるカラフルなログは、そこからのUART出力です。最初はiBoot、次にカーネルとユーザー空間です。任意のコード実行は、iOSの世界のブートROMエクスプロイトであるcheckm8によって実現されていますが、コードベースが文字通り同じであるため、ここでも動作します。
ゲームを 60fps で適切な解像度で実行することは可能です。
フレームバッファを起動するのは簡単ではなく、かなりのリバースエンジニアリングが必要になります。そこで私は、組み込みデバッグユーティリティ(IOMFBUnitTest、開発ファームウェアにのみ存在)を自分のプロセスのコンテキストで起動し、いくつかの場所でフックすることで、面倒な作業の大部分をそこで済ませています。
そして:
残念ながら、フレームバッファにフレームを実際にコピーする関数は、反復ごとに4バイト(つまり基本的に1ピクセル)しかコピーせず、その間に私がまだ理解できない計算処理を行っています。この関数を適切に再実装すれば、パフォーマンスを大幅に向上させることができるはずです。
コントロールとサウンドはどうですか?
右側のターミナルウィンドウはドングルのシリアルログを出力します。もちろん、逆方向にもデータを送信できます。これは制御用です。サウンドは全く別の話ですが、アダプタのHDMIバージョンではサウンド出力も可能になるはずです。彼は将来的に、このポートをジェイルブレイクされたiOSデバイス用のパッケージとしてリリースする予定です。
CPUがあればDoomが実行できる
Doomは、ID Software社が開発し、1993年12月にDOS搭載PC向けにリリースされた伝説的なファーストパーソンシューティングゲームです。このゲームは絶大な人気を博し、公式および非公式の移植版が数多くリリースされました。特に、1999年にDoomのソースコードがGNU General Public Licenseの下で公開されて以降、その人気は飛躍的に高まりました。Doomは古いCPUアーキテクチャ向けに開発されており、最新のテクノロジーに依存していないため、動作にほとんどCPUパワーを必要としません。
これにより、プログラマーは Doom を移植して、スマート サーモスタット、ピアノ、ピンボール マシン、Redbox キオスク、量子コンピューター、さらには Apple Watch、iOS のピクチャー イン ピクチャー モード、MacBook Pro の廃止された Touch Bar など、予想外のハードウェア上で実行できるようになりました。
他のプロジェクトでは、Doom がターミナル内、オーディオ接続経由、MS Paint、LibreOffice Calc、Minecraft: Pi Edition、Stardew Valley などのソフトウェア内、さらに Excel テーブルや Word および PDF ドキュメント内で ASCII モードで実行されていました。