Chip-8の命令セット

0nnn - SYS addr

machine code routineのnnnにジャンプする。この命令はChip-8が最初に実装された古いコンピュータで使われたが、最近はもう使われていない。

00E0 - CLS

ディプレイをクリアする。

00EE - RET

サブルーチンから戻る。プログラムカウンタにスタックの一番上のアドレスをセットし、スタックポインタから1を引く。

1nnn - JP addr

アドレスnnnにジャンプする。インタプリタはプログラムカウンタをnnnにする。

2nnn - CALL addr

アドレスnnnのサブルーチンをCallする。インタプリタはスタックポインタをインクリメントし、それから現在のプログラムカウンタをスタックの一番上に置く。さらにプログラムカウンタにnnnをセットする。

3xkk - SE Vx, byte

Vx = kkの場合、次の命令をスキップする。インタプリタはレジスタVxとkkを比較し、二つが等しいならプログラムカウンタを2進める。

4xkk - SNE Vx, byte

Vx != kkの場合、次の命令をスキップする。インタプリタはレジスタVxとkkを比較し、二つが異なるならプログラムカウンタを2進める。

5xy0 - SE Vx, Vy

Vx = Vyの場合、次の命令をスキップする。インタプリタはレジスタVxとVyを比較し、二つが等しいならプログラムカウンタを2進める。

6xkk - LD Vx, byte

Vxにkkをセットする。インタプリタはレジスタVxにkkの値をセットする。

7xkk - ADD Vx, byte

VxにVx + kkをセットする。インタプリタはレジスタVxにkkの値を加算する。

8xy0 - LD Vx, Vy

VxにVyをセットする。インタプリタはレジスタVxにVyの値をセットする。

8xy1 - OR Vx, Vy

VxにVx OR Vyをセットする。VxとVyのビット和をとり、Vxにセットする。ビット和は二つの値のビットを比較し、どちらかひとつでも1の場合は1、両方とも0の場合は0とする。

8xy2 - AND Vx, Vy

VxにVx AND Vyをセットする。VxとVyのビット積をとり、Vxにセットする。ビット積は二つの値のビットを比較し、両方とも1の場合は1、それ以外の場合は0とする。

8xy3 - XOR Vx, Vy

VxにVx XOR Vyをセットする。VxとVyの排他的ビット和をとり、Vxにセットする。排他的ビット和は二つの値のビットを比較し、等しくない場合は1、それ以外の場合は0とする。

8xy4 - ADD Vx, Vy

VxにVx + Vyをセットする。結果が8bit(255)より大きい場合はVfに1、それ以外の場合は0をセットする。Vxには下位8bitのみ保持する。

8xy5 - SUB Vx, Vy

Vx > Vyの場合はVfに1、それ以外の場合は0をセットする。VxにVx - Vyをセットする。

8xy6 - SHR Vx {, Vy}

Vxの最下位ビットが1だった場合はVfに1、それ以外の場合は0をセットする。VxにVxを2で割った(または右ビットシフト)値をセットする。

8xy7 - SUBN Vx, Vy

Vy > Vxの場合Vfに1、それ以外の場合は0をセットする。VxにVy - Vxをセットする。

8xyE - SHL Vx {, Vy}

Vxの最上位ビットが1の場合Vfに1、それ以外の場合は0をセットする。Vxに2をかけた(または左ビットシフト)値をセットする。

9xy0 - SNE Vx, Vy

Vx != Vyの場合、次の命令をスキップする。つまり、プログラムカウンタを2インクリメントする。

Annn - LD I, addr

Iにnnnをセットする。

Bnnn - JP V0, addr

nnn + V0のアドレスにジャンプする。つまり、プログラムカウンタにnnn + V0をセットする。

Cxkk - RND Vx, byte

Vxに0~255の乱数 AND kkをセットする。AND演算については8xy2を参照。

Dxyn - DRW Vx, Vy, nibble

アドレスIのnバイトのスプライトを(Vx, Vy)に描画する。Vfにはcollision(後述)をセットする。

アドレスIのnバイトのスプライトを読み出し、スプライトとして(Vx, Vy)に描画する。スプライトは画面にXORする。このとき、消されたピクセルが一つでもある場合はVfに1、それ以外の場合は0をセットする。スプライトの一部が画面からはみ出る場合は、逆方向に折り返す。XORについては8xy3に詳しい。また、ディプレイの仕様に関しては2.4 Displayを参照のこと。

Ex9E - SKP Vx

Vxが押された場合、次の命令をスキップする。

キーボードををチェックし、Vxの値のキーが押されていればプログラムカウンタを2インクリメントする。

ExA1 - SKNP Vx

Vxが押されてない場合、次の命令をスキップする。

キーボードををチェックし、Vxの値のキーが押されていなければプログラムカウンタを2インクリメントする。

Fx07 - LD Vx, DT

VxにDelay timerの値dtをセットする。

Fx0A - LD Vx, K

押されたキーをVxにセットする。

キーが入力されるまで全ての実行をストップする。キーが押されるとその値をVxにセットする。

Fx15 - LD DT, Vx

Delay timer dtにVxをセットする。

Fx18 - LD ST, Vx

Sound timer stにVxをセットする。

Fx1E - ADD I, Vx

IにI + Vxをセットする。

Fx29 - LD F, Vx

IにVxのスプライト(fontset)のアドレスをセットする。

Iの値にVxの値に対応するスプライト(fontset)のアドレスをセットする。詳しくはDisplayを参照。

Fx33 - LD B, Vx

アドレスI, I+1、I+2にVxのBCDをセットする。

アドレスIにVxの下位3桁目の値をセットする。I+1には下位2桁目の値をセットし、I+2には下位1桁目の値をセットする。

Fx55 - LD [I], Vx

V0からVxまでの値をIから始まるアドレスにセットする。

Fx65 - LD Vx, [I]

アドレスIから読んだ値をV0からVxにセットする。