本連載は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ビットで選択可能である。

  • LDIX命令

ADIX命令

キャリー込みで、IXレジスタの内容をアキュムレータに加算する。hmlでIXhigh、IXmid、IXlowを指定する。

  • ADIX命令

STIX命令

アキュムレータの内容をIXレジスタに格納する。hmlでIXhigh、IXmid、IXlowを指定する。

  • STIX命令

以上の8種の命令と、アキュムレータやキャリーの操作を行うACC命令群があれば、最低限のメモリアクセスと加減算が可能である。

また、次々とメモリアドレスを増減させて連続したメモリをアクセスしたり、ループのカウントを行ったりするために、INC命令を設ける。

INC命令

指定したIXレジスタの内容を+1する。

  • INC命令

4004では4ビットのインデックスレジスタのインクレメントしか出来ないので、最大16回のループしか作れないが、MJアーキテクチャでは一つのINC命令で、12ビット、4096回までのループが作れる。例えば10回のループの場合は、FIM命令でDに-10(11110110)を指定し、符号拡張でIXレジスタに格納することにより、12ビットで表現された -10がIXレジスタに格納される。そして、ループの終わりのINC命令で+1し、後述のJCN命令でIXCYレジスタに入ったキャリーを判定すれば良い。

しかし、ループを作るためには元に戻るためのジャンプ命令が必要である。ということで、MJアーキテクチャに分岐命令、条件分岐命令、サブルーチンコールとリターンのためのジャンプ命令を次のように定義する。

JUN命令

無条件ジャンプ命令。分岐先の命令ROMの12ビットアドレスを指定する。

  • JUN命令

JCN命令

条件ジャンプ命令。条件Condが成立した場合、Amid、Alowで指定したアドレスへジャンプする。Highアドレスは4004と同様、PChighが使用される。

  • JCN命令

分岐条件には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アドレスに分岐する。

  • JMS命令

JIN命令

IXレジスタに格納されたアドレスにジャンプする。IX0レジスタを指定すれば、サブルーチンからのリターンにも使える。

  • JIN命令

但し、命令語には2ビットしか余裕が無いので、4004のようにアキュムレータに格納する4ビットのリターン値の指定は出来ない。そこで、NS="1"の場合は、既にアキュムレータに存在する値を戻り値として、何もセットしないことにする。一般的には、サブルーチンで計算した結果をリターン値とする場合が多いので、4004のようにBBL命令で指定した固定値を格納するより、この仕様の方が使いやすいと考えられる。また、単純な間接アドレス指定の分岐として使用する場合は、この指定を使えばアキュムレータの値を保存してジャンプできる。一方、NS="0"の場合は、上位3ビットはゼロとして1ビットの Retフィールドの値をアキュムレータに格納して戻る。これも良く使われる形であるが、正常復帰は0、異常復帰は1という使い方が可能である。