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にセットする。