Intel 8008

8008（はちまるまるはち、と読まれることが多い）は、インテルによって開発製造された初期のマイクロプロセッサであり、1972年4月に発表された。14ビット外部アドレスバスを持つ8ビットCPUで、16KBまでのアドレス空間を扱える。本来は Computer Terminal Corporation（英語版） (CTC) からの委託で、同社のプログラム可能な端末 Datapoint 2200 向けに設計した命令セットをコードネーム 1201 というチップに実装する予定だった。しかし、チップの提供が遅れたことと性能がCTCの目標に達しなかったため、2200には使われなかった(Datapoint 2200は結局TTL素子で製作された)。インテルとCTCの契約により、インテルはそのチップを他の顧客（例えば電卓市場参入を表明していたセイコー）に販売する許可を得ていた。 CTCは1968年、NASAの技術者だったオースティン・O・ロシュとフィル・レイがサン・アントニオで創業。ロシュはデスクトップ型コンピュータの製造を目論んでいた。しかし市場が未成熟だったため、同社の事業計画では単にテレタイプ端末 ASR-33 の代替となる製品とだけ言及しており、Datapoint 3300（英語版） を出荷した。ジャック・フラッサニートがデザインした筐体は IBM Selectric タイプライターが置ける場所に置けるよう同じ底面積になっており、画面のアスペクト比はIBMのパンチカードと同じになっている。商業的には成功したが、3300 は回路を小さな空間に詰め込みすぎたため、発熱問題に悩まされることになった。 発熱問題などに対処するため、CPU部分をワンチップ化して再実装するという設計変更が開始された。彼らが設計したチップを製造してくれる企業を探し、ロシュは当時メモリチップを製造していたインテルにたどり着いた。ロシュはそのコンセプトに懸念を表明していたロバート・ノイスと会った。フラッサニートは後に「ノイスは、それが興味をそそるアイデアで、インテルなら実現可能だが、愚かな行動になると言った。彼は、コンピュータチップはコンピュータ1台につき1個しか売れないが、メモリチップはコンピュータ1台当たり数百個も売れると言った」と述べている。もう1つの大きな懸念は、インテルの顧客がそれぞれ独自のプロセッサを設計しており、それに使うメモリチップをインテルから購入していた点で、インテルが自前のプロセッサを出荷すればライバルということになってメモリチップを買ってくれなくなる可能性があった。いずれにしても1970年初め、ノイスは5万ドルで開発契約を結び、テキサス・インスツルメンツ (TI) がセカンドソースとして加わった。 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経営陣に披露されたが、プロジェクトは中止となった。 10μmルールのPMOSロジックで実装されている。最初のバージョンは最高クロック周波数 0.5MHz で、後の 8008-1 で 0.8MHz までとなった。2クロックサイクルを T-state と呼び、1命令は5から11T-statesで動作する。レジスタ間の移動とALU操作は5T（0.5MHzの場合、20μs）、レジスタ-メモリ間の移動は8T（32μs）、コール命令やジャンプ命令は実際に分岐した場合11T-states（44μs）かかる。 単位時間当たりの命令実行回数 (MIPS) では4ビットのIntel 4004やIntel 4040に若干負けるのだが（0.8MHzで0.036MIPSから0.08MIPS）、8008は8ビットの演算ができ、大きなメモリ空間にアクセスできたため、4ビットチップと比較して3～4倍の計算能力があるといわれた。トランジスタ数は3,500個である。 最初期のパーソナルコンピュータ製品にも採用されており、フランス製のMicral（キットではない）、アメリカ製のSCELBI（英語版）（キット）などがある。 後継の 8080 や 8085 はバイナリ互換ではないがアセンブリ言語レベルで8008と互換性があり、内部設計も基本的に似ている。x86ファミリの最初の実装である8086は8080の拡張といえる部分もあり、もともとの Datapoint 2200 の設計に若干似ているともいえる。すなわち、8008の各命令と対応する命令が8080（および8085、Z80など）の命令セットに存在するだけでなく、32ビット化されたx86の命令セットにも対応する命令が存在する（ただし、機械語のビット列はそれぞれ異なる）。 チップは、（18ピンのDIPパッケージであるためにピン数が制限されていたので）ひとつの8ビットバスしか持たず、それをサポートするために大規模な外付け回路が必要とされた。たとえば14ビットアドレスで16Kバイトのメモリにアクセスできるようにしようとすると、外部にメモリアドレスレジスタ (MAR) を設けてアドレス出力をラッチする必要があった（アドレス出力が1サイクルでは完了しないため）。8008は、8本の入力ポートと24本の出力ポートにアクセスできる。 端末制御用に作られたものとしては納得できる設計だったが、他の用途に使うには困難がありすぎた。初期のごく少数のコンピュータ(最初に採用した会社はリコーといわれる)がこのマイクロプロセッサを使って設計されたが、一般に使われるようになったと言えるのは次の大幅に改良を加えられた8080である。 8008ファミリは MCS-8 と呼ばれることがある。 メモリ空間は14ビット(16KB)。 I/Oは入力ポートが8個、出力ポートが24個。 A,B,C,D,E,H,Lの8ビットレジスタと、8レベルのハードウェアスタック（うち1つはプログラムカウンタ）、S,Z,P,Cのフラグをもつ。 メモリへのアクセスはMレジスタ（HLレジスタペアによる間接指定）でしか行えない。それ以外のレジスタによる間接指定や、アドレス直接指定によるアクセスはできない。 16ビットレジスタという概念は存在しない。B,C,D,Eレジスタは単なる8ビットレジスタである。 スタックポインタはレジスタとしては存在しない。また、コール・リターン以外にスタックを操作する命令も存在しない。 命令長は1〜3バイト。オペコードはすべて1バイト。2バイト命令は1バイトの即値、3バイト命令（ジャンプ・コール）は2バイトのアドレスをもつ。 ニーモニックのオペコードはすべて3文字。 RST/INP/OUT命令を除き、機械語でオペランドを持たない命令（1バイト命令）はニーモニックでもオペランドを持たない。すなわち機械語のオペコードにエンコードされているレジスタ指定はニーモニックでもオペコードに含まれる。その結果、「LCD」「LED」「ACE」「SUM」などといった特徴あるニーモニックが存在する。 以下に命令一覧を示す。 rはレジスタA,B,C,D,E,H,L,Mを表す。 nは8ビット即値を表す。 nnは16(14)ビットアドレスを表す。 Lrr 8ビットレジスタ間の転送。LMMは存在しない。 LrI 8ビットレジスタに即値をロードする。 ADr 8ビットレジスタの内容をAレジスタに加算する。 ADI n 即値をAレジスタに加算する。 ACr 8ビットレジスタの内容とCフラグをAレジスタに加算する。 ACI n 即値とCフラグをAレジスタに加算する。 SUr 8ビットレジスタの内容をAレジスタから減算する。 SUI n 即値をAレジスタから減算する。 SBr 8ビットレジスタの内容とCフラグ（ボロー）をAレジスタから減算する。 SBI n 即値とCフラグ（ボロー）をAレジスタから減算する。 CPr 8ビットレジスタの内容をAレジスタから減算するが、結果は格納しない。 CPI n 即値をAレジスタから減算するが、結果は格納しない。 INr 8ビットレジスタの内容をインクリメントする。INMは存在しない。 DCr 8ビットレジスタの内容をデクリメントする。DCMは存在しない。 NDr 8ビットレジスタの内容とAレジスタの論理積をとる。 NDI n 即値とAレジスタの論理積をとる。 ORr 8ビットレジスタの内容とAレジスタの論理和をとる。 ORI n 即値とAレジスタの論理和をとる。 XRr 8ビットレジスタの内容とAレジスタの排他的論理和をとる。 XRI n 即値とAレジスタの排他的論理和をとる。 RLC Aレジスタの内容とCフラグを連結して左ローテートする。 RRC Aレジスタの内容とCフラグを連結して右ローテートする。 RAL Aレジスタの内容を左ローテートする。 RAR Aレジスタの内容を右ローテートする。 JMP nn 指定の番地にジャンプする。 JFZ nn Zフラグが0のとき指定の番地にジャンプする。 JTZ nn Zフラグが1のとき指定の番地にジャンプする。 JFC nn Cフラグが0のとき指定の番地にジャンプする。 JTC nn Cフラグが1のとき指定の番地にジャンプする。 JFP nn Pフラグが0のとき指定の番地にジャンプする。 JTP nn Pフラグが1のとき指定の番地にジャンプする。 JFS nn Sフラグが0のとき指定の番地にジャンプする。 JTS nn Sフラグが1のとき指定の番地にジャンプする。 CAL nn 指定の番地をコールする。 CFZ nn Zフラグが0のとき指定の番地をコールする。 CTZ nn Zフラグが1のとき指定の番地をコールする。 CFC nn Cフラグが0のとき指定の番地をコールする。 CTC nn Cフラグが1のとき指定の番地をコールする。 CFP nn Pフラグが0のとき指定の番地をコールする。 CTP nn Pフラグが1のとき指定の番地をコールする。 CFS nn Sフラグが0のとき指定の番地をコールする。 CTS nn Sフラグが1のとき指定の番地をコールする。 RST p (p=0～7) p*8番地をコールする。割り込み用。 RET リターンする。 RFZ Zフラグが0のときリターンする。 RTZ Zフラグが1のときリターンする。 RFC Cフラグが0のときリターンする。 RTC Cフラグが1のときリターンする。 RFP Pフラグが0のときリターンする。 RTP Pフラグが1のときリターンする。 RFS Sフラグが0のときリターンする。 RTS Sフラグが1のときリターンする。 INP p (p=0～7)Aレジスタに入力する。 OUT p (p=8～23)Aレジスタの内容を出力する。 NOP 何もしない。 HLT CPUを停止し、割り込みを待つ。