• - Facebook Page

  • - GOLE1

  • - Google+

  • - My Room

  • - 周辺風景1

  • - 周辺風景2

  • - Highway1

  • - Highway2

  • - Steam

  • - My site

  • - Profile

  • - 周辺風景3

画面モード

さっきの英語サイトに書いてある事を書き出してみることにする。日本語の資料が欲しいんじゃー(ノД`、)


Graphic Modes

graphic modes

mode main screen sub screen
MODE_0_2D
MODE_0_3D
BG0: text / 3D
BG1: text
BG2: text
BG3: text
BG0: text
BG1: text
BG2: text
BG3: text
MODE_1_2D
MODE_1_3D
BG0: text / 3D
BG1: text
BG2: text
BG3: rotation
BG0: text
BG1: text
BG2: text
BG3: rotation
MODE_2_2D
MODE_2_3D
BG0: 3D
BG1: text
BG2: rotation
BG3: rotation
BG0: text
BG1: text
BG2: rotation
BG3: rotation
MODE_3_2D
MODE_3_3D
BG0: text / 3D
BG1: text
BG2: text
BG3: extended rotation
BG0: text
BG1: text
BG2: text
BG3: extended rotation
MODE_4_2D
MODE_4_3D
BG0: text / 3D
BG1: text
BG2: rotation
BG3: extended rotation
BG0: text
BG1: text
BG2: rotation
BG3: extended rotation
MODE_5_2D
MODE_5_3D
BG0: text / 3D
BG1: text
BG2: extended rotation
BG3: extended rotation
BG0: text
BG1: text
BG2: extended rotation
BG3: extended rotation
MODE_6_2D
MODE_6_3D
BG0: 3D
BG1: -
BG2: large bitmap
BG3: -
not available
MODE_FB0
MODE_FB1
MODE_FB2
MODE_FB3
framebuffer not available

これらのモードはvideoSetMode( ),videoSetModeSub( )によって選択が可能。

videoSetMode(MODE_5_2D | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE);
videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE);

引数として4つのバックグラウンド全てを有効にすることも可能。

デフォルトでメイン画面は上の液晶になっている。これが気に入らなければ

lcdSwap( );

を使用することで上下の液晶画面を入れ替えることができる。

もし画面を使わないならば引数に0を入れると良い。


Background Types

We have six types of backgrounds:

  • framebuffer
    画面に表示されるメモリへ直接描画が可能なモード。16bitのみ。
    It is 256*192 pixels in size and has 16 bit/pixel color (5 bits red, green and blue - bit 15 gets ignored).
  • 3D
    OpenGLに似たコマンドで3D描画が可能なモード。
    その為、直接描画はできません。
  • text
    テキスト表示モード。
    タイル構造になっていると言うことができる(?)。最大サイズは64*64block(512*512pixels)。地図は32*32blockに整列されます。
    →画面表示は32*32block?それ以上のサイズはスクロール等で使用かな。
  • rotation
    textに似たモード。但し回転が可能。
    最大128*128blockが指定可能。and use 8bit maps instead of 16bit maps like text backgrounds. Rotation maps are arranged sequentially.(ノД`、)
  • extended rotation
    フレームバッファのように使えるモード。8bit,16bitが使用可能。
    ここで指定できるバッファサイズよりも画面解像度の方が大きかったり小さかったりするが、回転拡大縮小スクロールを駆使してなんとかすることが可能だ。16bit color使用時、15bit目はalphaになっています。
  • large bitmap
    512*1024又は1024*512の8bit image。(これでもう既に512kb使用している!これを使うにはVRAMのbank A〜Dが必要になるでしょう!)

text variants

Resolution Defined Map Size Layout
256x256 BG_32x32 2kb 32x32
256x512 BG_32x64 4kb 32x64
512x256 BG_64x32 4kb (32x32)+(32x32)
512x512 BG_64x64 8kb (32x32)+(32x32)+(32x32)+(32x32)



rotation variants

Resolution Defined Map Size Layout
128x128 BG_RS_16x16 256bytes 16x16
256x256 BG_RS_32x32 1kb 32x32
512x512 BG_RS_64x64 4kb 64x64
1024x1024 BG_RS_128x128 16kb 128x128



extended rotation variants

Resolution Size@8bit/pixel Size@16bit/pixel
128x128 16kb
BG_BMP8_128x128
32kb
BG_BMP16_128x128
256x256 64kb
BG_BMP8_256x256
128kb
BG_BMP16_256x256
512x256 128kb
BG_BMP8_512x256
256kb
BG_BMP16_512x256
512x512 256kb
BG_BMP8_512x512
512kb
BG_BMP16_512x512

(このdefineをどうやって使うのかはまた後ほど)

VRAM

VRAM

bank control register size what it can be used for
VRAM
VRAM_A
VRAM_A_CR 128kb VRAM_A_LCD
VRAM_A_MAIN_BG_0x6000000 = VRAM_A_MAIN_BG
VRAM_A_MAIN_BG_0x6020000
VRAM_A_MAIN_BG_0x6040000
VRAM_A_MAIN_BG_0x6060000
VRAM_A_MAIN_SPRITE
VRAM_A_TEXTURE_SLOT0 = VRAM_A_TEXTURE
VRAM_A_TEXTURE_SLOT1
VRAM_A_TEXTURE_SLOT2
VRAM_A_TEXTURE_SLOT3
VRAM_B VRAM_B_CR 128kb VRAM_B_LCD
VRAM_B_MAIN_BG_0x6000000
VRAM_B_MAIN_BG_0x6020000 = VRAM_B_MAIN_BG
VRAM_B_MAIN_BG_0x6040000
VRAM_B_MAIN_BG_0x6060000
VRAM_B_MAIN_SPRITE
VRAM_B_TEXTURE_SLOT0
VRAM_B_TEXTURE_SLOT1 = VRAM_B_TEXTURE
VRAM_B_TEXTURE_SLOT2
VRAM_B_TEXTURE_SLOT3
VRAM_C VRAM_C_CR 128kb VRAM_C_LCD
VRAM_C_MAIN_BG_0x6000000
VRAM_C_MAIN_BG_0x6020000
VRAM_C_MAIN_BG_0x6040000 = VRAM_C_MAIN_BG
VRAM_C_MAIN_BG_0x6060000
VRAM_C_ARM7
VRAM_C_SUB_BG_0x6200000 = VRAM_C_SUB_BG
VRAM_C_SUB_BG_0x6220000
VRAM_C_SUB_BG_0x6240000
VRAM_C_SUB_BG_0x6260000
VRAM_C_TEXTURE_SLOT0
VRAM_C_TEXTURE_SLOT1
VRAM_C_TEXTURE_SLOT2 = VRAM_C_TEXTURE
VRAM_C_TEXTURE_SLOT3
VRAM_D VRAM_D_CR 128kb VRAM_D_LCD
VRAM_D_MAIN_BG_0x6000000
VRAM_D_MAIN_BG_0x6020000
VRAM_D_MAIN_BG_0x6040000
VRAM_D_MAIN_BG_0x6060000 = VRAM_D_MAIN_BG
VRAM_D_ARM7
VRAM_D_SUB_SPRITE
VRAM_D_TEXTURE_SLOT0
VRAM_D_TEXTURE_SLOT1
VRAM_D_TEXTURE_SLOT2
VRAM_D_TEXTURE_SLOT3 = VRAM_D_TEXTURE
VRAM_E VRAM_E_CR 64kb VRAM_E_LCD
VRAM_E_MAIN_BG
VRAM_E_MAIN_SPRITE
VRAM_E_TEX_PALETTE
VRAM_E_BG_EXT_PALETTE
VRAM_E_OBJ_EXT_PALETTE
VRAM_F VRAM_F_CR 16kb VRAM_F_LCD
VRAM_F_MAIN_BG
VRAM_F_MAIN_SPRITE
VRAM_F_TEX_PALETTE
VRAM_F_BG_EXT_PALETTE
VRAM_F_OBJ_EXT_PALETTE
VRAM_G VRAM_G_CR 16kb VRAM_G_LCD
VRAM_G_MAIN_BG
VRAM_G_MAIN_SPRITE
VRAM_G_TEX_PALETTE
VRAM_G_BG_EXT_PALETTE
VRAM_G_OBJ_EXT_PALETTE
VRAM_H VRAM_H_CR 32kb VRAM_H_LCD
VRAM_H_SUB_BG
VRAM_H_SUB_BG_EXT_PALETTE
VRAM_I VRAM_I_CR 16kb VRAM_I_LCD
VRAM_I_SUB_BG
VRAM_I_SUB_SPRITE
VRAM_I_SUB_SPRITE_EXT_PALETTE

私達はDSに、どのVRAM bankを使用するのか指定しなければならない。
656kbのVRAMは異なる用途とサイズを持った9つのバンクメモリにアクセスができる。もしあなたがVRAMに大きなサイズを要求するなら、複数のバンクを同時に使用が可能です。

Note:"VRAM"定義は"VRAM_A"のエイリアスです。決して特別なバンクメモリではありません。"VRAM"バンクを使用すると、0x60000000から始まるアドレスをマップされるでしょう。



VRAM bank指定には10の関数があります:

void vramSetBankA(VRAM_A_TYPE a);
(...省略)
void vramSetBankI(VRAM_I_TYPE i);
uint32 vramSetMainBanks(VRAM_A_TYPE a, VRAM_B_TYPE b, VRAM_C_TYPE c, VRAM_D_TYPE d);

vramSetMainBanks(a,b,c,d);はvramSetBankA(a);…B,C,D…と同じです。しかしリターン値として以前に使用された設定値が(ハンドル形式で)取得できます。この引数を使用すると、以下の方法で簡単に4つのbankが復元できます。

void vramRestoreMainBanks(uint32 vramTemp);





VRAM_x_TYPE定義がテーブルの最後のカラムに記述されています。しかしこれらの値は何を意味しているのでしょうか?

  • VRAM_x_LCD
    3D,framebufferモードであることの指定する。
  • VRAM_x_MAIN_BG_0x60n0000
    メイン画面としてこのVRAMを使用することを指定する。
    もし256kbの領域を要求するなら、0x6000000〜0x6020000で1枚のスクリーンを作らなければなりません。
  • VRAM_x_SUB_BG_0x62n0000
    サブ画面。詳細はメインと同様。
  • VRAM_x_MAIN_SPRITE
    スプライトの為にこのVRAMを使用する。bank Aに0x06400000、bank Bに0x06420000が指定される。さらに上にbank Dが定義される。
  • VRAM_x_SUB_SPRITE
    サブ画面スプライト指定。
    0x06600000〜0x06660000をbankA〜Dにマップされる。
  • VRAM_X_TEXTURE_SLOT
  • VRAM_X_ARM7
  • VRAM_X_TEX_PALETTE
  • VRAM_X_BG_EXT_PALETTE
  • VRAM_X_SUB_BG_EXT_PALETTE
  • VRAM_X_OBJ_EXT_PALETTE
  • VRAM_X_SUB_SPRITE_EXT_PALETTE

最後の方は原文に書いていなかった(ノД`、)

VRAM_x_ARM7ってなんなんじゃー(ノД`、)

Background Control Register

各々のBGのための1つのCR



DSには8つのBGコントロールレジスタがあります。メイン画面、サブ画面各々のBGに1つずつCRがあります。メイン画面はBGn_CR、サブ画面はSUB_BGn_CRで呼び出します。

BG_CRはBG0_CRのエイリアスで、同様にSUB_BG_CRはSUB_BG0_CRのエイリアスです。これらのCRを任天堂DSで使用する場合、どんなイメージフォーマットやバックグラウンドイメージを置けば見つけられるのでしょうか。

videoSetMode(MODE_5_2D | DISPLAY_BG3_ACTIVE);
vramSetBankA(VRAM_A_MAIN_BG_0x6000000);
BG3_CR = BG_BMP16_256x256 | BG_WRAP_ON;

ここではMODE_5をメイン画面としました。しかしBG3(extended rotation)のみを有効としています。この場合、VRAM bankAに0x6000000がマップされ、その結果メイン画面が使用可能となります。

上にある例の最終行は、任天堂DSに対してBG3をサイズ256x256の16bit画像、そしてwrap around(なにこれ)指定しています。


Parameters for the CR

Here is a list of parameters for BGn_CR:

  • BG_{32x32|32x64|64x32|64x64}
    テキストBGで使用。
  • BG_RS_{16x16|32x32|64x64|128x128}
    rotation BGで使用。
  • BG_BMP{8|16}_{128x128|256x256|512x256|512x512}
    extended rotation BGで使用。bitの深さと解像度を指定。
  • BG_BMP8_1024x512 and BG_BMP8_512x1024
    MODE 6でのみ使用。
  • BG_WRAP_ON
    ラップを指定した場合、画像が最後まで移動したときにスクロールするでしょう(?)。これで「永遠にスクロール」させることができます。
  • BG_PRIORITY(n) or BG_PRIORITY_n
    BGの優先度指定。0が最も高く、3が最も低い。優先順位が高いBGは優先順位の低いBGの上で描画されます。同じ優先順位のスプライトの場合、BGの上で描画されるでしょう。
  • BG_TILE_RAM(n)
    メイン画面のみ!RAM上に0x6000000から開始される各々16kbの16blockのタイルデータを保持できる。このパラメータはどのブロックを使いたいかを選択します。
  • BG_TILE_RAM_SUB(n)
    サブ画面のみ!0x6200000から始まる以外はBG_TILE_RAMと同じ。
  • BG_MOSAIC_ON
    このフラグをセットするとモザイクエフェクトが使用できる。
  • BG_MAP_RAM(n)
    メイン画面のみ!RAM上に0x6000000から開始される各々2kbの32blockのタイルデータを保持できる。このパラメータはどのブロックを使いたいかを選択します。
  • BG_MAP_RAM_sub(n)
    サブ画面のみ!0x6200000から始まる以外はBG_MAP_RAMと同じ。


Additional register for each background

We have some more registers:

  • BGn_X0
    画面の左端をBGにマップする。
  • BGn_Y0
    画面の上端をBGにマップする。もしextended rotation BGを指定するなら、さらに以降にあるレジスタを指定できます。
  • BGn_XDX
    X軸スケーリング指定です。これは0.8.8の固定小数点で指定されます。特にスケーリングをしたくない場合は1.0(1<<8)を指定して下さい。例えば2倍に拡大したい場合は2.0(1<<9)を指定する事で背景は元の幅の半分しか表示されなくなるだろう。(2倍の拡大表示なのでbitmapの半分しか画面に表示ができなくなる)
  • BGn_XDY
    回転と剪断指定。
  • BGn_YDX
    回転と剪断指定。
  • BGn_YDY
    Y軸スケーリング指定。BGn_XDXと同様です。
  • BGn_CX
    画面の左端をBGにマップする(0.8.8の固定小数点で)。
  • BGn_CY
    画面の上端をBGにマップする(0.8.8の固定小数点で)。

n=2,3やサブ画面も同様(SUB_BG2_X0等)なので省略します。

rotationやextended rotation BGを使用する場合、BGn_CX,BGn_CYがBGn_X0,BGn_Y0に取って代わります。


Special registers

We have some more registers, which aren't specific for one background:

  • MOSAIC_CR / SUB_MOSAIC_CR
    モザイクエフェクト指定(ピクセルが大きく見える)。これを有効にするにはBGに最初に有効にしておかなければなりません。下位4bitがX軸モザイクサイズ、bit4〜7がY軸モザイクサイズです。
  • BLEND_CR / SUB_BLEND_CR
    背景の合成、又はフェードイン・フェードアウト指定。
  • BLEND_AB / SUB_BLEND_AB
    2つのBGを合成。bit 0〜4がBG Aの合成係数、bit 8〜12がBG Bの合成係数。残り13〜15は未使用。50%合成を行いたい場合は以下のように指定。
    BLEND_AB = 0x0F | (0x0F << 8);
  • BLEND_Y / SUB_BLEND_Y
    フェードイン/アウト指定。最後の5bitがどれくらい白く/黒くするかを指定します。0x00は背景のまま、0x1Fは真っ白/真っ黒です。

// blend BG2 and BG3 on the main screen
BLEND_CR = BLEND_ALPHA | BLEND_SRC_BG2 | BLEND_DST_BG3;
// fade BG2 to black on the sub screen
SUB_BLEND_CR = BLEND_FADE_BLACK | BLEND_SRC_BG2;



We have the following blending defines:

  • BLEND_NONE
    no blending
  • BLEND_ALPHA
    blend two backgrounds
  • BLEND_FADE_WHITE
    fade to white
  • BLEND_FADE_BLACK
    fade to black
  • BLEND_SRC_BGn
    (n = 0,1,2,3) which background will be the source
  • BLEND_SRC_SPRITE
  • BLEND_SRC_BACKDROP:
  • BLEND_DST_BGn
    (n = 0,1,2,3) which background will be the destination
  • BLEND_DST_SPRITE
  • BLEND_DST_BACKDROP



Back to our registers:

  • WINn_X0 / SUB_WINn_X0
    (n = 0,1)
  • WINn_X1 / SUB_WINn_X1
    (n = 0,1)
  • WINn_Y0 / SUB_WINn_Y0
    (n = 0,1)
  • WINn_Y1 / SUB_WINn_Y1
    (n = 0,1)
  • WIN_IN / SUB_WIN_IN
  • WIN_OUT / SUB_WIN_OUT

例によって最後の方は原文に書いてない個所がある(ノД`、)

Side Notes:

  1. the source layer(s) must be over destination layer(s) to have some blending displayed. that means the priority of source layers should be numerically lower than the the priority of destination layers.
  2. the source layer is what is going to be translucent, the destination(s) is what is going to be seen through.
  3. if you have something white to be translucent (ghost, cloud, ...), make sure you pick an alpha value <15 or the white value will "eat up" the color on the other layer