「割り込み」の編集履歴(バックアップ)一覧はこちら
「割り込み」(2017/02/20 (月) 16:53:21) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
**割り込みベクタ [#hd7a0a71]
***ネイティブモード時 [#q1565282]
|名称|ベクタ|ソフト/ハード|発生条件|変化するレジスタ|h
|COP|0xFFE4-0xFFE5|ソフト|コプロセッサ割り込み|P[I]=1, P[D]=0|
|BRK|0xFFE6-0xFFE7|ソフト|BRK命令実行時|P[I]=1, P[D]=0|
|ABORT|0xFFE8-0xFFE9|ハード|ハードウェア特殊信号|P[I]=1|
|NMI|0xFFEA-0xFFEB|ハード|V-Blank割り込み|P[I]=1|
|(予約)|0xFFEC-0xFFED|ハード|||
|IRQ|0xFFEE-0xFFEF|ハード/ソフト|ハードウェア信号|P[I]=1|
***エミュレーションモード時 [#dace6166]
|名称|ベクタ|ソフト/ハード|発生条件|変化するレジスタ|h
|COP|0xFFF4-0xFFE5|ソフト|コプロセッサ割り込み|P[I]=1, P[D]=0|
|(予約)|0xFFF6-0xFFE7|ハード|||
|ABORT|0xFFF8-0xFFE9|ハード|ハードウェア特殊信号|P[I]=1|
|NMI|0xFFFA-0xFFEB|ハード|V-Blank割り込み|P[I]=1|
|RESET|0xFFFC-0xFFED|ハード|電源投入時、リセット時|P[I]=1, P[D]=0|
|IRQ/BRK|0xFFFE-0xFFEF|ハード/ソフト|ハードウェア信号/BRK命令|P[I]=1, P[D]=0|
**詳細 [#x470d944]
***RESET [#v3b44d04]
リセットがかかると (電源 ON 時も含む)、[[D レジスタ>CPU/レジスタ#REGD]] と [[PBR>CPU/レジスタ#REGPBR]] と [[DBR>CPU/レジスタ#REGDBR]] はゼロになり、
D フラグはゼロ、I フラグと E フラグは 1 になる。
PC には 0x00FFFC からの 2 バイトの内容が読み込まれる。
リセット時はエミュレーションモードになる。
***NMI [#k3444564]
NMI がかかると、ステータスフラグと [[PBR>CPU/レジスタ#REGPBR]] と PC がスタックに積まれ、
[[PBR>CPU/レジスタ#REGPBR]] はゼロになり、I フラグが 1 になる。
PC には、ネイティブモードの場合は 0x00FFEA から 2 バイト、
エミュレーションモードの場合には 0x00FFFA から 2 バイトの内容が読み込まれる。
***IRQ [#v3102da0]
IRQ がかかると、ステータスフラグと [[PBR>CPU/レジスタ#REGPBR]] と PC がスタックに積まれ、
[[PBR>CPU/レジスタ#REGPBR]] はゼロになり、I フラグが 1 になる。
PC には、ネイティブモードの場合は 0x00FFEE から 2 バイト、
エミュレーションモードの場合は 0x00FFFE から 2 バイトの内容が入る。
I フラグが 1 の場合、 IRQ は禁止される。
エミュレーションモードの場合は BRK と同じアドレスにジャンプするため、注意が必要。
***ABORT [#l1a63dc1]
ABORT がかかると、ステータスフラグと [[PBR>CPU/レジスタ#REGPBR]] と PC がスタックに積まれ、
[[PBR>CPU/レジスタ#REGPBR]] はゼロになり、I フラグは 1 になる。
PC には、ネイティブモードの場合には 0x00FFE8 から 2 バイト、
エミュレーションモードの場合は 0x00FFF8 から 2 バイトの内容が入る。
***COP [#z7ea9e05]
[[COP>CPU/命令セット/COP]] 命令を実行すると、ステータスフラグと [[PBR>CPU/レジスタ#REGPBR]] と PC がスタックに積まれ、
[[PBR>CPU/レジスタ#REGPBR]] はゼロになり、I フラグが 1 、D フラグが 0 になる。
PC にはネイティブモードの時は 0x00FFE8 から 2 バイト、
エミュレーションモードの場合は 0x00FFF8 から 2 バイトの内容が入る。
***BRK [#c4ff16b7]
[[BRK>CPU/命令セット/BRK]] 命令を実行すると、ステータスフラグと [[PBR>CPU/レジスタ#REGPBR]] と PC がスタックに積まれ、
[[PBR>CPU/レジスタ#REGPBR]] はゼロになり、I フラグが 1、D フラグが 0 になる。
PC には、ネイティブモードの時は 0x00FFE8 から 2 バイト、
エミュレーションモードでは 0x00FFFE から 2 バイトの内容が入る。
エミュレーションモードの場合、IRQ と同じアドレスにジャンプするため、注意が必要。
***割り込み処理について [#z5fd0865]
ネイティブモード (16 bit のアキュームレータと、8 bit / 16 bit のインデックスレジスタ) 時と、
エミュレーションモード時ではスタックに詰まれるデータの内容が異なるので注意する必要がある。
エミュレーションモードでは、割り込みが開始されると、
プログラムカウンタの上位バイト、下位バイト、ステータスレジスタ
の順番でスタックにレジスタの内容がプッシュされる。
ネイティブモードでは、これに加えて
先頭にプログラムバンクレジスタ ([[PBR>CPU/レジスタ#REGPBR]]) がプッシュされ、
レジスタをプッシュした後、ステータスレジスタの
10 進モードビットがクリアされ、IRQ フラグがセットされる (NMI 以外の時)。
最後にプログラムバンクレジスタが 0 にセットされ、
65816 の IRQ ベクタの指すアドレスにジャンプする。
エミュレーションモードで動作している時、
RAM バンクが 0 以外にセットされていると、
プログラムバンクの値を失う。
これには 2 つの解決方法がある。
1 つは、RAM バンク 0 以外でエミュレーションモードを動かさない。
もう 1 つは、エミュレーションモードでバンク 0 以外を使う時に、
事前にプログラムバンクの値をメモリの保存するようにしておく。
ネイティブモードの時は IRQ ベクタと BRK ベクタが分離されている。
これにより、ステータスレジスタのビット 5 (BRK) をポーリングする必要がなくなる。
エミュレーションモードの時にはこれが動作しないので、
BRK フラグと IRQ のソースを確認する必要がある。
ネイティブモード時は、[[BRK>CPU/命令セット/BRK]] 命令が 2 バイト長となる。
ゼロ BRK 命令はオプションで"シグネチャ"バイトが付く。
これは、デバッグ時に複数の BRK 割り込みを識別する目的で使われる。
[[COP>CPU/命令セット/COP]] はコプロセッサ割り込みを指す ([[COP>CPU/命令セット/COP]] 命令参照)。
IRQ がトリガーされた時、現在の命令は割り込み開始前に完了される。
割り込み遅れ時間は 7 クロック分。
タイムクリティカルな IRQ を作成する場合、
WAI 命令を使うと、割り込み開始まで CPU を停止させることができる。
ABORT ベクタは、65816 の ABORT ピンが LOW になった時に参照される。
このピンは、65816 にのみ存在する (6502 には存在しない)。