PIT 8254

KusaReMKN

PIT 8253/8254 は x86 で広く利用されているタイマ・カウンタ IC です。 8253 のカウントレートは 0 MHz から 5 MHz です。 8254 では Read-Back Command が追加され、カウントレートが 10 MHz 程度まで拡大されました。

AT 互換機には 8254 が 1 つ搭載されており、1.19318 MHz のクロックが与えられています。 PC-9801 には 8253 が 1 つ搭載されており、2.4576 MHz か 1.9968 MHz のクロックが与えられています。

8254 は内部に 16 bit なカウンタを 3 つ持っており、CLK (クロック)、GATE (ゲート)、OUT (出力) のピンがカウンタ毎にあります。 それぞれに外部からのクロックが与えられ (それでも大抵は同一のクロックですが)、それぞれが別のモードで駆動することができます。 カウントは原則としてデクレメントで行われ、カウント値が 0 になった瞬間に設定値が再ロードされます (値 0 が読み出されることはありません)。 カウンタモードにはバイナリカウントモードと BCD カウントモードがありますが、BCD カウントモードは省略されていることがあります。 8254 では、その瞬間のカウント値を読み取ることができますが、設定値そのものを読み取る方法はありません。

動作モード

8253 と 8254 の動作モードは次のとおりです:

モード動作
モード 0: カウント終了時に割り込み カウントが終了したら信号 High を出力する
モード 1: プログラマブルワンショット 指定した長さのワンショットパルス信号 Low を出力する
モード 2: レートジェネレータ 入力クロックを n 分周する
モード 3: 方形波レートジェネレータ 入力クロックを Duty 比 1:1 で n 分周する
モード 4: ソフトウェアトリガストローブ 指定したカウントが終了するとストローブパルスを出力する
モード 5: ハードウェアトリガストローブ 外部トリガ入力によりカウントを開始し、カウントが終了するとストローブパルスを出力する

I/O ポート

AT 互換機

I/O Addr. bit R/W 備考
0x0040 8 R/W カウンタ 0 (IRQ0 用)
DOS ではモード 2 でカウント 65536 が設定されている
0x0041 8 R/W カウンタ 1 (メモリリフレッシュ用)
メモリやチップセット等によるが、通常は モード 2 で 0x18 が指定されている
0x0042 8 R/W カウンタ 2 (BEEP 用)
通常はモード 3
0x0043 8 W コントロールレジスタ
0x0061 8 R システムポート
0x0061 8 W システムポート

0x0043:W コントロールレジスタの値

bit
0 カウントモード
0: バイナリ, 1: BCD
1–3 カウントモード (上の表を参照)
000, 001, x10, x11, 100, 101
4, 5 カウンタアクセスモード
11: 16 bit リードロード, 10: 上位 8 bit リードロード, 01: 下位 8 bit リードロード, 00: カウント値ラッチ
6, 7 カウントチャネル指定
00: カウンタ 0, 01: カウンタ 1, 10: カウンタ 2, 11: リードバックコマンド

0x0043 で 16 bit リードロードを指定した場合、0x0040–0x0042 には下位 8 bit、上位 8 bit の順に書き込みます。

0x0061:R システムポートの値

bit
0 カウンタ 2 の GATE ピンの状態
1 スピーカイネーブルピンの状態 (これとカウンタ 2 の出力の AND がスピーカに接続される)
2 Write したときの bit 2 の値
3 Write したときの bit 3 の値
4 メモリリフレッシュが行われるたびに値が反転
5 カウンタ 2 の出力ピンの状態
6 ISA の IOCHK 信号が assert されて NMI が発生すると 1
7 メモリパリティエラーが発生すると 1

0x0061:W システムポートの値

bit
0 カウンタ 2 の GATE ピンへの値
1 スピーカイネーブルピンへの値 (1 で ON)
2 1 にするとメモリパリティエラーを検出したときに NMI が発生
3 1 にすると ISA の IOCHK 信号で NMI が発生
4–7 予約 (0 を推奨)

PC-9801

IO アドレス bit R/W 備考
0x0071 8 R/W カウンタ 0 (IRQ0 用)
モード 3 で利用
0x0073 8 R/W カウンタ 1 (メモリリフレッシュ用もしくは BEEP 用)、モード 3 で利用
BEEP の音程が変わらないもの (元祖, E, F, M) はメモリリフレッシュ
VF, VM, XL 以降は BEEP
0x0075 8 R/W カウンタ 2 (BEEP 用)
モード 3 で利用
0x0077 8 W コントロールレジスタ
0x3FDF に書き込んでも同じ
0x3FDF 8 W コントロールレジスタ
0x0077 に書き込んても同じ
0x3FDB 8 R/W カウンタ 1 (BEEP 用)、モード 3 で利用
多くの機種のノーマルモードではこちら

参考文献