命令リファレンス

表記規則

表記意味
rレジスタ(B, C, D, E, H, L, M, A)。Mは[HL](HLが指すメモリ)を意味します。
rpレジスタペア(B=BC, D=DE, H=HL, SP)。PUSH/POPではSPの代わりにPSW(A+フラグ)を使用します。
d88ビット即値データ(命令の次のバイト)
d1616ビット即値データ(命令の次の2バイト、リトルエンディアン)
a1616ビットアドレス(命令の次の2バイト、リトルエンディアン)

レジスタのビットパターン

オペコード内でレジスタを指定する3ビットのパターンです。

ビットパターンレジスタ
000B
001C
010D
011E
100H
101L
110M(メモリ参照)
111A

条件コード

条件付き命令で使用する条件コードです。

条件意味フラグ
NZ非ゼロZ = 0
ZゼロZ = 1
NCキャリーなしCY = 0
CキャリーありCY = 1
POパリティ奇数P = 0
PEパリティ偶数P = 1
P正(プラス)S = 0
M負(マイナス)S = 1

フラグ表記

記号意味
*演算結果に応じて更新されます。
00にクリアされます。
11にセットされます。
-変化しません。

データ転送命令

MOV r1, r2

ソースレジスタの値をデスティネーションレジスタにコピーします。

r1 ← r2
オペコードバイト数フラグ SZACPCY
0x40〜0x7F(0x76を除く)1-----

オペコードのビットパターンは 01DDDSSS です。DDD=デスティネーション、SSS=ソースです。

MVI r, d8

8ビット即値をレジスタにロードします。

r ← d8
オペコードバイト数フラグ SZACPCY
0x06(B), 0x0E(C), 0x16(D), 0x1E(E), 0x26(H), 0x2E(L), 0x36(M), 0x3E(A)2-----

LXI rp, d16

16ビット即値をレジスタペアにロードします。

rp ← d16
オペコードバイト数フラグ SZACPCY
0x01(BC), 0x11(DE), 0x21(HL), 0x31(SP)3-----

LDA a16

指定アドレスのメモリ内容をAレジスタにロードします。

A ← [a16]
オペコードバイト数フラグ SZACPCY
0x3A3-----

STA a16

Aレジスタの値を指定アドレスのメモリに格納します。

[a16] ← A
オペコードバイト数フラグ SZACPCY
0x323-----

LHLD a16

指定アドレスから2バイトをHLレジスタペアにロードします。

L ← [a16], H ← [a16 + 1]
オペコードバイト数フラグ SZACPCY
0x2A3-----

SHLD a16

HLレジスタペアの値を指定アドレスに格納します。

[a16] ← L, [a16 + 1] ← H
オペコードバイト数フラグ SZACPCY
0x223-----

LDAX rp

レジスタペアが指すメモリアドレスの内容をAレジスタにロードします。

A ← [rp]
オペコードバイト数フラグ SZACPCY
0x0A(BC), 0x1A(DE)1-----

STAX rp

Aレジスタの値をレジスタペアが指すメモリアドレスに格納します。

[rp] ← A
オペコードバイト数フラグ SZACPCY
0x02(BC), 0x12(DE)1-----

XCHG

DEレジスタペアとHLレジスタペアの値を交換します。

DE ↔ HL
オペコードバイト数フラグ SZACPCY
0xEB1-----

XTHL

HLレジスタペアとスタックトップの値を交換します。

L ↔ [SP], H ↔ [SP + 1]
オペコードバイト数フラグ SZACPCY
0xE31-----

SPHL

HLレジスタペアの値をSPにコピーします。

SP ← HL
オペコードバイト数フラグ SZACPCY
0xF91-----

算術演算命令

ADD r

Aレジスタにレジスタの値を加算します。

A ← A + r
オペコードバイト数フラグ SZACPCY
0x80(B), 0x81(C), 0x82(D), 0x83(E), 0x84(H), 0x85(L), 0x86(M), 0x87(A)1*****

ADC r

Aレジスタにレジスタの値とキャリーフラグを加算します。

A ← A + r + CY
オペコードバイト数フラグ SZACPCY
0x88(B), 0x89(C), 0x8A(D), 0x8B(E), 0x8C(H), 0x8D(L), 0x8E(M), 0x8F(A)1*****

ADI d8

Aレジスタに8ビット即値を加算します。

A ← A + d8
オペコードバイト数フラグ SZACPCY
0xC62*****

ACI d8

Aレジスタに8ビット即値とキャリーフラグを加算します。

A ← A + d8 + CY
オペコードバイト数フラグ SZACPCY
0xCE2*****

SUB r

Aレジスタからレジスタの値を減算します。

A ← A - r
オペコードバイト数フラグ SZACPCY
0x90(B), 0x91(C), 0x92(D), 0x93(E), 0x94(H), 0x95(L), 0x96(M), 0x97(A)1*****

SBB r

Aレジスタからレジスタの値とキャリーフラグを減算します。

A ← A - r - CY
オペコードバイト数フラグ SZACPCY
0x98(B), 0x99(C), 0x9A(D), 0x9B(E), 0x9C(H), 0x9D(L), 0x9E(M), 0x9F(A)1*****

SUI d8

Aレジスタから8ビット即値を減算します。

A ← A - d8
オペコードバイト数フラグ SZACPCY
0xD62*****

SBI d8

Aレジスタから8ビット即値とキャリーフラグを減算します。

A ← A - d8 - CY
オペコードバイト数フラグ SZACPCY
0xDE2*****

INR r

レジスタの値を1増加します。CYフラグは変化しません。

r ← r + 1
オペコードバイト数フラグ SZACPCY
0x04(B), 0x0C(C), 0x14(D), 0x1C(E), 0x24(H), 0x2C(L), 0x34(M), 0x3C(A)1****-

DCR r

レジスタの値を1減少します。CYフラグは変化しません。

r ← r - 1
オペコードバイト数フラグ SZACPCY
0x05(B), 0x0D(C), 0x15(D), 0x1D(E), 0x25(H), 0x2D(L), 0x35(M), 0x3D(A)1****-

INX rp

レジスタペアの値を1増加します。フラグは変化しません。

rp ← rp + 1
オペコードバイト数フラグ SZACPCY
0x03(BC), 0x13(DE), 0x23(HL), 0x33(SP)1-----

DCX rp

レジスタペアの値を1減少します。フラグは変化しません。

rp ← rp - 1
オペコードバイト数フラグ SZACPCY
0x0B(BC), 0x1B(DE), 0x2B(HL), 0x3B(SP)1-----

DAD rp

HLレジスタペアにレジスタペアの値を加算します(16ビット加算)。CYのみ更新されます。

HL ← HL + rp
オペコードバイト数フラグ SZACPCY
0x09(BC), 0x19(DE), 0x29(HL), 0x39(SP)1----*

DAA

Aレジスタの値をBCD(2進化10進数)に補正します。

加算命令の後に使用し、結果をBCD形式に調整します。補正の条件は以下の通りです。

オペコードバイト数フラグ SZACPCY
0x271*****

論理演算命令

ANA r

Aレジスタとレジスタの値のビットごとのANDを取ります。

A ← A AND r
オペコードバイト数フラグ SZACPCY
0xA0(B), 0xA1(C), 0xA2(D), 0xA3(E), 0xA4(H), 0xA5(L), 0xA6(M), 0xA7(A)1**1*0

XRA r

Aレジスタとレジスタの値のビットごとの排他的ORを取ります。

A ← A XOR r
オペコードバイト数フラグ SZACPCY
0xA8(B), 0xA9(C), 0xAA(D), 0xAB(E), 0xAC(H), 0xAD(L), 0xAE(M), 0xAF(A)1**0*0

ORA r

Aレジスタとレジスタの値のビットごとのORを取ります。

A ← A OR r
オペコードバイト数フラグ SZACPCY
0xB0(B), 0xB1(C), 0xB2(D), 0xB3(E), 0xB4(H), 0xB5(L), 0xB6(M), 0xB7(A)1**0*0

CMP r

Aレジスタからレジスタの値を減算し、フラグのみを更新します。Aレジスタの値は変化しません。

A - r(結果は破棄)

A = r のとき Z = 1、A < r のとき CY = 1 となります。

オペコードバイト数フラグ SZACPCY
0xB8(B), 0xB9(C), 0xBA(D), 0xBB(E), 0xBC(H), 0xBD(L), 0xBE(M), 0xBF(A)1*****

ANI d8

Aレジスタと8ビット即値のビットごとのANDを取ります。

A ← A AND d8
オペコードバイト数フラグ SZACPCY
0xE62**1*0

XRI d8

Aレジスタと8ビット即値のビットごとの排他的ORを取ります。

A ← A XOR d8
オペコードバイト数フラグ SZACPCY
0xEE2**0*0

ORI d8

Aレジスタと8ビット即値のビットごとのORを取ります。

A ← A OR d8
オペコードバイト数フラグ SZACPCY
0xF62**0*0

CPI d8

Aレジスタから8ビット即値を減算し、フラグのみを更新します。Aレジスタの値は変化しません。

A - d8(結果は破棄)

A = d8 のとき Z = 1、A < d8 のとき CY = 1 となります。

オペコードバイト数フラグ SZACPCY
0xFE2*****

RLC

Aレジスタを左に1ビット回転します。ビット7はビット0とCYフラグにコピーされます。

CY ← A.7, A ← (A << 1) | A.7
オペコードバイト数フラグ SZACPCY
0x071----*

RRC

Aレジスタを右に1ビット回転します。ビット0はビット7とCYフラグにコピーされます。

CY ← A.0, A ← (A >> 1) | (A.0 << 7)
オペコードバイト数フラグ SZACPCY
0x0F1----*

RAL

Aレジスタをキャリー経由で左に1ビット回転します。ビット7がCYに、旧CYがビット0に入ります。

temp ← A.7, A ← (A << 1) | CY, CY ← temp
オペコードバイト数フラグ SZACPCY
0x171----*

RAR

Aレジスタをキャリー経由で右に1ビット回転します。ビット0がCYに、旧CYがビット7に入ります。

temp ← A.0, A ← (A >> 1) | (CY << 7), CY ← temp
オペコードバイト数フラグ SZACPCY
0x1F1----*

CMA

Aレジスタの全ビットを反転します(1の補数)。

A ← NOT A
オペコードバイト数フラグ SZACPCY
0x2F1-----

STC

CYフラグを1にセットします。

CY ← 1
オペコードバイト数フラグ SZACPCY
0x371----1

CMC

CYフラグを反転します。

CY ← NOT CY
オペコードバイト数フラグ SZACPCY
0x3F1----*

分岐命令

JMP a16

指定アドレスに無条件ジャンプします。

PC ← a16
オペコードバイト数フラグ SZACPCY
0xC33-----

Jcond a16(条件付きジャンプ)

条件が成立した場合、指定アドレスにジャンプします。不成立の場合は次の命令に進みます。

if (条件成立) then PC ← a16
ニモニックオペコード条件
JNZ0xC2Z = 0
JZ0xCAZ = 1
JNC0xD2CY = 0
JC0xDACY = 1
JPO0xE2P = 0
JPE0xEAP = 1
JP0xF2S = 0
JM0xFAS = 1

全て3バイト命令です。フラグは変化しません。

CALL a16

サブルーチンを呼び出します。戻りアドレス(次の命令のアドレス)をスタックにプッシュし、指定アドレスにジャンプします。

SP ← SP - 2, [SP] ← PC, PC ← a16
オペコードバイト数フラグ SZACPCY
0xCD3-----

Ccond a16(条件付きコール)

条件が成立した場合、サブルーチンを呼び出します。不成立の場合は次の命令に進みます。

if (条件成立) then SP ← SP - 2, [SP] ← PC, PC ← a16
ニモニックオペコード条件
CNZ0xC4Z = 0
CZ0xCCZ = 1
CNC0xD4CY = 0
CC0xDCCY = 1
CPO0xE4P = 0
CPE0xECP = 1
CP0xF4S = 0
CM0xFCS = 1

全て3バイト命令です。フラグは変化しません。

RET

サブルーチンから復帰します。スタックから戻りアドレスをポップし、そのアドレスにジャンプします。

PC ← [SP], SP ← SP + 2
オペコードバイト数フラグ SZACPCY
0xC91-----

Rcond(条件付きリターン)

条件が成立した場合、サブルーチンから復帰します。不成立の場合は次の命令に進みます。

if (条件成立) then PC ← [SP], SP ← SP + 2
ニモニックオペコード条件
RNZ0xC0Z = 0
RZ0xC8Z = 1
RNC0xD0CY = 0
RC0xD8CY = 1
RPO0xE0P = 0
RPE0xE8P = 1
RP0xF0S = 0
RM0xF8S = 1

全て1バイト命令です。フラグは変化しません。

RST n

1バイトのCALL命令です。戻りアドレスをスタックにプッシュし、n × 8 のアドレスにジャンプします。

SP ← SP - 2, [SP] ← PC, PC ← n × 8
ニモニックオペコードジャンプ先
RST 00xC70x0000
RST 10xCF0x0008
RST 20xD70x0010
RST 30xDF0x0018
RST 40xE70x0020
RST 50xEF0x0028
RST 60xF70x0030
RST 70xFF0x0038

フラグは変化しません。

PCHL

HLレジスタペアの値をPCにロードします。HLが指すアドレスにジャンプします。

PC ← HL
オペコードバイト数フラグ SZACPCY
0xE91-----

スタック命令

PUSH rp

レジスタペアの値をスタックにプッシュします。SPを2デクリメントし、上位バイト、下位バイトの順で格納します。

SP ← SP - 2, [SP+1] ← rp上位, [SP] ← rp下位
オペコードバイト数フラグ SZACPCY
0xC5(BC), 0xD5(DE), 0xE5(HL), 0xF5(PSW)1-----

PUSH PSWでは、Aレジスタ(上位)とフラグレジスタ(下位)がプッシュされます。

POP rp

スタックからレジスタペアに値をポップします。下位バイト、上位バイトの順で読み出し、SPを2インクリメントします。

rp下位 ← [SP], rp上位 ← [SP+1], SP ← SP + 2
オペコードバイト数フラグ SZACPCY
0xC1(BC), 0xD1(DE), 0xE1(HL), 0xF1(PSW)1-----

POP PSWでは、フラグレジスタ(下位)とAレジスタ(上位)が復元されます。全フラグが復元されるため、フラグの値が変化します。

制御命令

NOP

何も行いません。

オペコードバイト数フラグ SZACPCY
0x001-----

HLT

CPUを停止します。HLT命令で停止した状態からCPUを再開する方法はありません。再開するにはページをリロードしてください。

オペコードバイト数フラグ SZACPCY
0x761-----

EI

割り込みを許可します。

INTE ← 1
オペコードバイト数フラグ SZACPCY
0xFB1-----

現在、割り込みソースは実装されていません。そのため、現状のEI命令は特に何もしません。

DI

割り込みを禁止します。

INTE ← 0
オペコードバイト数フラグ SZACPCY
0xF31-----

現在、割り込みソースは実装されていません。そのため、現状のDI命令は特に何もしません。

入出力命令

OUT d8

Aレジスタの値を指定ポートに出力します。

port[d8] ← A
オペコードバイト数フラグ SZACPCY
0xD32-----

現在の実装では、OUT命令は何もしません。周辺機器との連携は今後追加予定です。

IN d8

指定ポートから値を読み取り、Aレジスタに格納します。

A ← port[d8]
オペコードバイト数フラグ SZACPCY
0xDB2-----

現在の実装では、IN命令は常に0xFFを返します。周辺機器との連携は今後追加予定です。