めざせ4004! IC24個で電卓用CPUを作ってみた: Chapter 2-6 インデックスレジスタの本数

ビット幅が決まったところで、次に検討すべきなのはインデックスレジスタの本数です。 まずは一般的なCPUにおけるインデックスレジスタの本数を調べてみましょう。

はてさて、これだけでは傾向が見えてきません。単純に考えれば本数が多い方が良いように思えますし、実際MC68000は7本と多いですので、EX4-2024のインデックスレジスタも多い方が良いような気がします。しかし何本が最適なのかと聞かれると表4からでは判断ができません。

ではソフトウエアの視点から考えてみましょう。今回制作するCPUは電卓を作ることを目的としているので、まずはC言語で7桁の電卓用プログラムを作ってみます。 前提として7桁の数値は1桁ずつ配列に格納されるものとします。電卓の画面に表示されている数値は配列cxに格納され、画面に表示されてない数値(先に入力された数値)は配列cyに格納されているとします。そして計算の途中結果を格納するために配列ctを使うとします。

Chapter 2-6-1 加減算

話を簡単にするために、配列の各要素は4ビットの整数とし、繰り上がりも無視します。そのうえで加算のプログラムを作ると以下のようになります。

繰り上がりや10進数補正を無視しているので、ただ単に各桁を加算していくだけの極めて簡単なプログラムとなっています。 この配列へのアクセスを実際のCPUの命令に落とし込むとどうなるでしょうか? コード8を見ると配列の添え字はiのみです。このiをインデックスレジスタに割り当てれば良いので、必要なインデックスレジスタの数は1個となります。

減算も同様です。繰り下がりやマイナス処理を無視すると極めて簡単なプログラムになります。

配列へのアクセスが3ヵ所ありますが、その添え字は全てiです。従って加算と同様にインデックスレジスタも1個で足ります。

Chapter 2-6-2 乗算

乗算は3重ループを使います。2重ループで済むだろうと考える方もいらっしゃると思いますが、乗算命令の無いEX4-2024では3重ループが必要となります。 プログラムから乗算を実行する部分だけを抜き出すと以下のようになります。

この3重ループはそれぞれ変数i、j、kをカウンタに使用していますが、このうちiとkが配列の添え字に使用されています。これらをインデックスレジスタに割り当てることになりますので、乗算の場合は2個のインデックスレジスタが必要となります。ただし配列ctの添え字が k+i になっている点は要注意です。

Chapter 2-6-3 除算

除算のプログラムは少々難解です。インデックスレジスタに関する重要な部分だけを抜き出すと以下のようになります。なお、事前に序数cxと被除数cyは最大桁方向にシフトされているものとします。

乗算と同様に3重ループが必要となりますが、真ん中のループはdo~whileなのでカウンタを使いません。カウンタを使うのは外側forループのiと内側のforループのjのみですから、これらをインデックスレジスタに割り当てれば良いように見えます。 ところが厄介なことに、このプログラムでは配列の添え字に計算式を使用しています。 cx[j+6-i]  という部分です。これは直接CPU命令に変換できないので、複数のCPU命令に分解して実行することになります。するとiとj以外に計算結果用のインデックスレジスタが必要となるので、合計3本となります。