仕事で役立つ人気ビジネスアプリおすすめ!
[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
コンピュータアーキテクチャの話 (63) 4ビットプロセサのアーキテクチャ設計
MJアーキテクチャの命令セット
このような方針に立って考えると、命令としては、
LD命令
IXフィールドで指定されたIXレジスタ(IX0~IX3)の内容で指定された(以降、「IXレジスタで指定された」と略記する)RAMのメモリアドレスの内容をアキュムレータにロードする。Incフィールドに"1"を指定すると、IXフィールドで指定されたIXレジスタをポストインクレメント(使用後に+1)する。
ADD/SUB命令
キャリー(ボロー)込みで、アキュムレータにIXレジスタで指定されたRAMのメモリアドレスの内容を加算(減算)する。4個のIXレジスタの指定は2ビットで済むので、1ビットのA/Sが"0"の場合はADD(加算)、"1"の場合はSUB(減算)動作を行う。もう1ビットのIncフィールドでIXレジスタのポストインクレメント(使用後に+1する)を指定する。
ST命令
アキュムレータの内容をIXレジスタで指定されたRAMのメモリアドレスに格納する。IXレジスタの指定は2ビットで済むので、1ビットのACフィールドを"1"とするとPDP-8のように格納後、アキュムレータのクリア、もう1ビットのIncフィールドでIXレジスタのポストインクレメントを指定する。
この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ビットをクリアする。
FIN命令
IX0の内容で指されるROMの8ビットの値をIXレジスタの下位8ビットに格納する。上位4ビットは0か符号拡張を行うかをH/Sビットで指定する。符号拡張を行う場合は、Dmidの最上位のビットをIXhighの4ビットにコピーする。また、IXCYビットをクリアする。
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レジスタをループカウンタとして使用する場合には便利な機能である。