Intel 8080(インテル 8080、i8080)は、インテルによって開発された8ビットマイクロプロセッサである。1973年末に8080のエンジニアリングサンプルが出荷され[1]、1974年2月にアメリカ合衆国フィラデルフィアにて開催された国際固体素子回路会議(英語版) (ISSCC) で発表された[2]。
同社の8008の後継に当たるが、命令の互換性はない。8080の命令は後に拡張され、ザイログのZ80や日立製作所の64180に継承された。初期のパーソナルコンピュータの多くに採用され、モトローラの6800やモステクノロジーの6502(Apple、コモドール、ファミコン、他)と覇を競った。
8008はシングルアドレッシングモードや遅いクロック速度、少ないピン数、スタック不足などによりソフトウェアの規模や複雑さが制限され、用途が限定的であった。8008に次ぐ新しいマイクロプロセッサの設計にあたっては、単純に8008にスタック命令を追加したものから完全に互換性を放棄したものまでいくつか提案されたが、最終的には両者の妥協案が採択された[3]。
1972年初頭、8080のアーキテクチャの考案者であるフェデリコ・ファジンはインテルの経営陣にこのチップを提案し、実行することを推進した。これは半年後にようやく開発の許可を得た。1972年11月、ファジンはかつて一緒に4004の設計を手伝っていた嶋正利を日本から雇った。嶋はファジンが4000ファミリ用に作ったシリコンゲートによるランダムロジックの設計手法を利用して、ファジンの指示の下で詳細設計を行った[4]。
8080はより多くの顧客に向けた汎用のマイクロプロセッサになることを意識して設計された。開発の労力は主に8008の周辺チップにあった機能を一つのパッケージに統合することに費やされた。開発初期の段階で、8080は8008とはバイナリ互換ではなく、新しいソフトウェアが8008と同じ制限を受けないように、ソースコードの変換によって互換性を保つことが決定された。同じ理由で、スタックベースのルーチンと割り込みの機能を拡張するため、スタックは外部メモリに移された。
嶋は1973年8月にレイアウトを完成させた。NMOSの製造プロセスが確立した後、1974年1月頃に8080の試作品が完成した。嶋は休暇を取って一時的に日本へ帰国し、休暇明けに8080の特性評価を行う予定だった。しかし、嶋がインテルに戻った頃には既に営業部の判断で8080が4万個製造されていた。8080はグラウンドが十分に取られていないという物理設計上のミスにより、大電流が流れるTTLデバイスと使用するには問題があった。そのため、8080はTTL-LS用としてしばらくの間販売され、グラウンド線の幅を太くして標準TTLに対応させたものが8080Aとして発売された[5]。
日本で1974年4月頃に発売された8080のサンプル価格は1個138,000円(2023年時点の306,796円と同等)で、これは当時の日本の全世帯1か月家計消費支出平均額をやや上回る額に相当した[6]。この価格は歩留まりの改善や他のメーカーから互換品が登場したことで下がっていった。1975年末には周辺回路として必要な電子部品を揃えたキット「MCS-80 システムC」(約63,000円)や、基板やモニタプログラムまで一式で揃えた組立キット「SDK-80(英語版)」(約13万円)が発売された[7]。
8080は、アキュムレータ1つを含む、7つの汎用レジスタ(8ビット)を持つ。これはたとえば6800と比べて本数としては多い。また、二つの8ビットレジスタを併せて、BC、DE、HLの3つの16ビットレジスタとして扱う命令もある。
さらに見る 16ビット単位の呼称, 8ビット単位(上位) ...
16ビット単位の呼称 | 8ビット単位(上位) | 8ビット単位(下位) | 説明 |
PSW | A | Flag |
アキュムレータ(A)とフラグ・レジスタ |
BC | B | C |
汎用レジスタ |
DE | D | E |
汎用レジスタ |
HL | H | L |
汎用兼 間接参照用レジスタ |
PC |
|
プログラムカウンタ |
SP |
|
スタックポインタ |
閉じる
(注)命令中ではHLレジスタペアをポインタとして扱うメモリ参照は「M」と表現される: 例 ADD M
- フラグレジスタのビット位置
- b7:S 符号
- b6:Z ゼロ
- b5:未使用 (0に固定)
- b4:H AUXキャリー(パックBCD演算用)
- b3:未使用 (0に固定)
- b2:P パリティ
- b1:未使用 (0に固定)
- b0:C キャリー
- このフラグ位置は8086を経てIA-32に至るまで代々引き継がれている。
- 命令はバイト単位で、1から3バイトの可変長である。
- 主な命令は、8ビットレジスタ間のロード、8ビットおよび16ビットレジスタペアに対する即値ロード命令、Aレジスタを用いた加減算とビット論理演算・比較演算(HLレジスタペアをポインタとして扱うメモリ参照を含む)、絶対番地指定による条件および無条件ジャンプ・コール命令・リターン命令、スタックへのPUSH/POP操作、割り込み許可・禁止命令、8レベルの割り込みをエミュレートするソフトウェア割り込み命令などがある。
- 相対ジャンプ及び相対コール命令がないため命令を動的に再配置することは原則としてできなかった。
- リセット直後は(プログラム・カウンタが)0番地からアドレスが増加する方向に実行される。また、スタックポインタはアドレスが減少する方向に(プッシュにより)自動的に減算されるため、スタックはメモリ下位(数字の大きい方が上)番地に向かって伸びる。
以下に命令一覧を示す。
- rは8ビットレジスタA,B,C,D,E,H,LまたはM(HLレジスタで示されるメモリ)を表す。ザイログニーモニックではMは(HL)と書く。
- rrは16ビットレジスタBC,DE,HL,SPを表す。なおインテルニーモニックではBC,DE,HLはB,D,Hと書く。
- nは8ビットの数値(即値またはI/Oアドレス)を表す。
- nnは16ビットの数値(即値またはメモリアドレス)を表す。
- インテルニーモニックとザイログニーモニックが異なるものは、スラッシュで区切って示した。
転送・交換命令
- MOV r,r / LD r,r
- 8ビットレジスタ間の転送。MOV M,Mは存在しない(相当するコードはHLT/HALTに割り当てられている)。
- MVI r,n / LD r,n
- 8ビットレジスタに即値をロードする。
- LXI rr,nn / LD rr,nn
- 16ビットレジスタに即値をロードする。
- LDA nn / LD a,(nn)
- メモリの内容をAレジスタにロードする。
- STA nn / LD (nn),A
- Aレジスタの内容をメモリにストアする。
- LHLD nn / LD HL,(nn)
- メモリの内容をHLレジスタにロードする。
- SHLD nn / LD (nn),HL
- HLレジスタの内容をメモリにストアする。
- LDAX B / LD A,(BC)
- BCレジスタで示されるメモリの内容をAレジスタにロードする。HLレジスタのMOV A,Mに相当。
- LDAX D / LD A,(DE)
- DEレジスタで示されるメモリの内容をAレジスタにロードする。
- STAX B / LD (BC),A
- Aレジスタの内容をBCレジスタで示されるメモリにストアする。HLレジスタのMOV M,Aに相当。
- STAX D / LD (DE),A
- Aレジスタの内容をDEレジスタで示されるメモリにストアする。HLレジスタのMOV M,Aに相当。
- SPHL / LD SP,HL
- HLレジスタの内容をSPレジスタに転送する。
- XCHG / EX DE,HL
- DEレジスタとHLレジスタの内容を交換する。
算術演算命令
- ADD r / ADD A,r
- 8ビットレジスタの内容をAレジスタに加算する。
- ADI n / ADD A,n
- 即値をAレジスタに加算する。
- ADC r / ADC A,r
- 8ビットレジスタの内容とCフラグをAレジスタに加算する。
- ACI n / ADC A,n
- 即値とCフラグをAレジスタに加算する。
- SUB r
- 8ビットレジスタの内容をAレジスタから減算する。
- 8ビット加減算命令のうちSUBのみはザイログニーモニックでもデスティネーションのAを表記しない。これはZ80に16ビットのSUB命令がなく(ADD,ADC,SBC命令はある)、対象がAレジスタであることが自明なためである。
- SUI n / SUB n
- 即値をAレジスタから減算する。
- SBB r / SBC A,r
- 8ビットレジスタの内容とCフラグ(ボロー)をAレジスタから減算する。
- SBI n / SBC A,n
- 即値とCフラグ(ボロー)をAレジスタから減算する。
- CMP r / CP r
- 8ビットレジスタの内容をAレジスタから減算するが、結果は格納しない。
- CPI n / CP n
- 即値をAレジスタから減算するが、結果は格納しない。
- INR r / INC r
- 8ビットレジスタの内容をインクリメントする。
- DCR r / DEC r
- 8ビットレジスタの内容をデクリメントする。
- INX rr / INC rr
- 16ビットレジスタの内容をインクリメントする。
- DCX rr / DEC rr
- 16ビットレジスタの内容をデクリメントする。
- DAD rr / ADD HL,rr
- 16ビットレジスタの内容をHLレジスタに加算する。
- DAA
- Aレジスタの内容をBCD補正する。
論理演算命令
- ANA r / AND r
- 8ビットレジスタの内容とAレジスタの論理積をとる。
- ANI n / AND n
- 即値とAレジスタの論理積をとる。
- ORA r / OR r
- 8ビットレジスタの内容とAレジスタの論理和をとる。
- ORI n / OR n
- 即値とAレジスタの論理和をとる。
- XRA r / XOR r
- 8ビットレジスタの内容とAレジスタの排他的論理和をとる。
- XRI n / XOR n
- 即値とAレジスタの排他的論理和をとる。
- CMA / CPL
- Aレジスタの内容を反転する。
ローテート命令
- RLC / RLCA
- Aレジスタの内容を左ローテートする。
- RRC / RRCA
- Aレジスタの内容を右ローテートする。
- RAL / RLA
- Aレジスタの内容とCフラグを連結して左ローテートする。
- RAR / RRA
- Aレジスタの内容とCフラグを連結して右ローテートする。
ジャンプ・コール・リターン命令
- JMP nn / JP nn
- 指定の番地にジャンプする。
- JNZ nn / JP NZ,nn
- Zフラグが0のとき指定の番地にジャンプする。
- JZ nn / JP Z,nn
- Zフラグが1のとき指定の番地にジャンプする。
- JNC nn / JP NC,nn
- Cフラグが0のとき指定の番地にジャンプする。
- JC nn / JP C,nn
- Cフラグが1のとき指定の番地にジャンプする。
- JPO nn / JP PO,nn
- Pフラグが0のとき指定の番地にジャンプする。
- JPE nn / JP PE,nn
- Pフラグが1のとき指定の番地にジャンプする。
- JP nn / JP P,nn
- Sフラグが0のとき指定の番地にジャンプする。
- JM nn / JP M,nn
- Sフラグが1のとき指定の番地にジャンプする。
- PCHL / JP (HL)
- HLの内容をPCに転送する。
- CALL nn
- 指定の番地をコールする。
- CNZ nn / CALL NZ,nn
- Zフラグが0のとき指定の番地をコールする。
- CZ nn / CALL Z,nn
- Zフラグが1のとき指定の番地をコールする。
- CNC nn / CALL NC,nn
- Cフラグが0のとき指定の番地をコールする。
- CC nn / CALL C,nn
- Cフラグが1のとき指定の番地をコールする。
- CPO nn / CALL PO,nn
- Pフラグが0のとき指定の番地をコールする。
- CPE nn / CALL PE,nn
- Pフラグが1のとき指定の番地をコールする。
- CP nn / CALL P,nn
- Sフラグが0のとき指定の番地をコールする。
- CM nn / CALL M,nn
- Sフラグが1のとき指定の番地をコールする。
- RST p / RST n
- (p=0~7) p*8番地をコールする。割り込み用。
- RET
- リターンする。
- RNZ / RET NZ
- Zフラグが0のときリターンする。
- RZ / RET Z
- Zフラグが1のときリターンする。
- RNC / RET NC
- Cフラグが0のときリターンする。
- RC / RET C
- Cフラグが1のときリターンする。
- RPO / RET PO
- Pフラグが0のときリターンする。
- RPE / RET PE
- Pフラグが1のときリターンする。
- RP / RET P
- Sフラグが0のときリターンする。
- RM / RET M
- Sフラグが1のときリターンする。
スタック操作命令
- PUSH rr
- 16ビットレジスタをプッシュする。SPは指定できない。
- PUSH PSW / PUSH AF
- PSWをプッシュする。
- POP rr
- 16ビットレジスタをポップする。SPは指定できない。
- POP PSW / POP AF
- PSWをポップする。
- XTHL / EX (SP),HL
- HLレジスタとスタックトップの内容を交換する。
フラグ操作命令
- STC / SCF
- Cフラグを1にする。
- CMC / CCF
- Cフラグを反転する。
入出力命令
- IN n / IN A,(n)
- I/OアドレスからAレジスタに入力する。
- OUT n / OUT (n),A
- Aレジスタの内容をI/Oアドレスに出力する。
CPU制御命令
- NOP
- 何もしない。
- HLT / HALT
- CPUを停止し、割り込みを待つ。
- DI
- 割り込みを禁止する。
- EI
- 割り込みを許可する。
NEC製のセカンドソース品 (μPD8080A) は減算時における10進補正フラグの扱いがオリジナルとは違っており、ここを全く同じにしたもの (μPD8080AF) が追加販売されている。TK-80には前者が、TK-80Eには後者が採用された。
任天堂のゲームボーイに組み込まれたカスタムプロセッサLR35902[8]
は、このプロセッサに対して近似した仕様を持っている。このプロセッサはカスタムZ80とも表記されるが、Z80で拡張された裏レジスタや、処理に時間のかかるインデックスレジスタなどの命令が削除されているため、命令セットとしてはi8080に近い仕様となっている。但し、一部の仕様はZ80を引き継いでいるほか、供給元であるシャープはZ80のセカンドソースではあるため、Z80の亜種と捉えることもできる。
鎌田, 信夫「海外技術動向―8ビット並列処理ワンチップCPU」『電子材料』第13巻第3号、工業調査会、1974年、12-13頁、ISSN 0387-0774。
嶋正利・西村恕彦・石田晴久「座談会 マイクロコンピュータの誕生 開発者 嶋 正利氏に聞く」『bit』 Vol.11 No.11、共立出版、1979年、pp.4-14。
宮内, 剛男『椎名尭慶のマイコンウォーズ : ソードに賭ける男たち』プレジデント社、1982年、161頁。