ホームに戻る
NDS概要

0、この文章の目的

ニンテンドウDS(NDS)で動くものを作るとき何ができるかをまとめました。
2D表示などについてはGBAとほとんど同じなので簡単に書いてあります。
NDSになって新たに何ができるようになって、だいたいどういう風にやるかの紹介です。

具体的にすべての仕様がまとめられた情報はネットを探しましたが英語でもありませんでした。
devkitPro のサンプルもよくできてはいますがすべてを完全に網羅したものではありません。
C:\devkitPro\libnds\include からヘッダを読むとなんとなくわかることもあります。
ともあれ調べたいことはいろいろ調べてみました。
数値データは真偽を検証していないので不適切な場合があるかもしれません。

1、はじめに

開発環境は devkitPro というのを使います。
動作確認には DeSmuME というエミュレーターを使いました。
ともにフリーで入手可能です。

arm7.c と arm9.c をビルドする場合は例えば以下のようです。

C:\devkitPro\devkitARM\bin\arm-eabi-g++ -g -Wall -O2 -mcpu=arm7tdmi -mtune=arm7tdmi -fomit-frame-pointer -ffast-math -fno-rtti -fno-exceptions -IC:\devkitPro\libnds\include -DARM7 -c arm7.c -oarm7.o
C:\devkitPro\devkitARM\bin\arm-eabi-g++ -g -mthumb-interwork -mno-fpu -specs=ds_arm7.specs arm7.o -LC:\devkitPro\libnds\lib -lnds7 -oarm7.elf
C:\devkitPro\devkitARM\bin\arm-eabi-objcopy -O binary arm7.elf arm7.bin

C:\devkitPro\devkitARM\bin\arm-eabi-g++ -g -Wall -O2 -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer -ffast-math -mthumb-interwork -IC:\devkitPro\libnds\include -DARM9 -c arm9.c -oarm9.o
C:\devkitPro\devkitARM\bin\arm-eabi-g++ -g -mthumb-interwork -mno-fpu -specs=ds_arm9.specs arm9.o -LC:\devkitPro\libnds\lib -lnds9  -o arm9.elf
C:\devkitPro\devkitARM\bin\arm-eabi-objcopy -O binary arm9.elf arm9.bin

C:\devkitPro\devkitARM\bin\ndstool -c templete.nds -9 arm9.bin -7 arm7.bin

2、NDSでできること

CPUはARM7とARM9の2つがある。
主にARM9を使うがARM7でしかできないことがある。
画面は256×192とGBAより少し大きい。
また、メインとサブの2つある。
GBAよりVRAMの容量が増えた。
またどちらか1画面に限るが3D表示が可能である。
キーはGBAよりXとYのキーが増えている。
タッチペンの入力が下の画面に限り可能である。
サウンドは同時に16チャンネルまで再生可能。
ワイヤレス通信が可能。

とりあえず、メモリマップは以下のよう。

ITCM           0x01FF8000-0x01FFFFFF 32KB
MAIN           0x02000000-0x023FFFFF 4M
WRAM           0x037F8000-0x037FFFFF 32KB
DTCM           0x0080000 16KB
I/O            0x04000000-0x05000000 16KB
BG Palette     0x05000000-0x05000200 512Byte
OBJ Palette    0x05000200-0x05000400 512Byte
DB BG Palette  0x05000400-0x05000600 512Byte
DB OBJ Palette 0x05000600-0x05000800 512Byte
BG VRAM        0x06000000-0x06080000 512KB
DB BG VRAM     0x06200000-0x06220000 128KB
OBJ VRAM       0x06400000-0x06440000 256KB
DB OBJ VRAM    0x06600000-0x06620000 128KB
LCDC VRAM      0x06800000-0x068A0000 640KB
OAM            0x07000000-0x07000400 1024Byte
DB OAM         0x07000400-0x07000800 1024Byte
CART ROM       0x08000000-0x09FFFFFF 32MB
CART RAM       0x0A000000-0x0A010000 64KB
BIOS           0xFFFF0000-0xFFFF8000 32KB

3、コンソール機能

devkitPro のライブラリ機能かも知れないが、
コンソール表示が簡単にできる。
デバッグなどに便利である。

4、タッチペン

タッチペンの位置を得るためにARM7のコードが必要。
ARM9内で位置を得るのは簡単にできる。

5、キー

X、Yボタンに関してはARM7のコードが必要。
タッチペンと同じくARM9内で状態を得ることができる。

6、タイマー

オーバーフローすると割り込みをかけるタイマーがある。
このあたりの動作はGBAとよく似ている。

7、2D

VRAMはメインに512KB、サブに128KBある。
メインとサブは上下で自由に入れ替えができるが、
両方の画面でいちどに同等のことができないことがある。
メイン、サブともに画面モードがあり、レイヤーは4つある。
タイルモードや回転エフェクト、スプライトも使える。
このあたりはGBAと似ている。

MAIN 2D/3D Engine 

Mode   BG0     BG1  BG2          BG3 
Mode 0 Text/3D Text Text         Text 
Mode 1 Text/3D Text Text         Rotation 
Mode 2 Text/3D Text Rotation     Rotation 
Mode 3 Text/3D Text Text         Extended 
Mode 4 Text/3D Text Rotation     Extended 
Mode 5 Text/3D Text Extended     Extended 
Mode 6 3D      -    Large Bitmap - 

Sub 2D Engine

Mode   BG0     BG1  BG2          BG3 
Mode 0 Text    Text Text         Text 
Mode 1 Text    Text Text         Rotation 
Mode 2 Text    Text Rotation     Rotation 
Mode 3 Text    Text Text         Extended 
Mode 4 Text    Text Rotation     Extended 
Mode 5 Text    Text Extended     Extended

Tile Mode

Character Memory

0     0x06000000-0x06004000
1     0x06004000-0x06008000
...31 0x0607C000-0x06080000

Map Memory

0     0x06000000-0x06000800
1     0x06000800-0x06001000
...31 0x0600F800-0x06010000

VRAM_A 0x6800000
VRAM_B 0x6820000
VRAM_C 0x6840000
VRAM_D 0x6860000
VRAM_E 0x6880000
VRAM_F 0x6890000
VRAM_G 0x6894000
VRAM_H 0x6898000
VRAM_I 0x68A0000

VRAM_A 128KB MAIN     MAIN
VRAM_B 128KB MAIN     MAIN
VRAM_C 128KB MAIN/SUB -
VRAM_D 128KB MAIN     SUB
VRAM_E  64KB MAIN-    MAIN-
VRAM_F  16KB MAIN-    MAIN
VRAM_G  16KB MAIN-    MAIN
VRAM_H  32KB SUB-     -
VRAM_I  16KB SUB-     SUB-

8、3D

3DのコードはOpenGLで書ける。
OpenGLが書ければ難しくは無いであろう。


7、サウンド

サウンドの再生にもARM7の力を借りる。
16チャンネルを同時に再生できるのでステレオ再生も楽にできる。

8、通信

調べてないのでわかりません。

inserted by FC2 system