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