Macでゲームボーイアドバンスのゲームを作ろう【01】
ながらく放置していたGBA用の自作ゲームを作っていきます。
今回はひとまずHello Worldのビルドまでやっていきます。
前回は開発環境を整えたので、その続き。
devkitProにはあらかじめMakefileが同梱されていて、それを使うと簡単にGBA向けのROMをビルドできます。
$ mkdir ~/gba-sample
$ cd ~/gba-sample
$ cp $DEVKITPRO/examples/gba/template/Makefile .
それではまずは何もしないROMを作ってみます。
このmain.cをgba-sample/source/に置いてください。
int main(){}
main関数を呼ぶだけの本当に何もしないプログラムです。
これをmakeしてみます。
$ cd ~/gba-sample
$ make
これでgba-sample_mb.gbaという実行ファイルが出来上がるはずです(makeがこける場合は環境構築がうまくいっていないので、もう一度やり直してみてください)
エミュレータで実行してみると、何も表示されない画面が出てくるはずです。
すでにOpenEmuをインストールしている人は、
$ open ~/gba-sample/gba-sample_mb.gba
で実行できます。
エミュレータをインストールするのはなんだか違法っぽくて嫌という人は、ブラウザ上で動作するGBA.jsなどでも実行できます。
次にHello Worldをやっていきます。
main関数をこんな感じで書き換えてみます。
int main()
{
*(unsigned int*)0x04000000=0x0403;
((unsigned short*)0x06000000)[120+80*240]=0x001f;
((unsigned short*)0x06000000)[136+80*240]=0x03e0;
((unsigned short*)0x06000000)[120+96*240]=0x7c00;
while(1);
}
なんだかよく分からないですけど、アドレスをハードコーディングして値を代入していたりして、やばさを感じますね。
ひとまずmakeして実行してみると、こんな画面になると思います。
画面中央に赤、緑、青の点が1ドットずつ描かれています。
ここでプログラムの解説をすると、まず3行目では、GBAの画面描画モードを指定していて、今回はMode3を指定しています。画面描画モードについてはおいおい説明していくので、今はおまじないだと思って読み飛ばしてください。
続く4行目から6行目では、IOレジスタに直接値を書き込むことで、画面に表示するドットと色を指定しています。
最後に7行目では、無限ループで画面にドットを表示し続けます。
GBA開発は基本的にこんな感じで、「直接アドレスを指定して代入」をずっとやっていくので、敷居が高く感じるかもしれませんが、UnityやDXライブラリを使っていると、大量に出てくるブラックボックスで使っている機能が一切ないので、本当に「自作」って感じがして楽しいですよ〜