命令リファレンス
表記規則
| 表記 | 意味 |
|---|---|
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+フラグ)を使用します。 |
d8 | 8ビット即値データ(命令の次のバイト) |
d16 | 16ビット即値データ(命令の次の2バイト、リトルエンディアン) |
a16 | 16ビットアドレス(命令の次の2バイト、リトルエンディアン) |
レジスタのビットパターン
オペコード内でレジスタを指定する3ビットのパターンです。
| ビットパターン | レジスタ |
|---|---|
| 000 | B |
| 001 | C |
| 010 | D |
| 011 | E |
| 100 | H |
| 101 | L |
| 110 | M(メモリ参照) |
| 111 | A |
条件コード
条件付き命令で使用する条件コードです。
| 条件 | 意味 | フラグ |
|---|---|---|
| NZ | 非ゼロ | Z = 0 |
| Z | ゼロ | Z = 1 |
| NC | キャリーなし | CY = 0 |
| C | キャリーあり | CY = 1 |
| PO | パリティ奇数 | P = 0 |
| PE | パリティ偶数 | P = 1 |
| P | 正(プラス) | S = 0 |
| M | 負(マイナス) | S = 1 |
フラグ表記
| 記号 | 意味 |
|---|---|
| * | 演算結果に応じて更新されます。 |
| 0 | 0にクリアされます。 |
| 1 | 1にセットされます。 |
| - | 変化しません。 |
データ転送命令
MOV r1, r2
ソースレジスタの値をデスティネーションレジスタにコピーします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x40〜0x7F(0x76を除く) | 1 | - | - | - | - | - |
オペコードのビットパターンは 01DDDSSS です。DDD=デスティネーション、SSS=ソースです。
MVI r, d8
8ビット即値をレジスタにロードします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x06(B), 0x0E(C), 0x16(D), 0x1E(E), 0x26(H), 0x2E(L), 0x36(M), 0x3E(A) | 2 | - | - | - | - | - |
LXI rp, d16
16ビット即値をレジスタペアにロードします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x01(BC), 0x11(DE), 0x21(HL), 0x31(SP) | 3 | - | - | - | - | - |
LDA a16
指定アドレスのメモリ内容をAレジスタにロードします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x3A | 3 | - | - | - | - | - |
STA a16
Aレジスタの値を指定アドレスのメモリに格納します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x32 | 3 | - | - | - | - | - |
LHLD a16
指定アドレスから2バイトをHLレジスタペアにロードします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x2A | 3 | - | - | - | - | - |
SHLD a16
HLレジスタペアの値を指定アドレスに格納します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x22 | 3 | - | - | - | - | - |
LDAX rp
レジスタペアが指すメモリアドレスの内容をAレジスタにロードします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x0A(BC), 0x1A(DE) | 1 | - | - | - | - | - |
STAX rp
Aレジスタの値をレジスタペアが指すメモリアドレスに格納します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x02(BC), 0x12(DE) | 1 | - | - | - | - | - |
XCHG
DEレジスタペアとHLレジスタペアの値を交換します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xEB | 1 | - | - | - | - | - |
XTHL
HLレジスタペアとスタックトップの値を交換します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xE3 | 1 | - | - | - | - | - |
SPHL
HLレジスタペアの値をSPにコピーします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xF9 | 1 | - | - | - | - | - |
算術演算命令
ADD r
Aレジスタにレジスタの値を加算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x80(B), 0x81(C), 0x82(D), 0x83(E), 0x84(H), 0x85(L), 0x86(M), 0x87(A) | 1 | * | * | * | * | * |
ADC r
Aレジスタにレジスタの値とキャリーフラグを加算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x88(B), 0x89(C), 0x8A(D), 0x8B(E), 0x8C(H), 0x8D(L), 0x8E(M), 0x8F(A) | 1 | * | * | * | * | * |
ADI d8
Aレジスタに8ビット即値を加算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xC6 | 2 | * | * | * | * | * |
ACI d8
Aレジスタに8ビット即値とキャリーフラグを加算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xCE | 2 | * | * | * | * | * |
SUB r
Aレジスタからレジスタの値を減算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x90(B), 0x91(C), 0x92(D), 0x93(E), 0x94(H), 0x95(L), 0x96(M), 0x97(A) | 1 | * | * | * | * | * |
SBB r
Aレジスタからレジスタの値とキャリーフラグを減算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x98(B), 0x99(C), 0x9A(D), 0x9B(E), 0x9C(H), 0x9D(L), 0x9E(M), 0x9F(A) | 1 | * | * | * | * | * |
SUI d8
Aレジスタから8ビット即値を減算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xD6 | 2 | * | * | * | * | * |
SBI d8
Aレジスタから8ビット即値とキャリーフラグを減算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xDE | 2 | * | * | * | * | * |
INR r
レジスタの値を1増加します。CYフラグは変化しません。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x04(B), 0x0C(C), 0x14(D), 0x1C(E), 0x24(H), 0x2C(L), 0x34(M), 0x3C(A) | 1 | * | * | * | * | - |
DCR r
レジスタの値を1減少します。CYフラグは変化しません。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x05(B), 0x0D(C), 0x15(D), 0x1D(E), 0x25(H), 0x2D(L), 0x35(M), 0x3D(A) | 1 | * | * | * | * | - |
INX rp
レジスタペアの値を1増加します。フラグは変化しません。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x03(BC), 0x13(DE), 0x23(HL), 0x33(SP) | 1 | - | - | - | - | - |
DCX rp
レジスタペアの値を1減少します。フラグは変化しません。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x0B(BC), 0x1B(DE), 0x2B(HL), 0x3B(SP) | 1 | - | - | - | - | - |
DAD rp
HLレジスタペアにレジスタペアの値を加算します(16ビット加算)。CYのみ更新されます。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x09(BC), 0x19(DE), 0x29(HL), 0x39(SP) | 1 | - | - | - | - | * |
DAA
Aレジスタの値をBCD(2進化10進数)に補正します。
加算命令の後に使用し、結果をBCD形式に調整します。補正の条件は以下の通りです。
- Aの下位4ビットが9より大きい、またはACフラグが1の場合、Aに0x06を加算します。
- 補正後のAの上位4ビットが9より大きい、またはCYフラグが1の場合、Aに0x60を加算します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x27 | 1 | * | * | * | * | * |
論理演算命令
ANA r
Aレジスタとレジスタの値のビットごとのANDを取ります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xA0(B), 0xA1(C), 0xA2(D), 0xA3(E), 0xA4(H), 0xA5(L), 0xA6(M), 0xA7(A) | 1 | * | * | 1 | * | 0 |
XRA r
Aレジスタとレジスタの値のビットごとの排他的ORを取ります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xA8(B), 0xA9(C), 0xAA(D), 0xAB(E), 0xAC(H), 0xAD(L), 0xAE(M), 0xAF(A) | 1 | * | * | 0 | * | 0 |
ORA r
Aレジスタとレジスタの値のビットごとのORを取ります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 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 のとき Z = 1、A < r のとき CY = 1 となります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xB8(B), 0xB9(C), 0xBA(D), 0xBB(E), 0xBC(H), 0xBD(L), 0xBE(M), 0xBF(A) | 1 | * | * | * | * | * |
ANI d8
Aレジスタと8ビット即値のビットごとのANDを取ります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xE6 | 2 | * | * | 1 | * | 0 |
XRI d8
Aレジスタと8ビット即値のビットごとの排他的ORを取ります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xEE | 2 | * | * | 0 | * | 0 |
ORI d8
Aレジスタと8ビット即値のビットごとのORを取ります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xF6 | 2 | * | * | 0 | * | 0 |
CPI d8
Aレジスタから8ビット即値を減算し、フラグのみを更新します。Aレジスタの値は変化しません。
A = d8 のとき Z = 1、A < d8 のとき CY = 1 となります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xFE | 2 | * | * | * | * | * |
RLC
Aレジスタを左に1ビット回転します。ビット7はビット0とCYフラグにコピーされます。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x07 | 1 | - | - | - | - | * |
RRC
Aレジスタを右に1ビット回転します。ビット0はビット7とCYフラグにコピーされます。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x0F | 1 | - | - | - | - | * |
RAL
Aレジスタをキャリー経由で左に1ビット回転します。ビット7がCYに、旧CYがビット0に入ります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x17 | 1 | - | - | - | - | * |
RAR
Aレジスタをキャリー経由で右に1ビット回転します。ビット0がCYに、旧CYがビット7に入ります。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x1F | 1 | - | - | - | - | * |
CMA
Aレジスタの全ビットを反転します(1の補数)。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x2F | 1 | - | - | - | - | - |
STC
CYフラグを1にセットします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x37 | 1 | - | - | - | - | 1 |
CMC
CYフラグを反転します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x3F | 1 | - | - | - | - | * |
分岐命令
JMP a16
指定アドレスに無条件ジャンプします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xC3 | 3 | - | - | - | - | - |
Jcond a16(条件付きジャンプ)
条件が成立した場合、指定アドレスにジャンプします。不成立の場合は次の命令に進みます。
| ニモニック | オペコード | 条件 |
|---|---|---|
| JNZ | 0xC2 | Z = 0 |
| JZ | 0xCA | Z = 1 |
| JNC | 0xD2 | CY = 0 |
| JC | 0xDA | CY = 1 |
| JPO | 0xE2 | P = 0 |
| JPE | 0xEA | P = 1 |
| JP | 0xF2 | S = 0 |
| JM | 0xFA | S = 1 |
全て3バイト命令です。フラグは変化しません。
CALL a16
サブルーチンを呼び出します。戻りアドレス(次の命令のアドレス)をスタックにプッシュし、指定アドレスにジャンプします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xCD | 3 | - | - | - | - | - |
Ccond a16(条件付きコール)
条件が成立した場合、サブルーチンを呼び出します。不成立の場合は次の命令に進みます。
| ニモニック | オペコード | 条件 |
|---|---|---|
| CNZ | 0xC4 | Z = 0 |
| CZ | 0xCC | Z = 1 |
| CNC | 0xD4 | CY = 0 |
| CC | 0xDC | CY = 1 |
| CPO | 0xE4 | P = 0 |
| CPE | 0xEC | P = 1 |
| CP | 0xF4 | S = 0 |
| CM | 0xFC | S = 1 |
全て3バイト命令です。フラグは変化しません。
RET
サブルーチンから復帰します。スタックから戻りアドレスをポップし、そのアドレスにジャンプします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xC9 | 1 | - | - | - | - | - |
Rcond(条件付きリターン)
条件が成立した場合、サブルーチンから復帰します。不成立の場合は次の命令に進みます。
| ニモニック | オペコード | 条件 |
|---|---|---|
| RNZ | 0xC0 | Z = 0 |
| RZ | 0xC8 | Z = 1 |
| RNC | 0xD0 | CY = 0 |
| RC | 0xD8 | CY = 1 |
| RPO | 0xE0 | P = 0 |
| RPE | 0xE8 | P = 1 |
| RP | 0xF0 | S = 0 |
| RM | 0xF8 | S = 1 |
全て1バイト命令です。フラグは変化しません。
RST n
1バイトのCALL命令です。戻りアドレスをスタックにプッシュし、n × 8 のアドレスにジャンプします。
| ニモニック | オペコード | ジャンプ先 |
|---|---|---|
| RST 0 | 0xC7 | 0x0000 |
| RST 1 | 0xCF | 0x0008 |
| RST 2 | 0xD7 | 0x0010 |
| RST 3 | 0xDF | 0x0018 |
| RST 4 | 0xE7 | 0x0020 |
| RST 5 | 0xEF | 0x0028 |
| RST 6 | 0xF7 | 0x0030 |
| RST 7 | 0xFF | 0x0038 |
フラグは変化しません。
PCHL
HLレジスタペアの値をPCにロードします。HLが指すアドレスにジャンプします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xE9 | 1 | - | - | - | - | - |
スタック命令
PUSH rp
レジスタペアの値をスタックにプッシュします。SPを2デクリメントし、上位バイト、下位バイトの順で格納します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xC5(BC), 0xD5(DE), 0xE5(HL), 0xF5(PSW) | 1 | - | - | - | - | - |
PUSH PSWでは、Aレジスタ(上位)とフラグレジスタ(下位)がプッシュされます。
POP rp
スタックからレジスタペアに値をポップします。下位バイト、上位バイトの順で読み出し、SPを2インクリメントします。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xC1(BC), 0xD1(DE), 0xE1(HL), 0xF1(PSW) | 1 | - | - | - | - | - |
POP PSWでは、フラグレジスタ(下位)とAレジスタ(上位)が復元されます。全フラグが復元されるため、フラグの値が変化します。
制御命令
NOP
何も行いません。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x00 | 1 | - | - | - | - | - |
HLT
CPUを停止します。HLT命令で停止した状態からCPUを再開する方法はありません。再開するにはページをリロードしてください。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0x76 | 1 | - | - | - | - | - |
EI
割り込みを許可します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xFB | 1 | - | - | - | - | - |
現在、割り込みソースは実装されていません。そのため、現状のEI命令は特に何もしません。
DI
割り込みを禁止します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xF3 | 1 | - | - | - | - | - |
現在、割り込みソースは実装されていません。そのため、現状のDI命令は特に何もしません。
入出力命令
OUT d8
Aレジスタの値を指定ポートに出力します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xD3 | 2 | - | - | - | - | - |
現在の実装では、OUT命令は何もしません。周辺機器との連携は今後追加予定です。
IN d8
指定ポートから値を読み取り、Aレジスタに格納します。
| オペコード | バイト数 | フラグ S | Z | AC | P | CY |
|---|---|---|---|---|---|---|
| 0xDB | 2 | - | - | - | - | - |
現在の実装では、IN命令は常に0xFFを返します。周辺機器との連携は今後追加予定です。