1.前提条件
・本体の改造はしない。
・画像、音声は、P6側から出力する。
・外付けのハードウエアは、とりあえずどんな物でも可能とする。
この条件がないと、本当に何でもアリになってしまいますので。
後、前提条件ではないんですが、
・ターゲットは、PC-6001mk2/PC-6601 にする。
初代機ではグラフィック能力が貧弱すぎる。
SR は、実は中身をよく知らない。
という理由です。
2.何が難しいのか?
PC-6001mk2 を触った事がある人なら、体感的にすごく遅いマシンである事がわかります。『中の人がサボってるんじゃないか』という意見がありましたが、実際にサボってます(描画期間)。
実は一番難しいのは、ごまかしが効く画像表示よりも、ごまかしが効かない音声出力(PCM音声出力)です。PCM音声出力は、タイミングを計って出力する必要があるため、結構シビアです。
3.画面描画の概要
普通(?)のパソコンの場合、画面周りのハードウエアはこんな感じになっていると思います(最近のはよく分かりません...)。
実際に描画する際には、CPU→VRAMにデータを書き込み、
VRAMのデータをCRTコントローラが読み出して、画面に出力します。
外部から指示して、パソコンに画面描画をさせる場合、以下の3つのようなやり方が考えられます。
1)CRTコントローラが、外部にアクセスできるモードを持っている場合
2)VRAM の出力を何らかの方法で、外部から入力できる(だませる)場合
3)愚直にCPUからVRAMにデータを書き込む場合(工夫なし)
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コントローラからバスリクエストを受けて、バスを解放します。
この時は、CPU がVRAMにデータを書き込んでいるだけで、バスはCPUがコントロールしています。
この時に、CPU はバスをCRTコントローラに明け渡しています。CRTコントローラは、バスを使ってVRAM からデータを読み出します。
CRTコントローラがバスを占有するタイミングは画面に描画する時で、モードで決まっています。
mk2の画面モード(MODE=5)の場合は、SCREEN1〜4で同じで、以下のようなタイミングの時です。
画面描画は、一番上の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のため)。
上の図をちょっと描き直したものです。原点が違うだけで内容は同じです。図の大きさは数字の通りになっていないのですが、ぱっと見ても CPU 停止時間が多いのが分かると思います。
さらに、CPU停止時間が一定周期で発生するため、そのCPU停止時間を避けてPSGにデータを送らないと、PCM 出力が出来ません。
結局、横1ライン毎にPSGにデータを出力すると、PCM のサンプリングレートを一番高く出来ます。最高サンプリング周波数は、約15.7KHz です(でも、実際は15.7KHz は厳しい)。
ちなみに、OUT &H93,2 というコマンドで、バスリクエストをオフに出来ます(戻すのは、OUT &H93,3)。
ただし、バスリクエストをオフにした場合は、画面描画が砂嵐になるか、真っ黒になります(本当はいろいろとありますが省略)。
前の画面データを保持する、とかだったら使い道があるんですが、画面の出力が実質止まってしまうため、動画再生の時には、バスリクエストをオフにする事はできません。
結局、バスリクエストはそのままで、それを避けながら使うしかありません。
続きます。


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
>>
>>の図は正しくないようです。正しくはバス経由ではなくVRAMに外部から直接データを
>>流し込む(期せずして相応しい用語ですな)矢印です。
この辺りは適当です。
最初は、何らかの方法でCPUを止めて、データバスにデータを流し込む事を
考えていました。結局ダメでしたが。
PC-6001mk2/PC-6601 の拡張コネクタは、CPUからの信号などが殆ど出力
されていますが、外部から入力できるのは、データバス、nEROM(ROMKILL)、の
2つしかありません。
つまり、外部からは直接的にはほとんど制御できないんですね。
>>でも結論としてはうまくいったんですよね?その辺が楽しみです。
>>それとも3)の手法ですか?
これは本文に書いている通りです。
> PC-6001mk2/PC-6601 は、回路図を見た限りでは、残念ながら3)の手法しか採れません。
> 考えていました。結局ダメでしたが。
これをするには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チップだけを対象にはできないので、
ある意味当然ではありますが。
>>これは使えないんでしょうかねぇ?本体にRAMがないヶ所でのみ信号が出るならダメ
>>ですね。
>>でもmkII以降はRAM 64Kなので外部DRAM自体不要で信号が出ないような気も...
mk2以降は、外部に64KのRAMを接続できますので、信号はちゃんと出ます。当然、必要な時以外は出ませんので、今回の用途には結局使えませんが。
具体的にどの時でしょう?
でもVRAMアクセス時には内蔵RAMになるならダメですね。
調べてみるとN66SR-BASIC(モード6)でVRAMが増えるそうですが、他のモードではどう
なんでしょう?N60/66(モード1〜5)では使わないような...
>>
>>具体的にどの時でしょう?
mk2、66には、64K内蔵RAM 以外に、外付けカートリッジとして、64Kの外付けRAMの空間があります。
外部DRAM用信号が残っているのは、この外付けカートリッジ用のRAMへのアクセスのためです。
ただし、外付けRAM は、VRAMとしては機能しません。
SRに関してはよく知りません。
> 外部DRAM用信号が残っているのは、この外付けカートリッジ用のRAMへのアクセスのためです。
なるほど。VRAM領域なども外部RAMにより主記憶として使えるんですね。でもVRAMの
増量には使えないと。
まぁどうであれVRAMにならないなら今回の用途にはNGですが、今後SRに応用する際には
使える余地がありそうですね。
以前からのモットー『本体の改造はなしの方向で』というのは『そこにあるP6を借りて』という
点で大事だと思います。(『そこにあるというシチュエーションはあり得ない』というのは却下)
自分は以前話に出た98Fとか改造しまくっているので説得力ないですが。
SRの場合内蔵メインRAMはCRTCに接続してあり、CPUからの
メインメモリアクセスも全てCRTCを通して行います。
で、CRTCがVRAMとして使えるのはCRTCに直結している
内蔵メインメモリのみで、外部カートリッジのRAMを
VRAMにすることはできません。
(mkII/66ではこれはどうなんでしたっけ。)
外付けメモリというか拡張コネクタに出力されているRAM関連の信号は、MEMC経由のCPU からの信号のみが接続されており、CRTC からの信号は接続されていません。
15.7kなんですね。
この辺は類似CRTC(6845)のAppleIIやCGAでも似たようなもの(どちらもモノクロ高解像度
モードでにじみが出る)ですが。
> メインメモリアクセスも全て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優先にできますか?
できないならタイミングがかなりシビアになりますね。
15.7kなんですね。
そうです。
>>で、バスリクエストOFFのように、内蔵RAMへのアクセスをCPU優先にできますか?
>>できないならタイミングがかなりシビアになりますね。
mk2/66 は、バスリクエストON/OFF しかありません。
SR はよく分かりませんが、多分バスリクエストON/OFFしかありません。
もし、CPU を優先に出来ても、画面が崩れるだけだと思います。
(おそらくCRTCがメモリにアクセスしている瞬間以外は)CPUも
動作できるようになっています。
I/Oポート98Hで設定する例のあれです。
これはN66SR-BASICではデフォルトONで、従来機の互換BASICでも
デフォルトはOFFですがONにできます。
市販のmkII用ゲームでもいくつか対応しているものがあって、
SRで動かすと高速動作します。
いろいろ応用できる事もありそうですが、自分のスキルでは
たどり着けない領域ですし、SRの話で長々とお邪魔するのも
なんなので、このへんにしておきます。