NSC800

National Semiconductor社はIntel社のマイクロプロセッサのセカンドソースとして8080Aなどを供給するほか、SC/MP系列のオリジナルマイクロプロセッサも生産していました。そんなNS社が1970年代末に発表したZ80 CPUバイナリ互換のCMOSマイクロプロセッサがNSC800です。ただし、ハードウエア的にはZ80 CPUと互換性はなく、8085風味というか独自のバスインターフェースとなっていて、割り込みも8085に近い形で強化されています。

NSC800
40 pinセラミックパッケージのNSC800D-2。新しめの資料には-2というのがどのようなクロック周波数か記載されていないのだけど、実際はどうなのだろう。

NSC800の特徴はハードウエア面にあるので、ピン配置から説明していきます。
A8    1      40 VCC
A9    2      39 PS*
A10   3      38 WAIT*
A11   4      37 RESET OUT
A12   5      36 BREQ*
A13   6      35 BACK*
A14   7      34 IO/M*
A15   8      33 RESET IN*
CLK   9      32 RD*
XOUT 10      31 WR*
XIN  11      30 ALE
AD0  12      29 S0
AD1  13      28 RFSH*
AD2  14      27 S1
AD3  15      26 INTA*
AD4  16      25 INTR*
AD5  17      24 RSTC*
AD6  18      23 RSTB*
AD7  19      22 RSTA*
GND  20      21 NMI*
電源は+5 V単一で、2.5 MHzクロック動作のときに10 mAほどしか消費しません。n-MOS版のZ80 CPUや8085と比べれば1/10程度になっています。XINとXOUTは水晶発振子を接続してクロックを生成する端子です。実際のクロック周波数は水晶発振子の周波数が1/2に分周されたものになります。CLK端子はそのクロック信号の出力で、クロック信号を必要とする周辺LSIへの供給源となります。
アドレス下位はデータバスにマルチプレクスして出力され、そのタイミングを表すのがALE信号です。1970年代では、74HC373のような高速CMOSの8 bitラッチなどありませんでしたから、汎用CMOSロジックでラッチして専用の周辺以外を接続するには、速度的にも厳しかったでしょうね。まぁ、完全CMOSコンピュータを作ろうとしたら、CMOSのROMが特殊な時代でしたし。
RD*, WR*, WAIT*はバスの入出力タイミングを示す信号で、S0, S1, IO/M*はバスサイクルの識別状態信号です。S0, S1を用いてバスバッファの方向制御やHALT状態検出ができるようになっています。このあたりは8085Aと同様の信号です。
BREQ*, BACK*はDMA用の信号で、RFSH*はダイナミックメモリのリフレッシュタイミングを表します。リフレッシュサイクルはZ80 CPUと同じくM1サイクル中に挿入され、リフレッシュアドレスはアドレス下位に出力されます。そのため、同時にALE信号も出力されています。リフレッシュアドレスが8 bitに拡張されている点がZ80 CPUと異なります。
RESET IN*とRESET OUTはリセット関係の信号で、RESET IN*はヒステリシス付き入力となっていて、コンデンサの充電を利用したパワーオンリセット回路を簡単に構成できるようになっています。RESET OUT信号は周辺LSI用のリセット信号出力です。
PS*信号はPower Saveの略で、プロセッサの内部クロックを停止してプログラムの実行も中断し、消費電力を小さくすることができますが、クロック発振回路は動作していて、消費電流はせいぜい1/2にしかなりません。もっとも、バスアクセスが停止するわけですから、CMOSプロセスのメモリや入出力ポートを使用していれば、その周辺回路の消費電流はかなり小さくなることが期待できますけど。PS*信号は命令の切れ目でサンプリングされ、ALE信号が引き伸ばされるような状態でプロセッサを停止させます。
NMI*, RSTA*, RSTB*, RSTC*, INTR*, INTA*が割り込み関係の信号です。INTA*が割り込みアクノリッジ出力で、それ以外が割り込み要求信号です。8085Aの信号では、TRAP, RST7.5, RST6.5, RST5.5, INTR, INTA*に相当します。しかし、正論理と負論理が異なりますし、NMI*の飛び先はTRAP割り込みと異なりZ80 CPU互換となっていますし、割り込みマスクの方法も異なります。次の表をご覧ください。
 
信号名 アドレス センス方式 対応する8085Aの割り込み
NMI* 66H エッジ TRAP, 24H, エッジ・レベル
RSTA* 3CH レベル RST7.5, 3CH, エッジ
RSTB* 34H レベル RST6.5, 34H, レベル
RSTC* 2CH レベル RST5.5, 2CH, レベル
INTR* -- レベル INTR, --, レベル

INTR*については割り込みモードと割り込みアクノレッジサイクルの応答に依存して割り込みスタートアドレスが変化します。割り込みの優先順位は、この表で上に行くほど高くなっています。このように、NMI*はZ80 CPUと同じ動作で、8085Aとは微妙に異なっていたりします。
しかも、8085AではRST7.5, RST6.5, RST5.5の個別の割り込みマスクに関してはSIM命令で設定できましたが、Z80 CPUバイナリ互換のNSC800ではSIM命令を実行することはできません。そのため、I/Oアドレス空間の0BBHに割り込み制御レジスタICRを追加し、次のような形で個別の割り込みマスクを実現しています。
 
ビット 名称 機能
0 IEI INTR*の割り込み許可ビット
1 IEC RSTC*の割り込み許可ビット
2 IEB RSTB*の割り込み許可ビット
3 IEA RSTA*の割り込み許可ビット

これらのビットは割り込み許可となっているように、1なら割り込みが許可され0なら禁止されます。また、当然ながらEI, DI命令で設定されるIFFも1になっていなければ、NMI*以外の割り込みは生じません。ICRの各ビットは、リセット時にはIEIのみ1、残りは0に設定され、デフォルトでZ80 CPU互換となるようになっています。RSTA*, RSTB*, RSTC*割り込みを使用するには、必ずICRを適切に設定する必要があります。
ICRは書き込み専用のレジスタで内容を読み出すことはできず、OUT (0BBH), A命令かCレジスタに0BBHを入れた上でのOUT (C), R命令でしか書き込みできません。I/Oブロック転送命令では影響をうけないようにされています。

このNSC800はNational Semiconductor社によると(http://www.national.com/company/pressroom/history80.html)、1981年に販売開始ということです。1979年頃ではなかったのか、それとも発売予定と実際の販売開始にかなり開きが出たのか、ちょっと自信がありません。1981年だとすると、沖電気のCMOS版8085と同時期ということになります。Z80 CPUピン互換のCMOSプロセッサよりは先んじていたことには間違いありませんが。
いずれにせよ、74シリーズ互換の高速CMOSロジックが一般化して普及する前で、CMOSのROMが特殊だった時代なので、電池動作のコンピュータを作るのは高くつく時代でした。ただ、発熱が少ないのは確かでZ80ファミリの周辺LSIを使わずに多数の割り込みを受け付けられて命令体系はZ80 CPU互換というのを活かして、環境条件が劣悪な工業用組み込み分野には使いやすかったかもしれません。

Return to IC Collection