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

アキュムレータ命令群

アキュムレータ命令はアキュムレータを操作して各種の処理を行う命令であり、OPAの値により14種のバリエーションがある。また、OPA=14 、OPA=15に対応する命令はなく、空きとなっている。

  • 4004のアキュムレータ命令群

RAL、RAR命令

アキュムレータとキャリーフラグを繋ぎ、CY←AC3←AC2←AC1←AC0←(CY)と1ポジションシフトするのがRAL命令、RAR命令は、CY→AC3→AC2→AC1→AC0→(CY)と1ポジションシフトを行う。

TCS命令

4004は電卓を最初の適用ターゲットとしており、10進数を4ビットで表現するBCD(Binary Coded Decimal)演算を強く意識して作られている。このBCD演算は事務用計算では現在も用いられており、現在でもサポートしているプロセサは少なくない。

TCS命令は10進の引き算用の命令である。ある桁の引き算でマイナスになると上位から10を借りて来て足し込むが、その下の桁でボロー(借り)がある場合は-1して9を足し込むことになる。これを効率よく実行するのがTCS命令である。

DAA命令

4ビットで表現した二つの10進数を足すと、結果は0~18までの値となる。結果が9以下の場合は問題ないが、10以上の場合は正しいBCD数とはなっていない。この場合にはアキュムレータに6を加えて正しい10進数に補正するのがDecimal Adjust Accumulator命令である。結果が10~15の場合は、結果が10の場合は6を加えることにより16となり、桁上がりを示すキャリーが出てその桁は0となり正しいBCD数となる。結果が11~15の場合も同様であり、桁上がりが出て、その桁は1~5となる。結果が16以上の場合はキャリーがセットされ、和は0~2の範囲となる。これに6を加えると、新たにキャリーは出ないが、最初の加算でセットされたキャリーが残り、その桁は6~8と正しい値になる。

DAA命令は、アキュムレータの内容が10以上、あるいはキャリーがセットされている場合にはアキュムレータの内容を+6をするという処理を行う。

KBP命令

電卓などのキーボードは接点スイッチで、前述のRDR命令では押されたキーに対応するビットだけが"1"にセットされた形式で読み込まれたと考えられる。最終的にはこれを数値入力や、+/-/=キーが押されたという事象として認識する必要があるが、テーブルを引いて判別を行うためには押されたキーに対応したビットが"1"になっているワンホット形式ではなく、バイナリになっている方がテーブルが引き易い。このワンホットからバイナリへの変換を行うのがKBP命令である。

しかし、アキュムレータのビット0が"1"になっている場合、どのようにエンコードされるのか("0000"では押されていないのと区別できないので、ビット0-3を1~4に対応させるとか、どれかのビットをキーが押されたことを示すビットとし、ビット0-3は0~3に対応させるなどが考えられる)はデータシートには記述が無く不明である。また、複数のキーが押されて複数のビットがセットされている場合にどのような動作をするのかについても情報が無い。

DCL命令

RAMチップのグループはCM-RAM0-3の信号ラインで選択されるが、この信号をコントロールするのがDCL命令である。アキュムレータの内容をCMレジスタに転送し、それがそのままCM-RAM0-3ラインの状態になるのでは無いかと思われるが、アキュムレータの下位2ビットをデコードしているのかも知れない。

なお、CLB、CLC、IAC、CMC、CMA、TCC、DAC、STC命令の動作は表の記載で自明であるので省略する。

以上がIntelのデータシートに記載された4004 CPUのアーキテクチャである。最近の強力なプロセサと比べると非常に制限された機能しか持っていないが、それでも何とか簡単なプログラムを作って走らせられそうだと言う感触を持って戴けたのではないかと思う。そこで、この次はこれらの情報に基づいて、Faggin氏の後を追ってこの4004を再設計してみようと思う。