Genesis Doom の E1M1 をメガドライブ用エミュレータで表示したキャプチャ

メガドライブ向け DOOM のもうひとつの無茶移植版を公開しました

敵も出ず、銃も撃てない、DOOM E1M1 を歩き回れるウォーキングシミュレーター。GBADoom をベースにしたメガドライブ向けもうひとつの無茶移植版のソースを公開しました。

以前、メガドライブで DOOM を動かしたという記事を書きました。そのときに少し触れた、もうひとつの無茶移植版のほうもソースを公開しました。

GBADoom をベースに、AI エージェントを使ってメガドライブ(海外名 Sega Genesis)へ移植したものです。敵も出ず、銃も撃てません。DOOM の最初のステージ E1M1 を歩き回れるウォーキングシミュレーターです。

まずはデモ動画をどうぞ。

▶ E1M1 を出口まで探索するデモ動画

Genesis Plus GX で、通常のパッド入力を自動再生して録画したものです。動画は等速で、出口のスイッチ操作とクリア後の画面まで入っています。

前の記事で「いつか供養したい」と書いたほうです

前の記事で公開したのは、ネオジオ向けの移植で使われていた Doom64KB をベースにしたものです。今回の Genesis Doom は、それより前から進めていた、GBADoom ベースの移植です。

GBADoom は Game Boy Advance 向けの DOOM 移植です。ソースと動作の様子はこちら。

整数演算中心で、組み込み機向けのベースとして扱いやすそうだったのですが、メガドライブへ持ってくるのはなかなか大変でした。

RAM に収めるところから苦労し、コンパイラの選択でドハマりし、エンディアンの違いでもビルドとテストを繰り返していました。前の記事で「こちらはまだ公開していません(いつか供養したい)」と書いたほうです。

ピクセルで描いた絵を、タイルしか並べられない画面に出す

メガドライブのメイン RAM は 64KB。CPU は約 7.6MHz の Motorola 68000 です。

そして、画面表示を担当する VDP は、フレームバッファに描いた絵をそのまま表示する仕組みではありません。8×8 ドットのタイルを並べて画面を作ります。

そこで今回は、DOOM 側で 120×64 の小さな画面を描き、それをメガドライブ用のタイルデータへ変換して、240×128 に拡大して表示しています。描くだけでなく、表示形式への変換と VRAM への転送まで必要になります。

ゲーム画面ではタイルの配置を最初に作っておき、その後は絵柄のデータだけを DMA で更新します。毎フレーム転送する量を減らすための処理です。

RAM 64KB に収めるために削ったもの

画面を小さくしただけで収まるわけでもありません。描画用の作業領域やキャッシュもメモリを使います。

そのため、ステータスバーの描画を外したり、一時バッファやテクスチャのキャッシュを小さくしたり、ゲームデータをできるだけ ROM 側から参照したりしています。

それでも RAM はかなり詰まっています。大きな配列を追加するのはもちろん、メモリ配置の小さな変化でも動作が変わることがあり、なかなか大変です。

BGM は MIDI を VGM、さらに XGM へ変換して、SGDK のサウンドドライバで鳴らしています。ゲーム側の 68000 とは別に、Z80 側で音楽を再生する構成です。

E1M1 を歩き回るウォーキングシミュレーター

敵と戦う要素はありませんが、E1M1 の中を移動して、景色を眺めたり、出口まで歩いたりできます。BGM を聴きながら、見慣れたステージをメガドライブの画面で散歩する感じです。

フレームレートは開始時点で 0.8fps、描画負荷が軽い壁際で最大約 2fps です。それでも、RAM 64KB のメガドライブで DOOM の空間を描画して、その中を歩き回れるところまでは動きました。

紹介プレゼン

紹介プレゼンを Canva で見る

メガドライブに Doom を移植してみた:スライド 1 / 21「メガドライブに」
メガドライブに Doom を移植してみた:スライド 2 / 21「ゲームデータは WAD にまとまっている」
メガドライブに Doom を移植してみた:スライド 3 / 21「大きなデータを、そのまま読める」
メガドライブに Doom を移植してみた:スライド 4 / 21「Doom の空間は「2.5D」」
メガドライブに Doom を移植してみた:スライド 5 / 21「BSP で、見えない部分の処理を省く」
メガドライブに Doom を移植してみた:スライド 6 / 21「移植元は GBADoom」
メガドライブに Doom を移植してみた:スライド 7 / 21「まず、起動画面が出た」
メガドライブに Doom を移植してみた:スライド 8 / 21「横長ドットで描く」
メガドライブに Doom を移植してみた:スライド 9 / 21「色の変換は、事前にテーブル化」
メガドライブに Doom を移植してみた:スライド 10 / 21「最初のゴールは「描画して歩く」」
メガドライブに Doom を移植してみた:スライド 11 / 21「収まっても、スタックで止まる」
メガドライブに Doom を移植してみた:スライド 12 / 21「同じ数値でも、バイトの順が逆」
メガドライブに Doom を移植してみた:スライド 13 / 21「見えるデバッグ情報を増やす」
メガドライブに Doom を移植してみた:スライド 14 / 21「動いた。でも、遅い」
メガドライブに Doom を移植してみた:スライド 15 / 21「入力をつなぐと、歩けた」
メガドライブに Doom を移植してみた:スライド 16 / 21「計算と転送を軽くする」
メガドライブに Doom を移植してみた:スライド 17 / 21「縦も半分。遠景も簡略化」
メガドライブに Doom を移植してみた:スライド 18 / 21「Doom の雰囲気を感じられるところまで」
メガドライブに Doom を移植してみた:スライド 19 / 21「メガドライブで Doom が動いた」
メガドライブに Doom を移植してみた:スライド 20 / 21「MSX では、バンク切り替え」
メガドライブに Doom を移植してみた:スライド 21 / 21「MSX 版は、まだ苦戦中」

ソースを公開しています

リポジトリはこちらです。

GBADoom 由来のエンジンに、メガドライブ用の画面表示、入力、音声処理を組み合わせています。

ROM や WAD、楽曲データは含めていないので、動かす場合は README に沿ってゲームデータなどを別途用意する必要があります。

前の記事では苦労話だけになっていたもうひとつの無茶移植版も、これでようやく公開できました。メガドライブの制約の中で DOOM の画面をどう出しているのか、興味のある方は覗いてみてください。