GB ゲーム開発覚え書き: 基礎から
Game, C, GameBoyゲームボーイを知る
ゲームボーイのゲームを開発するには、ゲームボーイを知ることが必要。
ゲームボーイといえば横井軍平氏が開発した究極の携帯ゲーム機。起動時の「NINTENDO」ロゴがぐちゃぐちゃになる。通信ケーブル持ちは貴族。刺繍の課題はドラゴン柄で GBC の色はクリアパープル。画面にすぐ傷がつく。ポケットプリンタの用紙から牧場の匂いがする。
それぐらいしか知らない。
そこでまずは、The Ultimate Game Boy Talk という約 1 時間のトークを聴く。
これでゲームボーイの基本的なスペックや、何をやっているかをある程度知ることができる。
あとは、pandocs という資料を都度読む。ここにはゲームボーイに関するほぼ全ての情報が揃っている。
これらの優れた資料を集めたコミュニティページが Game Boy Development community 略して GBDev。また開発者向けのフォーラムもある。
基本スペックについて
製品コードは DMG(Dot Matrix Game)と呼ばれる。
項目 | 容量、種類 | 備考 |
---|---|---|
CPU | LR35902 | ※Z80 CPU のカスタム版 |
CPU クロック数 | 4.19MHz | ※カラーは 8.39MHz |
WRAM | 8kb | ※カラーは 32kb |
VRAM | 8kb | ※カラーは 16kb |
ROM | 最大 32mb | |
画面解像度 | 160 × 144 | |
色 | 4 色 | ※カラーは 32768 色 |
サウンド | ステレオ 4ch | ※スピーカーはモノラル |
LR35902 はシャープが開発したもので、Z80 の一部の命令セットを持つ。
"Custom Z80" とか "GB Z80" とか呼ばれているのを見る。
ちなみに GBA からは ARM を採用していて、開発的には GBA の方がポピュラー。
GB は 32kb の ROM バンクを持つ。0000〜3FFF (16kb)が固定バンク、4000〜7FFF (16kb)が後述の MBC で切り替え可能なバンク。
8kb の外部 RAM 領域もあり、SRAM や、後述する MBC などに使う。
カートリッジと MBC
カートリッジにはいくつか種類があり、ほぼ全てに MBC(メモリバンクコントローラー) というマッパーが含まれている。カートリッジのバンクを切り替えることで、本体に収まらないデータをマップできる。
また、カートリッジの種類によって ROM の容量も違う。
Pan Docs による MBC の一覧ページ
『テトリス』など初期に出たゲームは 32kb のカートリッジで、MBC がないタイプ。
ROM 32kb, RAM 8kb の固定された容量を持ち、ROM バンクには 0000〜3FFF, 4000〜7FFF の計 32kb が直接マップされる。
MBC は番号があって、最大 2MB の ROM と 32kb の RAM を持つ MBC1 や、最大 512kb の ROM と 512×4bit の RAM を持つ MBC2 などがある。
MBC 1〜7 まであるが 4 だけない。
MBC には独自の機能が含まれるものもある。例えば『ポケットモンスター金・銀』には時計機能があるが、これは RCT(リアルタイムクロック)が含まれた MBC3 を使っている。
MBC では外部 RAM をサポートしたり、内臓 RAM が埋め込まれているものがある。セーブ機能があるゲームは、ボタン電池が埋め込まれてて、RAM が揮発しないようになっている。
画面とグラフィック
解像度は 160×144。
GB 本体は堅牢だけど液晶の方は貧弱で、GBC までは本体の側面に、コントラストの調整ノブがあった。
画面の残像がすごいものの、それを逆手に取った『地球解放軍ジアース』では、残像で背景の多重スクロールを実現している。
ゲームボーイのグラフィックは、ピクセル単位ではなく、8×8 のタイル単位でデータを持つ。
一画面には最大 20×18 マスのタイルが表示されることになる。
画面表示では、「スプライト(オブジェクト)」「バックグラウンド」「ウィンドウ」の 3 つのレイヤーを持つ。
スプライトは 8×8 か 8×16 マスのどちらかを設定できる。
バックグラウンドは 32×32 マスある。スクロール可能で、上下左右ともにループする。
そして、ウィンドウという特殊なレイヤーがある。
ウィンドウは、実質「バックグラウンドに被せられる不透明なバックグラウンド」であり、主にゲームのステータスを表示するエリアだったり、ゲーム内ウィンドウとして使われる。
このようなレイヤーを持つのは当時のゲーム機では珍しく、GB とメガドライブぐらいだとか。
実際のゲームでウィンドウがどう使われるかは、こちらの記事がわかりやすい。
ゲームボーイの背景面とウィンドウ-WentWayUp
記事のようにステータス UI に使われることが多い。ファミコンでこれをやるにはラスタスクロール(水平ラインの描画時に割り込みを入れて、描画を擬似的に分断させる)や、スプライト直置きが必要だったとか。
描画方法はファミコンというか昔のテレビのように、上から下に、左から右にレンダリングしていく。
左から右へ 1 ライン描画した後と(HBlank)、画面描画が終わり、また左上に戻るまで(VBlank)を繰り返す。
はじめに CPU が計算し、その結果を PPU(Picture Processing Unit)がレンダリングしている。
CPU も PPU も VRAM にアクセスし、 PPU がレンダリングしている時、CPU は VRAM へアクセスできない というのを、覚えておいた方が良さそうな気がしたので Pan Docs のリンクを貼っておく。
Accessing VRAM and OAM - Pan Docs
コピーガード
任天堂は海賊版ゲームの流通を防ぐため、色々と対策手段を入れていた。
その中の1つに、NINTENDO のロゴが降ってきて、「ピコーン」と鳴る最初のアレがある。
あのロゴはカートリッジのヘッダに挿入され、本体側でそのビットマップを照合している。
NINTENDO ロゴが埋め込まれてない、またはロゴが上手く読み込めなかった場合は "NINTENDO" の部分が変な表示になり、起動しない。
NINTENDO のロゴは VRAM に残り、NINTENDO ロゴで演出をするゲームがある。
例えば『X』では、NINTENDO のロゴが出た後、続いて下に"presents..."という文字を挿入する。
続編の『X-RETURNS』は操作性がダメな時代の任天堂ゲーだったので、Switch でリメイクしてほしい。しかし操作性は Switch も………なんでもありません。
サウンド
GB はステレオサウンドで、4ch の音色をサポートする。
初代 GB には "DOT MATRIX WITH STEREO SOUND" という文字がフレームに刻まれており、ステレオサウンドを強調しているが、スピーカーはモノラルで、イヤホンを繋ぐとステレオになる。
チャンネルの内容を雑に並べるとこう。
- スウィープ可能な矩形波 ch1
- 矩形波 ch2
- 波形メモリ ch3
- ノイズ ch4
スウィープというのはマリオがジャンプする時の「ピョーン」みたいに、上がっていく or 下がっていくアレ。
まず、本体側で音声を有効にして、上記の音声どれかのレジスタに値を入れると音が出力される。
音声は無効のままにできる。その場合、電池の消費量が抑えられる(pandocs によると約 16%)。
SGB では周波数が若干高くなる。また、GBA では ch3 の音声がちょっと変わる。
外部音声を変換して、ゲームボーイで再生させるゲームもあった。
代表的なのはボイスで、要所要所に入る『ときめきメモリアル POCKET』とか。
あとは『ポケットモンスター ピカチュウ』とか、ちさタローが声入れてる『倉庫番』とか。
チップチューン作曲者はプロサウンド化した(ノイズを減らした)GB を使い、『LSDj』を使って GB 音源の力をフルに活かしている。
でも、ゲーム開発をやってみるとチャンネル数の制約が厳しい。
「音が鳴る時に BGM が消える」などの現象は妥協しないといけない。
先ほど挙げた「ボイスが出るゲーム」でも、喋る間は処理が止まったり、他のサウンドが消えたりする。
開発では GBT Player というライブラリが使える。ただし、ASM 向けに開発されていて、GBDK(そしてそれに依存する GBStudio)のサポートは消極的。
入出力、データ通信
入出力は十字キー、AB ボタン、スタートセレクト。
「遊び心」としてシリアル通信ポートを備えている。
通信ケーブルというものを使って、ゲームボーイ同士を接続するもの(ワイヤレス時代に通信ケーブルと言っても通じなさそうなので、念の為書いておく)。
ゲームボーイ本体からクロック信号を出し、受信は外部クロックを使用。
通信時の転送速度は、約 1KB/s で、GBC のゲームだと最大 64KB/s のやり取りができるそうな。
GBC だけは本体に赤外線ポートがあった(むしろこっちの方が通じないのでは?)。
また、カートリッジに赤外線ポートが含まれているものもある。それがハドソンの GB KISS。
GB KISS の MBC はなんだろう?と思いきや HuC-1 というものらしい。確かにハドソンっぽい型番。
参考: MBC(Japanese) - TeamKNOx WEB-Siteより
終わり
「スプライトを動かす編」に続く。