REP 命令 (Reset Processor Status Flag)
指定されたステータスフラグをクリアします。
REPオーバーロード
| オペコード | 構文 | アドレッシングモード | バイト数 | 命令サイクル | 注 |
|---|---|---|---|---|---|
| C2 | REP #const | Imm | 2 | 3 |
フラグ変化
nvmxdizc
nvmxdizc: オペランドで指定されたフラグはクリアされ、そのほかは変更されない。
解説
REP命令は、オペランドに指定された値のうち、1になっているビットに対応するステータスフラグをクリアします。
メモリモードフラグおよびインデクスフラグを直接クリアする命令はこれだけです(PLP命令やRTI命令でスタックから復帰した場合にも変化します)。したがって通常はレジスタ幅の変更のために使用されます。
なお、エミュレーションモードではメモリモードフラグおよびインデクスフラグは常に1となり、この命令でクリアすることはできません。
使用例
REP命令とSEP命令は、処理の途中でレジスタの幅を切り替えるのに使います。
REP #$20 ; Aを16ビットにする
LDA.w #$1234
STA $00 ; $00に$34、$01に$12が書き込まれる
SEP #$20 ; Aを8ビットに戻す
LDA.b #$56
STA $02 ; $02に$56が書き込まれる
REP #$30 ; A・X・Yを16ビットにする
SEP #$20 ; Aだけを8ビットに戻す(X・Yは16ビットのまま)
即値(#)を使う命令のバイト数は、実行時のmフラグ・xフラグによって変わります。多くのアセンブラはREP・SEPによるフラグの変化を追いかけないため、例のように.b・.wを付けて即値の大きさを明示する必要があります。フラグの状態と即値の大きさが食い違うと、CPUは命令の区切りを誤って読むため、以降のプログラムが正しく実行されません。