ええっ⁈ CPU創ったの⁈ すっごーい! 第2章 第3節

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

2017/8/11
コミックマーケット C92 1日目 東7そ11b

第2章 第3節 命令コードの組み立て

表5をよく見ると、「必要度」が◎の命令のうち、セレクタ①がアキュムレータAもしくは入力ポート(IN)の時は、出力先としてアキュムレータAまたはBしか指定しないことに気づくでしょう。

ADD A, B
ADD B, A
ADD A, Im
MOV B, A
IN A
IN B

例外は「必要度」が○や△の命令だけです。

OUT A
JMP A

このような例外的な命令をデコードしようとすると必要となるICの数が増えてしまいます。そのため、これらの命令を省略し、出力先がアキュムレータとなる命令だけを実装するならば回路を簡略化できます。

表5から該当部分だけを取り出してみましょう。

表6 アキュムレータへの出力命令
(※)命令内のイミディエイトデータはゼロに設定します
セレクタ① セレクタ② 出力先 該当する命令 必要度
A B A ADD A, B
B ADD B, A
ROM A ADD A, Im
B MOV B, A (※)
入力ポート (IN) ROM A IN A (※)
B IN B (※)

 

これをそのままセレクタの入力信号に置き換えます。

セレクタ①には出力をゼロにするためのST端子と、入力の切り替え(アキュムレータAまたは入力ポート)のためのSELECT端子がありますが、出力はゼロにしないのでST端子は0、SELECT端子はアキュムレータAを0に割り当て、入力ポートを1に割り当てます。

セレクタ②はSELECT端子のみです。出力先はアキュムレータAを0に割り当て、Bを1に割り当ててみましょう。すると表7のように命令コードの半分が出来上がります。

表7 命令コード表(演算関係)
(※)命令内のイミディエイトデータはゼロに設定します
セレクタ① セレクタ② 出力先 該当する命令 必要度
ST SELECT SELECT
0 0 0 0 ADD A, B
1 ADD B, A
1 0 ADD A, Im
1 MOV B, A (※)
1 1 0 IN A (※)
1 IN B (※)

 

厄介なのは残り半分の命令です。表5から該当部分を取り出すと以下のようになります。

表8 セレクタ①の出力がゼロの場合
セレクタ① セレクタ② 出力先 該当する命令 必要度
ゼロ B A MOV A, B
出力ポート OUT B
ROM A MOV A, Im
B MOV B, Im
出力ポート OUT Im
PC JMP Im

 

セレクタ①の出力がゼロの場合、出力先はアキュムレータAとB、出力ポート、そしてPCの4通りとなります。そのため出力の選択に2ビットが必要となってしまいます。

そこで、セレクタ①のSELECT端子を出力先の選択に流用します。

セレクタ①のST端子を1にすると出力先はゼロになりますが、この時SELECT端子は0と1どちらでも構いません。そのため出力先の選択に流用しても問題ありません。

以上から命令コード表を作ると以下のようになります。

表9 命令コード表(イミディエイトデータ、出力命令、ジャンプ命令など)
セレクタ① セレクタ② 出力先 該当する命令 必要度
ST SELECT SELECT
1 0 0 0 MOV A, B
1 0 MOV A, Im
1 MOV B, Im
1 0 0 OUT B
1 0 OUT Im
1 JMP Im

 

これで出来上がり……ではありません。重要な命令が抜けています。

条件ジャンプ命令です。

JNC Im

条件ジャンプ命令はジャンプ命令と全く同じ動作をします。違う点はただ一つ、キャリーが1の場合にはPCへの書き込みを行わない事だけです。そのため命令コードもジャンプ命令とできる限り同じにしておくと命令実現に必要な回路が少なくて済みます。

TD4の場合はジャンプ命令の命令コードは1111で、条件ジャンプ命令は1110でした。しかしTD4EX1では表9にある通り1110はOUT命令に割り当ててしまいました。

ここでOUT命令を削除できれば話は簡単なのですが、これはTD4に存在する命令ですし、あると便利な命令ですから残すべきです。

となると選択肢は事実上無く、ジャンプ命令の命令コードである1111近い位置となると1101しかありません。この命令コードならばセレクタ①の変更は不要ですし、出力先をPCにするための特別な回路も必要ありません。セレクタ②への例外処理だけは必要になってしまいますが、これによって命令デコーダーがどの程度複雑化するかはこの先の検討次第です。

表10に完成した命令コード表を示します。

表10 完成したTD4EX1の命令コード表
(※) 命令内のイミディエイトデータはゼロに設定します
(★) 例外処理。実際のセレクタ②のSELECT端子には1にします。
セレクタ① セレクタ② 出力先 該当する命令 必要度
ST SELECT SELECT
0 0 0 0 ADD A, B
1 ADD B, A
1 0 ADD A, Im
1 MOV B, A (※)
1 1 0 IN A (※)
1 IN B (※)
1 0 0 0 MOV A, B
1 0 MOV A, Im
1 MOV B, Im
1 0 0 OUT B
0(★) 1 JNC Im
1 0 OUT Im
1 JMP Im

 

予定通りではありますがTD4とは全く違う命令コードになりました。

例外処理となる条件ジャンプ命令の1101が痛々しいですが、とにかく先に進みましょう。