2013年06月08日

動画再生_説明(1)

  リクエストがあったので、動画再生カートリッジの動作説明です。実はやってる事は簡単な事が多いので、多少細かく書いていこうかと思います。既に書いたものありますが、その辺りはご容赦を。


1.前提条件

 ・本体の改造はしない。
 ・画像、音声は、P6側から出力する。
 ・外付けのハードウエアは、とりあえずどんな物でも可能とする。

  この条件がないと、本当に何でもアリになってしまいますので。

  後、前提条件ではないんですが、
 ・ターゲットは、PC-6001mk2/PC-6601 にする。

  初代機ではグラフィック能力が貧弱すぎる。
  SR は、実は中身をよく知らない。

  という理由です。


2.何が難しいのか?

  PC-6001mk2 を触った事がある人なら、体感的にすごく遅いマシンである事がわかります。『中の人がサボってるんじゃないか』という意見がありましたが、実際にサボってます(描画期間)。

  実は一番難しいのは、ごまかしが効く画像表示よりも、ごまかしが効かない音声出力(PCM音声出力)です。PCM音声出力は、タイミングを計って出力する必要があるため、結構シビアです。


3.画面描画の概要


画面出力1

  普通(?)のパソコンの場合、画面周りのハードウエアはこんな感じになっていると思います(最近のはよく分かりません...)。


画面出力2

  実際に描画する際には、CPU→VRAMにデータを書き込み、


画面出力3

  VRAMのデータをCRTコントローラが読み出して、画面に出力します。

  外部から指示して、パソコンに画面描画をさせる場合、以下の3つのようなやり方が考えられます。
  1)CRTコントローラが、外部にアクセスできるモードを持っている場合

画面出力4


  2)VRAM の出力を何らかの方法で、外部から入力できる(だませる)場合

画面出力5


  3)愚直にCPUからVRAMにデータを書き込む場合(工夫なし)

画面出力6


  PC-6001初代機の場合は、2)の手法が採れます。拡張ROM/RAMカートリッジにVRAMを載せる構成のため、VRAM自体が外部になります。そのため、VRAMのデータを自由に操る事ができるためです。

  PC-6001mk2/PC-6601 は、回路図を見た限りでは、残念ながら3)の手法しか採れません。

  つまり、

  ・外部から、CPU に対して描画データを出力する。
  ・CPU が、読み込んだデータをVRAM に書き込む。
  ・CRTC がVRAMの値を読み込んで、画面に出力する。

  という、一連の作業が必要になります。

  この場合、一連の作業がどれくらい速く出来るかで、どれくらいのフレームレートになるかが決まります。

  具体的な描画手順は後ほど。


4.音声出力の概要

  PC-6001mk2/PC-6601 には、音声出力の方法は2つあります。PSG と 音声合成です。BEEP出力はありません(PSG が似たような音を出している)。

  BEEP音でメロディを奏でるわけではないので、PSG を使うとだいぶラクですが単にメロディを奏でるだけだと寂しい。音声合成は未だに解析できていないので、既存の音声を歌わせるだけになるので、ちょっと...

  という事で、今回は PSG を使って、PCM 出力にしています。

  PSG(AY-3-8910)を使った PCM 出力は、MSXなどでも行われているので、特に目新しいものではありません。

  原理ですが、音量をかなり速い周波数(サンプリング周波数)で上下させるものです。例えば、8KHz のサンプリング周波数のPCM出力をする場合には、8KHz の周期でAY-3-8910にアクセスします。

  CPU の動作周波数が4MHz なので、8KHz は余裕...ではないんですね、P6 の場合。

  バスリクエストというものがあって、CPU がお休みする時があるんですね。


5.バスリクエストの話

  バスリクエストとは、正確には『CPU が外部回路からアドレスバス/データバスを解放せよ』という要求(リクエスト)です。

  CPU は、外部回路からバスの解放要求(バスリクエスト)があると、割と即座にバスを解放します(バスアックノリッジを返します)。バスを解放している間は、CPU は動作を完全に停止しています。

  PC-6001/mk2/66 は、画面描画の際に、CRTコントローラからバスリクエストを受けて、バスを解放します。


画面出力2

  この時は、CPU がVRAMにデータを書き込んでいるだけで、バスはCPUがコントロールしています。


画面出力3

  この時に、CPU はバスをCRTコントローラに明け渡しています。CRTコントローラは、バスを使ってVRAM からデータを読み出します。

  CRTコントローラがバスを占有するタイミングは画面に描画する時で、モードで決まっています。

  mk2の画面モード(MODE=5)の場合は、SCREEN1〜4で同じで、以下のようなタイミングの時です。

バスリクエスト1


  画面描画は、一番上のline を左から右へ、次のline を左から右へ、・・・、一番下のline を左から右へ、と進みます。1本のline にかかる時間は、14MHz で912clk で、そのlineを262本出力して、1画面(1フレーム)となります。

  1フレーム出力する時間は、912 clk × (1 / 14.31818 MHz )× 262 = 16.668 ms です。1秒間に大体60フレーム出力します(垂直同期周波数が60Hzのため)。


バスリクエスト2

  上の図をちょっと描き直したものです。原点が違うだけで内容は同じです。図の大きさは数字の通りになっていないのですが、ぱっと見ても CPU 停止時間が多いのが分かると思います。

  さらに、CPU停止時間が一定周期で発生するため、そのCPU停止時間を避けてPSGにデータを送らないと、PCM 出力が出来ません。

  結局、横1ライン毎にPSGにデータを出力すると、PCM のサンプリングレートを一番高く出来ます。最高サンプリング周波数は、約15.7KHz です(でも、実際は15.7KHz は厳しい)。



  ちなみに、OUT &H93,2 というコマンドで、バスリクエストをオフに出来ます(戻すのは、OUT &H93,3)。

  ただし、バスリクエストをオフにした場合は、画面描画が砂嵐になるか、真っ黒になります(本当はいろいろとありますが省略)。

  前の画面データを保持する、とかだったら使い道があるんですが、画面の出力が実質止まってしまうため、動画再生の時には、バスリクエストをオフにする事はできません。

  結局、バスリクエストはそのままで、それを避けながら使うしかありません。


  続きます。

posted by えすび at 19:03| Comment(13) | HW:動画再生 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
> 普通(?)のパソコンの場合、画面周りのハードウエアはこんな感じになっていると思います(最近のはよく分かりません...)。

NECのパソコンは伝統的にこの仕組みになっていました。PC-80に始まりPC-98でも
この仕組みでした。まぁAT互換機や今日のPCも基本的にはそうですが(ハードウェア的には
違うものもありますが、CPUからは(VGAモードまでは)このようになっています)。
88SRやPC-98ではFSBを迂回するパスが追加されました。
対してMSXはVDPを介してしかVRAMにアクセスできません。

ところで、カートリッジスロットからはバスリクエストできないですね。
スロットからのバスリクエストはMSXで拡張されたのか
d4.princess.ne.jp/msx/datas/slot.html
という事で、

> 2)VRAM の出力を何らかの方法で、外部から入力できる(だませる)場合

の図は正しくないようです。正しくはバス経由ではなくVRAMに外部から直接データを
流し込む(期せずして相応しい用語ですな)矢印です。

でも結論としてはうまくいったんですよね?その辺が楽しみです。
それとも3)の手法ですか?


その後の世代のCRTC等では、デュアルポートRAM等で表示用のデータバスを直結する
手法がとられました(↑の『FSBを迂回するパス』のくだり)。いちいちバススチールでは
遅いのは目に見えていますから。

ではPC-88のスロットにはバスリクエストはあるのか?というと、DMAリクエストはあり
ますがバスリクエストはないんです。
www.maroon.dti.ne.jp/youkan/pc88/expslot.html
スロットからのバススチールはPC-98まで待つ事になったワケです。
zerokoubou.fam.cx/cbusslot.htm
Posted by かかっくん at 2013年06月10日 02:09
>>> 2)VRAM の出力を何らかの方法で、外部から入力できる(だませる)場合
>>
>>の図は正しくないようです。正しくはバス経由ではなくVRAMに外部から直接データを
>>流し込む(期せずして相応しい用語ですな)矢印です。

 この辺りは適当です。

 最初は、何らかの方法でCPUを止めて、データバスにデータを流し込む事を
考えていました。結局ダメでしたが。

 PC-6001mk2/PC-6601 の拡張コネクタは、CPUからの信号などが殆ど出力
されていますが、外部から入力できるのは、データバス、nEROM(ROMKILL)、の
2つしかありません。
 つまり、外部からは直接的にはほとんど制御できないんですね。


>>でも結論としてはうまくいったんですよね?その辺が楽しみです。
>>それとも3)の手法ですか?

  これは本文に書いている通りです。


> PC-6001mk2/PC-6601 は、回路図を見た限りでは、残念ながら3)の手法しか採れません。





Posted by えすび at 2013年06月10日 07:49
>  最初は、何らかの方法でCPUを止めて、データバスにデータを流し込む事を
> 考えていました。結局ダメでしたが。

これをするにはBUSDIRの他、アドレスバスや制御線等を双方向にする必要があります。
BUSDIRが出ていない(CRTCにしか接続されていない)以上、止めるのは難しいですね。

>  PC-6001mk2/PC-6601 の拡張コネクタは、CPUからの信号などが殆ど出力
> されていますが、外部から入力できるのは、データバス、nEROM(ROMKILL)、の
> 2つしかありません。
> つまり、外部からは直接的にはほとんど制御できないんですね。

当時はスロットの用途として、ROMカートリッジ・増設メモリやボイスシンセサイザなど、
メモリとバススレーブI/Oしか念頭になかったでしょうから仕方なかったのかも知れません。
MSXでは拡張を考慮してBUSDIR他を設けたのでしょう。

ところでmkIIで一部の定義が変わりましたが、外部DRAM用信号周りは残りましたが、
これは使えないんでしょうかねぇ?本体にRAMがないヶ所でのみ信号が出るならダメ
ですね。
でもmkII以降はRAM 64Kなので外部DRAM自体不要で信号が出ないような気も...


話は変わりますが、PC-98では用意されていたバスリクエスト信号ですが、ISAではどう
だったかというと、これがなかったりしてDMA用信号によりトリッキーな方法で実現して
います。機種により相性で動作しない場合もあります。EISAやMCAにはちゃんとあるよう
ですが。

PCIには共通で使えるDMAがなくバススレーブかバスマスタかしかないそうです。
アーキテクチャに依存しない汎用バスでは特定のDMAチップだけを対象にはできないので、
ある意味当然ではありますが。
Posted by かかっくん at 2013年06月11日 05:26
>>ところでmkIIで一部の定義が変わりましたが、外部DRAM用信号周りは残りましたが、
>>これは使えないんでしょうかねぇ?本体にRAMがないヶ所でのみ信号が出るならダメ
>>ですね。
>>でもmkII以降はRAM 64Kなので外部DRAM自体不要で信号が出ないような気も...


mk2以降は、外部に64KのRAMを接続できますので、信号はちゃんと出ます。当然、必要な時以外は出ませんので、今回の用途には結局使えませんが。
Posted by えすび at 2013年06月11日 06:55
> mk2以降は、外部に64KのRAMを接続できますので、信号はちゃんと出ます。当然、必要な時以外は出ませんので、今回の用途には結局使えませんが。

具体的にどの時でしょう?
でもVRAMアクセス時には内蔵RAMになるならダメですね。
調べてみるとN66SR-BASIC(モード6)でVRAMが増えるそうですが、他のモードではどう
なんでしょう?N60/66(モード1〜5)では使わないような...
Posted by かかっくん at 2013年06月12日 04:13
>>>> mk2以降は、外部に64KのRAMを接続できますので、信号はちゃんと出ます。当然、必要な時以外は出ませんので、今回の用途には結局使えませんが。
>>
>>具体的にどの時でしょう?

  mk2、66には、64K内蔵RAM 以外に、外付けカートリッジとして、64Kの外付けRAMの空間があります。
  外部DRAM用信号が残っているのは、この外付けカートリッジ用のRAMへのアクセスのためです。

  ただし、外付けRAM は、VRAMとしては機能しません。

  SRに関してはよく知りません。
Posted by えすび at 2013年06月12日 08:00
>  mk2、66には、64K内蔵RAM 以外に、外付けカートリッジとして、64Kの外付けRAMの空間があります。
>  外部DRAM用信号が残っているのは、この外付けカートリッジ用のRAMへのアクセスのためです。

なるほど。VRAM領域なども外部RAMにより主記憶として使えるんですね。でもVRAMの
増量には使えないと。
まぁどうであれVRAMにならないなら今回の用途にはNGですが、今後SRに応用する際には
使える余地がありそうですね。

以前からのモットー『本体の改造はなしの方向で』というのは『そこにあるP6を借りて』という
点で大事だと思います。(『そこにあるというシチュエーションはあり得ない』というのは却下)
自分は以前話に出た98Fとか改造しまくっているので説得力ないですが。
Posted by かかっくん at 2013年06月13日 20:50
用語が正確ではないかも知れませんが……

SRの場合内蔵メインRAMはCRTCに接続してあり、CPUからの
メインメモリアクセスも全てCRTCを通して行います。
で、CRTCがVRAMとして使えるのはCRTCに直結している
内蔵メインメモリのみで、外部カートリッジのRAMを
VRAMにすることはできません。

(mkII/66ではこれはどうなんでしたっけ。)
Posted by onda at 2013年06月15日 15:15
 mk2/66 では、内蔵メモリは CRTC からと MEMC経由でCPU からアクセスされます。
 外付けメモリというか拡張コネクタに出力されているRAM関連の信号は、MEMC経由のCPU からの信号のみが接続されており、CRTC からの信号は接続されていません。

Posted by えすび at 2013年06月15日 15:33
ところで、今まで質問しませんでしたが、P6のfHはPC-88/98の200ライン(15.98k)と違って
15.7kなんですね。
この辺は類似CRTC(6845)のAppleIIやCGAでも似たようなもの(どちらもモノクロ高解像度
モードでにじみが出る)ですが。
Posted by かかっくん at 2013年06月16日 01:49
> SRの場合内蔵メインRAMはCRTCに接続してあり、CPUからの
> メインメモリアクセスも全てCRTCを通して行います。
> で、CRTCがVRAMとして使えるのはCRTCに直結している
> 内蔵メインメモリのみで、外部カートリッジのRAMを
> VRAMにすることはできません。

やっぱりダメなんですね。という事は、VRAMが増量するカラクリは、PC-6006SRによる
RAMが主記憶になり、内蔵RAMがVRAMになるワケですね。結局外部RAMをVRAMにできる
のはP6だけと...

結局SRでも同じ方法をとらざるを得ず、SR-BASIC 320x150は容量が大きいのでフレーム
レートが低くなってしまいますね...思ったより大変だ...
VRAMが別空間のMSXよりはマシか。でもMSXでも動画は実現していた(EVA イーヴァ)し...
やってできない事はないでしょ。多分...

で、バスリクエストOFFのように、内蔵RAMへのアクセスをCPU優先にできますか?
できないならタイミングがかなりシビアになりますね。
Posted by かかっくん at 2013年06月16日 02:23
>>ところで、今まで質問しませんでしたが、P6のfHはPC-88/98の200ライン(15.98k)と違って
15.7kなんですね。

  そうです。

>>で、バスリクエストOFFのように、内蔵RAMへのアクセスをCPU優先にできますか?
>>できないならタイミングがかなりシビアになりますね。

  mk2/66 は、バスリクエストON/OFF しかありません。
  SR はよく分かりませんが、多分バスリクエストON/OFFしかありません。

  もし、CPU を優先に出来ても、画面が崩れるだけだと思います。
Posted by えすび at 2013年06月16日 08:56
SRは表示期間中でもmkII以前のようにCPU完全ストップではなく、
(おそらくCRTCがメモリにアクセスしている瞬間以外は)CPUも
動作できるようになっています。
I/Oポート98Hで設定する例のあれです。

これはN66SR-BASICではデフォルトONで、従来機の互換BASICでも
デフォルトはOFFですがONにできます。
市販のmkII用ゲームでもいくつか対応しているものがあって、
SRで動かすと高速動作します。

いろいろ応用できる事もありそうですが、自分のスキルでは
たどり着けない領域ですし、SRの話で長々とお邪魔するのも
なんなので、このへんにしておきます。
Posted by onda at 2013年06月16日 16:18
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。