ホームに戻る
GBA概要

0、この文章の目的

ゲームボーイアドバンス(GBA)で動くものを作るとき、
ハードウェアは何ができそのためにどういったことをするのか?
ということをできるだけ数値を避け文章で書いてみました。

実際には膨大な数値データが必要です。
「GBATEK」というキーワードで検索してみてください。

1、はじめに

「Linuxから目覚めるぼくらのゲームボーイ」
という本が売っています。
ここにケーブルおよび開発環境が整っています。

開発環境は付録のCD1枚に収められています。
CDからブートするとKNOPPIXというLinuxが立ち上がります。
CDからのブートは最初からPCの仕様にあったり、BIOSの設定でできます。
実行用のバイナリ作成のために binutils と gcc が必要になりますが、
CDにはすでにインストールされている状態になっています。
本にはインストールのやり方も書いてあるので自力でやってもいいと思いますが、
ものすごく時間がかかります。
/home/knoppix ディレクトリ以降の領域はRAMに存在します。
ここにはすでにサンプルが入ったディレクトリが用意されています。
自分でファイルの作成やコンパイルをする場合もここでやると良さそう。
電源を切ると作成したファイルは消えるので退避する必要があります。

コンパイルは gcc でARM用のコンパイル。
C言語のみでの記述が可能なので、アセンブラの知識は必須ではありません。
リンカスクリプトとインクルードヘッダを指定しての ld でのリンク。
カートリッヂでは 0x08000000、ブートゲーブルでは 0x02000000 からの開始。
また、セクション先頭から main へとぶ処理を用意します。
最後に無駄なヘッダ情報を objcopy で切り取る。
以上の手順はサンプルファイルにもあるのでなんとなくわかります。

転送用のツールがCDの中に optusb というのがソースであります。
コンパイルが非常に早いのでそのつどコンパイルしても良さそうです。

転送はカセット無しでGBAの電源を入れると真っ白の画面になり、
ここで optusb で転送するバイナリを送るとすぐ実行が開始されます。
ケーブルを抜いても実行を続けることができますが、
電源を切ると転送したデータは消えます。

追記:
Windows上で動作する devkitadv という開発セットがあります。
こちらは int __gba_multiboot = 0; とコード内に書くだけで、
リンクの指定をせずにマルチブートできる便利なものです。
devkitadv とは別に btcons_usb という転送ツールもあります。
こちらもWindows版があり、どこかで探せます。
併せて VisualBoyAdvance というエミュレータも存在しますので、
実はWindowsだけでだいたいのことはできてしまいます。

2、GBAのスペック

CPUはARM7で16.78MHzです。
サブプロセッサにZ80が乗っているそうです。
メモリはBIOS領域、内部RAM、外部RAM、VRAM、その他を使用。
画面は240×160ドットで最大32768色を同時に表示可能。
サウンドはアナログ4チャンネル、デジタル2チャンネル。
キーは10個、通信ポートも備えています。
ゲームパックには32MBのROMと64KBのSRAMが乗るらしいです。

ゲームパックを用いずにUSB転送のみで実行しようとする場合、
転送バイナリを外部RAMの256KB以内にデータをおさえる必要があります。
ゲームパックが無いことによる制限はこの点のみです。

3、画面描画

表示可能な色数は赤青緑の要素が各5ビットで32768色。
ただしこれらの色は背景用に最大256色しか同時に表示できない。
スプライト用にも同じように256色までしか表示できない。
(透明色が1色あるために正確には255色である。)
この色データを集めたものを「パレット」と呼ぶ。

次に8×8ドットのキャラクターデータを用意する。
このデータのことを「タイル」と呼ぶ。
タイルデータそのものはパレット番号を並べたものになる。
背景用には最大1024種類を同時に用意でき、
スプライト用には最大512種類を同時に用意できる。

背景に関しては8ドット単位でしかタイルを並べることができません。
背景にはタイルをどのように並べるかという情報が要ります。
この情報を「マップ」と呼びます。
背景は最大4枚まで定義でき上から透過させることで同時表示が可能です。
ただし背景のマップデータは背景のタイルデータのメモリ領域と重複します。
よってマップデータをたくさん定義すると定義できるタイルの種類が減るのです。

スプライトに関しては背景用とは別に最大512種類のタイルを同時使用可能です。
またスプライトですがGBAでは「オブジェクト」と呼んでいるようです。
オブジェクトは画面に同時に最大128個まで1ドット単位で表示できます。
オブジェクトの状態を定義するOAMという領域があり。
オブジェクト用の領域は他に影響されて減るようなことはありません。

以上は画面モード0の256色モードについての説明でした。

16色モードでは16色で16のパレットを定義できます。
16色モードはタイルデータが小さくて済み倍の定義が可能です。
またモード1や2では画面数が減るが伸縮回転などのエフェクトが使用でき、
モード3ではパレットで制限されず32768色使用できるモード、
モード4では256色パレットでダブルバッファが使用できるモード、
モード5では低解像度で32768色のダブルバッファが可能なモード、
などモードを指定することでいろいろな表現が可能となります。

4、エフェクト

エフェクトには、
拡大、縮小、回転、モザイク、半透過、画面を白く、画面を黒く、ウィンドウ
以上が存在します。
拡大、縮小、回転に関しては、
背景で使用すると使用できる背景の枚数が減ります。
スプライトに関してはそのような制限はありません。
モザイクは全体に適応されます。部分的に適応できません。
半透過はアルファブレンドの適応となります。
制限として透過は2枚間までのブレンドです。
画面を白く、黒くは徐々に画面が白くなったり、暗くなる表現です。
半透過と白く、黒くはいずれか1つしか同時に使用できません。
ウィンドウは2枚までの四角領域のマスクを指定し、
各背景やスプライトが適応となるかどうかを選べます。
その他、ウィンドウの外部適応や、
スプライトの不透明領域でのマスクも可能です。

5、キー

キーは押されている状態を取得できます。
押された場合に割り込み処理をかけることもできます。
離した場合の割り込みはできません。

6、タイマー

タイマーは同時に4つ使えます。
指定した初期値からオーバーフローまでカウントします。
オーバーフローした場合は初期値にカウントが戻ります。
ひとつ前のタイマーがオーバーフローしたら1カウントする、
というようなカスケードモードと呼ばれるモードも使用可能です。
(タイマー0にはカスケードモードはありません。)
オーバーフロー時の割り込みがそれぞれのタイマーで可能です。

7、DMA

転送元アドレスと転送先アドレスとサイズを指定すると、
CPUを介さず高速にデータを転送してくれます。
転送終了時に割り込み処理をかけることができます。
DMA処理は同時に4つ処理できますが、
DMA0は最優先の高速転送。
DMA1、2はサウンドなどに使用される。
DMA3はカートリッヂなどから大量のデータを転送するのに用いる。

8、サウンド

アナログの4チャンネルがあります。
チャンネル0はスウィープ+トーンモード。
チャンネル1はトーンモード。
チャンネル2は波形再生モード。
チャンネル3はノイズモード。
タイマーと絡めて値を変化させて音を鳴らす方式です。
デジタルの2チャンネルはWAVEファイルを鳴らす方式。
FIFOバッファに値を定期的に入れて再生します。
ここで必ずDMAとタイマーを利用してデータを送信すること。
ハードウェアが使い方を見据えて設計されているようです。

9、割り込み

割り込み可能なのはゲームパック、キー、DMA、通信、タイマー、V、Hブランク。
割り込みを発生させるには、

各割り込み要因で割り込みを有効にする。
割り込み指定領域での割り込みを有効にする操作にフラグをたてる。
割り込み自体を有効にするスイッチをオンにする。

以上の3つの手順をふむ必要がある。
また割り込みを止めなければならない場合は2通りあり、
割り込みの条件を変える場合には割り込み自体を止める必要があり、
また割り込み中も他の割り込みが発生しないように割り込みを止める必要がある。
最後に、どの割り込みが起きても1つの関数に送ることしかできないため、
割り込みが起こってからどの割り込みがあったか調べなければならない。
また起こった割り込みのフラグには1を代入してリセットする必要がある。

10、アニメ

VブランクやHブランク時にスプライトや背景の位置を変えてアニメが可能です。
Vブランクでの割り込みで切り替えるのが普通でしょう。
垂直方向で任意のラインで割り込みをかけるVカウントという仕組みもある。


11、通信

通信は256KBits/sの速度で一度に32ビットの送信が可能。
通信では互いの32ビットの領域を一度で入れ替えます。
通信にはゲーム機のマスターとスレーブをまず決める必要があります。
同期は互いの SI と SO のビットがリンクしているのを利用できます。
スレーブはスタートビットをたて待機、マスターがスタートビットをたてて通信開始。
通信の完了を知るための方法は2つあります。
スタートビットが0にリセットされるのを調べるか通信割り込みを使う方法です。

inserted by FC2 system