ええっ⁈ 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から該当部分だけを取り出してみましょう。
セレクタ① | セレクタ② | 出力先 | 該当する命令 | 必要度 |
---|---|---|---|---|
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のように命令コードの半分が出来上がります。
セレクタ① | セレクタ② | 出力先 | 該当する命令 | 必要度 | |
---|---|---|---|---|---|
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から該当部分を取り出すと以下のようになります。
セレクタ① | セレクタ② | 出力先 | 該当する命令 | 必要度 |
---|---|---|---|---|
ゼロ | 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どちらでも構いません。そのため出力先の選択に流用しても問題ありません。
以上から命令コード表を作ると以下のようになります。
セレクタ① | セレクタ② | 出力先 | 該当する命令 | 必要度 | |
---|---|---|---|---|---|
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に完成した命令コード表を示します。
セレクタ① | セレクタ② | 出力先 | 該当する命令 | 必要度 | |
---|---|---|---|---|---|
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が痛々しいですが、とにかく先に進みましょう。