この世のCPUを食べ尽くすのだ! 第3章 第4節
~あんたCPUなんか創ってどうするのよ?! Vol.3~
2018/10/8
技術書典5 け39
第3章 第4節 テンキー入出力回路
テンキーはaitendoの基盤を使用していますが、これは単なるスイッチのマトリックスです。電子回路は全く搭載されていないので、キーの検出もデコードも全てTD4EX3が行います。
テンキーはメモリマップドI/OのE番地に割り当てられており、各ビットとボタンの対応は表3のようになっています。
テンキー I/Oポート |
E番地出力 | ||||
---|---|---|---|---|---|
7 | B | D | E | ||
E番地 入力 |
7 | 7 | 8 | 9 | ÷ |
B | 4 | 5 | 6 | × | |
D | 1 | 2 | 3 | – | |
E | 0 | AC | = | + |
例えば 1 キーが押されているかどうかを調べたい場合は、まずOUT命令でE番地に7という値を出力します。次にIN命令でE番地から入力を行い、Dという値が入力されたならば1キーが押されている事が分かるという仕組みです。
全キーのスキャンは以下の手順に従います。
- E番地にE、D、B、7のいずれかの値を出力します。
- E番地からの入力を行います。何もキーが押されていない場合はFが読み込まれますが、キーが押されるとE、D、B、7のいずれかの値が読み込まれます。
- 読み込んだ値に1を加算します。何もキーが押されていない場合(Fが読み込まれていた場合)はキャリーが発生するのでJNC命令で判別し、手順1に戻って次の列のスキャンを行います。
- 何かのキーが押されていた場合は、さらに1、2、4の順番で値を加算してJNC命令で分岐します。1を加算した時点でキャリーが発生した場合は 0、AC、=、+ のいずれかが押されており、次の2の加算でキャリー発生ならば 1、2、3、–、最後の4の加算でキャリー発生ならは 4、5、6、×、そしてキャリー無しならは 7、8、9、÷ となります。
これらの判別をすべてソフトウエアで行います。第4章にサンプルプログラムを掲載していますが、128バイトにも及ぶ長大なプログラムとなっています。
このように、TD4EX3のI/Oユニットでは僅か2個のICでキー入力を行うことができましたが、修正すべき点が幾つかあります。
- 複数のキーを同時押しすると壊れる
- 複数のキーの同時押しについては何も考えていなかったので、最悪の場合、出力回路の74HC161が壊れてしまいます。原理は「CPUの創りかた」の118ページにあるROMの場合と同じです。
- ダイオードを追加すれば解決できますので、いずれ修正する予定です。
- チャタリング防止回路が無い
- 「CPUの創りかた」でも懇切丁寧に説明していますが、スイッチと言うのはチャタリングと呼ばれるノイズを発生させます。従って本来はノイズ除去回路が必要なのですが、TD4EX3ではIC数削減のために無視しています。とりあえず問題なく動作しているので大丈夫でしょう。
- どうしてもノイズ除去が必要になったらソフトウエアで行う予定です。