あんたCPUなんか創ってどうするのよ?! Vol.1 第6章 第4節
~TD4とかいうCPUがあまりにも残念だったので拡張してみた~
2016/8/14
コミックマーケット C90 3日目 西g16b
第6章 第4節 インテル4004 のアプローチ
ではここで、偉大なる先人の知恵を借りましょう。
4004の命令コードはオペコードが4ビット、オペランドが4ビットとなっており、TD4と似ています。これはTD4が4004の真似をしている訳ではなく、4ビットCPU を設計すると概ね同じような仕様に落ち着くと言うことでしょう。
ところが4004の命令数は39個もあります。オペコードが4ビットしかないのに、一体どうやって39個もの命令を実現しているのでしょうか?
それは命令コード表を見れば分かります。
命令 | 1バイト目 | 2バイト目 | 説明 | |
---|---|---|---|---|
bit7~4 | bit3~0 | |||
NOP | 0000 | 0000 | 何もしない | |
JCN | 0001 | cccc | aaaaaaaa | 条件分岐 |
FIM | 0010 | rrr0 | dddddddd | 8ビット定数(イミディエイトデータ)読み込み |
SRC | 0010 | rrr1 | アドレス送信 | |
FIN | 0011 | rrr0 | テーブル参照 | |
JIN | 0011 | rrr1 | レジスタ間接ジャンプ | |
JUN | 0100 | aaaa | aaaaaaaa | 無条件ジャンプ |
JMS | 0101 | aaaa | aaaaaaaa | サブルーチンコール |
INC | 0110 | rrrr | インクリメント | |
ISZ | 0111 | rrrr | aaaaaaaa | インクリメント&分岐 |
ADD | 1000 | rrrr | 加算 | |
SUB | 1001 | rrrr | 減算 | |
LD | 1010 | rrrr | レジスタ⇒アキュムレータ転送 | |
XCH | 1011 | rrrr | レジスタ⇔アキュムレータ交換 | |
BBL | 1100 | rrrr | サブルーチンからのリターン | |
LDM | 1101 | Imm | イミディエイトデータ読込 | |
RAM命令群 | 1110 | ???? | RAMへの読み書き・加減算およびROMへの入出力 | |
ACC命令群 | 1111 | ???? | 各種演算 |
4004 の命令コードで特筆すべきことは、一部の命令のオペコードが8 ビット幅になっている事です。上の表のRAM 命令群とACC 命令群が該当します。また、オペコードが0010 の時と0011 の時は命令コードの最下位ビットによって別の命令として解釈されます。かなり複雑な命令体系だと言って良いでしょう。
それらの結果、4004 では39 個もの命令を実現しています。
この命令セットを嶋正利氏たちがどのようにして作り上げたのか、非常に興味があります。