Tutorial.2 ビットマップモード(1) †画面モード †GBAの画面の表示方法には大きく分けて2種類あり、ビットマップモードと
まず最初はビットマップモードの3〜5を練習してみましょう。 ビットマップモード †このモードはとあるメモリ領域に値を書き込むと、それがそのまま画面に反映されます。 メモリ領域 = 色; とすると、画面にドットの色が表示されるわけです。 GBAの画面サイズは240x160ドットですが、ここでは1ドットにつき2バイトで表現します。
ドットを表示する関数をソースコードで書くと以下になります。 void Mode3PutPixel(u32 x, u32 y, u16 col) { u16* ScreenBuffer = (u16*)0x6000000; ScreenBuffer[y*240+x] = col; } この引数colは、色(RGB)データです。マクロを使って表します。 #define RGB5(r,g,b)((r)|((g)<<5)|((b)<<10))
下位ビットから順番に赤、緑、青がそれぞれ5bitづつ、0〜31の32段階を指定して使います。 ![]() モード3でドットを描く †とりあえず1ドットだけ出してみましょう。GBA版Hallo Worldです。 #include "lib/gba.h" //--------------------------------------------------------------------------- void WaitForVsync(void) { while(*(vu16*)0x4000006 >= 160) {}; while(*(vu16*)0x4000006 < 160) {}; } //--------------------------------------------------------------------------- void Mode3PutPixel(u32 x, u32 y, u16 col) { u16* ScreenBuffer = (u16*)0x6000000; ScreenBuffer[y*240+x] = col; } //--------------------------------------------------------------------------- int main(void) { // モード設定 SetMode(MODE_3 | BG2_ENABLE); // ドットの描画 u32 x = 50; u32 y = 50; u16 col = RGB5(31,31,31); Mode3PutPixel(x, y, col); for(;;) { WaitForVsync(); } } まず始めに、グラフィックスのモードを設定します。 SetMode(MODE_3 | BG2_ENABLE); グラフィックスモードの設定はヘッダファイルにあるSetMode()マクロを使っています。 // gba.h static inline void SetMode(int mode) {REG_DISPCNT = mode;} #define REG_DISPCNT *((vu16 *)(REG_BASE + 0x00)) #define REG_BASE 0x04000000 *((vu16*)(0x04000000 + 0x00)) = MODE_3 | BG2_ENABLE と同じ意味になり、0x04000000〜0x04000001に値を入れることで ビットマップモードで使用するBG番号は2のみですが、 u16* ScreenBuffer = (u16*)0x6000000; 次に、ScreenBufferポインタにVRAMを指定させて、 void Mode3PutPixel(u32 x, u32 y, u16 col) { u16* ScreenBuffer = (u16*)0x6000000; ScreenBuffer[y*240+x] = col; } 最後は垂直同期待ちの処理です。 void WaitForVsync(void) { while(*(vu16*)0x4000006 >= 160) {}; while(*(vu16*)0x4000006 < 160) {}; } GBAは高速で画面を書き換えています。 ![]() もう少し詳しく言い直しましょう。液晶画面は240x160ドットです。 Horizontal Dimensions The drawing time for each dot is 4 CPU cycles. Visible 240 dots, 57.221 us, 960 cycles - 78% of h-time H-Blanking 68 dots, 16.212 us, 272 cycles - 22% of h-time Total 308 dots, 73.433 us, 1232 cycles - ca. 13.620 kHz 仕様書を読むと1ドット描画するのにCPUで4サイクル。 次に、160ライン分終わった後にも68ライン分存在します。 Vertical Dimensions Visible (*) 160 lines, 11.749 ms, 197120 cycles - 70% of v-time V-Blanking 68 lines, 4.994 ms, 83776 cycles - 30% of v-time Total 228 lines, 16.743 ms, 280896 cycles - ca. 59.737 Hz 描画処理を行う場合、基本的にはこのV-Blankの間に行います。 先ほどの関数は、VCOUNT(描画中のライン)が160になるまで待つことを 動作画面 †x座標:50、y座標:50に、白色を1ドット表示 ![]() 履歴 †
|