自分自身はゲームボーイ世代というよりはファミコン世代です。先日このような GBDK という SDK を見つけました:
https://github.com/gbdk-2020/gbdk-2020

2023061801


GBDK(GameBoy Development Kit) はその名の通り「C 言語によるゲームボーイの開発キット」です。クロスプラットフォーム対応しており、Windows/macOS/Linux で使えるものです(リリースノートによると他のゲームプラットフォームにも対応しているようですが、このブログエントリではゲームボーイ版に絞って紹介します)。

普段ゲームを作っているわけではないし、何より C 言語なので普段自分が使っている開発環境とも異なるのですが、C は全く経験ないわけではないし、何よりも「一度くらい自分の作ったゲームがゲームボーイ内で動くのを見てみたい」という好奇心から挑戦してみることにしました。当面の最終目的は以前にブラウザゲームとして作った「モールモール」をゲームボーイ内で動かしてみるということに設定します(「モールモール」についてはリンク先を参照してください)。

かなり苦労することになると思うので、複数回に分けて紹介していきます(このエントリを書いている時点ではまだ完成の目途もたっていません)。初回となる今回は開発環境の構築と、動作確認の "Hello World!" までを紹介します。


【環境構築】
普段の自分は Windows + WSL を使ってアプリ開発を行っていて、GBDK も Linux 版があるのでそのまま WSL でゲーム ROM を開発することもできます。できますが、作ったゲーム ROM の動作確認を行う環境としてゲームボーイエミュレータを使いたいという事情があります。WSL 内でゲームボーイエミュレータを動かすこともできないことはないと思うのですが、この動作確認部分を必要以上に複雑にしたくなかったので、今回は純 Windows 環境で開発することにします。開発環境構築自体は macOS や Linux でも Windows とそんなに変わらないと思っています。

まず GBDK のダウンロードサイトから自分の環境向け最新版(2023/06/18 時点での最新バージョンは 4.1.1、また自分の場合は gbdk-win64.zip)をダウンロードし、適当なフォルダに展開します。以下の例では C:\MyApps というフォルダ内に展開したものと過程して紹介します:
https://github.com/gbdk-2020/gbdk-2020/releases

2023061801


あっけないですが、これで GBDK の準備は終わりです。展開先の examples フォルダ内にサンプルがたくさんあります。ソースコードは実際にゲームで使うようなグラフィック処理が含まれているものが多く、見てもすぐには理解できないかもしれませんが、各サンプルフォルダごとに含まれている Makefile や compile.bat を見ておくことでコンパイル手順などは参考にしやすいと思っています。実際に以下で紹介する Hello World サンプルでも参考にしました。

加えて、ゲーム ROM を作った後の動作確認用にゲームボーイエミュレータをインストールしておきます。ゲームボーイエミュレータは色々リリースされているようで、インストールするのはなんでもいいと思うのですが、自分は mGBA というものをインストールしました。なお mGBA の場合、各キーとボタンのマッピングはデフォルトで以下のようになっていました。この情報は今回の Hello World の時点では不要ですが、いずれゲームを作って動作確認していく中で必要になっていくはずです:
ゲームボーイのボタンPC キー
UP上矢印
DOWN下矢印
LEFT左矢印
RIGHT右矢印
AX
BZ
SELECTBackspace
STARTReturn



【ハローワールド】
新しい環境での第一歩は「ハローワールド」です。ゲームボーイでもそこは譲れません。

最終的に作るゲームにおいてはやはりグラフィックを使ってスプライト処理やスクロールなども含めて作りたい希望はありますが、まずはテキストコンソールを使ったものから順を追って作っていこうと思います。

まずは適当なフォルダ内に "helloworld" という名前のフォルダを作っておきます。この後作成するファイルや作業はすべてこのフォルダ内で行います。

そして helloworld フォルダ内に helloworld.c というテキストファイルを以下の内容で作成します(太字部分で "Hello World!" を出力しています):
#include <gb/gb.h>
#include <stdint.h>
#include <stdio.h>

void main( void ){
    printf( "Hello World!" );

    CRITICAL {
        add_SIO(nowait_int_handler);
    }
    set_interrupts(SIO_IFLAG);
}

Windows の場合は同様にしてもう1つ compile.bat というファイルを以下の内容で作成します(最初の c:\MyApps\gbdk 部分は GBDK を展開したフォルダ名を指定してください):
c:\MyApps\gbdk\bin\lcc -Wa-l -Wl-m -Wl-j -o helloworld.gb helloworld.c

macOS や Linux の場合、compile.bat は不要ですが、代わりに以下の内容で Makefile というファイルを作成してください(一行目の CC の値は GBDK を展開した先を参照するよう書き換えてください。この例では自分のホームフォルダ内に展開した例として記載しています):
CC	= ~/gbdk/bin/lcc -Wa-l -Wl-m -Wl-j

BINS	= helloworld.gb

all:	$(BINS)

# Compile and link single file in one pass
%.gb:	%.c
	$(CC) -o $@ $<

clean:
	rm -f *.o *.lst *.map *.gb *~ *.rel *.cdb *.ihx *.lnk *.sym *.asm *.noi


この時点で Windows だと以下のようなフォルダ構成になっています(macOS や Linux の場合は compile.bat の代わりに Makefile があるはずです):
2023061802


compile.bat と Makefile とで違いはありますが、どちらも「helloworld.c をコンパイルして helloworld.gb を作る」ための内容になっています。

これで準備完了です。早速コンパイルしましょう。Windows の場合はコマンドプロンプトを開いて helloworld.c のあるフォルダに移動し、compile.bat を実行します(正しく実行できた場合、実行結果として helloworld.gb が出来上がっていることが確認できます。これがゲーム ROM です):

2023061803


macOS や Linux の場合はターミナルで helloworld.c のあるフォルダに移動して make コマンドを実行します。正しく実行できると同様に helloworld.gb が出来上がっていることが確認できます:
2023061804


最後に完成したゲーム ROM をエミュレータで動作確認してみます。まずエミュレータを起動(下図は mGBA の場合):
2023061805


次に上の手順で作った helloworld.gb を読み込みます(mGBA の場合はメニューから ファイル - ROM をロード で helloworld.gb を指定):
2023061806


以下のような画面になれば成功です。ゲームボーイで Hello World! ができました!:
2023061807


とりあえず今回はここまで。次は移動キーや A, B, Start といったボタン操作に対応するものに改良していき、少しずつゲームっぽいものにしていくつもりです。