本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。
一方、RAMに格納されたデータをメモリアドレスとして使用するためには、メモリからアキュムレータにロードされた値を4ビット単位でIXレジスタに格納する命令が必要である。また、この逆にIXレジスタの値を4ビットずつアキュムレータに転送する命令があると、IXレジスタを4004のインデックスレジスタと同様に使用することが出来て便利である。ということで、MJアーキテクチャに次の命令を追加する。
LDIX命令
IXレジスタの内容をアキュムレータにロードする。IXレジスタの数が4個であるのでIX指定は2ビットで済み、IXhigh(hml=2)、IXmid(hml=1)、IXlow(hml=0)の指定を含めて4ビットで選択可能である。
ADIX命令
キャリー込みで、IXレジスタの内容をアキュムレータに加算する。hmlでIXhigh、IXmid、IXlowを指定する。
STIX命令
アキュムレータの内容をIXレジスタに格納する。hmlでIXhigh、IXmid、IXlowを指定する。
以上の8種の命令と、アキュムレータやキャリーの操作を行うACC命令群があれば、最低限のメモリアクセスと加減算が可能である。
また、次々とメモリアドレスを増減させて連続したメモリをアクセスしたり、ループのカウントを行ったりするために、INC命令を設ける。
INC命令
指定したIXレジスタの内容を+1する。
4004では4ビットのインデックスレジスタのインクレメントしか出来ないので、最大16回のループしか作れないが、MJアーキテクチャでは一つのINC命令で、12ビット、4096回までのループが作れる。例えば10回のループの場合は、FIM命令でDに-10(11110110)を指定し、符号拡張でIXレジスタに格納することにより、12ビットで表現された -10がIXレジスタに格納される。そして、ループの終わりのINC命令で+1し、後述のJCN命令でIXCYレジスタに入ったキャリーを判定すれば良い。
しかし、ループを作るためには元に戻るためのジャンプ命令が必要である。ということで、MJアーキテクチャに分岐命令、条件分岐命令、サブルーチンコールとリターンのためのジャンプ命令を次のように定義する。
JUN命令
無条件ジャンプ命令。分岐先の命令ROMの12ビットアドレスを指定する。
JCN命令
条件ジャンプ命令。条件Condが成立した場合、Amid、Alowで指定したアドレスへジャンプする。Highアドレスは4004と同様、PChighが使用される。
分岐条件にはIXレジスタのINC命令でキャリーが立ったことを示すIXCY==1を加え、以下のように定義する。
Cond (C2-C4、C1==0)以下の条件が成立した場合にジャンプ
000: CY==1
001: IXCY==1
010: ACC==0
011: GT (ACC!=0, CY==0)
100: LT (ACC!=0, CY==1)
101: TEST==1
C1==1: 条件が不成立の場合に、ジャンプ
000~101の条件はC1==0の場合と同じ
JMS命令
サブルーチンコール命令。次の命令のアドレスをIX0に格納し、Ahigh、Amid、Alowで指定される12ビットのROMアドレスに分岐する。
JIN命令
IXレジスタに格納されたアドレスにジャンプする。IX0レジスタを指定すれば、サブルーチンからのリターンにも使える。
但し、命令語には2ビットしか余裕が無いので、4004のようにアキュムレータに格納する4ビットのリターン値の指定は出来ない。そこで、NS="1"の場合は、既にアキュムレータに存在する値を戻り値として、何もセットしないことにする。一般的には、サブルーチンで計算した結果をリターン値とする場合が多いので、4004のようにBBL命令で指定した固定値を格納するより、この仕様の方が使いやすいと考えられる。また、単純な間接アドレス指定の分岐として使用する場合は、この指定を使えばアキュムレータの値を保存してジャンプできる。一方、NS="0"の場合は、上位3ビットはゼロとして1ビットの Retフィールドの値をアキュムレータに格納して戻る。これも良く使われる形であるが、正常復帰は0、異常復帰は1という使い方が可能である。