Intel 8008

8008は、インテルによって開発製造された初期のマイクロプロセッサであり、1972年4月に発表された。14ビット外部アドレスバスを持つ8ビットCPUで、16KBまでのアドレス空間を扱える。本来は データポイント  からの委託で、同社のプログラム可能な端末 Datapoint 2200 向けに設計した命令セットをコードネーム 1201 というチップに実装する予定だった。しかし、チップの提供が遅れたことと性能がCTCの目標に達しなかったため、2200には使われなかった。インテルとCTCの契約により、インテルはそのチップを他の顧客に販売する許可を得ていた。

1. 歴史
-----

CTCは1968年、NASAの技術者だったオースティン・O・ロシュとフィル・レイがサン・アントニオで創業。ロシュはデスクトップ型コンピュータの製造を目論んでいた。しかし市場が未成熟だったため、同社の事業計画では単にテレタイプ端末 ASR-33 の代替となる製品とだけ言及しており、Datapoint 3300 を出荷した。ジャック・フラッサニートがデザインした筐体は IBM Selectric タイプライターが置ける場所に置けるよう同じ底面積になっており、画面のアスペクト比はIBMのパンチカードと同じになっている。商業的には成功したが、3300 は回路を小さな空間に詰め込みすぎたため、発熱問題に悩まされることになった。

発熱問題などに対処するため、CPU部分をワンチップ化して再実装するという設計変更が開始された。彼らが設計したチップを製造してくれる企業を探し、ロシュは当時メモリチップを製造していたインテルにたどり着いた。ロシュはそのコンセプトに懸念を表明していたロバート・ノイスと会った。フラッサニートは後に「ノイスは、それが興味をそそるアイデアで、インテルなら実現可能だが、愚かな行動になると言った。彼は、コンピュータチップはコンピュータ1台につき1個しか売れないが、メモリチップはコンピュータ1台当たり数百個も売れると言った」と述べている。もう1つの大きな懸念は、インテルの顧客がそれぞれ独自のプロセッサを設計しており、それに使うメモリチップをインテルから購入していた点で、インテルが自前のプロセッサを出荷すればライバルということになってメモリチップを買ってくれなくなる可能性があった。いずれにしても1970年初め、ノイスは5万ドルで開発契約を結び、テキサス・インスツルメンツ  がセカンドソースとして加わった。

TIはインテルの設計図に基づいて1201のサンプルを作ったが、あまりにもバグが多く、使えなかった。インテル自身の製造は遅延した。CTCはワンチップCPUの完成を待てず、TTL素子でCPUを構成する方向で再設計することを決定した。1970年春、Datapoint 2200 がリリースされ、1970年5月25日、ゼネラルミルズが最初の購入者となった。CTCは2200のリリースで1201を必要としなくなったため、その開発を停止させた。6カ月後、セイコーは1201を科学技術電卓に採用したいとインテルに打診してきた。これは、ビジコンが Intel 4004 を使ってビジネス用電卓で成功しているのを見てのことである。4004の設計にも関わり1201でもプロジェクトリーダーを務めたフェデリコ・ファジンの指揮で若干の再設計が行われ、ピン数を16から18に増やし、新たな1201が1971年後半に完成した。

そのころCTCはハードディスクドライブを搭載した新たな Datapoint 2200 II を開発しており、1201は新製品には非力すぎて使えないと判断。1201の知的財産権をインテルに譲渡する代わりに契約金5万ドルを支払わないということにした。インテルはこれを8008に改称し、1972年4月のカタログに120ドルという価格で掲載した。従来の顧客が去ってしまうのではないかという懸念は現実にはならず、8008は商業的に成功を収めた。その後継として 8080 が続き、さらに大成功となる Intel x86 ファミリへと続いていくことになる。

8008を使った初期の完全なシステムとして、カリフォルニア州立大学サクラメント校のビル・ペンツのチームが作った //Sac State 8008// がある。最初の真のマイクロコンピュータの1つであり、PROMに IBM Basic assembly language と共に簡単なOSが搭載されており、カラーディスプレイ、HDD、キーボード、モデム、磁気テープ/紙テープリーダ、プリンターを制御できる。このプロジェクトはテクトロニクスの支援を得て1972年春にはじまり、約1年後に完成した。ビル・ペンツはインテルにいくつか助言し、後の 8080 の命令セットに影響を与えている。

イギリスでは1972年、EMIの研究所でトム・スピンクが8008の出荷前のサンプル品を使いマイクロコンピュータを作った。ジョー・ハードマンが周辺回路を設計し、停電時のセーブ・リカバリ機能なども実現している。OSはDECのPDP-11用アセンブラを改造したメタアセンブラで書かれ、PROMに搭載された。試作品がEMI経営陣に披露されたが、プロジェクトは中止となった。

2. 設計
-----

10μmルールのPMOSロジックで実装されている。最初のバージョンは最高クロック周波数 0.5MHz で、後の 8008-1 で 0.8MHz までとなった。2クロックサイクルを T-state と呼び、1命令は5から11T-statesで動作する。レジスタ間の移動とALU操作は5T、レジスタ-メモリ間の移動は8T、コール命令やジャンプ命令は実際に分岐した場合11T-statesかかる。

単位時間当たりの命令実行回数  では4ビットのIntel 4004やIntel 4040に若干負けるのだが、8008は8ビットの演算ができ、大きなメモリ空間にアクセスできたため、4ビットチップと比較して3～4倍の計算能力があるといわれた。トランジスタ数は3,500個である。

最初期のパーソナルコンピュータ製品にも採用されており、フランス製のMicral、アメリカ製のSCELBIなどがある。

後継の 8080 や 8085 はバイナリ互換ではないがアセンブリ言語レベルで8008と互換性があり、内部設計も基本的に似ている。x86ファミリの最初の実装である8086は8080の拡張といえる部分もあり、もともとの Datapoint 2200 の設計に若干似ているともいえる。すなわち、8008の各命令と対応する命令が8080の命令セットに存在するだけでなく、32ビット化されたx86の命令セットにも対応する命令が存在する。

チップは、ひとつの8ビットバスしか持たず、それをサポートするために大規模な外付け回路が必要とされた。たとえば14ビットアドレスで16Kバイトのメモリにアクセスできるようにしようとすると、外部にメモリアドレスレジスタ  を設けてアドレス出力をラッチする必要があった。8008は、8本の入力ポートと24本の出力ポートにアクセスできる。

端末制御用に作られたものとしては納得できる設計だったが、他の用途に使うには困難がありすぎた。初期のごく少数のコンピュータがこのマイクロプロセッサを使って設計されたが、一般に使われるようになったと言えるのは次の大幅に改良を加えられた8080である。

8008ファミリは //MCS-8// と呼ばれることがある。

3. アーキテクチャ
----------

メモリ空間は14ビット。
I/Oは入力ポートが8個、出力ポートが24個。
A,B,C,D,E,H,Lの8ビットレジスタと、8レベルのハードウェアスタック、S,Z,P,Cのフラグをもつ。
メモリへのアクセスはMレジスタでしか行えない。それ以外のレジスタによる間接指定や、アドレス直接指定によるアクセスはできない。
16ビットレジスタという概念は存在しない。B,C,D,Eレジスタは単なる8ビットレジスタである。
スタックポインタはレジスタとしては存在しない。また、コール・リターン以外にスタックを操作する命令も存在しない。

4. 命令セット
--------

命令長は1〜3バイト。オペコードはすべて1バイト。2バイト命令は1バイトの即値、3バイト命令は2バイトのアドレスをもつ。
ニーモニックのオペコードはすべて3文字。
RST/INP/OUT命令を除き、機械語でオペランドを持たない命令はニーモニックでもオペランドを持たない。すなわち機械語のオペコードにエンコードされているレジスタ指定はニーモニックでもオペコードに含まれる。その結果、「LCD」「LED」「ACE」「SUM」などといった特徴あるニーモニックが存在する。以下に命令一覧を示す。

rはレジスタA,B,C,D,E,H,L,Mを表す。
nは8ビット即値を表す。
nnは16ビットアドレスを表す。

4.1. 転送命令
---------

Lrr8ビットレジスタ間の転送。LMMは存在しない。LrI8ビットレジスタに即値をロードする。

4.2. 算術演算命令
-----------

ADr8ビットレジスタの内容をAレジスタに加算する。ADI n即値をAレジスタに加算する。ACr8ビットレジスタの内容とCフラグをAレジスタに加算する。ACI n即値とCフラグをAレジスタに加算する。SUr8ビットレジスタの内容をAレジスタから減算する。SUI n即値をAレジスタから減算する。SBr8ビットレジスタの内容とCフラグをAレジスタから減算する。SBI n即値とCフラグをAレジスタから減算する。CPr8ビットレジスタの内容をAレジスタから減算するが、結果は格納しない。CPI n即値をAレジスタから減算するが、結果は格納しない。INr8ビットレジスタの内容をインクリメントする。INMは存在しない。DCr8ビットレジスタの内容をデクリメントする。DCMは存在しない。

4.3. 論理演算命令
-----------

NDr8ビットレジスタの内容とAレジスタの論理積をとる。NDI n即値とAレジスタの論理積をとる。ORr8ビットレジスタの内容とAレジスタの論理和をとる。ORI n即値とAレジスタの論理和をとる。XRr8ビットレジスタの内容とAレジスタの排他的論理和をとる。XRI n即値とAレジスタの排他的論理和をとる。

4.4. ローテート命令
------------

RLCAレジスタの内容とCフラグを連結して左ローテートする。RRCAレジスタの内容とCフラグを連結して右ローテートする。RALAレジスタの内容を左ローテートする。RARAレジスタの内容を右ローテートする。

4.5. ジャンプ・コール・リターン命令
--------------------

JMP nn指定の番地にジャンプする。JFZ nnZフラグが0のとき指定の番地にジャンプする。JTZ nnZフラグが1のとき指定の番地にジャンプする。JFC nnCフラグが0のとき指定の番地にジャンプする。JTC nnCフラグが1のとき指定の番地にジャンプする。JFP nnPフラグが0のとき指定の番地にジャンプする。JTP nnPフラグが1のとき指定の番地にジャンプする。JFS nnSフラグが0のとき指定の番地にジャンプする。JTS nnSフラグが1のとき指定の番地にジャンプする。CAL nn指定の番地をコールする。CFZ nnZフラグが0のとき指定の番地をコールする。CTZ nnZフラグが1のとき指定の番地をコールする。CFC nnCフラグが0のとき指定の番地をコールする。CTC nnCフラグが1のとき指定の番地をコールする。CFP nnPフラグが0のとき指定の番地をコールする。CTP nnPフラグが1のとき指定の番地をコールする。CFS nnSフラグが0のとき指定の番地をコールする。CTS nnSフラグが1のとき指定の番地をコールする。RST p p*8番地をコールする。割り込み用。RETリターンする。RFZZフラグが0のときリターンする。RTZZフラグが1のときリターンする。RFCCフラグが0のときリターンする。RTCCフラグが1のときリターンする。RFPPフラグが0のときリターンする。RTPPフラグが1のときリターンする。RFSSフラグが0のときリターンする。RTSSフラグが1のときリターンする。

4.6. 入出力命令
----------

INP pAレジスタに入力する。OUT pAレジスタの内容を出力する。

4.7. CPU制御命令
------------

NOP何もしない。HLTCPUを停止し、割り込みを待つ。

5. 脚注・出典
--------

6. 外部リンク
--------

[1] - 8008データシート  2023年9月4日閲覧。
[2] Computer World 2023年9月4日閲覧。
[3] 非公式 2023年9月4日閲覧。
[4] The DigiBarn Computer Museum 2023年9月4日閲覧。
url=http://donbot.com/MicrocomputerDesign/First_Edition/F001.htmlw:Martin Research 2023年9月4日閲覧。
url=http://donbot.com/MicrocomputerDesign/SE/M001.htmlMartin Research 2023年9月4日閲覧。