2016/11/17
ファミコンミニでDOOMを動かそう
DOOOOOOOOOOM!
ハードウェアがハックされて好きなソフトウェアが動かせるようになると、必ずといっていいほど良く使われるゲームがあります。 それが、DOOMです。 DOOMは1993年に発売された、現在で言うところのFPSにあたるゲームです。2016年にはリブートタイトルが発売されました。
また、このゲームの特徴としてゲームエンジンのソースが公開されているという点があります。 擬似3Dのソフトウェアレンダラが含まれたゲームエンジンなので、移植にはもってこいというわけです。 今でも公開されたソースを使用して様々な改良エンジン(ソースポート)が作られています。
ファミコンミニでLinuxが動作したとき、「Linuxが動くんならDOOMが動くのは当たり前だな!」とか思っていたので、いつかDOOMを動作させるという目標は立ててました。 そして、ファミコンミニで動く自前ビルドのLinuxを使用していますが、DOOMを動作させることができました。
必要なもの
やりたいことは、Linuxのフレームバッファを描画先にできるDOOMエンジンを動作させることなので、以下のようになります。
- HDMIを復活させたファミコンミニのカーネル
- ARM Linuxをターゲットにしているビルド環境
- SDL v1.2系
- lsdldoom
- DOOMのIWAD(ゲームデータ)、製品版を持っていないのであればシェアウェア版を使う
ビルドしよう
SDLのビルド済みバイナリをlsdldoomで使う際のパス通しの作業が面倒なので、ここでは簡単に行うためにRaspbianをQEMUで動かした環境を使います。 QEMUのユーザモードを使えば、実用的な速度でARM Linuxのビルド環境を使うことができます(クロスコンパイラが最速なのは変わりませんが)
以降、特記していない限りはRaspbianをQEMUのユーザモードで動かしている環境上での作業です。
SDLのビルドとインストール
SDLをダウンロードしてインストールします。
キーボード入力を殺しておかないと起動しないので、そのためのパッチを当ててインストールします。
./configure
のオプションは、
- フレームバッファ(fbcon)のサポートのみに絞る
- 最終的には静的リンクしたバイナリを作りたいので、
.so
をビルドしない
の意味があります。
$ cd SDL-1.2.15
$ patch -p0 < sdl-fbvideo.patch
$ ./configure --without-x --disable-directfb --disable-shared --disable-sdl-dlopen
$ make
$ sudo make install
lsdldoomのビルド
lsdldoomをダウンロードしてビルドします。 これもそのままでは色深度の判定がおかしくなってしまうので、パッチを当ててビルドします。
$ cd lsdldoom-1.5
$ patch -p0 < lsdldoom-video.patch
$ ./configure --disable-dependency-tracking --disable-cpu-opt LDFLAGS=-static
$ make
ファミコンミニのLinuxへ持っていく
lsdmdoomからは、以下のファイルを持っていけば動くはずです。
src/lsdldoom
data/boomlump.wad
さらに、DOOMのIWADも必要になるので一緒に持っていきます。
動かす
ファミコンミニのLinuxで動かします。 SDLのマウスサポートを殺すために、環境変数を設定した上で起動します。
$ SDL_NOMOUSE=1 ./lsdldoom -width 1280 -height 720
起動させると、以下のツイートの動画のように動くはずです。
ファミコンミニでDOOM動作!色深度がおかしいのも直した pic.twitter.com/mg95wSHjh0
— NV(*´`*) (@nvsofts) November 17, 2016
最後に
まだコントローラによる操作やサウンドが死んでいますが、これでやっと気持ちよく寝られそうです。