GBAプログラミング

GBAプログラミングを社内勉強会のネタにしようと思って、西田亙さんの(http://memo.wnishida.com/)「Linuxから目覚めるぼくらのゲームボーイ」を参照してコードを書き始めた。一つはまったことがあるのでメモっておく。

BGがらみのレジスタを指すポインタを通じてパレット、タイル、マップを操作しようとしたが、グローバル変数にするとうまく動かない。スタック変数だとうまくいった。

これだとダメ。

hword *bcolor	= (hword *)BG_PALETTE;
hword *tile		= (hword *)VRAM_TILE(0);
hword *map		= (hword *)VRAM_MAP(28);

int main(void)
{
	int i, j, k = 0;
	int idx;
	
	// パレット初期化
	bcolor[0] = RGB( 0,  0,  0);	// Black
	bcolor[1] = RGB( 0,  0, 31);	// Blue
	bcolor[2] = RGB( 0, 31,  0);	// Green
	bcolor[3] = RGB( 0, 31, 31);	// Light teal
	bcolor[4] = RGB(31,  0,  0);	// Red
	bcolor[5] = RGB(31,  0, 31);	// Purple
	bcolor[6] = RGB(31, 31,  0);	// Yellow
	bcolor[7] = RGB(31, 31, 31);	// White

こっちならOK

int main(void)
{
	int i, j, k = 0;
	int idx;
	
	hword *bcolor	= (hword *)BG_PALETTE;
	hword *tile		= (hword *)VRAM_TILE(0);
	hword *map		= (hword *)VRAM_MAP(28);

	// LCD表示開始
	GBA_REGISTER(LCD_BG0)  = LCD_SIZE3232 | LCD_COLOR256 | LCD_BGTILE(0) | LCD_BGMAP(28);
	GBA_REGISTER(LCD_CTRL)  = LCD_MODE0 | LCD_BG0EN;

	// パレット初期化
	bcolor[0] = RGB( 0,  0,  0);	// Black
	bcolor[1] = RGB( 0,  0, 31);	// Blue
	bcolor[2] = RGB( 0, 31,  0);	// Green
	bcolor[3] = RGB( 0, 31, 31);	// Light teal
	bcolor[4] = RGB(31,  0,  0);	// Red
	bcolor[5] = RGB(31,  0, 31);	// Purple
	bcolor[6] = RGB(31, 31,  0);	// Yellow
	bcolor[7] = RGB(31, 31, 31);	// White

グローバルがダメなのでたぶんリンカがうまくいっていないと思う。リンカスクリプトのせいかもしれない。