DMA転送についてのアセンブリ編
アセンブラでのDMA転送は
チャネルにパラメータを書き込むことで実行できる。
前回、DMA転送の関数
void spu_mfcdma64(volatile void *ls_addr,
unsigned int ea_h,
unsigned int ea_l,
unsigned int dma_size,
unsigned int tag_id,
unsigned int cmd);
この関数とまったく同じ動作させるためには
チャネル16番から21番にパラメータを書き込む。
チャネル16番はLSのアドレス
チャネル17番はメインメモリのアドレスの上位アドレス
チャネル18番は下位アドレス
チャネル19番はDMA転送サイズ
チャネル20番はタグ
チャネル21番はDMA転送の種類(送信なら32、受信なら64)
関数の引数順番ととチャネルの番号が対応しています。
spu_writech(imm, 1 ra);
spu_mfcstat(unsigned int type)
では
チャネル22番から24番まで書き込む。
チャネル22番はタグマスク
(チャネル20番に書き込んだタグの値の左に1bitシフトした値)
チャネル23番はタグステータスの更新リクエストの書き込み
( 0なら無条件、1ならどれか一つでも完了していれば更新、2なら全部が終了したら更新)
チャネル24番はタグステータスを読み込み
書き込み命令と読み込み命令は
wrch ch, ra
rdch rt, ch
ロードストアとか細かな命令について全く説明してなかったので
アドレス計算とかは、また今度と言うことで・・・
今回は、それぞれのレジスタ100番以降にパラメータが格納されていることということにしといてください。
各レジスタの中身ついては、適当にお任せします。
wrch $ch16, $100
wrch $ch17, $101
wrch $ch18, $102
wrch $ch19, $103
wrch $ch20, $104
wrch $ch21, $105
wrch $ch22, $106
wrch $ch23, $107
wrch $2, $ch24
記述だけならこれだけ書けば動作します。
タグの値何かは、
ビットシフトなのでレジスタの値をいじるか、
即値でいれるなら、それはそれで問題ない。
なので、パラメータは格納されているとしても各レジスタに全部入っていれば
最短でこれだけ記述すればいい。
アドレス計算なんかは、ローテートやシフト命令によって計算できるので、
また機会があれば書きたいとは思います。
その前に、ロード・ストアについても書いたほうがいいかな。
PR