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