以前、メガドライブで DOOM を動かしたという記事を書きました。そのときに少し触れた、もうひとつの無茶移植版のほうもソースを公開しました。
GBADoom をベースに、AI エージェントを使ってメガドライブ(海外名 Sega Genesis)へ移植したものです。敵も出ず、銃も撃てません。DOOM の最初のステージ 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 の空間を描画して、その中を歩き回れるところまでは動きました。
紹介プレゼン





















ソースを公開しています
リポジトリはこちらです。
GBADoom 由来のエンジンに、メガドライブ用の画面表示、入力、音声処理を組み合わせています。
ROM や WAD、楽曲データは含めていないので、動かす場合は README に沿ってゲームデータなどを別途用意する必要があります。
前の記事では苦労話だけになっていたもうひとつの無茶移植版も、これでようやく公開できました。メガドライブの制約の中で DOOM の画面をどう出しているのか、興味のある方は覗いてみてください。


