MCS-40

Intel社の4040は4004の改良版後継マイクロプロセッサです。プログラム用メモリのバンク切換の端子が増えて、割り込みが可能になっていますが、信号タイミングなどは4004とコンパチブルになっていて、4004の周辺LSIがそのまま使えます。命令は4004の40命令に加えて、14種類の新命令が加わっています。さらに、インデックスレジスタバンクが増えて、バンク切り替えできるようになっています。実に素直な、つまりは小手先の、と言い換えられるような種類の改良ですね。

4040

このように4004と異なり24ピンのパッケージです。タイミングは4004と同一なので、やはり最大750 kHzの周波数のクロックで動作し、最短命令実行時間は10.8 usです。クロック周波数を上げて高速化することは行われませんでした。ピン配置を以下に示します。

D0     1      24 CY
D1     2      23 CM-ROM0
D2     3      22 CM-ROM1
D3     4      21 Vdd1
STPACK 5      20 CM-RAM0
STP    6      19 CM-RAM1
INT    7      18 CM-RAM2
INTACK 8      17 CM-RAM3
Vss    9      16 SYNC
CLK1  10      15 Vdd2
CLK2  11      14 Vdd
RESET 12      13 TEST

初期は、別ページの4004のように、金メッキの金属部をもつ白いセラミックパッケージに納められていたようですが、私の手元にあるのは量産後かなり後で作られたものなので、金属シールのセラミックパッケージと比べれば安価なCERDIPパッケージになっています。後というのがいつかといえば、写真の4040の製造は1979年です。なんと8080Aどころか8086の生産が立ち上がっていたときでも4040を生産していたというわけで、昔の時の流れはゆっくりだったというか、メーカも責任を持って安定供給を保証していたというか、簡単に短時間で生産中止が通告される最近とは大違いですね。

では、拡張されたレジスタ構成を次に示します。

4040 register

網がかけられている部分が、4004になかった部分です。現在のCPUに慣れた人には、サブルーチン呼び出し用のスタックについて補足すべきかもしれません。8080になるまでのIntel社のマイクロプロセッサは、サブルーチンの戻りアドレスを外部のデータメモリに記録するようになっていません。構造的には、プログラムカウンタを8本用意しておいて、サブルーチン呼び出しの際に次のプログラムカウンタを使うようにし、サブルーチンから戻る際には前のプログラムカウンタに切り替えるというような形で、すべてCPUの内部にあります。もちろん、そのようなスタックですから、レジスタの内容をプッシュしたりすることはできませんで、プログラムカウンタ専用です。4004ではスタックが3レベルまででしたが、4040では7レベルまで、リセット直後から使われるプログラムカウンタまで入れれば4本から8本へと2倍に拡大されました。
ついでに、スクラッチパッドレジスタですが、4004では0番から15番までの4 bitレジスタが16本ありましたが、4040では0番から7番までをバンク切り替えできるようになっています。なんか、8080からZ80のときと同じことを、この時期からやっていたのですね。このレジスタバンクがあるおかげで、割り込みが便利に使えるようになっています。4040の命令体系と処理速度では内部レジスタを外部のメモリに退避させたり復帰させたりしようとすれば、1 ms程度の時間が簡単に消費されてしまいます。レジスタバンクの切り替えなら、1命令の実行だけで簡単にレジスタ退避や復帰ができますから、割り込みが実用的な速度になります。
SRCレジスタはSRC命令でROMチップやRAMチップに送られたデータのコピーを保持しているレジスタです。ただし、割り込みサービスルーチンを実行している間はSRC命令が実行されてもSRCレジスタの内容を書き換えられないようになっています。MCS-40アーキテクチャではROMチップやRAMチップに分散配置された一種のポインタレジスタもプログラムコンテキストの一部なので、割り込み時に保護しなくてはなりません。そのためのレジスタです。プログラマが明示的に内容にアクセスすることはできませんが、割り込みの説明用に必要なので。

4040で拡張された命令には、つぎの14種類があります。4004で未使用の機械語に割り当てられています。

MNE. Code   解説
HLT  01    Halt CPU until STP or INT input
BBS  02    Branch Back and restore SRC register
LCR  03    Load contents of Command Register to accumulator
OR4  04    Logical OR contents of IR4 to accumulator
OR5  05    Logical OR contents of IR5 to accumulator
AN6  06    Logical AND contents of IR6 to accumulator
AN7  07    Logical AND contents of IR7 to accumulator
DB0  08    Designate ROM Bank 0
DB1  09    Designate ROM Bank 1
SB0  0A    Select Index Register Bank 0
SB1  0B    Select Index Register Bank 1
EIN  0C    Enable Interrupt
DIN  0D    Disable Interrupt
RPM  0E    Read Program Memory to Accumulator

HLT命令は割り込みなどが入力されるまでCPUを停止させる命令です。
BBS, LCR, EIN, DINの4命令が割り込みのために新設された命令です。EINとDINは割り込みの許可と禁止で、これは自明でしょう。LCRはRAMチップの選択を行うコマンドレジスタを読み出すための命令です。割り込みサービスルーチン内でRAMチップを選択する際にはコマンドレジスタを書き換えなければいけませんが、単に上書きしては割り込みから復帰した時点で異なるRAMチップがセレクトされたままになっている危険性があります。コマンドレジスタの内容も割り込みで保護しなくてはならないプログラムコンテキストの一部ですから、読み出して保存するための命令が新設されたというわけです。BBS命令は割り込みサービスルーチンからの復帰命令で、スタックを一段ポップすると同時にSRCレジスタに保持された内容を外部チップに送出します。
OR4, OR5, AN6, AN7の各命令は論理演算を行えるようにするために追加された命令です。MCS-4には論理演算命令がないのが欠点とされていましたから、改良版のMCS-40では論理演算を補っています。ただ、任意のレジスタを指定できるようにするほど機械語に空きがありませんでしたから、それぞれ特定のインデックスレジスタとの演算しかできません。
DB0とDB1はROMバンクの選択命令です。この命令によってROM選択信号のCM-ROM0かCM-ROM1のどちらが有効になるか、決められます。
SB0とSB1はインデックスレジスタバンクの切り替え命令です。
RPM命令はWPM命令に対応する4 bit単位でプログラムメモリを読み込む命令です。4008/4009か4289で管理されたメモリだけが対象です。これらのLSIに内蔵されたFirst/Lastフリップフロップの状態に影響を与えるので、WPM命令と同じく注意して使う必要があります。

Return to IC Collection.