本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。
前回示した最初の表は、命令の前半のA1~A3サイクルのバス動作、第二の表は命令の後半のA1~A3サイクルのバス動作を示したものである。そして、第三の表は、命令の前半のM1、M2サイクルの動作、第四の表は命令の後半のM1、M2サイクルの動作を示したものである。この部分はFIN命令の後半に処理を除くと、全命令で同じ動作を行えば良い。
次の5番目の表は命令の前半のX1~X3サイクルのバス動作をまとめたものであり、一番複雑な表であり、命令によって各サイクルでのSRCとDSTが異なる。
例外は命令の前半のX1サイクルである。ここでは、処理しようとしている命令がどの命令であるかはX1サイクルでのデコードが終わらないと判明しない設計としているので、RSレジスタへの書き込みの必要性の有無にかかわらず、X1サイクルではRSレジスタへの書き込みを行うことにしている。X1 DSTの欄にRSと書かれた場合は、RSレジスタへの書き込みが必要な場合、(RS)と書かれた欄は、命令の動作としてはRSレジスタへの書き込みは必要ではないが、書き込みを行っても問題は生じないので、DSTをRSレジスタとしていることを示している。
勿論、OPRの4ビットはM1サイクルで得られているので、M2サイクルでこれをデコードして、X1サイクルでOPAの内容をRSレジスタに書くかどうかを判定するという設計も可能であるが、特にメリットが無いので、ここでは命令の最初の8ビットのX1サイクルにおいては、常にOPAの内容をRSレジスタに書き込むことにした。
X3 ALUと書かれた欄は、X3サイクルでのALUの動作を示している。ACC命令はOPA部の指定によりALU動作が変わるので、この表ではOPAで指定(Spec'd by OPA)として詳細動作は省略している。
ALU動作の欄には二つ例外的な記述がある。一つはJCN命令であり、Tempレジスタに入れられた4bitの条件が成立するかどうかをALUで判定し、CCフラグレジスタに格納する。もう一つの例外はXCH命令である。XCH命令はアキュムレータの内容と指定されたインデックスレジスタの内容を交換する命令であるが、X2サイクルのレジスタの内容をTempレジスタに入れるのは良いが、X3サイクルでアキュムレータの内容を内部バス経由でインデックスレジスタに書き込むのと同時に、Tempレジスタに内容をアキュムレータに入れる必要がある。しかし、内部バスはアキュムレータの内容を送るのに使われており、内部バスを経由してTempレジスタの内容をアキュムレータに格納することは出来ない。
この問題を解決するには、2バイト命令のように次の8サイクルを使って処理することも考えられるが、Tempとアキュムレータの両レジスタはALUの回りの比較的近い位置関係にあるので、ここではTempからアキュムレータへ書き込む専用の経路を作る設計とし、XCH命令は8サイクルで実行できる設計とした。
内部バス経由のデータ転送とALU以外の操作としては、PCのインクリメントとスタックのプッシュ、ポップがある。
まず、PCのインクリメントであるが、通常は次の命令バイトを読むためにA3サイクルでPCの値をインクリメントする。しかし、一つだけ例外がある。それはROMからデータを読み指定されたレジスタペアに格納するFIN命令である。FIN命令は1バイトの命令であるが、ROMをもう一回読むために、もう8サイクル必要であり、2バイト命令のように16サイクルで実行される特別な処理を必要とする命令である。その他の命令ではA1、A2サイクルにはPClow、PCmidをバスに送り出し、ROMから次の命令を読むが、FIN命令の後半では、レジスタペア0、1の内容をバスに送り出す必要がある。また、A3サイクルが2回あるが、命令は8ビット長であるのでPCをインクリメントは1回で良い。従って、2回目のA3サイクルではPCの+1を行わないという例外的な処理が必要となる。
また、JUN命令やJMS命令のように必ずジャンプする命令の場合は、命令の2バイト目の処理でPCをインクリメントしても、その直後のX1~3サイクルでPCが上書きされるのでインクリメントの必要は無いが、インクリメントを行っても問題は無いので、他の命令の処理と同じになるようにして制御を簡単にしている。
サブルーチンを呼び出すJMS命令は戻り先の番地をスタックに格納する必要があり、2バイト目のA3サイクルでPCを+1して次の命令を指すようにし、次のM1あるいはM2サイクルにPCの内容をスタックにプッシュする。一方、サブルーチンから戻るBBL命令は命令種別の判定が終わったX1サイクル以降でスタックのポップを行えば良い。スタックはバスやALUと独立に動作できるユニットであるので、プッシュ、ポップを実行するサイクルはある程度自由度があり、この設計ではX3サイクルでポップを行っている。
これで命令ごとの各サイクルの動作の整理が終わったので、次は、必要な動作を行う回路の論理設計に入ろう。