PC-98における垂直同期信号タイミング調査

テキスト画面をフル活用するプログラムにおいて、実機とNeko Project 21/Wの結果が異なることが分かり、調査の結果として垂直同期信号の扱いに差があることが判明しました。

文献には垂直同期に関わる各区間(垂直フロントポーチVFP, 垂直バックポーチVBP, 垂直同期VSync, 垂直周期Vなど)の時間が明記されていますが、以下のことについて明記している文献は発見できませんでした。

そこで、これらが実際にどうであるかを検証するプログラムを作成し結果を募集したところ、多くの方にご協力をいただけたため、お礼の気持ちとしてここにその結果をまとめたいと思います。

信号定義

非常に大雑把ですが、本資料では以下のように定義します。

検証方法

オシロスコープで信号線を覗いたとしても、フラグがいつ立って割り込みがいつ出ていてるかを見るのは手間ですし、実施ハードルも高いです。 そこで、ソフトウェア的にVSYNC区間を調査するプログラム(VSIRRCHK.COM)を作成し、配布して検証してもらうことにしました。

測定はシンプルで、CPUを割り込み禁止にするとVSYNC割り込み要求時にPICのIRRビットが立つことを利用します。 つまり、GDC VSYNCビットとPICのIRRビットをループで観測し続ければ、ループ1回分の精度でGDC VSYNCビットと割り込み発生のタイミング差を測定できます。 ただし、ループ回数なので実時間としていくつなのかは分かりません。

具体的には以下の手順で測定を行います。

  1. GDC VSYNCビットが1→0になるのを待機し、その直後から測定を開始します。
  2. 以下の状況が発生したときのループカウンタ値を記録します。
  3. 記録した各タイミングのループカウンタ値を表示します。

ここで測定されるのは、垂直周期Vのループカウント数、GDC VSYNCビットがON/OFFになったときのループカウント数、VSYNC割り込みが発生したときのループカウント数の3つです。 絶対的な時間は分かりませんが、垂直周期Vに対してGDC VSYNCビットがONの期間が占める割合を求めれば、文献値との比較によってどの範囲でビットが立っている可能性が高いかを特定できます。 また、GDC VSYNCビットのカウントとVSYNC割り込みのカウントは同じ基準なので、割り込み発生タイミングもある程度特定できます。

VSIRRCHK.COMは1カウントくらいの読み取り誤差があるので、Resultメッセージは参考程度です。 大事なのは、IRR IRQ2とVSYNC HIGH/LOWの16進カウンタ値です。 IRR IRQ2のカウンタ値がVSYNC HIGHとほぼ同じなら割り込みはHigh遷移の位置、VSYNC LOWとほぼ同じ値ならLow遷移の位置です。

検証結果

以下の表は、報告を受けた各機種において、生のループカウント値(CPU性能依存)と、そこから換算したGDC VSYNC High区間を除く割合(Ratio)、および割込位置の判定(High=GDC VSYNC High遷移で割り込み, Low=GDC VSYNC Low遷移で割り込み)を記録したものです。

文献値は文献に記載されている実際の時間を用いて計算したものです。

文献値(24k)Xa10/CXa10/K 24knp21/w(旧)np21/w(新)BX無印BX2Cr13Xc13 24kVM21UX21RX2586MV 24kCe2 24kVX2 286VX2 V30 8MHzVX2 V30 10MHzVM 8MHzVM 10MHz文献値(15k)VX2 286 15kVX2 V30 8MHz 15kVX2 V30 10MHz 15kXa10/K 31.5kXc13 31.5k586MV 31.5kCe2 31k
VSync IRQ?87027725243714055367749638872882552512831528748149641086525648525648?9844765886284717860544052
VSync High17.48544772524371405536774963887388265251283152874824964108652564852564815.839844765886284717960544052
VSync Low17.728702786826781430437395045904089875331305155376205046110353365953365916.3310114896046312721160814068
Ratio0.9820.9820.9820.9100.9830.9830.9840.9820.9820.9850.9830.9840.9820.9840.9850.9850.9830.9850.9830.9690.9730.9730.9740.9960.9960.9960.996
割込位置?LowHighHighHighHighHighHighHighHighHighHighHighHighHighHighHighHighHigh?HighHighHighHighHighHighHigh
元データ

考察とまとめ

上記調査結果により、以下のことはほぼ確実だと思われます。

15k, 24kは文献通り、31.5kは文献を持っていませんが、31.5k同士の結果は整合しています。 例外の1件の原因はよく分かりません。24k, 31.5kで計り直しても一貫してLowでした。 何か故障しているのかもしれません。が、回路の故障にしては不自然すぎる気がします。
(追加情報)一方がXa10/Cで、もう一方がXa10/Kという差がありました。

他の機種での結果が得られましたら今後も追記していきます。

資料集に戻る

トップに戻る