index
GBA開発クイックスタート

先ずは、コーディングから実機への書き込みまでの一連の作業手順を体験してみましょう。 Linux 上での開発を想定して説明しますが、Windows 上での開発でも全く同じです。Windows の場合は、スタートメニュから、すべてのプログラム>アクセサリ>コマンドプロンプトを起動して、コマンドを実行してください。

cubeC言語ソースの作成

ヘッダーファイル 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++);
}
※ 必要ならばプログラムの説明を読んでください。

cubeコンパイル

先ず、開発環境の構築のページを参考に、スタートアッププログラムのオブジェクト 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形式を直接実行できないため)

cubeエミュレータによる動作確認とデバッグ

エミュレータは、VisualBoyAdvance *.bin で起動できます。*.bin は、GBA実行形式ファイル名です。開発環境の構築のページを参考に、適当なエイリアス名を作成しておいてください。上手く動作しなかった場合は、VisualBoyAdvance の Tools メニューでデバッグツールを起動して動作を調べてみましょう(Windows版の場合)。上手く動いても、VRAMの中やIOレジスタを覗いてみてください。

(参考)Linux バージョンの場合、メニューはありません。デバッグツールとして使用するためには、デバッグモードで起動してください。起動オプションは、--h オプションで調べることが出来ます。

cube実機への書き込み

実機でのプログラムの実行方法は2通りあります。
方法開始アドレス
1外部RAMへ直接プログラムを転送して実行0x0200 0000
2フラッシュROMにプログラムを書き込んで実行0x0800 0000

(1)外部RAMへ直接プログラムを転送して実行する方法

リンカースクリプト gcc.ls の .text 行を書換え、アドレス 0x02000000 に配置するようにして、リンクしなおして下さい。

  1. GBAの電源はOFFにして、ブートケーブルUSBをGBAとLinux機に接続します
  2. GBAのROMやFlashカートリッジは外しておきます
  3. GBAの電源をONにすると、白画面になります(プログラム転送待ち状態)
  4. Linuxのコマンドラインで、「btcons_usb 実行形式プログラム名」を実行します。ケバイ画面が動けばOKです
  5. 別のプログラムを実行するには、GBAの電源をOFFにしてやり直します

(2)フラッシュROMにプログラムを書き込んで実行する方法

リンカースクリプト gcc.ls の .text 行は、アドレス 0x08000000 のまま(エミュレータの場合と同じ)でOKです。

  1. GBAの電源はOFFにして、ブートケーブルUSBをGBAとLinux機に接続します
  2. GBAにFlashカートリッジを挿しておきます
  3. 電源をONにしてすぐに SELECT と STARTボタンを両方押すと、白画面になります(プログラム転送待ち状態)
  4. Linuxのコマンドラインで、「btcons_usb -fe」を実行して、FLashカートリッジの内容を消去します
  5. Linuxのコマンドラインで、「btcons_usb -fa 実行形式プログラム名」を実行してFlashカートリッジにプログラムを書き込みます
  6. GBAの電源を一旦OFFにし、再起動してケバイ画面が動けばOKです
  7. 別のプログラムを実行するには、FLashカートリッジの内容を消去してから、新しいプログラムを書き込む必要があります

尚、Flashカートリッジに多数のプログラムを保存し、ローダー(複数のプログラムから選択して起動するプログラム)から選択起動することも可能ですが、方法は各自で調べてください。


お問い合わせはこちらまで: kitagawa@is.t.kanazawa-u.ac.jp

(c) Kanazawa Univ., 2004