English
FAQプログラム全般
■  | 進む
FAQ/プログラム全般

DMA



CPU-DMAを用いたA-BUS→C-BUSの転送がうまくいかない。

Q)
CPU DMAを使ってABUSからCBUS(ワークRAM-L)への転送を行っていますが、2回目以降の転送が失敗しているようです。
CDC_DATAEndで得られる転送数が1回目の転送では正常な値がかえってきますが、2回目以降の転送では必ず 5ワードという値が返され、転送先には1バイトも転送されていません。
以下にルーチンを記述しますが転送前に何等かの処理が必要なのでしょうか。

A)
DMA_CpuSetPrm関数に渡すパラメータのDmaC.mskにDMA_CPU_M_TEを追加してください。
詳細は、

SH7095ハードウェアマニュアル
     第9章ダイレクトメモリアクセスコントローラ
         9.2.4DMAチャネルコントロールレジスタ0、1

を参照してください。


SCU-DMAを使って同一バス間の転送が出来ない。

Q)
DMA_ScuMemCopy()で、WORK_RAM_H同士間のコピーが正常に動作しません。
どういった理由が、考えられますか?

A)
SCU-DMAは異なるバス間の転送を行うDMAです。
同一空間上では行うことはできません。
同一空間上でのデータ転送には、CPU-DMAかソフトウェア転送をご使用ください。

<SCU-DMA を使用できる転送例>
WorkRAM-H ←→ VDP1
WorkRAM-H ─→ VDP2
WorkRAM-H ←→ SCSP(SoundRAM)
CD Buffer ─→ WorkRAM-H
CD Buffer ─→ VDP1
CD Buffer ─→ VDP2
CD Buffer ─→ SCSP(SoundRAM)

SCU-DMAでHighRAMからB-Busへの転送がうまくいかない。

Q)
SCU DMAの2chを間接モードで使用して、ワークRAM-Hから、B-BUSへの転送を試みていますが、まったく転送されていません。
原因としては、どのようなことが考えられるか御教示お願いします。

A)
SCUの間接モードのテーブル設定はどのようになっていますか?
「転送バイト数」、「書き出しアドレス」、「読み込みアドレス」の順で設定してください。

├───────────────┤
│  1回目の転送バイト数   │m  ←書き出しアドレスレジスタにセットする
├───────────────┤    アドレス
│  1回目の書き出しアドレス │m+4 
├───────────────┤    
│  1回目の読み込みアドレス │m+8 
├───────────────┤
│       :       │
│       :       │
│       :       │
│       :       │
├───────────────┤
│  n回目の転送バイト数   │
├───────────────┤
│  n回目の書き出しアドレス │
├─┬─────────────┤
│1│n回目の読み込みアドレス │
└─┴─────────────┘
 ↑
 n回目の読み込みアドレスの31ビット目に必ず「1」をセットする


SCU-DMAの間接モードのテーブルの仕様について。

Q)
SCU-DMA間接モードテーブルの仕様ですが、テーブルサイズが1020バイトまでの 場合は、開始アドレスを1024バイト境界に置くとなっていますが1020バイトを 越えるデーターの場合はどうなるのでしょうか?
現状1024バイト境界で動作している様なのですが (現在2688バイト程度のテーブル) これは将来において保証されないということなのでしょうか?

A)
SCU追加マニュアル(No.25)によると、データサイズが(n×12)バイトまでの時 2 ^ mバイトのデータテーブルが必要とあります。つまり、現在そちらで 使用されているデータサイズですと、 ( 2 ^ 11 ) = 2048 < 2688 = ( 224 × 12 ) <= 2688 < 4096 = ( 2 ^ 12 ) ですので、 4096バイトのテーブルサイズが必要となります。

DMAでのレベル1起動中の制限について。

Q)
SCU-DMAでDMAレベル1の実行中にDMAレベル2の起動禁止とありますが、これは DMAレベル1が動作(DMA転送中)の時にレベル2の起動を禁止するだけでしょうか?

DMAレベル1をSCU割り込みで自動起動にしている場合は、レベル1はずっと動作中であると言うことになるのでしょうか?

誤動作とありますが、具体的にはどのような症状なのでしょうか。
ゲームに支障が無い場合は利用してもよろしいのでしょうか?

A)
これは、使用禁止です。
レベル1実行時にレベル2を起動した場合予期せぬ事が起こり、正常な動作は保証できません。
もしご使用のようでしたらプログラムの方を変更してください。


SCU-DMAの同時使用チャネルについて。

Q)
SCU-DMAの同時使用可能チャンネルは2チャンネルで、3チャンネル同時使用すると 優先順位は無視されるとの事ですが、これは優先順位が無視されるだけで3つとも必ず終了するのでしょうか?

優先順位が無視された場合、具体的にはどのような順番になるのでしょうか?

また、これは前の質問に重なりますが、優先順位が無視された場合、レベル2の 起動中にレベル1が起動することが有るとなるとその場合、誤動作等は 発生するのでしょうか?

A)
ハードウェアの禁止事項ですので使用しないでください。


LowRAMからVDP1への高速な転送方法はどれですか?

Q)
WORK_RAM_L領域をスプライトデータのバッファとして使いたいのですが、 WORK_RAM_L領域からSPR_VRAM領域への転送方法で一番速いのはどんな 方法でしょうか?
SCU_DMAは使えないようなので、CPU_DMAを使いたいのですが。

A)
WORK_RAM_L領域から転送するのに一番高速に行う方法は、転送量にも よりますが、CPU-DMA転送を使用する事です。
転送量が少ない場合(数バイト)、DMA転送には起動前と起動後に数クロックのウェートが入りますので、 メモリ転送の方がよい場合もあります。


■  | 進む
FAQプログラム全般
Copyright SEGA ENTERPRISES, LTD,. 1997