昨日アップした画面描画期間の検出プログラムは、やはり間違っていたようです。
改定版をアップします。
vsync2_2.zip
拡張RAMが必要で、ページ4です。
前と同じですが、画面切り換えを使っている関係で、mk2、66では動作しません。
方法ですが、基本は同じです。
・画面描画期間の検出の方法(基本)
画面描画期間の時だけ止まっているCPU で、その止まっている期間を検出するためには、CPU の外部に基準の時計が必要になります。
SUB-CPU がつながっている8255 のポートを使用します。
特定ポートにデータを書き込むと、4MHz で60〜80クロックぐらいかかる処理があります。
これを使い、画面描画期間を判定します。
データ書き込み
↓
4MHz で50クロックぐらい待つ
↓
処理が完了しているかを判断する
画面描画期間以外:処理が完了しない。
画面描画期間:CPU が途中で止まっているため、実際には50クロック以上の時間が経っており、処理が完了する。
で判断します。
・画面描画期間の検出の方法
上記の基本の検出を4度行います。その際、一定期間(具体的には155クロック)空けます。
こうすると、画面描画をしている時は、4度の検出のどこかで検出できるようになります。
ただし、検出には大体8走査線分(描画期間中)、3走査線分(描画期間中)の時間がかかります。
初代P6では、1走査線は 910クロック@14M(253クロック@4M)分の時間で、CPU が動作できる期間はその内の、296クロック@14M(83クロック@4M)ぐらいです。
また、mk2、66では、1走査線は 912クロック@14M(255クロック@4M)分の時間で、CPU が動作できる期間はその内の、304クロック@14M(85クロック@4M)です。
この走査線とCPUが動作できる/動作できない期間はほぼ一定間隔なので、検出期間をいい感じにすると、4度の検出の間のどこかで引っ掛けることが出来ます。
vsyncdet.xls
↑が説明の図です。
ピンクの長方形が、検出方法の基本で書いている、サブCPU の処理完了待ちです。ピンクの最後で処理が完了しているかどうかを判断します。
ピンクの最後が水色になっているのは、そのタイミングで画面描画期間(CPUが止まった期間)を検出できることを示します。
サブCPUにアクセスする間隔をもっと短くすればよさそうなんですが、短くすると応答の時間が極端に長くなったり短くなったりと、変になります。
なので、実測から今の155クロック間隔にしています。
サンプルプログラムでは描画期間判断ルーチンを2度呼んでいますが、これは
1)描画期間が開始されるまで待つ。その後に
2)描画期間が終了するまで待つ。
として、描画期間が終了した直後を探しています。
2)描画期間が終了するまで待つ。だけでよさそうなんですが、これだと描画期間直後ではなく、中間の時も検出される場合があるからです。
マウスのプログラムを作った時にハマりました(^^;
ちなみに、PC-6001F の方でも、サブCPU からの応答値を合わせましたので、同じように動作すると思います。
2012年12月02日
この記事へのコメント
コメントを書く

