Gameboy Development



このサイトで扱っているゲームボーイの開発についてです。
環境は RGBDS(アセンブラ)を使用しています。
Windows のテキストエディタ上でプログラムを書いて
アセンブラでコンパイルすると、ROM ファイルが出来上がります。

一般的には開発環境は C 言語によるものがメジャーです。


■ 開発環境



プログラムを書くには、ゲームボーイのハードウェアと開発言語の知識が必要になります。
GB 開発が盛んだったのは 2000 年前後ですが、今でも探せばネット上で様々な資料が入手できます。

簡単なことをするには、それほど深い知識は必要ありませんがそれなりの前準備と覚悟は必要です。
8bit コンピュータに馴染みのある人なら割と抵抗無く入っていけるのではないかと思います。
CPU は Z80 のサブセットあるいは 8080 プラスアルファのような感じです。

世間的にはゲームボーイのプログラミングというニッチなカテゴリも随分下火になってきているので
今更な感はありますがその分資料は充実していますし、今なら他の誰とも競合することなくマイペースで作りたいものが作れます。多分。

資料として確実に必要なものは、命令表・メモリーマップ・I/Oレジスタ解説といったところでしょうか。
昔の PC(PC-60 や PC88,MSX 等々)でプログラミングに親しんだ人は、ROM にプログラムを書く場合の作法や
ROM の先頭にヘッダが付いている点などで戸惑う面があるかもしれません。

1)アセンブラまたは C 環境を用意する



アセンブラは RGBDS を使用します。
https://github.com/rednex/rgbds

Windows 版についてはビルドされたものが https://github.com/rednex/rgbds/releases ここから取得できます。
ドキュメントについては https://github.com/rednex/rednex.github.io こちら。

必要なものは RGBASM.EXE と RGBLINK.EXE と RGBFIX.EXE です。これらを適当なフォルダに置きます。
RGBASM はアセンブラ本体、RGBLINK はリンカ、 RGBFIX は ROM イメージサイズの補正などの後処理用です。

C で制作できる環境もあります。
http://gbdk.sourceforge.net/

とはいえ筆者は GBDK はあまり触っていないのでよく分かりません。
GBDK で検索すれば国内での使用事例はまだまだあるようなのでそちらを参考に。


2)プログラム書く or ソースを用意する



ソースファイルはテキストエディタで編集します。拡張子は .z80 や .asm など様々ですが普通にテキストとして扱います。
GB 特有のヘッダー設定やメモリーバンク仕様など最初に覚えるべき事はいろいろありますが、それさえ分かれば後は使い回しが効きます。
プログラミング自体については、後に示す資料のサイトなどを巡って勉強しましょう。

このサイトのソースであれば、source フォルダ以下のファイル群をアセンブラと同じフォルダに置きます。

3)コンパイル



このサイトのものであれば、ソースに入っている compile.bat にコンパイルの一連の作業を記述してあります。
ダブルクリックしてソースコードにバグやエラーが無ければ ROM ファイル(xxxx.gbc) が出来上がります。
エミュレータなどで動作確認をすると良いでしょう。

同時に生成される xxxx.sym ファイルや xxxx.map ファイルは各種定数定義やラベル、メモリマップなどを示すテキストファイルです。
デバッグの際に参考にすると良いでしょう。エミュレータによっては、自動的に読み込んでくれるものもあります。

自力でコンパイルする場合は、RGBDS のヘルプを良く読むか、compile.bat を参考にしてみてください。
compile.bat もまたテキストファイルなのでエディタで編集します。

4)実機で実行するには


-GB Exchanger と 64Mbit Flash ROM -

ここまでで述べたように、GB ソフトの開発には実機は(とりあえずは)必要ないのですが、やはり完成したら
一度は実機で動かしてみたいところです。また、エミュレータ上と実機では動作が違うこともあり、
実際の動作や見た目を確認することは完成度を高める点からも大切です。

すでに国内で販売されていないのが残念ですが、PC のプリンタポートなどに接続し、作製した ROM ファイルを
Flash ROM カートリッジに書き込むアダプタがありました。写真は筆者所有の GB Exchanger です。
こうしたアダプタは他にもいくつか種類があるほか、自作されている方もいます。
アダプタ同様、書き込み可能なカートリッジも入手困難です。こちらも自作のものがあるようですが、それなりにハードルは高くなります。

書き込むハードウェアが揃ったら、書き込むためのツールも調達しなければなりません。
こちらはネット上に様々な書き込みハードをサポートしつつ、使い方も簡単なものがネット上でいくつか公開されています。

Mootan's Room 書き込み用ハード・ソフト等を公開されています。

近年、Amazon などで USB を介して直接書き込みできるフラッシュカートの販売などがあるようです。
USB であれば機種を問わず多くの環境で利用できるため最も便利なテスト環境といえます。

実機で実行するもう一つの手段としてエミュレータがあります。
といっても PC 上で動作するエミュレータではなく、GBA や DS 上で動作するものです。
これらは、やはりエミュレータなので完全に実機と同じというわけではありませんが
GBA に内蔵されている GB と共通のハードウェア機能(音源など)を使う場合は、PC 上でのエミュレータより実機に近いとも言えます。
GBAで動くGBエミュレータとしては Goomba Color http://www.dwedit.org/ が最良でしょう。

5)デバッグ



開発にはデバッガが必須です。
エミュレータで重要なのは、なんと言っても再現性です。
2017 年現在でも、GB を完全に再現したエミュレータはありませんが、高い完成度を持ちデバッグに有用なものはいくつか存在します。

http://bgb.bircd.org/
BGB は上のスクリーンショットのエミュレータで、デバッガ機能が非常に充実しています。
RGBASM が出力したシンボルファイル(.sym)をデバッグ時に自動的に読み込んでくれます。
他機種の開発環境と比べても、ここまで整ったものはなかなかないと思います。

https://github.com/sinamas/gambatte
Gambatte は再現性に定評のあるエミュレータです。
エミュレータの再現度を評価するテスト(GB Accuracy Tests)においても高い成績を収めています。
こちらはデバッガ機能はついていません。

https://github.com/LIJI32/SameBoy
こちらも再現性の高いエミュレータです。これを書いている時点では最高かも。
どちらかというと mac よりで開発されており、Windows 版はいくつかの機能が現時点では使用できません。

上記 GB Accurcy Tests を見て貰うと分かるとおり、実機と微妙に挙動が異なる部分は未だ残っています。

6)その他 Tips

知っておくと便利なこと。
  • 開発環境に 2byte 文字(日本語)をサポートしたものが少ないので、ソースコードはできるだけ UTF-8 で書いた方がトラブルが少ないかもしれません。
  • GB で絵を書くのに使うツールはかなり貧弱です。以前はそれでも何種類かあったのですが、時と共に失われてしまいました。
    とりあえず、タイルパターンを書く「GB Tile Designer」と、タイルを並べてマップを構成するのが「GB Map Builder」が定番です。
    後述の GB Dev Wiki の Tools からたどれるリンク先から入手できます。
  • GBC の色は RGB 各 32 段階ありますが、線形の変化ではなく、かなりいびつなカーブの色変化をします。
    おまけに RGB 各色が他の色に影響したりして、PC で見る色とはかなりズレが出ます。
  • GB 実機の液晶は今では考えられないくらいに残像がでます。PC に使っているモニター次第でもあり正確な再現が難しい所なので、
    エミュレータで設定で残像を再現するオプション(BGB であれば Graphics -> Mix current and last frame) があればオンにしましょう。
  • GB は ROM にヘッダ領域があり、その中のチェックサムを起動時にチェックします。これにパスしなければ起動しません。
    RGBFIX はこのチェックサムを自動的に算出して書き込んでくれるツールです。
  • カートリッジ側 RAM(バッテリバックアップ有/無)は書き込み許可・禁止の設定ができます。
    これを忘れていると書き込めなくてハマることがあります。rRAMG の設定を確認しましょう。詳しくは GB dev Wiki へ。
  • GB のメモリ空間は $0000-$FFFF の 64KB なのですが、$4000-$7FFF の 16KB をバンクメモリとすることによって最大 8MB まで ROM を持てます。
    また、バッテリーバックアップや時計機能など拡張機能を持つメモリコントローラーが多くの ROM に使われており、これらを知ることが GB 開発の要です。
  • GB は初代と GBC の 2 世代が主な機種ですが、他に SFC の拡張機器である SGB,SGB2 があり、後継機種の GBA は GB/GBC (ほぼ)互換です。
    ただし、GB, GBC それぞれの機種でも型番によって微妙に挙動が異なり、未だ検証作業が進められています。
  • メモリーバンクコントローラー(MBC)に、MBC4 は存在しません。巷の資料では MBC4 が記載されているものがありますが、現在の所 MBC4 の ROM は確認されていません。
    逆に、MBC6, MBC7 は数は少ないですが存在します。

    MBC6 は「ネットでゲット ミニゲーム@100」というゲームに使われたもののようです。
    モバイルアダプタ GB を使ってミニゲームの追加が出来たようです。フラッシュ ROM を積んでいたという話も。

    MBC7 は「コロコロカービー」と「コマンドマスター」で、モーションセンサーを搭載しています。
  • 昔の CPU の高速化の常套手段としてメモリ境界揃えというものがあります。
    下位 8bit を xx00 に揃えるなどすることでアドレス計算を単純化して高速化するという手法です。
    これは RGBASM では次のように書きます。

    SECTION "DATA",ROMX, BANK[1], ALIGN[4]	
    

    ALIGN がポイントで、上の場合続くデータが 2^4 つまり 16byte 境界に揃うことになります。$xx00, $xx10, $xx20x …といった具合です。,

    アドレス決め打ちで書きたい場合は、次のように書くと良いでしょう。

    SECTION "DATA",ROMX[$4080], BANK[1]	
    
  • GB には Z80 に無い独特な命令がいくつかあります。
    SWAP 命令などは結構便利です。反面 SBC HL,xx 命令などが無いので工夫が必要になったりします。
    以前は次のような表記の命令がありました。

    LD HL,[SP+e]	
    

    この命令は SP+e の加算した値を *そのまま* HL にコピーします。メモリの内容を拾って 16bit ロードする命令ではありません。
    この表記の仕方が誤解を招くためか、RGBASM では以下のように表記方法が変更されています。

    LD HL,SP+e	
    

    同様に JP [HL] という表記も JP HL になりました。Z80 使いはかえって混乱するかもしれません。

    LD HL,SP+e は何に使うのかというと…

     PUSH  BC
      PUSH  DE
      PUSH  HL …スタックに値を積んで
      CALL  FUNC
     ADD   SP,6 …pop 3つ分
      ///
    FUNC:
      LD    HL,SP+6
      LD    A,[HL+]
      LD    H,[HL]
      LD    L,A …ここでHLにはスタックに積んだBCの値が入る
     ///
      RET
    

    このように、Z80 におけるインデックスレジスタの代用として使うのです。
    高級言語からマシン語にコンパイルしたコードにはこのような表現がよく出てきます。
  • RGBASM は \ によるエスケープが必要な場合があります。

    CHRDATA: incbin	"data\\chracter.bin"
    

    また、ダブルクオーテーション込みで定義したい場合なども、

    FILENAME equs "\"binary.bin\""
    
        incbin FILENAME, 16, 512
        incbin FILENAME, 1024, 512
    

    このように記述します。
  • BGB エミュレータはデバッグウインドウを持っていて、特定の命令をトリガとして簡易的なメッセージを出力できます。
    書式は以下の通り。

        ld    d,d
        jr    .end
        dw    $6464
        dw    $0000
        db    "hello."  
    .end:
    

    つまり、$52,$18,nn,$64,$64,$00,$00 というバイナリの並びが来ると、それ以降をメッセージと認識します。
    GB 側の動作としては jr でジャンプするので実行の邪魔にはなりません。
    メッセージウインドウはオプションでデバッグウインドウを表示する設定にしておくと、以下のように表示されます。2byte 文字(日本語)は残念ながら不可。



    メッセージを可変のものにしたい場合や、メッセージを置いておく場所に困る場合は以下のように間接的な指定も出来ます。

        ld    d,d
        jr    .end
        dw    $6464
        dw    $0001
        dw    DebugStrAdr
        dw    DebugStrBank  
    .end:
    

    違いは $0000 の部分が $0001 になっている点です。
    バンク番号 2byte にアドレス 2byte を指定します。
    アドレスは RAM 指定も Ok、つまり RAM の内容を書き換えて可変の文字列が可能です。文字列の終端は 0 にしておくこと。

  • GB は市販ゲームでも色々とおかしな技が使われていて、いまだに良く分からないものが沢山あります。
    さりげない技術に目をこらしながら遊んでみると、より理解が深まるかもしれません。


■ 資 料

さすがに現行から見ると何世代も前の機種なのでシーンの活発さは全盛期と比べるべくも無いですが、
その分枯れた資料や、そう簡単には失われないであろうコミュニティが今でも残っています。
  • Gameboy Software Development Forum http://gbdev.gg8.se/forums/index.php
    英語のフォーラムです。ここからリンクをたどればほとんどの開発ツールや資料を集めることが出来ます。
  • Gameboy Development Wiki http://gbdev.gg8.se/wiki/articles/Main_Page
    上記サイトに併設の Wiki。ハードウェア周りの資料はここで一通り揃えられます。
  • GameBoy Dev'rs http://www.devrs.com/gb/
    かつての総本山です。ゲームボーイで動くアプリケーションや、技術情報・サンプルへのリンクなどがまとめられています。
  • PDRoms http://www.pdroms.de/
    パブリックドメインな ROM が入手できます。
    テクニカルなデモなど、資料としてだけでなく見るだけでも楽しめるものが沢山あります。
  • GB CPU 命令表(お受験に出るゲームボーイさんの勝手ミラー)



▲ TOP