懐かしいインテル8080命令セットのメモ

懐かしのインテル8080

2017年6月、久しぶりにインテル8080マイクロプロセッサのアセンブラを書いています。

CP/Mシミュレータで懐かしのインテル8080アセンブラを使う

符号付き算術演算のオーバーフロー検出アルゴリズム

インテル8080を最初に使用した1976年は、なんの疑問も持たずマイクロプロセッサのアーキテクチャとはこんなものだと思っていました。

ベンチャー企業V社でインテル8080を使う

あれから、数十年・・・。いろんなアーキテクチャのアセンブラを経験しました。
インテル8080は、とても「癖の強い」命令セットを持ったCISC(Complex Instruction Set Computer)系のアーキテクチャということがわかりました。

久しぶりに8080命令セットを使用したので、自分なりに整理したメモを書いておきます。

intel 8080

intel 8080

レジスタ・セット

インテル8080は、8bitマイクロプロセッサです。8bit長の算術論理演算装置(ALU : Arithmetic Logic Unit)と、次のレジスタを持ちます。

  • アキュムレータ : A (8bit)
  • フラグレジスタ : PSW (8bit)
  • 6つの汎用レジスタ : B,C,D,E,H,L (8bit)
  • スタックポインタ : SP (16bit)
  • プログラムカウンタ : PC (16bit)
i8080レジスタ

i8080レジスタ

アキュームレータ Aレジスタは、演算結果を格納します。フラグレジスタは、ALUの演算結果の状態を表します。

アドレスは、16bit長で64KBのメモリー空間を持ちます。汎用レジスタは、2つのレジスタを16bit長のペアレジスタ BC,DE,HLとして扱うこともできます。HLレジスタは、メモリポインタで間接参照して擬似的にMレジスタとして使用します。

SPレジスタはメモリに16bitデータのスタックを構成し、PUSH命令でスタック[--SP]に入れ、POP命令でスタック[SP++]から取り出します。

転送系命令

レジスタ間、およびレジスタとメモリ間の転送に関する命令を示します。

i8080 転送命令

i8080 転送命令

 

分類 命令表記 説明
転送 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

演算系命令

算術演算、論理演算に関する命令を示します。

i8080 ALU命令

i8080 ALU命令

 

分類 命令表記 説明
加算 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レジスタを左方向または右方向にローテイトします。

i8080 SHIFT命令

i8080 SHIFT命令

 

分類 命令表記 説明
ローテイト左 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プロセッサと比較すると癖のある命令セットです。レジスタの特長を活かして、パズルを解くようにエレガントなコードを書き使いこなすことが当時の喜びだったような気がします。