CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

タイマ換装

インターバルタイマはi8253を使っていますが、改良版のi8254を入手しました。同じCERDIPですが足の生え方がちょっと違います
 
イメージ 1
i8254の改良点はi8253にリードバックコマンドを追加してOUTピンの状態やモード設定レジスタ読み出しをできるようにしたことです。
割とすぐ思いつくことだし、レジスタを1個追加するだけで出来てしまうのにわざわざ型番を+1したというのはi8253の設計がFIX、量産が始まってから、あっ!やっちまった・・なんて状況があったんでしょうか。型番はi8253Aでもいいような気がしますが。
 
さてリードバックコマンド実行後に読み出せるステータスレジスタはこのようなフォーマットです
 
イメージ 2
D5~D0は初期化時に設定したモードを示すだけなのであまり意味がありません。
最上位ビットD7にはOUTピンの状態が反映されます。
 
8254のリードバック機能を確かめるためこんなプログラムを動作させてみました
リードバックコマンド0xCEで全てのカウンタのステータスをラッチさせた直後はステータスレジスタが読み取れるはずです
 
イメージ 3

今まで通りのi8253を実装した状態ではリードバックコマンドは無視されるのでその後のレジスタ読み取りは、カウント値のものなので読むたびに違う値が返ってきてしまいます
 
イメージ 4

i8254に差し替えてから同じプログラムを実行させるとこうなります
全てのカウンタは初期化時にモード3にプログラムしているので下位6ビットは常に0x36が返り、最上位ビットが1(0xB6)になったり0(0x36)になっていてちゃんとOUTピンの状態が見えているようです
 
イメージ 5

まぁタイマをワンショットモードにしてポーリングでタイムアウトを待つような使い方にはいいですが
このボードのように周期モードでボーレートジェネレータやインターバル割込みで使う場合はあまり関係ありません