あなたCPUなんか創ってどうするのかしら?! 第1章 第5節

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

2019/4/14
技術書典6
池袋サンシャインシティ 文化会館ビル2F 展示ホールD「う11」

第1章 第5節 レジスタ間演算命令とレジスタ間転送命令

順序が逆のような印象を受けるかもしれませんが、筆者はTD4EX4の命令コードを決める際、ジャンプ命令のビットパターンを仮決定した上で、全体的な命令の構成を検討しました。

これは論理的な理由ではなくイメージの問題です。表1をご覧いただけば分かるように、ジャンプ命令がTD4と同じ位置にあればTD4を拡張したCPUだという印象を与えられるからです。

第1章 第5節 第1項 レジスタ間演算命令の可否

ジャンプ命令の次に考えたのはレジスタ間演算命令の必要性です。

本プロジェクトのVol.2である「ええっ?! CPU創ったの?! すっごーい!」では2個のアキュムレーターであるAレジスタとBレジスタとの間での加算を実現しました。元々TD4に存在していたレジスタ間転送命令と合わせると、TD4EX1では1桁の加算のみの電卓モドキを作成することができます。

しかしRAMを備えたTD4EX4の場合、レジスタ間演算命令の必要性はあまり高くありません。

例えば6809のようなレジスタの少ないCPUの場合、計算を行うデータの大半はRAMに格納されています。そのためRAMとアキュムレーターとの間の演算命令は必要ですが、アキュムレーター間の演算が必要になることは滅多にありません。そのため6809にはアキュムレーター間演算命令が存在しません。

筆者の経験では6809でアキュムレーター間演算命令をどうしても欲しいと思った状況は1度しかありませんでした。ややこしい計算を高速に実行したかったのですが、存在しない命令を欲しがっても無意味ですから泣く泣くあきらめてRAMとの演算に変更しました。速度が若干落ちてしまいましたが仕方ありません。

ともあれTD4EX4ではアキュムレーター間演算命令は無くても我慢できると判断し、不採用としました。

第1章 第5節 第2項 レジスタ間転送命令の可否

では次に、レジスタ間転送命令はどうでしょうか?

レジスタ間転送命令はTD4にも存在しますし、6809の場合でもそれなりに使用する機会がありました。従って可能であればTD4EX4でも採用したい命令です。

しかし筆者はこれも不採用としました。理由はレジスタ間演算命令を不採用にしたからです。

そもそも転送命令と演算命令は兄弟のようなもので、転送ができるのであれば演算も出来る方が好ましいのですし、演算ができるのなら転送は必須です。例えばZ80ではアキュムレーターとレジスタとの間での転送と演算の両方が可能ですが、これは6809と異なり非常に便利で、アキュムレーターが1個しか無いという弱点が気にならない程でした。

しかし6809のようなレジスタ間演算命令が無いCPUの場合、レジスタ間でのデータの転送はあまり必要になりません。演算も転送もRAMとアキュムレーターとの間で行えば良いからです。

そしてもう一つ大きな理由があります。それは命令デコーダーの簡素化です。

TD4の場合、以下の表のように、命令コードのbit4~bit5で演算データの入力元を、bit6~bit7で演算結果の出力先を指定するようになっていました。そのためレジスタ間転送命令を簡単に実装できているのですが、その一方でレジスタ間演算命令を実現できないという中途半端な方式になっています。

表2 TD4の命令の基本的な考え方
 演算データの入力元bit5~4
   00011011
演算結果の出力先 AレジスタBレジスタ入力ポートゼロ
bit7~600AレジスタADD A, ImMOV A, BIN AMOV A, Im
01BレジスタMOV B, AADD B, ImIN BMOV B, Im
10出力ポートOUT BOUT Im
11PCJNC ImJMP Im

しかしTD4EX4はTD4とは異なる命令コードを採用し、bit4だけでアキュムレーターを選択するようになっています。つまりbit4が0の場合は、演算データの入力元と演算結果の出力先の両方がAレジスタとなり、bit4が1の場合は両方がBレジスタとなります。

このようにするとデータの入力元と出力先を別々に指定できなくなり、レジスタ間転送命令を実現できなくなります。しかし命令デコーダーはデータの入力元と出力先を一括してデコードできるため、大幅に簡素化できます。筆者はこの簡素化によるメリットとレジスタ間転送命令が無いことによるデメリットを比較し、最終的にレジスタ間転送命令を不採用としました。