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の場合、次の命令をスキップする。インタプリタはレジスタVxkkを比較し、二つが等しいならプログラムカウンタを2進める。

4xkk - SNE Vx, byte

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

5xy0 - SE Vx, Vy

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

6xkk - LD Vx, byte

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

7xkk - ADD Vx, byte

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

8xy0 - LD Vx, Vy

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

8xy1 - OR Vx, Vy

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

8xy2 - AND Vx, Vy

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

8xy3 - XOR Vx, Vy

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

8xy4 - ADD Vx, Vy

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

8xy5 - SUB Vx, Vy

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

8xy6 - SHR Vx {, Vy}

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

8xy7 - SUBN Vx, Vy

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

8xyE - SHL Vx {, Vy}

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

9xy0 - SNE Vx, Vy

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

Annn - LD I, addr

Innnをセットする。

Bnnn - JP V0, addr

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

Cxkk - RND Vx, byte

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

Dxyn - DRW Vx, Vy, nibble

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

アドレスInバイトのスプライトを読み出し、スプライトとして(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 dtVxをセットする。

Fx18 - LD ST, Vx

Sound timer stVxをセットする。

Fx1E - ADD I, Vx

II + Vxをセットする。

Fx29 - LD F, Vx

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

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

Fx33 - LD B, Vx

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

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

Fx55 - LD [I], Vx

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

Fx65 - LD Vx, [I]

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