-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/ が最良でしょう。
開発にはデバッガが必須です。
エミュレータで重要なのは、なんと言っても再現性です。
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 命令などが無いので工夫が必要になったりします。
以前は次のような表記の命令がありました。
この命令は SP+e の加算した値を *そのまま* HL にコピーします。メモリの内容を拾って 16bit ロードする命令ではありません。
この表記の仕方が誤解を招くためか、RGBASM では以下のように表記方法が変更されています。
同様に 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 は市販ゲームでも色々とおかしな技が使われていて、いまだに良く分からないものが沢山あります。
さりげない技術に目をこらしながら遊んでみると、より理解が深まるかもしれません。
■ 資 料
さすがに現行から見ると何世代も前の機種なのでシーンの活発さは全盛期と比べるべくも無いですが、
その分枯れた資料や、そう簡単には失われないであろうコミュニティが今でも残っています。
▲ TOP