一応同時再生ができるようになったので、例によりニコニコ動画からムービーを適当に拾ってきて録画してみました。
TVで見ると色が付くのですが、キャプチャで録画したので本来の白黒になってしまっています。
動作環境は以下のようになっています。
- 割り込みを禁止
- AVRのクロックはPC本体からの15.9744MHz
- 画像3バイトに音声1バイトを1組としてデータを構成
- 処理速度を平均化するため、一切の圧縮なし。音声も1バイト中下位4ビットしか使ってない
- 256x192ドット/10fpsで、1画像は6144バイト
- 音声は1fpsあたり6144/3=2048バイト
以上から、音声は20480Hz/4ビットとなるのですが、DMAの関係で、やはり今のところ音質はどうにもなりません。 画面出力を切ると、10kHz程度でもかなりの音質になるのですが。
上記の条件から、転送レートは以下のようになります。
(6144(video) + 2048(audio)) * 10(fps) = 81920 = 80kB/s
やはり拡張スロットからAVRを介して直接入力しているだけのことはあり、かなりの転送レートが出ます。 しかも、バッファを持たない完全ストリーミングなので、PC側のメモリをほとんど消費しません。 プレイヤーのプログラムも、0.5kB程度の容量で実現できています。
以下が、プレイヤーの中心部です。
_play_loop: ld hl, #0xe200 ;11 (hl=VRAM position) ld d, #16 ;8 -> 19 (d=counter) _read: ld a, #AVRSD_READ ;8 out (#0x00), a ;13 nop ;5 -> 26 _read_command_loop: in a, (#0x00) ;13 cp e ;5 (e=BUSY) jp z, _read_command_loop ;11 -> 29/loop or a ;5 jr nz, _terminate ;8/13 in a, (#0x00) ;13 (size L) in a, (#0x00) ;13 (size H) ld b, #0x80 ;8 -> 47 (b=loop counter=dec x 384) _render_loop: in a, (#0x00) ;13 out (#0xa1), a ;13 (audio output) ini ;19 ini ;19 ini ;19 jp nz, _render_loop;11 -> 94*128=12032 dec d ;5 jp nz, _read ;11 jp _play_loop ;11 _terminate:
ご覧のとおり、ほとんどinしているだけです。
このセッティングだと、画像:音声=3:1固定のため、fpsを上げると同時に音声周波数も上がってしまいます。 しかし、512バイトセクタ単位で読み込んでいる関係で、他の比率はなかなか難しいものがあります。
それにしても、DMA ON時の音質は何とかならないものでしょうかね...。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!