Takayama Fumihiko | Email: <tekezo@pqrs.org> | Google+

手軽な低レベルプログラミング環境として GBA はもっと評価されるべき

目次

手軽な低レベルプログラミング環境として GBA はもっと評価されるべき

いろいろと GAMEBOY ADVANCE というハードを触ってみての感想を書きます。

GAMEBOY ADVANCE の特徴はコチラ。

  • ハードウェアがちょうど良いスペックで手頃だよ
  • 開発を始めるにあたっての初期投資がタダ
  • C とか C++ のみでプログラムが書けるよ
  • OS とか無いから、ハードウェア資源を自由に使いまくれるよ
  • 精度の高いエミュレータがあるので動作テストが楽
  • 作ったソフトは超ポータブル。 GBA とか DS の実機で動くし、 Windows, MacOSX, Linux, WindowsCE, FreeBSD とかでも動くよ。
  • 詳細なドキュメントが完備してる

そんなわけで

  • 「Linuxから目覚めるぼくらのゲームボーイ!」とかいらないよ
  • アセンブリ言語知らなくても大丈夫
  • みんなも GBA でプログラムを書こう
みたいな話です。

ハードウェアがちょうど良いスペック

実際のハードウェアスペックは以下の通りで、決してパワフルなマシンではありません。

が、この制限が逆に「何が出来て何が出来ないのか」把握しやすい利点になっています。

限られたハードウェア資源を有効利用するために機能の取捨選択や工夫をするのも楽しみの一つです。

CPU ARM7 16.78MHz
メモリ 32KB + 256KB
ビデオメモリ 96KB
解像度 240x160

開発を始めるにあたっての初期投資がタダ

とりあえず開発を始めるにあたっては特殊なハードウェアなどは必要なくて、

  • コンパイルは gcc
  • テストはエミュレータの VisualBoyAdvance
といった流れで開発を進めます。


最後の最後に実機確認をする段階になったら、ロムイメージを書き込んで GBA の実機で実行させるためのマジコンが必要になりますが 当面は必要ありません。

まず VisualBoyAdvance で動けば実機で動きますし、その逆も真です。

ちなみに「Linuxから目覚めるぼくらのゲームボーイ!」などで用いられている ブートケーブル経由での開発はハードウェア資源の制限がキツくなるのでオススメできません。


コンパイルについては gcc で OK で、これは devkitPro r18 (buildscripts 20060412) をインストールすれば一式入ります。

Windows, MacOSX, Linux など主要な OS であれば動くので、普段使いの環境で開発出来ます。

なお、devkitPro r19, r20 については r18 よりも遅いバイナリが作られることがあるので、 devkitPro r18 をオススメします。


■ devkitPro r18 のインストールは buildscripts 20060412 を落としてきて、以下のようにすれば OK です。

1: build devkitARM (gba gp32 ds)
2: build devkitPPC (gamecube)
3: build devkitPSP (PSP)
>> 1

1: I have already downloaded the source packages
2: Download the packages for me (requires wget)
>> 2

Please enter the directory where you would like 'devkitARM' to be installed:
for mingw/msys you must use <drive>:/<install path> or you will have include path problems
this is the top level directory for devkitpro, i.e. e:/devkitPro
>> /Users/tekezo/gba/devkitpro-r18

あとは環境変数として以下の内容を .bashrc とか .zshrc とかに書けば OK。

export DEVKITPRO=~/gba/devkitpro-r18/
export DEVKITARM=$DEVKITPRO/devkitARM
export PATH=$DEVKITARM/bin:$PATH

C とか C++ のみでプログラムが書けるよ

アセンブリ言語とか知らなくても大丈夫! GBA の Hello World は以下のような感じにかけます。 C++ のみ。

helloworld.png

int
main(void)
{
#ifdef SET_WAITCNT
  // Set ROM WAITCNT
  *((volatile u16 *)0x04000204) = 0x4317;
#endif
  InitInterrupt();
  REG_SOUNDCNT_X = 0;

  setupTile();
  int bgmapIndex = 31;

  SetMode(MODE_0 | BG0_ON);
  REG_BG0CNT = BG_SIZE_0 | BG_PRIORITY(3) | BG_16_COLOR |
    CHAR_BASE(0) | SCREEN_BASE(bgmapIndex);

  int fontTileIndex = 1;
  int fontTileSize = 30 * 20; // (240 / 8) * (160 / 8) == 30 * 20.
  FontHandler::initialize(fontTileIndex, fontTileSize);

  int palette = 1;
  FontHandler::StringInfo si;

  FontHandler::makeString(&si, 2, "Hello World!  PRESS A");
  int x = 1;
  int y = 4;
  FontHandler::drawString(x, y, palette, si, bgmapIndex);

  EnableInterrupt(IE_VBL);
  for (;;) {
    ScanKeys();
    u16 keysDown = KeysDown();
    if (keysDown & KEY_A) {
      ++y;
      FontHandler::drawString(x, y, palette, si, bgmapIndex);
    }
    VBlankIntrWait();
  }
  return 0;
}

ちなみに BulletGBA (ソースコード) とか Vulkanon (ソースコード) は C++ のみで書かれています。 C++ だけでも全然大丈夫!

BulletGBA Vulkanon
/gba/bulletgba/ /gba/vulkanon/

詳細なドキュメント

GBATEK に全ての情報が集約されていますので、これだけ見れば OK です。

あとは devkitPro 用のサンプルコードについては、 BulletGBA とか Vulkanon のソースの libfont とか libsound とか libsram とか見るとわかりやすいよ!

開発役立ちメモ

  • とりあえず ROM WAITCNT を 0x4317 にセットして ROM 読み込みのキャッシュを有効にしよう!
  • GBA は浮動小数点をネイティブサポートしてないので固定小数点を使おう!
  • GBA は割り算をネイティブサポートしてないので / や % は使わずに Div とか DivMod を使おう! (libgba/include/gba_systemcalls.h)
  • ROM アクセスはシーケンシャルであればプリフェッチが利くので、とにかく inline を使おう!

続く

Date: 2007-05-26 15:22 (UTC)