Intel 8080

Intel 8080（インテル 8080、i8080）は、インテルによって開発された8ビットマイクロプロセッサであり、1974年4月に発表された。同社の8008の後継に当たるが命令の互換性はない。8080の命令は、後に拡張され、ザイログのZ80や日立製作所の64180に継承された。初期のパーソナルコンピュータの多くに採用され、モトローラの6800やモステクノロジーの6502（Apple、コモドール、ファミコン、他）と覇を競った。 i8080のロジック設計の中心となったのはビジコン退社後、リコーを経てインテルに入社した嶋正利だった。開発者の特権として彼はフォトマスク余白に嶋家の家紋である引両紋（丸に三つ引）を刻んだ。 8080は、アキュムレータ1つを含む、7つの汎用レジスタ（8ビット）を持つ。これはたとえば6800と比べて本数としては多い。また、二つの8ビットレジスタを併せて、BC、DE、HLの3つの16ビットレジスタとして扱う命令もある。 （注）命令中では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アドレスに出力する。 NOP 何もしない。 HLT / HALT CPUを停止し、割り込みを待つ。 DI 割り込みを禁止する。 EI 割り込みを許可する。 8080はグラウンドが十分に取られていないという物理設計上のミスにより、大電流が流れるTTLデバイスと使用するには問題があったため、TTL-LS用として発売された。後にグラウンド線の幅を太くして標準TTLに対応させたものが8080Aとして発売された。 これには逸話がある。8080の開発者の一人であった嶋正利は、8080のレイアウトを完成させた後、休暇を取って一時的に日本へ帰国。嶋は休暇明けに8080の特性評価を行う予定だった。しかし、嶋がインテルに戻った頃には既に営業部の判断で8080が4万個製造されていた。そのため、8080はTTL-LS用としてしばらくの間販売されるに至った。 NEC製のセカンドソース品 (μPD8080A) は減算時における10進補正フラグの扱いがオリジナルとは違っており、ここを全く同じにしたもの (μPD8080AF) が追加販売されている。TK-80には前者が、TK-80Eには後者が採用された。 任天堂のゲームボーイに組み込まれたカスタムプロセッサLR35902 は、このプロセッサに対して近似した仕様を持っている。このプロセッサはカスタムZ80とも表記されるが、Z80で拡張された裏レジスタや、処理に時間のかかるインデックスレジスタなどの命令が削除されているため、命令セットとしてはi8080に近い仕様となっている。但し、一部の仕様はZ80を引き継いでいるほか、供給元であるシャープはZ80のセカンドソースではあるため、Z80の亜種と捉えることもできる。 OS デジタルリサーチのCP/M (CP/M-80) が有名