- 2022/09/20(火)
devkitproでドットの表示[GBAプログラミング]
表示が乱れた場合は再ロードをお試しください。
前回からdevkitproというものを使って、ゲームボーイアドバンスのソフトを作ることを目標にプログラミングしています。今回はドットを描画する関数です。
以下のサイトを参考にしています。
https://akkera102.sakura.ne.jp/gbadev/?tutorial.3
場所の指定
GBAの画面サイズは240x160ドットで、1ドットにつき2バイトです。
引数xの幅は0~239、引数yの幅は0~159で最後の引数colorは色(RGB)データです。マクロを使って表します。つまり、場所を指定する関数です。
メモリ領域(VRAM)は0x6000000番地から開始され、ポインタを使ってアクセスします。
void Mode3PutPixel(u32 x, u32 y, u16 color)
{
u16* ScreenBuffer = (u16*)0x6000000;
ScreenBuffer[y*240+x] = color;
}devkitproのtypedef宣言が以下のようになっているので、これを使うらしいです。
// gba_types.h
typedef unsigned char u8; /**< Unsigned 8 bit value */
typedef unsigned short int u16; /**< Unsigned 16 bit value */
typedef unsigned int u32; /**< Unsigned 32 bit value */
typedef signed char s8; /**< Signed 8 bit value */
typedef signed short int s16; /**< Signed 16 bit value */
typedef signed int s32; /**< Signed 32 bit value */
typedef volatile u8 vu8; /**< volatile Unsigned 8 bit value */
typedef volatile u16 vu16; /**< volatile Unigned 16 bit value */
typedef volatile u32 vu32; /**< volatile Unsigned 32 bit value */
typedef volatile s8 vs8; /**< volatile Signed 8 bit value */
typedef volatile s16 vs16; /**< volatile Signed 8 bit value */
typedef volatile s32 vs32; /**< volatile Signed 8 bit value */色の指定
色の指定は以下のようにマクロで指定します。
各R:0~31,G:0~31,B:0~31の32×32×32=32768色を指定できるらしいです。
u16 color = RGB5(31,31,31);以下のマクロでモードを設定します
ビットマップモードはいくつかあるのですが、今回はビットマップモード3というものを使用しています。
SetMode(MODE_3 | BG2_ENABLE);devkitproのmakefileについて
調べてみましたが詳しくはわかりませんでした。以下のサイトに詳しいことが書いてあります。
Tonc: Setting up a development environment (coranac.com)
そこであっているのかはわかりませんが、devkitpro/example/gba/templeteにあるtempleteのディレクトリをコピーして、名前をsorceファイルと同じ名前にします(例えばmain.cならmain)。たぶんmakefileを色々書き換えればここら辺は自由にできると思うのですが、わかりませんでしたのでわかる人がいましたら教えてください。
ここで元のtempleteディレクトリに入っているファイルをmakefile以外消します。
そして、sorceディレクトリに自分の作ったcファイルを入れます。
includeディレクトリにヘッダーファイルを入れます。
buildディレクトリは出来上がったものが入るので何も入れなくて大丈夫です。
そして、makefileがある階層で右クリック→エクスプローラで開く→makeとコマンドを打ちます。
するとmakefileの階層にgbaファイルができているはずです。

サンプルファイル
横一直線に白い線を引くプログラムを書きました。以下のようになったら成功です。
#include <gba.h>
//---------------------------------------------------------------------------
void Mode3PutPixel(u32 x, u32 y, u16 color)
{
u16* ScreenBuffer = (u16*)0x6000000;
ScreenBuffer[y*240+x] = color;
}
//---------------------------------------------------------------------------
int main(void)
{
SetMode(MODE_3 | BG2_ENABLE);
s32 i;
for(i=0; i<239; i++)
{
Mode3PutPixel(i, 50, RGB5(31, 31, 31));
}
}