COP 命令 (Co-Processor Enable)
現在の処理を中断し、COPベクタによるソフトウェア割り込みを実行します。
COPオーバーロード
| オペコード | 構文 | アドレッシングモード | バイト数 | 命令サイクル | 注 |
|---|---|---|---|---|---|
| 02 | COP #Imm. | Stack/ Interrupt | 2 | 7 | 1 |
注\
- ネイティブモード時は1サイクル追加
フラグ変化
----dI--
d: ソフトウェア割込開始時に強制的にクリアされる
I: ソフトウェア割込開始時に強制的にセットされる
解説
COP命令は、現在実行中の処理を中断し、COPベクタによるソフトウェア割り込みを実行します。本来はコプロセッサとの連携のために用意された命令ですが、SNESでは通常のソフトウェア割り込みとして使用できます。
ソフトウェア割込開始処理の内容はネイティブモードとエミュレーションモードで異なります。
COP命令のオペランドには、8ビットの定数を指定することでシグネチャとすることができます。これは実際の処理では使用されませんが、デバッガ上でのトレースに役立ちます。
・ネイティブモード
- プログラムバンクレジスタをスタックにプッシュします。
- プログラムカウンタを2インクリメントし、スタックにプッシュします。
- ステータスレジスタをスタックにプッシュします。
- 割込禁止フラグをセットし、デシマルフラグをクリアします。
- プログラムバンクレジスタをゼロクリアし、プログラムカウンタをCOPベクタ($FFE4)より取得し、割込処理を実行します。
・エミュレーションモード
- プログラムカウンタを2インクリメントし、スタックにプッシュします。
- ステータスレジスタをスタックにプッシュします。
- 割込禁止フラグをセットします
- プログラムバンクレジスタをゼロクリアし、プログラムカウンタをCOPベクタ($FFF4)より取得し、割込処理を実行します。
- デシマルフラグをクリアします
使用例
シグネチャで処理を振り分ける
COP命令のオペランド(シグネチャ)は、割込処理ルーチンの中で、スタックに積まれた戻り先アドレスの1バイト前を読めば取得できます。
COP #$01 ; COP処理ルーチンの$01番の処理を呼ぶ
; ネイティブモード用のCOP処理ルーチン
; ダイレクトページの$00~$02を作業用に使う
CopHandler:
REP #$30
PHA
PHX ; スタック: X(2バイト)、A(2バイト)、P、戻り先(2バイト)、戻り先のバンク の順
LDA 6,S ; 戻り先アドレス
DEC A ; 1バイト前がシグネチャ
STA $00
SEP #$20
LDA 8,S ; 戻り先のバンク
STA $02
LDA [$00] ; A = シグネチャ
; ... シグネチャに応じた処理 ...
REP #$30
PLX
PLA
RTI