この世のCPUを食べ尽くすのだ! 第2章 第4節 第3項

~あんたCPUなんか創ってどうするのよ?! Vol.3~

2018/10/8
技術書典5 け39

第2章 第4節 第3項 テンキーとLEDをメモリマップドI/Oに割り当てる方法

表示用の7セグメントLEDを3個使うことにしましたので、普通に考えれば3個の出力ポートが必要になります。既にテンキー用に1個のアドレスをI/Oポートに割り当てる事にしましたので、合計で4個のアドレスをメモリマップドI/Oに割り当てることになります。という事はRAMに使えるアドレスは12語に減ってしまうことになります。

たった2桁の電卓とは言え、乗除算のための作業用エリアが必要であることを考えると、RAMが12語というのはいささか心許ないです。先にプログラムを設計して正確なメモリ量を算出すれば良いのですが、最終的な命令コードも確定していない現状では困難です。

そこで少しでもI/Oポートを減らすべく無い知恵を絞った結果、必要なI/Oポートを2個だけに減らすことができました。そしてこの2個をRAMアドレスのE番地とF番地に割り当てます。

E番地への出力
テンキーの列選択と、7セグメントLEDへの数値出力を兼ねます。
押されたボタンのチェックは負論理の方がプログラムを組みやすいので(理由は第4章で説明します)、このポートにEを出力した場合は右端の列(×÷)を選択し、7を出力した場合は左端の列(0147)を選択します。
7セグメントLEDへの表示の場合は、表示させたい数値をこのポートに出力した後、F番地に出力先のLED番号を出力します。
E番地からの入力
テンキーからの入力を行います。テンキーの各行が下から順番に各ビットに割り当てられています。つまり下端の0AC=+が最下位ビットに、上端の789÷が最上位ビットに対応します。負論理の方がプログラムを組みやすいため、各ビットはプルアップしてあり、通常は全ビットが1です。ボタンが押されると対応するビットが0になります。

図18 74HC138
図18 74HC138

F番地への出力
どのLEDに出力するかを指定します。
まずLEDに表示したい値をE番地に出力しておき、その上で出力したいLED番号をF番地に出力します。LED番号は0が最下位(右端)、1が2桁目(中央)、2が最上位(左端)です。
このポートには3ビットのデコードを行う74HC138を使っています。そのため最大8個のLEDを接続する事ができますが、TD4EX3ではせいぜい2桁までしか計算できませんので、これ以上LEDを増やす予定はありません。にもかかわらず74HC138を使う理由は、このICが多数のチップセレクト用の端子を持っていて、必要なIC数を削減できるからです。
F番地からの入力
未使用。読み込みを行うと結果は不定となります。