2007-06 << 2007-07 >> 2007-08

2007-07-13 (金)

*NDS::画面モード

DSの画面モードの仕組みが分かってきた.

  • videoSetModeでモードを指定
  • vramSetBankA~IでVRAMを実メモリにマップ
  • BGx_CRでどのバックグラウンドにどのVRAMを使うかや重ねる順番を指定

という風な動作をしているっぽい.

videoSetModeで設定できるモードは,0~6とフレームバッファモードがある.フレームバッファはそのままなのでOK.

あとは,各モードにある,バックグラウンドというものが難関.各モードにある4つのバックグラウンドは要するにレイヤーだった.自由に重ね合わせたりできる.

ただ,BGx_CRで指定するVRAMが重ならないように自分で設定しないといけない.拡張回転バックグラウンドで使うBG_GFXもずれるので,自分でずらすか,BG_BMP_RAM(base)で得られるアドレスを使わないといけない.BG_BMP_RAM(base)の定義は(((base)*0x4000) + 0x06000000)みたいになってるので,そのままポインタにキャストすればOK.

ダブルバッファリングとかはBGx_CRでVRAMのアドレスを入れ替えればいいのかな?サンプルはたくさんあるから,あとで確認しよう.

MAINは拡張回転BG+テキスト,SUBは拡張回転BGという設定ならこんな感じ.

videoSetMode(MODE_5_2D | DISPLAY_BG2_ACTIVE|DISPLAY_BG0_ACTIVE);
vramSetBankA(VRAM_A_MAIN_BG);
vramSetBankB(VRAM_B_MAIN_BG_0x06020000); 
videoSetModeSub(MODE_5_2D | DISPLAY_BG2_ACTIVE);
vramSetBankC(VRAM_C_SUB_BG);
BG0_CR = BG_MAP_BASE(0) |BG_TILE_BASE(1)| BG_PRIORITY(1);
BG2_CR = BG_BMP16_256x256 |BG_BMP_BASE(2) | BG_PRIORITY(2);
SUB_BG2_CR = BG_BMP16_256x256 | BG_PRIORITY(1);
BG_PALETTE[0] = 0x0000;
BG_PALETTE[255] = RGB15(31,31,31);
consoleInitDefault((u16*)SCREEN_BASE_BLOCK(0), (u16*)CHAR_BASE_BLOCK(1), 16);
2007-06 << 2007-07 >> 2007-08