タイルモードのサンプルコード

NDSのタイルモードのサンプルコードです。
初期化の部分ではまった。

  • DISPCNT
    • Mode0を選び、BG0を有効にする。
  • VRAMCNT_A
    • VRAM Aを有効にし、MST=1とする。MST=1とすることで、VRAM Aが0x0600000にマップされる。
  • BG0CONT
    • 256色/1パレットモードにし、タイルのオフセットを1、マップのオフセットを0にする。
  • VRAMにアクセスする時は16bit単位でアクセスしないとダメ
#define	NDS_IOBASE  		0x04000000
#define	NDS_BG_PALETTE		0x05000000
#define	NDS_VRAM		0x06000000
#define	RGB15(r,g,b)  ((r)|((g)<<5)|((b)<<10))

int main(void) {
    
	unsigned short *vp;
	int i,j,k;
	unsigned char charmap[2][8]= {{ 0x7c, 0x86, 0x8a, 0x92, 0xa2, 0xc2, 0x7c, 0x00 },  /* 0 */
	                              { 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00 }}; /* 1 */
	unsigned char bits;

	/* video */
	*((unsigned int   *) (NDS_IOBASE + 0x0000)) = 0x10100; /* DISPCNT   : Display Mode=Graphics Display, BG Mode=0, BG0 Active*/
	*((unsigned char  *) (NDS_IOBASE + 0x0240)) = 0x81;    /* VRAMCNT_A : VRAM Enable, VRAM Offset=0,MST=1 */
	*((unsigned short *) (NDS_IOBASE + 0x0008)) = 0x0084;  /* BG0CNT    : Colors/Palettes=256/1, Character Base Block=1, Screen Base Block=0 */

	/* palette */
	*((unsigned short *) (NDS_BG_PALETTE)+1) = RGB15(0,0,0);     /* black */
	*((unsigned short *) (NDS_BG_PALETTE)+2) = RGB15(31,31,31);  /* white */

	/* tile */
	vp = (unsigned short *) (NDS_VRAM + 0x4000); /* BG TILE 1 */
	for(i=0; i<2; i++){
		for(j = 0; j<8; j++){
			bits = charmap[i][j];
			for(k=0; k<8; k+=2){
				*vp++ = ((bits & (0x80>>k)) ? 2 : 1) | ((bits & (0x40>>k)) ? 0x200 : 0x100);
			}
		}
	}
	
	/* map */
	vp = (unsigned short *) (NDS_VRAM + 0x0000); /* BG MAP 0 */
	for(i=0; i<32*32; i++)
		*vp++ = i%2;
	
	return 0;
}

エミュレータでの実行例

参考