[1chipMSX]

MSX turboR から追加された システムタイマー を付けてみる
MSX turboR の I/O E6h, E7h にはシステムタイマーと呼ばれるフリーランカウンタが
追加されています。

MSX2+ 以前は、タイマーと呼ばれるものは無く、1/60秒単位で入る垂直同期割り込み
でタイミングをとるのが一般的で、より高精度なタイミングを要求するアプリは、
走査線割り込みを頻繁に発生させてタイミングをとったりしていました。
しかし、数マイクロ秒だけ待ちたい場合などには、割り込みではタイミングを取れない
ので無駄命令で実行サイクルを消費したりするのが普通でした。
turboR では、R800 と Z80 の2種類の CPU が存在していて、同じコードは動くモノの
実行速度が異なっているために、そういったタイミングをとる必要がある場合に一方で
動くモノが他方では動かないようなことになりかねません。
それを解決するために、3.911マイクロ秒ごとにインクリメントするフリーランカウンタ
が追加されたようです。

カウンタは 16bit あって、下位 8bit が E6h, 上位 8bit が E7h に接続されています。
といっても、単純に読み出すだけだと 16bit として使うことは出来ません。なぜならば、
一方を読み出している間にも他方がインクリメントしてしまうからです。
たとえば、カウンタが 00FFh のときに下位を読み出すと FFh ですが、読み出してる間に
カウントが進んで 0100h になって、その状態で上位を読み出すと 01h なわけで、読み出した
上位と下位を繋げると 01FFh になってしまいます。
(ちょっと工夫すれば判別できますが、その辺の説明は省略 (^^; )

turboR の仕様を決めた人は、3.911マイクロ秒とは、何を基準に決めたのでしょうか。
真相の程は知りませんが、FM音源のアクセスウェイト時間が 3.911usec に近いことと、
上位カウンタが 3.911usec * 256 = 1001.216usec と 1msec に限りなく近いことから
CALL PAUSE(n) 命令のような使い方がやりやすいなんてことを狙ったのかもしれませんね。

とりあえず、1chipMSX は、21.47727MHz のクロックをベースクロックとしているので、
1clock辺り 1000000usec / 21477270Hz = 0.04656usec くらい。
3.911usec を得るためには、3.911usec / 0.04656 ≒ 84cycle
念のため、逆算すると 3.911112 usec
3.911usec という数値は、MSX turboR テクニカル・ハンドブックに記載されている数値ですが
実際は 3.911usecキッカリじゃなかったかもしれませんね。ということで、84分周でいきます。

回路としては次のモノが必要。

・84分周を数える分周器
  log2(84) = log(84)/log(2) = 6.39bit なので、7bit あれば十分。
・E6h/E7h に直結されるフリーランカウンタ
・CPUからの読み書きに対応するデコーダ


turboR のシステムタイマーは、リードオンリーのようです。
今回作成したシステムタイマーは、E6h, E7h のポートに書き込むことによって、カウント値を
変更できる点が異なります。

上に戻って最新ソースからダウンロードできます。

[▲上へ]