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