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" という文字がフレームに刻まれており、ステレオサウンドを強調しているが、スピーカーはモノラルで、イヤホンを繋ぐとステレオになる。

チャンネルの内容を雑に並べるとこう。

  1. スウィープ可能な矩形波 ch1
  2. 矩形波 ch2
  3. 波形メモリ ch3
  4. ノイズ 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より

終わり

「スプライトを動かす編」に続く。