P/ECE研究室〜S1C33分室
* Thu Jan 17 05:51:14 JST 2002 Naoyuki Sawa
S1C33209は、二種類のDMAコントローラを持っています。
高速DMAコントローラと、インテリジェントDMAコントローラです。
高速DMAコントローラ(以下、高速DMA)は、CPU内部に設定レジスタを持ち、高速に動作します。
その代わり、全部で4チャネルしかなく、また機能も多少制限されています。
普通のDMAコントローラなので、理解しやすいです。
インテリジェントDMAコントローラ(以下、インテリジェントDMA)は、RAM上に設定情報を置いて使います。
最大128チャネル、機能も豊富ですが、RAMから設定情報を読むため、少々オーバーヘッドがあります。
(とはいえ、実際に計ったわけではないので、どこにオーバーヘッドの影響が出るのか、今のところわかりません。
トリガ発生から転送開始までにタイムラグがあるのか、それとも連続転送モードでの転送レートが低いのか...
要調査です。)
機能豊富な分、ちょっと理解しづらそうです。
まずは、理解しやすそうな、高速DMAを使ってみることにしました。
P/ECEでは、高速DMAの各チャネルを、次のような用途に使っています。
Ch.
| P/ECEでの用途
|
0
| LCD転送(シリアルCh.3バッファへの書き込み)
|
1
| サウンド再生(16ビットタイマCh.1コンペアAへの書き込み)
|
2
| 未使用(USB転送に使おうとした形跡あり)
|
3
| 未使用
|
前回の8ビットタイマと違って、高速DMAはチャネル毎の性格の違いがあまりありません。
今回は、完全に未使用となっている、Ch.3を使って実験することにしました。
pceAppProc()で、毎回同じアドレスにある文字列を画面に表示し続けます。
少し待ったところでDMA転送を開始し、そのアドレスに新しい文字列を送り込みます。
表示される文字列は、変わってくれるでしょうか。ソースはこちら。
※昨日のP/ECE研究報告で話題に挙げた、c33208.hを利用しました。
成功です。予想以上に簡単です。
余談〜
実は僕は、汎用DMAコントローラのプログラミングをやったことがありませんでした。
MSXには、汎用DMAコントローラは搭載されていなかった(と思う)からです。
(VDPがDMAっぽいとは言えるけど、VRAMtoVRAMなので、ちょっと違いますよね)
DOS/Vでサウンドブラスターのプログラミングでもやれば、DMAの勉強をする機会もあったのでしょうけれど、
そうこうしているうちにすっかりWindowsが主流に。
仮想メモリやらなんやかやで、直接DMAを操作するプログラムの実験は、かなり難しくなってしまいました。
というわけで、DMAのプログラミングは今回が初めてだったので、うまく動いてくれてちょっと感動です。
〜余談
今回の実験では、とにかくいちばん簡単な設定で、高速DMAを使ってみました。
プログラムからの指令で転送を開始し、指定サイズを一気に転送して終了。
つまり、memcpy()のような動作です。
LCD転送やサウンド再生では、もう少し複雑な設定でDMAが使われています。
周辺回路からの要求で転送を開始し、1バイトづつ同じアドレスに書き込む、という動作です。
これらの設定については、今後、試していきたいと思います。
ゆくゆくは、P/ECE開発者の方が断念した(と思われる)、DMAを利用したUSB転送にも挑戦してみたいです。
さて最後は、身の程知らずの「カーネルいちゃもんコーナー」です。
snd.cのstop_pcm()にて、(たぶん)高速DMAトリガフラグをクリアするために、
sp[0x823e/2] = 0;
としていますが、この処理には意味がないと思います。
S1C33209のマニュアルによると、HS1_TF:CH.1トリガフラグレジスタ(0x40823E・D0)は、
書き込むデータは"1"のみ意味があり、トリガフラグがセットされていたらそれをクリアします。
"0"の書き込みは無効で、トリガフラグはクリアされません。
まあ、実際には、そのすぐ下でDMA自体を無効化しているので、トリガフラグの状態は関係ありませんし、
start_pcm()でもDMAを有効にする前に、
sp[0x823e/2] = 1;
としてトリガフラグをクリアしているので、動作上は全く影響ありません。
S1C33209/221/222テクニカルマニュアル(s1c33209_221_222j.pdf)の420ページ(B-V-2-8)にて、
HST0: Ch.0ソフトウェアトリガ(HSDMAソフトウェアトリガレジスタ 0x4029F・D0)
HST1: Ch.1ソフトウェアトリガ(HSDMAソフトウェアトリガレジスタ 0x4029F・D1)
HST2: Ch.2ソフトウェアトリガ(HSDMAソフトウェアトリガレジスタ 0x4029F・D2)
HST3: Ch.3ソフトウェアトリガ(HSDMAソフトウェアトリガレジスタ 0x4029F・D3)
となっていますが、アドレス0x4029Fは0x4029Aの誤植と思われます。
アドレス0x4029Fは、フラグセット/リセット方式選択レジスタです。
次回は、16ビットタイマかインテリジェントDMAを試してみようと思います。
(続きます...)
nsawa@piece-me.org