スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

NRTDRVX作成メモ

基本的な単位の確認。

250ns = 4MHz
60Hz = 1/60sec = 16666us = 16.666ms

4MHzはX1の基本周波数であり、あらゆるパーツに供給されています。
60Hzは16.66msです。NTSCでの垂直同期はほぼ1/60になります。

NRTDRVはボードまたは本体に付属する割り込み処理ができるカウンタICのZ80 CTCを利用しています。
CTC0からCTC3までの4つのチャンネルがあり、それぞれに定数が設定できます。
定数はカウンタにセットされ、ゼロになるまでカウントダウンし、トリガーを発生させます。
ゼロになった後は自動的に再度定数がカウンタにセットされます。

NRTDRVでは、
CTC0とCTC3をテンポ割り込みに利用しています。

CTC0
タイマーモード
プリスケーラ1/256
1カウント = 250ns * 256 = 64us

CTC3
カウンタモード
プリスケーラ1/1

CTC0のカウント0時のトリガー出力はCTC3に接続されています。
CTC3はトリガーに対してカウントダウンを行なうので、CTC3の割り込み発生は、
(CTC0定数) * 64us * (CTC3定数)となります。


また、CTC1をエフェクトなどで利用する固定されたタイマーとして利用しています。

CTC1
割り込み
タイマーモード
プリスケーラ 1/256

1カウント = 250ns * 256 = 64000ns = 64us

CTC1の定数は0であり、カウンタとしては256がセットされた扱いになるので、
256 * 64 = 16384usとなります。

NRTDRVXでは、MSXの垂直同期割り込みが60Hzであり、およそ16666usであることを利用して、
60Hzの割り込みごとに、16666usを加算、
そこから各割り込み要因が必要としていた秒数が満たされているかを計算し、
満たされていた分だけ呼び出しています。

例えばCTC1は16666us > 16384usであり、一回割り込みルーチンを呼び出し、
16666usから16384usを引きます。
282usという少しのズレは59回後(つまりは1秒後)には16638usになります。
そこで、割り込みルーチンを二回呼び出すことでズレを吸収します。

これでほかのドライバと同じ1/60秒の精度にはなるものの、
ドライバ本来のタイミングが保たれるようになります。
スポンサーサイト

コメント

非公開コメント

プロフィール

BouKiCHi

Author:BouKiCHi
ABOUT ME
MAIL:alf_byncyou at hotmail.com

WEB:http://clogging.web.fc2.com/
TWITTER:@bkc_alf

月別アーカイブ

FC2カウンター

ブロとも申請フォーム

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。