Nanashi-softプログラマ専用NDSでプログラミング


◇NDSでプログラミング-画面に点を打つ-

○テンプレートを利用する

開発キットに付いていたテンプレートを流用します
arm7の方は,ボタンやタップ入力が大体書かれているようで都合がよいので,そのまま触らないで進めます

arm9の方を見ると,ツールが作成したコンソールモードになるように記述されています
それでは点が打てない可能性があるので,main関数内を全て削除して,自分で記述する事にします

int main(void) {
	return 0;
}

○画面モード

ここでは VRAMの内容を直接映し出すフレームバッファを使用します

アドレスマップを見ると,0x04000000の 16bit目をオンにするとフレームバッファモードになるようです

*(volatile unsigned int *)0x04000000 = 0x00020000;


表示される VRAMアドレスは 0x6000000〜なのですが,実は直接アクセスができません
バンク切り替えで他の場所のメモリを参照する仕組みになっているようです
メモリマップの VRAMバンクを見ると,0x06800000〜を割り当てられるようになっているようです
この部分をオンにして,0x6000000に当てます

*(volatile unsigned char *)0x04000240=0x80;

○点を打ってみる

これで,直接 VRAM上に値を入れる事で描画されます
実際に表示されている 0x6000000〜では無く,0x06800000〜に値を入れます。間違わないように注意して下さい(0x6000000に値を入れても無視されるだけですが)

*(unsigned short *)(0x06800000 + (X座標 + Y座標 * 256) * 2)=BGR値;

256は画面の横ドット数です
×2しているのは,1ドットが2バイトだからです
BGR値は,先頭ビット0固定,青5ビット,緑5ビット,赤5ビットをくっつけた値です。通常のRGBとは反対なので注意です

画面の真ん中に点を打つサンプル
arm9のソースとしてコンパイルして,テンプレートのarm7用のものとくっつけてndsファイルにして下さい

int main(void){
  int x, y;
  int r, g, b;

  //フレームバッファモード設定
  *(volatile unsigned int *)0x04000000=0x00020000;
  //VRAMバンクを0x06800000〜に設定
  *(volatile unsigned char *)0x04000240=0x80;

  //画面のど真ん中を定義
  x=256/2;
  y=192/2;

  //白を定義
  b=127;
  g=127;
  r=127;

  //ドットを絵画
  *(unsigned short *)(0x06800000 + (x + y * 256) * 2)=(b << 10) | (g << 5) | r;

  //終了しないように無限ループ
  while(1){
  }

  return 0;
}

○問題点

気付いた人もいるでしょうが,この方法では上か下かのどちらかの画面にしか表示されません
ハードウェア仕様のグラフィックモードを見ると,確かにフレームバッファを使用した時はメインのみで,サブはオフになるように記載されています

VRAMを直接表示できて,直感的に操作できる便利モードですが,その引き替えに1画面になってしまいます


TOPプログラマ専用NDSでプログラミング