DMA (Direct Memory Access)
DMAとは、CPUを介さずデバイスが直接メモリ(アドレスバス)にアクセスするための機構です。
DSでは、CPUごとに4つずつ、合計8個のDMAチャンネルがあります。
DMAにアクセスする方法はGBAと似ていますが、1箇所、gamepakビット(bit27)だけが変更になっています。この部分は、ARM7では無くなり、ARM9では3bitに拡張されています。
全てのチャンネルの長さは21ビットです。(最大で 1 ~ 1FFFFFh ユニットで、0 = 200000h です)
SAD/DAD レジスタの幅は 0 ~ 0FFFFFFEh です。
転送モード ( DMACNT Bit27-29 で設定する ) :
0 |
即時転送 |
1 |
V-Blank 時にスタート |
2 |
H-Blank 時にスタート (V-Blank中は停止) |
3 |
表示開始と同期 |
4 |
メインメモリ表示 |
5 |
DS カートリッジスロット |
6 |
GBA カートリッジスロット |
7 |
ジオメトリコマンド FIFO |
SAD(転送元アドレス) と DAD(転送先アドレス) は読み書き可能です。
どちらとも、GBAモードでは制限を受けます(最大 4000h か 10000h ユニット。アドレスは 0 ~ 07FFFFFEh の間に制限される)。
DMACNT Bit27 はARM7では使用しません。
転送モード ( DMACNT Bit28-29 で設定する ) :
0 |
即時転送 |
1 |
V-Blank 時にスタート |
2 |
DS カートリッジスロット |
3 |
DMA0/DMA2: ワイヤレス割り込み, DMA1/DMA3: GBA カートリッジスロット |
- 40000E0h - ARM9 のみ - DMA0FILL - DMA 0 Filldata (R/W)
- 40000E4h - ARM9 のみ - DMA1FILL - DMA 1 Filldata (R/W)
- 40000E8h - ARM9 のみ - DMA2FILL - DMA 2 Filldata (R/W)
- 40000ECh - ARM9 のみ - DMA3FILL - DMA 3 Filldata (R/W)
DMAフィルデータレジスタは16バイトのWRAMを持っていて、DMA転送処理時のソースアドレスとして使用されます。
DMAはTCM(CPUコアに入ったメモリ?)を読み込むことができなかったり、メインRAM アクセス時にはリソースキャッシュや書き込みバッファがあるので、こういった方法を使用します。
DSは、この他に16個のサウンド用DMAチャンネルと、2個のサウンドキャプチャ用DMAを持っています。
これらのチャンネルの優先順位はまだ分かりません。
- ARM9 キャッシュ, 書き込みバッファ, DTCM と ITCM
キャッシュとTCMはARM9へ、システムバスを通さずに直接接続されています。
なので DMA は DTCM/ITCM にアクセスできません。キャッシュメモリ領域にはアクセスすることができますが、注意する必要があります。
キャッシュメモリ領域にアクセスするには、DMA 読み込みの前に書き込みバッファを繋ぎ、DMA 書き込みの後にキャッシュを無効にしてください。
DMA転送中にも、TCMやキャッシュの中にあるコードを読み込ませることでCPUを動かすことができます。TCMとキャッシュ中にコードが無い場合はDMA転送が終わるまでCPUはhalt状態になります。
DMA転送中に割り込みが発生した時、CPUは停止します。
(TCMとキャッシュにIRQハンドラが存在しない場合 - IRQベクタFFFF00xxhがキャッシュされていない、かつ ITCM の 000000xxh にも移されていない状態 - や、IRQハンドラがIE・IF・他のIOポートにアクセスする場合に停止します)
メインRAMはシーケンシャルアクセスか、そうでないかによってアクセス時間が違います。
通常、DMAはシーケンシャルアクセスを使用します(最初の1ワードを除いて)。
ただし、転送元と転送先が両方ともメインRAMである場合、全てのアクセスはシーケンシャルではなくなります。
そのような時、2つのDMAユニットを使った転送を高速化するには、片方がメインRAMからWRAMへ転送し、もう片方がWRAMからメインRAMへ転送するようにします。
最終更新:2007年07月13日 21:42