ええっ⁈ CPU創ったの⁈ すっごーい! 第2章 第1節
~あんたCPUなんか創ってどうするのよ?! Vol.2~
2017/8/11
コミックマーケット C92 1日目 東7そ11b
第2章 第1節 アキュムレータBの接続を変更する
TD4でアキュムレータ間加算が出来ないのは、アキュムレータAとBの両方が加算ICである74HC283の同じ側の入力に接続されていることが原因です。アキュムレータAとBとで加算を行いたいならば74HC283の2つある入力の別々の側に接続する必要があります。
という訳で、TD4EX1のブロック図を以下のように決めます。
まずセレクタを変更します。TD4では74HC153という4択2ビットのセレクタを2個使用していますが、TD4EX1ではこれを74HC157という2択4ビットのセレクタに変更します。74HC157は1個で4ビットを一括して切り替えることが出来るので74HC153よりも使いやすいと思います。
74HC157は2個用意し、1つ目は従来の74HC153の代わりとしてアキュムレータAと入力ポートの切り替えに使用します。2個目は74HC283とROMとの間に接続し、さらにアキュムレータBを接続します。
このように接続すると以下の4通りの計算が可能になります。
セレクタ② | |||
---|---|---|---|
アキュムレータB | ROM | ||
セレクタ① | アキュムレータA | A+B | A+イミディエイトデータ |
入力ポート | B+入力ポート | 入力ポート+イミディエイトデータ |
まず、目的であるアキュムレータA+アキュムレータBが可能になります。この結果をアキュムレータAに格納すれば
ADD A, B
命令を実現でき、アキュムレータBに格納すれば
ADD B, A
命令を実現できます。
しかし良いことばかりではありません。アキュムレータBに注目してください。
表3のアキュムレータBをよく見ると、アキュムレータBの値そのままという計算がありません。必ずアキュムレータAまたは入力ポートと加算されてしまいます。つまり以下の命令を実現できません。
OUT B
MOV A, B
イミディエイトデータも同様です。イミディエイトデータも必ずアキュムレータAまたは入力ポートと加算されてしまいます。つまり以下の命令を実現できません。
MOV A, Im
MOV B, Im
OUT Im
JMP Im
JNC Im
もし、これらの命令が不要なのであれば表3のままで構わないのですが、残念ながらこれらは必須命令ですので、何らかの対策を施す必要があります。
幸いなことに74HC157には出力を強制的にゼロにする機能がありますので、それを利用します。
74HC153と74HC157にはST端子という入力(ストローブ入力)があり、これをHにすると出力が強制的にゼロになります。表3のセレクタ①のST端子をHにすると出力がゼロになり、アキュムレータBまたはイミディエイトデータの出力はそのまま74HC283の加算結果として出力されます。
表4にST端子を採用したセレクタ変更案を示します。
セレクタ② | |||
---|---|---|---|
アキュムレータB | ROM | ||
セレクタ① | アキュムレータA | A+B | A+イミディエイトデータ |
入力ポート | B+入力ポート | 入力ポート+イミディエイトデータ | |
なし(ゼロ出力) | B | イミディエイトデータ |
では、表4をもとにして詳細を検討します。表5をご覧ください。
セレクタ① | セレクタ② | 出力先 | 該当する命令 | 必要度 |
---|---|---|---|---|
A | B | A | ADD A, B | ◎ |
B | ADD B, A | ◎ | ||
出力ポート | OUT A+B | × | ||
PC | JMP A+B | × | ||
ROM | A | ADD A, Im | ◎ | |
B | MOV B, A (※) | ◎ | ||
出力ポート | OUT A (※) | ○ | ||
PC | JMP A (※) | △ | ||
入力ポート (IN) |
B | A | MOV A, B+IN | × |
B | ADD B, IN | × | ||
出力ポート | OUT B+IN | × | ||
PC | JMP B+IN | × | ||
ROM | A | IN A (※) | ◎ | |
B | IN B (※) | ◎ | ||
出力ポート | OUT IN+Im | × | ||
PC | JMP IN+Im | × | ||
ゼロ | B | A | MOV A, B | ◎ |
B | NOP | △ | ||
出力ポート | OUT B | ◎ | ||
PC | JMP B | △ | ||
ROM | A | MOV A, Im | ◎ | |
B | MOV B, Im | ◎ | ||
出力ポート | OUT Im | ◎ | ||
PC | JMP Im | ◎ |
表5は図2のブロック図で実行可能なTD4EX1の演算を全て列挙したものです。
右端の「必要度」が◎の演算はTD4EX1で実現すべき命令です。TD4に存在する命令のほとんどが含まれていますが、例外が1つ。以下の命令だけは実現できません。
ADD B, Im
これはTD4EX1の回路上どう逆立ちしても実現できません。なぜなら加算ICである74HC283の2つある入力の片側に、アキュムレータBとイミディエイトデータの両方が接続されているからです。
実際にドッグフードを食べてみないと断定はできませんが、この命令が無くなることによる影響は小さいだろうと筆者は考えています。なぜなら代替手段があるからです。例えばアキュムレータBではなくAを使う方法がありますし、以下のようにアキュムレータ間加算で代替する方法もあります。
MOV A, Im
ADD B, A
逆にTD4には存在しないけれどもTD4EX1では可能な命令もあります(「必要度」が○や△)。このうち以下の命令はあると便利だと思いますが、実際に採用するかどうかは今後の検討次第とします。
OUT A