• 伊号4004潜

今回は、4004のソフトウェア面を見ていくことにしよう。4004の機械語は、8ビットで45種の命令を持つ。大半のの命令は1バイト(8ビット)だが、一部8ビットのパラメーターが後続する2バイト命令がある。

(図01)は、ソフトウェアからアクセス可能なCPU内部レジスタだ。中心になるのは演算が実行できる4ビットのACCUMULATOR(アキュムレーター)、汎用レジスタである4ビットの「インデックスレジスタ」16個である。なお、インデックスレジスタは、0~15の番号を割り当てられ、偶数レジスタと奇数レジスタを「ペアレジスタ」として8ビットとして使う命令がある。

  • 図01: 4004には、16個の4ビット汎用レジスタがある。これは、2つを組み合わせて8ビットのペアレジスタとしても利用できる。演算はすべて4ビットのアキュムレーターで行い、結果はアキュムレータに入る。その他には、CCRレジスタがあり、これはDCL命令で設定、4つ組の4001RAMグループのうちの1つを選択する。また、Testピンの状態をJCN命令で判定できる。その他にプログラムレジスタやスタックがあるが、命令からは直接アクセスできない

    図01: 4004には、16個の4ビット汎用レジスタがある。これは、2つを組み合わせて8ビットのペアレジスタとしても利用できる。演算はすべて4ビットのアキュムレーターで行い、結果はアキュムレータに入る。その他には、CCRレジスタがあり、これはDCL命令で設定、4つ組の4001RAMグループのうちの1つを選択する。また、Testピンの状態をJCN命令で判定できる。その他にプログラムレジスタやスタックがあるが、命令からは直接アクセスできない

演算命令としては、加算、減算などで、乗算、除算命令は持たない。もっとも、4004後継となる8080やZ-80なども乗算、除算命令を持たなかった。これらが機械語として実装されるのは、16ビット CPU(たとえば8086など)になってからである。このため、乗算、除算の計算は、加減算を使って行う。

4004のアーキテクチャで特殊なのは、RAMのアクセスである。4004は、16ピンしか信号端子がなく、アドレスとデータを時分割で出力するなど複雑な仕組みを強いられた。特にRAMのアクセスは、電卓での利用を考慮し、現在のようにメモリセルが連続したアドレスに割り当てられているのではなく、チップ(4002 RAM)ごとにアクセスする場所をレジスタに登録し、その後、専用の命令を使って、4ビット単位での読み書きを行った。命令として暗黙的にRAMを使うような命令はなく、たとえばサブルーチン呼び出し時のスタックは、CPU内部に3段の12ビットレジスタとして実装されている。このため、4004の最小構成は、4004CPUと4001ROMの2つだけにできた。

また、チップ内のRAMは、16個の「メインメモリ」4ビットメモリセル(データシートでは、Main Memory Charactersと表記されていた)と4個の4ビット「状態メモリ」(同Status Character)という構造を持っていた。データシートでは、これを「レジスタ」と呼んでいた(図02)。

  • 図02: RAMは16個の4ビットメインメモリと4個4ビットのステータスからなるレジスタの4つ組で構成されている。メインメモリとステータスは、アクセスするための命令が異なる。チップはDCL命令で選択、レジスタとメインメモリはSRC命令で選択して、専用命令で読み書きを行えるほか、アキュムレーターと加算、減算が行える

    図02: RAMは16個の4ビットメインメモリと4個4ビットのステータスからなるレジスタの4つ組で構成されている。メインメモリとステータスは、アクセスするための命令が異なる。チップはDCL命令で選択、レジスタとメインメモリはSRC命令で選択して、専用命令で読み書きを行えるほか、アキュムレーターと加算、減算が行える

レジスタは仮数部最大16桁、指数部最大2桁を収容でき、RAMというよりも、電卓のメモリを想定したような構造だった。なお、メインメモリと状態メモリでは、アクセス方法が異なる。

1つのRAMチップには、レジスタが4セットある。1セットは80ビットで、4セット(4002RAM 1チップ分)で320ビット(40バイト)である。

4004では、この4002RAMチップを4つ組でグループとして4グループ、最大16個を接続できた。4002RAMチップは、ダイナミックRAMを使って実装されておりリフレッシュ回路を内蔵していた。

メインメモリをアクセスするには、予め、アクセス先を指定しておく。DCL(DESIGNATE COMMAND LINE)命令で4グループのうちの1つをアキュムレーターの値を使って選択、その後、SRC(SEND REGISTER CONTROL)命令で、レジスタペアの8ビット値を使い、4チップのうちの1つ、チップ内のレジスタの1つ、4ビットのメインメモリ1つを選択する。

なお、DCL、SRC命令は、RAMアクセスだけでなく、4001ROMチップや4002RAMチップ内蔵の入出力ポートのアクセスにも利用される。関連する命令を(表01)に示す。

  • ■表01

    ■表01

プログラムは、4001ROMに格納される。4004は、リセットされるとプログラムカウンタがゼロとなり、0番地から実行を開始する。あとは、命令に従ってROMからプログラムを読み出して実行していく。4004では、RAMが特殊であり、ROMとは異なる方法でアクセス(いわゆるメモリ空間が異なる)ため、汎用のメモリ空間アクセス命令がない。通常、機械語をROMから読み出す必要はないが、データテーブルなどをROM内に置き、これを使って計算を行うことがある。

4004には、そのためにROMアクセス命令が用意されている。FIM(FETCH IMMEDIATE)は、2バイト命令で、2バイト目の8ビットをROMアドレス下位8ビットとして、上位4ビットには、実行中プログラムがあるROMのアドレスを使う。この命令は、指定したアドレスのROM内容8ビットをレジスタペアに格納する。

FIN(FETCH INDIRECT)は、レジスタペア0の内容をROMアドレスの下位8ビットとして、上位4ビットにプログラムカウンタの上位4ビット(実行中のプログラムがあるROMアドレスの上位4ビットと同じ)を使って、ROMを読み出し、指定されたレジスタペアに格納する。

現在のCPUから見ると奇妙な感じのアーキテクチャだが、当時最大の問題はパッケージで16ピン以上に増やすことが困難だった。このため、データとアドレスを重畳し、ROMやRAM側に機能を分散させ、ピン数の削減を行った。その中での命令定義となるため、奇妙なのは仕方がない。

今回のタイトルネタは、1963年の映画「海底軍艦」より、旧日本軍のものとされる架空の潜水艦、伊号403潜の名前から取った。終戦間際に行方不明となった403潜は同作品の謎の1つ。基地からの発進シーンや飛行、潜航、地底など日本の「戦艦」系ドラマの元祖といえる。