COP 命令 (Co-Processor Enable)

現在の処理を中断し、COPベクタによるソフトウェア割り込みを実行します。

COPオーバーロード

オペコード構文アドレッシングモードバイト数命令サイクル注
02COP #Imm.Stack/ Interrupt271

注\

  1. ネイティブモード時は1サイクル追加

フラグ変化

----dI--

d: ソフトウェア割込開始時に強制的にクリアされる
I: ソフトウェア割込開始時に強制的にセットされる

解説

COP命令は、現在実行中の処理を中断し、COPベクタによるソフトウェア割り込みを実行します。本来はコプロセッサとの連携のために用意された命令ですが、SNESでは通常のソフトウェア割り込みとして使用できます。
ソフトウェア割込開始処理の内容はネイティブモードとエミュレーションモードで異なります。
COP命令のオペランドには、8ビットの定数を指定することでシグネチャとすることができます。これは実際の処理では使用されませんが、デバッガ上でのトレースに役立ちます。

・ネイティブモード

  1. プログラムバンクレジスタをスタックにプッシュします。
  2. プログラムカウンタを2インクリメントし、スタックにプッシュします。
  3. ステータスレジスタをスタックにプッシュします。
  4. 割込禁止フラグをセットし、デシマルフラグをクリアします。
  5. プログラムバンクレジスタをゼロクリアし、プログラムカウンタをCOPベクタ($FFE4)より取得し、割込処理を実行します。

・エミュレーションモード

  1. プログラムカウンタを2インクリメントし、スタックにプッシュします。
  2. ステータスレジスタをスタックにプッシュします。
  3. 割込禁止フラグをセットします
  4. プログラムバンクレジスタをゼロクリアし、プログラムカウンタをCOPベクタ($FFF4)より取得し、割込処理を実行します。
  5. デシマルフラグをクリアします

使用例

シグネチャで処理を振り分ける

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

参照

BRK命令
RTI命令
WAI命令
SEI命令
CLI命令