
| GBA開発クイックスタート |
先ずは、コーディングから実機への書き込みまでの一連の作業手順を体験してみましょう。 Linux 上での開発を想定して説明しますが、Windows 上での開発でも全く同じです。Windows の場合は、スタートメニュから、すべてのプログラム>アクセサリ>コマンドプロンプトを起動して、コマンドを実行してください。
C言語ソースの作成
ヘッダーファイル gba.h (こちらからダウンロードできます)とプログラムファイル tile.c を用意してください。gba.h には、ハードウエアに関する定数やマクロ定義を集めてあります。tile.c を読むときに、gba.h の内容を参照してください。tile.c は、8色のタイルを画面の端から順番に表示する動作を繰り返します。入力待ちのない無限ループとなっていますので、プログラムを止めるときは電源をOFFにします。tile.c には、ハードウエアを制御する方法の典型例が幾つか含まれていますので、全て理解しておいてください。もし、必要なら解説ページを参照してください。
タイルパターンによる画面制御例 (tile.c)
/****************************************/
/* Test program using tile mode */
/****************************************/
#include "gba.h"
hword* map = (hword*) VRAM_MAP(16); // Map base address
hword* tile = (hword*) VRAM_TILE(0); // Tile base address
hword* color = (hword*) BG_PALETTE; // Palette
void waiting(int);
int main() {
int i, j, k = 0, index; // index: tile index
// Background palette color
color[1] = RGB( 0, 0, 0); // Black
color[2] = RGB( 0, 0, 31); // Blue
color[3] = RGB( 0, 31, 0); // Green
color[4] = RGB( 0, 31, 31); // Aqua
color[5] = RGB(31, 0, 0); // Red
color[6] = RGB(31, 0, 31); // Purple
color[7] = RGB(31, 31, 0); // Yellow
color[8] = RGB(31, 31, 31); // White
// Tile data
for (i = 0; i < 8; i++) {
for (j = 0; j < 32; j++)
tile[i * 32 + j] = ((i + 1) << 8) + (i + 1);
}
// Map data
for (i = 0; i < 10; i++) {
for (j = 0; j < 15; j++) {
index = ((k + i + j) % 8) + 1;
map[(i * 32 + j) * 2 ] = index;
map[(i * 32 + j) * 2 + 1 ] = index;
map[(i * 32 + j) * 2 + 32] = index;
map[(i * 32 + j) * 2 + 33] = index;
}
}
k++;
// Background control register & LCD control register & LCD ON
gba_reg(BG0_CTL) = LCD_SIZE00 | // 32x32tile
LCD_COLOR256 | // 256color
LCD_BGTILE(0) | // Tile block 0
LCD_BGMAP(16); // Map block 16
gba_reg(LCD_CTL) = LCD_MODE0 | LCD_BG0; // MODE 0 + BG0 ON
// Redraw LCD
while (1) {
waiting(128);
for (i = 0; i <10; i++) {
for (j = 0; j < 15; j++) {
index = ((k + i + j) % 8) + 1;
map[(i * 32 + j) * 2 ] = index;
map[(i * 32 + j) * 2 + 1 ] = index;
map[(i * 32 + j) * 2 + 32] = index;
map[(i * 32 + j) * 2 + 33] = index;
}
}
k = (k < 15) ? k + 1 : 0;
}
}
/*** Waiting rootine ***/
void waiting(int t) {
int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < t; j++);
}
|
コンパイル
先ず、開発環境の構築のページを参考に、スタートアッププログラムのオブジェクト crt.o とリンカースクリプト gcc.ls を作成してください。gcc.ls は、エミュレータで実行する場合は、カートリッジROMの開始アドレス 0x08000000 からプログラムを配置することに注意してください。エミュレータは、カートリッジROMに格納したプログラムを実行するように作られているからです。
次に、下記の要領でGBA実行ファイルを作成します。> はコマンドプロンプトを表します。
| > gcc-arm -Wall -c tile.c | ARM用コンパイラの起動。-c オプションは、コンパイルとアセンブルまでを行い停止。-Wall オプションにより警告メッセージを表示させます。警告メッセージをなくすようにプログラミングすることは、厳格なプログラミングスタイルを身につけるために有効です。 |
| > ld-arm -o tile.out -T gcc.ls crt.o tile.o | リンカーを起動しELF形式で出力する。-o で出力ファイル名を指定。-T でリンカースクリプト gcc.ls を使用。オブジェクトファイル名の順序に依存するので、crt.o を先に指定する必要がある。 |
| > objcopy-arm -O binary tile.out tile.bin | ELF形式のファイルを、単純バイナリ形式に変換する。(GBAはELF形式を直接実行できないため) |
エミュレータによる動作確認とデバッグ
エミュレータは、VisualBoyAdvance *.bin で起動できます。*.bin は、GBA実行形式ファイル名です。開発環境の構築のページを参考に、適当なエイリアス名を作成しておいてください。上手く動作しなかった場合は、VisualBoyAdvance の Tools メニューでデバッグツールを起動して動作を調べてみましょう(Windows版の場合)。上手く動いても、VRAMの中やIOレジスタを覗いてみてください。
(参考)Linux バージョンの場合、メニューはありません。デバッグツールとして使用するためには、デバッグモードで起動してください。起動オプションは、--h オプションで調べることが出来ます。
実機への書き込み
実機でのプログラムの実行方法は2通りあります。
| 方法 | 開始アドレス | |
|---|---|---|
| 1 | 外部RAMへ直接プログラムを転送して実行 | 0x0200 0000 |
| 2 | フラッシュROMにプログラムを書き込んで実行 | 0x0800 0000 |
(1)外部RAMへ直接プログラムを転送して実行する方法
リンカースクリプト gcc.ls の .text 行を書換え、アドレス 0x02000000 に配置するようにして、リンクしなおして下さい。
(2)フラッシュROMにプログラムを書き込んで実行する方法
リンカースクリプト gcc.ls の .text 行は、アドレス 0x08000000 のまま(エミュレータの場合と同じ)でOKです。
尚、Flashカートリッジに多数のプログラムを保存し、ローダー(複数のプログラムから選択して起動するプログラム)から選択起動することも可能ですが、方法は各自で調べてください。
(c) Kanazawa Univ., 2004