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

MJアーキテクチャの命令セット

このような方針に立って考えると、命令としては、

LD命令

IXフィールドで指定されたIXレジスタ(IX0~IX3)の内容で指定された(以降、「IXレジスタで指定された」と略記する)RAMのメモリアドレスの内容をアキュムレータにロードする。Incフィールドに"1"を指定すると、IXフィールドで指定されたIXレジスタをポストインクレメント(使用後に+1)する。

  • LD命令

ADD/SUB命令

キャリー(ボロー)込みで、アキュムレータにIXレジスタで指定されたRAMのメモリアドレスの内容を加算(減算)する。4個のIXレジスタの指定は2ビットで済むので、1ビットのA/Sが"0"の場合はADD(加算)、"1"の場合はSUB(減算)動作を行う。もう1ビットのIncフィールドでIXレジスタのポストインクレメント(使用後に+1する)を指定する。

  • ADD/SUB命令

ST命令

アキュムレータの内容をIXレジスタで指定されたRAMのメモリアドレスに格納する。IXレジスタの指定は2ビットで済むので、1ビットのACフィールドを"1"とするとPDP-8のように格納後、アキュムレータのクリア、もう1ビットのIncフィールドでIXレジスタのポストインクレメントを指定する。

  • ST命令

この3つの命令があれば、最低限、メモリからデータを読み、加算と減算を行い、結果をメモリに格納することが出来る。

しかし、LD命令、ADD命令、ST命令でRAMのアドレスを指定するためには、アクセスするメモリアドレスをIXレジスタに格納する命令が必要である。この目的に対して、4004では2バイト命令の後半の8ビットをレジスタペアに格納するFIM命令と、レジスタペア0の内容をアドレスとしてアクセスされるROMの内容をレジスタペアに格納するFIN命令を備えている。

MJアーキテクチャとしてもこのような命令が必要であり、次のように拡張されたFIM命令、FIN命令を作ることにする。

FIM命令

8ビットのDの値をIXレジスタの下位8ビットに格納する。上位8ビットは0か符号拡張かをHSビットで指定する。H/Sを"1"として符号拡張を行う場合は、 Dmidの最上位のビットをIXhighの4ビットにコピーする。また、IXレジスタのインクレメントで発生するキャリーを保持するIXCYビットをクリアする。

  • FIM命令

FIN命令

IX0の内容で指されるROMの8ビットの値をIXレジスタの下位8ビットに格納する。上位4ビットは0か符号拡張を行うかをH/Sビットで指定する。符号拡張を行う場合は、Dmidの最上位のビットをIXhighの4ビットにコピーする。また、IXCYビットをクリアする。

  • FIN命令

MJアーキテクチャでは、RAMはX2~X4サイクルにアドレスを受け取り、X5サイクルにデータを返すという動作であり、ROMはA1~A3サイクルにアドレスを受け取り、M1、M2サイクルにデータを返すという動作である。従って、LD命令でROMを読むことは出来ないので、4004と同様に、MJアーキテクチャのプロセサにおいても、ROMアクセス専用の命令が必要となる。そして、これも4004と同様に、FIN命令は8ビット命令であるが16サイクルで実行されることになる。

これらのFIM、FIN命令で8ビットのデータを符号拡張してIXレジスタに格納する機能を設けたのは、IXレジスタに負の数を格納することが出来るようにするためである。単純に最上位の4ビットにゼロを格納すると、これらの命令でIXレジスタに格納できる数は0~255の範囲となるが、符号拡張を行うと、正の数の最大は0111 1111=127で、1000 0000は8ビットの最上位の"1"が、その上の4ビットにコピーされ、1111 1000 0000=-128をIXレジスタに格納することが出来る。負の数をIXレジスタに入れるのは、メモリアドレスの指定の場合には便利とは言えないが、後述のようにIXレジスタをループカウンタとして使用する場合には便利な機能である。