タイルモードのサンプルコード
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; }
エミュレータでの実行例
参考