本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。

FIM命令

FIM命令は、命令の後半の8ビットのデータをレジスタペアに格納する命令である。この8ビットのデータのOPR側、OPA側とレジスタペアの偶数、奇数側の対応はデータシートには明確に書かれておらず不明であるので、ここではOPR側のデータが偶数、OPA側のデータが奇数側に対応すると想定して話を進める。

SRC命令

4004 CPUは4ビットの双方向バス一本しか持っておらず、現在のプロセサのようにアドレスバスでアドレス情報を送ってデータバスでRAMからデータを読むという動作は出来ない。このため、予めアドレスをRAMチップに送って置き、後述のReadやWrite命令によりそのアドレスに対して読出しや書き込みを行うという方式を取っている。

このアドレスをセットするのがSRC命令である。RRRで指定されるレジスタペアからX2、X3サイクルにアドレスをデータバスに送り出し、RAMチップはこれを受け取ってチップ内のアドレスレジスタに格納する。

X2サイクルに送る4ビットは、上位2ビットがチップ番号、下位2ビットがチップ内の4個の80ビットのデータの選択に用いられ、X3サイクルで送られる4ビットは選択された80ビットデータの16個のMM文字の中の1文字(4ビット)を選択する。

データシートには明示的に書かれていないが、X2サイクルに送られる4ビットはROMチップに格納され、ROMの入出力ポートをアクセスするWRR、RDR命令に対するROMチップ番号の指定になると考えられる。

FIN命令

RRRで指定されたレジスタペアに格納されたアドレスでROMをアクセスし、その内容を読み出してアキュムレータに格納する命令である。レジスタペアで指定できるアドレスは8ビットであり、FIN命令が格納されているROMチップ内の指定アドレスの内容が読み込まれる。FIN命令はROMに格納したテーブルなどの固定値のデータを参照するのに用いることが出来る。

JIN命令

RRRで指定されるレジスタペアの内容の番地に無条件にジャンプする命令である。FIN命令同様に、レジスタペアでは8ビット分のアドレスしか指定できないので、実行するJIN命令と同一のROMチップ内の命令だけにジャンプが可能である。なお、FIN命令とJIN命令のOPRは同じであり、この二つの命令を区別するのはRRR0かRRR1かと言うOPAの最下位の1ビットである。従って、命令をデコードするにはOPRの内容に加えてOPAの最下位ビットを加えて5ビットをデコードする必要がある。

JUN命令

JUN命令は16ビット長の無条件分岐命令であり、最初のOPAの4ビットと後半の8ビットと合わせて12ビットの分岐先アドレスを指定することが出来るので、最大16個のROMの計4096バイトの任意の番地に分岐することができる。

JMS命令

JMS命令はJUN命令と似ており、12ビットのアドレスを指定することが出来るので4096命令のROMの任意の場所に分岐できるが、JMS命令はJUN命令とは異なり、分岐前の次の命令アドレスをスタックにプッシュする。これにより、後述のBBL命令によりJMS命令の次の命令に戻ることが出来る。つまり、JMS命令とBBL命令を対にして用いることによりサブルーチンコール(C言語では関数コール)を実現することが出来る。

INC命令

RRRRで指定したレジスタの内容を+1する命令である。

ISZ命令

ISZ命令は16ビット命令であり、RRRRでレジスタを指定し、次の8ビットで同一ROMチップ内の分岐先アドレスを指定する。命令の動作としては、RRRRで指定するレジスタの内容を+1し、結果がゼロでない場合は分岐先アドレスにジャンプし、結果がゼロになると次のアドレスの命令に行く。レジスタにループ回数の値を負にした値を入れ、分岐アドレスをループの開始アドレスとすることによりDOループのような指定回数まわるループを作ることが出来る。但し、レジスタは4ビットしかなく最大16回のループしか出来ないので、より長いループの場合は二重以上のループにする必要がある。

ADD/SUB/LD命令

RRRRで指定したレジスタの内容を、アキュムレータに加算(ADD命令)、アキュムレータから減算(SUB命令)、そのままアキュムレータに格納(LD命令)する命令である。

XCH命令

RRRRで指定したレジスタとアキュムレータの内容を交換する命令である。4004のアーキテクチャでは、RAM/ROMから読み出したデータやALUでの演算結果は全てアキュムレータに格納される。このデータを別のレジスタに退避したり、復元したりするのがXCH命令である。

BBL命令

BBL命令はDDDDの4ビット値をアキュムレータに格納し、スタックをポップしてStack1に格納されていた番地の命令にジャンプする命令である。Stack1の内容は、前回、JMS命令でサブルーチンを呼び出した時の戻り番地である。サブルーチンから戻るときに、固定値では無く、レジスタを指定してサブルーチンの実行結果をアキュムレータに格納して戻せる仕様の方が良いと思うが、4004の命令仕様では命令のOPA部に書いた固定した値が戻るようになっている。