ESP32-P4にDOOMを移植、拡大を専用回路に任せて丸め誤差のない4対3

DOOMをマイコンで動かした事例は珍しくない。ただし多くは似た見た目を再現した簡易版で、市販のゲームデータをそのまま読んだり、途中で保存したりはできない。luismi_kode氏が公開した移植は、doomgenericという既存のエンジンを土台に、本物の実装をESP32-P4へ載せた。ソースコードはGPL-2.0で公開されている。

面白いのは表示までの経路だ。DOOMが描く画面は320×200で、載せる先の有機ELは410×502ドットだ。そのままでは映らないので拡大が要る。ESP32-P4には画素の処理を受け持つPPAという回路があり、これに横を20/16倍、縦を24/16倍させると、ちょうど400×300になる。縦横の比は正確に4対3で、しかもどちらの係数もPPAが刻める16分の1の目盛りにぴったり乗るため、丸め誤差がどこにも出ない。拡大の間、CPUは1画素も触らない。同氏は、面白かったのはエンジンそのものではなく表示の経路だったと書いている。

メモリーの使い方も割り切っている。32MBのPSRAMへ、ゲームデータのファイルを起動時に丸ごと読み込む。エンジンはそこへの直接の参照を受け取るので、以降microSDに触るのは保存を書くときだけになる。無償で配布されているシェアウェア版のデータはあらかじめ本体のプログラムに埋め込んであり、カードを挿さない基板単体でも起動して遊べる。手持ちの製品版は12MBから15MB程度でPSRAMに収まる。BSDライセンスのFreedoomは28.8MBあって枠に入りきらないため、ファイルとして読み出す形になり、面の読み込みは遅くなるが動作はする。表示は2枚の画面を交互に使う方式で、画面のちらつきも出ない。

同氏はこの基板ならではの落とし穴も書き残した。下側のボタンと十字キーの左を1.4秒ほど同時に押し続けると、専用のICが働いてハードウェアリセットがかかる。同じボタンを8秒から15秒押し続けると、今度は充電ICの電源制御端子に届いてしまう。メニューを開く操作を0.6秒の長押しにとどめ、ボタンを離した瞬間に反応させているのはこのためだ。上側のボタンはGPIO35につながっており、この端子は起動時の設定を決める役目を持つが、影響するのは基板を挿した瞬間だけで、動作中は自由に使える。エンジンは外部参照ではなく取り込む形で持ち、加えた修正はすべて理由付きで記録している。ビルドにはESP-IDFの6.0以降が必要になる。

関連情報

fabsceneの更新情報はXで配信中です

この記事の感想・意見をSNSで共有しよう
  • URLをコピーしました!

最新記事

YouTube / PodCast

【PR】読んで役立つ注目記事

目次