CPY 命令 (Compare Index Register Y and Memory)
インデクスレジスタYとメモリを比較し、結果をステータスフラグへ返します。
CPYオーバーロード
| オペコード | 構文 | アドレッシングモード | バイト数 | 命令サイクル | 注 |
|---|---|---|---|---|---|
| C0 | CPY #const | Imm. | 2/ 3 | 2 | 1, 3 |
| C4 | CPY dp | DP. | 2 | 3 | 1, 2 |
| CC | CPY abs | Abs. | 3 | 4 | 1 |
注
- インデクスフラグクリア時は1サイクル追加
- ダイレクトページの開始アドレスがページ境界になっていない場合1サイクル追加
- インデクスフラグクリア時は3バイト。インデクスフラグセット時は2バイト。
フラグ変化
n-----zc
n: 比較結果のMSBがセットされる
z: 比較結果が0の場合にセットされる
c: 比較結果において符号なし借り(桁下がり)が発生しない場合にセットされる (これは内部演算で算術オーバーフローが発生した場合と等価)
解説
CPY命令はオペコードによって指定されたアドレッシングモードに従って、オペランドで指定された値とYレジスタを比較し、その結果をステータスフラグへ返します。
比較には減算が用いられ、Yレジスタからメモリの値を引きます。この命令によってYレジスタおよびメモリの状態は変更されません。
結果が0の場合、すなわち、Yレジスタとメモリの値が等しい場合にはZフラグがセットされます。また、借りが発生しない場合、すなわちYレジスタの値がメモリの値以上である場合はキャリーフラグがセットされます。
使用例
文字列の終わりまで読む
; ポインタ $00~$02 の指す文字列を、終端の$00まで処理する(Aは8ビット、Yは16ビット)
LDY.w #$0000
.loop
LDA [$00],Y
BEQ .end ; 終端に達した
; ... 1文字分の処理 ...
INY
CPY.w #$0100
BCC .loop ; 念のため256文字で打ち切る
.end