// // Test program for GBA devkitadv // // 型情報 typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32; typedef signed char s8; typedef signed short s16; typedef signed long s32; // 制御レジスタ情報 #define VRAMTOP (u16*)0x6000000 // VRAM frame buffer top address #define VRAMTOP_SPRITE (u16*)0x6010000 // VRAM frame buffer top address #define MAPTOP0 (u16*)0x6004000 // MAP buffer top address #define MAPTOP_SPRITE (u16*)0x7000000 // OAM buffer top address #define PALETTE (u16*)0x5000000 // PALETTE buffer top address #define PALETTE_SPRITE (u16*)0x5000200 // PALETTE buffer top address #define register(p) *((u16*) p) // I/O register handling macro // コントロールレジスタ #define LCD_CTRL 0x04000000 // LCD control #define BG0CNT 0x04000008 // BG0 control // 画面モード #define LCD_BGMODE0 0x0000 // BG mode 0 #define LCD_BGMODE1 0x0001 // BG mode 1 #define LCD_BGMODE2 0x0002 // BG mode 2 #define LCD_BGMODE3 0x0003 // BG mode 3 #define LCD_BGMODE4 0x0004 // BG mode 4 #define LCD_BGMODE5 0x0005 // BG mode 5 // スプライトタイルの配置方法 #define LCD_TWODIMENTIONAL 0x0000 // 2 dimantional #define LCD_ONEDIMENTIONAL 0x0040 // 1 dimantional // 有効な背景 #define LCD_BG0EN 0x0100 // Enable BG0 #define LCD_BG1EN 0x0200 // Enable BG1 #define LCD_BG2EN 0x0400 // Enable BG2 #define LCD_BG3EN 0x0800 // Enable BG3 #define LCD_SPRITEEN 0x1000 // Enable SPRITE // 背景用 VRAM アドレス #define BG_VRAM0 0x0000 // 0x06000000- // 背景用 MAP アドレス #define BG_MAP08 0x0800 // 0x06004000- // スプライトの形状 #define SPRITE_SQUARE 0x0000 #define SPRITE_HORIZONTAL 0x4000 #define SPRITE_VERTICAL 0x8000 // スプライトのサイズ #define SPRITE_SIZE0 0x0000 #define SPRITE_SIZE1 0x4000 #define SPRITE_SIZE2 0x8000 #define SPRITE_SIZE3 0xC000 // スプライト表示優先度 #define SPRITE_PRIORITY_HIGHEST 0x0000 #define SPRITE_PRIORITY_HIGH 0x0400 #define SPRITE_PRIORITY_NORMAL 0x0800 #define SPRITE_PRIORITY_LOW 0x0C00 #define RGB(r, g, b) (((b) << 10) + ((g) << 5) + (r)) // マルチブート指定 int __gba_multiboot = 0; // メインプログラム int main(void) { int i; u16* vram = VRAMTOP; u16* sp_vram = VRAMTOP_SPRITE; u16* map0 = MAPTOP0; u16* sp_map = MAPTOP_SPRITE; u16* palette = PALETTE; u16* sp_palette = PALETTE_SPRITE; // 画面モードの初期化 register(LCD_CTRL) = LCD_BG0EN | LCD_SPRITEEN | LCD_ONEDIMENTIONAL | LCD_BGMODE0; // 背景 0-3 の初期化 register(BG0CNT) = BG_MAP08 | BG_VRAM0; // パレットへの登録 palette[0] = RGB(31, 31, 31); palette[1] = RGB(31, 0, 0); sp_palette[0] = RGB(31, 31, 31); sp_palette[1] = RGB(0, 0, 31); sp_palette[2] = RGB(0, 31, 0); // タイル 0 for(i = 0; i < 16; i++){vram[i] = 0x0000;} // タイル 1 for(i = 16; i < 32; i++){vram[i] = 0x1111;} // マップへタイルを配置 map0[0] = 0x0001; // スプライト 0 for(i = 0; i < 16; i++){sp_vram[i] = 0x0000;} // スプライト 1 for(i = 16; i < 32; i++){sp_vram[i] = 0x1111;} // スプライト 2 for(i = 32; i < 96; i++){sp_vram[i] = 0x2222;} // (10, 20) にスプライト 1 を配置 sp_map[0] = SPRITE_SQUARE | 20; // 正方形 Y=20 sp_map[1] = SPRITE_SIZE0 | 10; // サイズ 0 X=10 sp_map[2] = SPRITE_PRIORITY_HIGH | 1; // 表示優先 sprite number=1 // (10, 20) にスプライト 2 を配置 sp_map[4] = SPRITE_SQUARE | (1 << 8) | 20; // 正方形 回転あり Y=20 sp_map[5] = SPRITE_SIZE1 | (0 << 9) | 10; // サイズ 1 回転データ 0 X=10 sp_map[6] = SPRITE_PRIORITY_HIGHEST | 2; // 表示最優先 sprite number=2 // 回転データ 45度回転 sp_map[3] = 0x016A; sp_map[7] = 0x016A; sp_map[11] = 0x016A; sp_map[15] = 0xFE96; // 無限ループ while (1){} }