Tutorial.11 タイルモード(2)

前回のmode0を簡単にまとめてみました。
合わせてmode1、mode2も載せておきます。

色々モードの紹介していきましたが、個人的にhomebrewで使うのはmode0か3が主流です。
あとはほとんど使っていません。他は参考程度に見てください。

  • mode0
    サイズ256*256〜512*512
    画面数4 (BG0-3)
    色/パレット16色*16パレット/256色*1パレット
    キャラクタ定義数1024
    伸縮回転不可能
  • mode1
    色/パレット16色/16パレットor256色/1パレット256色/1パレット
    キャラクタ定義数1024256
    サイズ256x256〜512x512128x128〜1024x1024
    画面数2(BG0-1)1(BG2)
    伸縮回転不可能可能

mode1には、伸縮回転可能なBG、不可能なBGの2種類があります。

  • mode2
    サイズ128x128〜1024x1024
    画面数2(BG2-3)
    色/パレット256色*1パレット
    キャラクタ定義数256
    伸縮回転可能

モード0でBG0、BG1

再度モード0にて、2つの絵をレイヤー表示してみます。メモリ領域(VRAM)に入るか確認をしながらやってみましょう。

  • kumo
    clip_2.png
  • kusa
    clip_3.png

画像のサイズは(240ではなく)256x160の16色です。
タイルは32x20 = 640個。640個 * 32バイト(1タイル分のバイト数) = 20480バイト(0x5000)。
色が全く同じの重複タイルも構わず使用します。

マップは256x256ドットサイズを使うので32 * 32 * 2 = 2048バイト(0x800)となります。
それでは対応表にうまく収まるよう、領域を確保してみましょう。

  • 対応表
    アドレスマップキャラクタ確保
    0x600000000bg0(kusa)
    0x600080010bg0(kusa)
    0x600100020bg0(kusa)
    0x600180030bg0(kusa)
    0x600200040bg0(kusa)
    0x600280050bg0(kusa)
    0x600300060bg0(kusa)
    0x600380070bg0(kusa)
    0x600400081bg0(kusa)
    0x600480091bg0(kusa)
    0x6005000101
    0x6005800111bg0 map
    0x6006000121bg1 map
    0x6006800131
    0x6007000141
    0x6007800151
    0x6008000162bg1(kumo)
    0x6008800172bg1(kumo)
    0x6009000182bg1(kumo)
    0x6009800192bg1(kumo)
    0x600A000202bg1(kumo)
    0x600A800212bg1(kumo)
    0x600B000222bg1(kumo)
    0x600B800232bg1(kumo)
    0x600C000243bg1(kumo)
    0x600C800253bg1(kumo)
    0x600D000263
    0x600D800273
    0x600E000283
    0x600E800293
    0x600F000303
    0x600F800313

うまく収まりましたね。レイヤー表示は上層がbg0、下層はbg3です。
逆にすると当然、kusaタイルは表示されません。

#include "lib/gba.h"
#include "res.h"

#define BG_MAX_CNT 4

typedef struct {
	u32  mapBase;
	u16* mapBaseAdr;
	u32  tileBase;
	u16* tileBaseAdr;
} ST_BG;

//---------------------------------------------------------------------------
ST_BG Bg[BG_MAX_CNT];

//---------------------------------------------------------------------------
void WaitForVsync(void)
{
	while(*(vu16*)0x4000006 >= 160) {};
	while(*(vu16*)0x4000006 <  160) {};
}
//---------------------------------------------------------------------------
void BgInitMem(void)
{
	const u32 mapBase[]  = { 11, 12,  0,  0 };
	const u32 tileBase[] = {  0,  2,  0,  0 };
	s32 i;

	for(i=0; i<BG_MAX_CNT; i++)
	{
		Bg[i].mapBase     = MAP_BASE(mapBase[i]);
		Bg[i].mapBaseAdr  = MAP_BASE_ADR(mapBase[i]);
		Bg[i].tileBase    = TILE_BASE(tileBase[i]);
		Bg[i].tileBaseAdr = TILE_BASE_ADR(tileBase[i]);
	}

	for(i=0; i<32*32; i++)
	{
		Bg[0].mapBaseAdr[i] = 0;
		Bg[1].mapBaseAdr[i] = 0;
		Bg[2].mapBaseAdr[i] = 0;
		Bg[3].mapBaseAdr[i] = 0;
	}

	for(i=0; i<0x2000; i++)
	{
		Bg[0].tileBaseAdr[i] = 0;
		Bg[1].tileBaseAdr[i] = 0;
		Bg[2].tileBaseAdr[i] = 0;
		Bg[3].tileBaseAdr[i] = 0;
	}
}
//---------------------------------------------------------------------------
void BgInit(void)
{
	BgInitMem();

	REG_DISPCNT = (MODE_0 | BG0_ON | BG1_ON);

	REG_BG0CNT = (BG_SIZE_0 | BG_16_COLOR | Bg[0].tileBase | Bg[0].mapBase);
	REG_BG1CNT = (BG_SIZE_0 | BG_16_COLOR | Bg[1].tileBase | Bg[1].mapBase);
}
//---------------------------------------------------------------------------
void BgSetTile(u32 bg, u16* pDat, u32 size)
{
	volatile u32 i;

	for(i=0; i<size; i++)
	{
		Bg[bg].tileBaseAdr[i] = pDat[i];
	}
}
//---------------------------------------------------------------------------
void BgSetPal(u32 pal, u16* pDat)
{
	volatile u32 i;

	for(i=0; i<16; i++)
	{
		BG_PALETTE[pal*16+i] |= pDat[i];
	}
}
//---------------------------------------------------------------------------
void BgSetMap(void)
{
	volatile u32 i;

	for(i=0; i<32*20; i++)
	{
		Bg[0].mapBaseAdr[i] = i;
		Bg[1].mapBaseAdr[i] = i | (1 << 12);
	}
}
//---------------------------------------------------------------------------
int main(void)
{
	BgInit();

	BgSetTile(0, (u16*)&bg0kusaTiles, bg0kusaTilesLen/2);
	BgSetTile(1, (u16*)&bg1kumoTiles, bg1kumoTilesLen/2);

	BgSetPal(0, (u16*)&bg0kusaPal);
	BgSetPal(1, (u16*)&bg1kumoPal);

	BgSetMap();

	for(;;)
	{
		WaitForVsync();
	}
}

動作画面

clip_1.png

履歴

  • 2014/12/27

添付ファイル: fileclip_3.png 229件 [詳細] fileclip_2.png 221件 [詳細] fileclip_1.png 240件 [詳細]

Last-modified: 2015-01-09 (金) 08:26:06 (2685d)