懐かしのインテル8080
2017年6月、久しぶりにインテル8080マイクロプロセッサのアセンブラを書いています。
インテル8080を最初に使用した1976年は、なんの疑問も持たずマイクロプロセッサのアーキテクチャとはこんなものだと思っていました。
あれから、数十年・・・。いろんなアーキテクチャのアセンブラを経験しました。
インテル8080は、とても「癖の強い」命令セットを持ったCISC(Complex Instruction Set Computer)系のアーキテクチャということがわかりました。
久しぶりに8080命令セットを使用したので、自分なりに整理したメモを書いておきます。
レジスタ・セット
インテル8080は、8bitマイクロプロセッサです。8bit長の算術論理演算装置(ALU : Arithmetic Logic Unit)と、次のレジスタを持ちます。
- アキュムレータ : A (8bit)
- フラグレジスタ : PSW (8bit)
- 6つの汎用レジスタ : B,C,D,E,H,L (8bit)
- スタックポインタ : SP (16bit)
- プログラムカウンタ : PC (16bit)
アキュームレータ Aレジスタは、演算結果を格納します。フラグレジスタは、ALUの演算結果の状態を表します。
アドレスは、16bit長で64KBのメモリー空間を持ちます。汎用レジスタは、2つのレジスタを16bit長のペアレジスタ BC,DE,HLとして扱うこともできます。HLレジスタは、メモリポインタで間接参照して擬似的にMレジスタとして使用します。
SPレジスタはメモリに16bitデータのスタックを構成し、PUSH命令でスタック[--SP]に入れ、POP命令でスタック[SP++]から取り出します。
転送系命令
レジスタ間、およびレジスタとメモリ間の転送に関する命令を示します。
分類 | 命令表記 | 説明 |
---|---|---|
転送 | MOV d,s | d ← s |
MOV d,M | d ← [HL] | |
MOV M,s | [HL] ← s | |
SPHL | SP ← HL | |
即値設定 | MVI d,n | d ← n |
MVI M,n | [HL]← n | |
LXI rr,nn | rr ← nn | |
Load Store | LDA adrs | A ← [adrs] |
STA adrs | [adrs] ← A | |
LDAX rm | A←[rm] | |
STAX rm | [rm]←A | |
LHLD adrs | HL ← [adrs] | |
SHLD adrs | [adrs] ← HL | |
交換 | XCHG | DE ⇔ HL |
【凡例】
d | A,B,C,D,E,H,L |
s | A,B,C,D,E,H,L |
rr | B,D,H,SP |
rm | B,D |
n | Immediate 8bit |
nn | Immediate 16bit |
adrs | Address |
演算系命令
算術演算、論理演算に関する命令を示します。
分類 | 命令表記 | 説明 |
---|---|---|
加算 | ADD r | A ← A + r |
ADD M | A ← A + [HL] | |
ADI n | A ← A + n | |
ADC r | A ← A + r + CY | |
ADC M | A ← A + [HL] + CY | |
ACI n | A ← A + n + CY | |
減算 | SUB r | A ← A – r |
SUB M | A ← A – [HL] | |
SUI n | A ← A – n | |
SBB r | A ← A – r – CY | |
SBB M | A ← A – [HL] – CY | |
SBI n | A ← A – n – CY | |
論理積 | ANA r | A ← A AND r |
ANA M | A ← A AND [HL] | |
ANI n | A ← A AND n | |
論理和 | ORA r | A ← A OR r |
ORA M | A ← A OR [HL] | |
ORI n | A ← A OR n | |
排他的論理和 | XRA r | A ← A XOR r |
XRA M | A ← A XOR [HL] | |
XRI n | A ← A XOR n | |
否定 | CMA | A ← Complement A |
比較 | CMP r | Flag ← A – r |
CMP M | Flag ← A – [HL] | |
CPI n | Flag ← A – n | |
増加 | INR r | r ← r + 1 |
INR M | [HL] ← [HL] + 1 | |
減少 | DCR r | r ← r – 1 |
DCR M | [HL] ← [HL] – 1 | |
増加16bit | INX rr | rr ← rr + 1 |
減少16bit | DCX rr | rr ← rr – 1 |
加算16bit | DAD rr | HL ← HL + rr |
10進補正 | DAA | A ← A Decimal Adjust Acc |
【凡例】
r | A,B,C,D,E,H,L |
rr | B,D,H,SP |
n | Immediate 8bit |
CY | Carry Flag |
シフト系命令
8080にはシフト命令はありません。ローテイト命令でAレジスタを左方向または右方向にローテイトします。
分類 | 命令表記 | 説明 |
---|---|---|
ローテイト左 | RLC | Rotate A Left |
RAL | Rotate A Left through carry | |
ローテイト右 | RRC | Rotate A Right |
RAR | Rotate A Right through carry |
ジャンプ系命令
ジャンプ命令、サブルーチン呼び出し、復帰命令を示します。
分類 | 命令表記 | 説明 |
---|---|---|
ジャンプ | JMP adrs | PC ← adrs |
Jccc adrs | if Flag(ccc) then JMP | |
PCHL | PC ← HL | |
コール | CALL adrs | [SP--] ← PC ; PC ← adrs |
Cccc adrs | if Flag(ccc) then CALL | |
リターン | RET | PC ← [SP++] |
Rccc | if Flag(ccc) then RET |
【凡例】
ccc | NZ,Z,NC,C,PO,PE,P,M |
adrs | Address |
スタック系命令
スタックに関する命令を示します。
分類 | 命令表記 | 説明 |
---|---|---|
スタック | PUSH rp | [--SP] ← rp |
POP rp | rp ← [SP++] | |
XTHL | HL ⇔ [SP] |
【凡例】
rp | B,D,H,PSW |
その他命令
その他命令を示します。
Carry操作 | CMC | CY ← Complement CY |
STC | CY ← 1 | |
NOP | NOP | No operation |
停止 | HLT | Halt processor |
割り込み制御 | DI | Disable Interrupts |
EI | Enable Interrupts | |
リスタート | RST v | Restart CALL v*8 |
入出力 | IN io | A ← PORT[io] |
OUT io | PORT[io] ← A |
【凡例】
CY | Carry Flag |
v | 3bit Vector(0..7) |
io | 8bit port Address |
最後に
インテル8080プロセッサの命令セットは、直交性の高い命令体系のモトローラ6809プロセッサと比較すると癖のある命令セットです。レジスタの特長を活かして、パズルを解くようにエレガントなコードを書き使いこなすことが当時の喜びだったような気がします。