割り込みベクタ

ネイティブモード時

名称ベクタソフト/ハード発生条件変化するレジスタ
COP0xFFE4-0xFFE5ソフトコプロセッサ割り込みP[I]=1, P[D]=0
BRK0xFFE6-0xFFE7ソフトBRK命令実行時P[I]=1, P[D]=0
ABORT0xFFE8-0xFFE9ハードハードウェア特殊信号P[I]=1
NMI0xFFEA-0xFFEBハードV-Blank割り込みP[I]=1
(予約)0xFFEC-0xFFEDハード
IRQ0xFFEE-0xFFEFハード/ソフトハードウェア信号P[I]=1

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

名称ベクタソフト/ハード発生条件変化するレジスタ
COP0xFFF4-0xFFE5ソフトコプロセッサ割り込みP[I]=1, P[D]=0
(予約)0xFFF6-0xFFE7ハード
ABORT0xFFF8-0xFFE9ハードハードウェア特殊信号P[I]=1
NMI0xFFFA-0xFFEBハードV-Blank割り込みP[I]=1
RESET0xFFFC-0xFFEDハード電源投入時、リセット時P[I]=1, P[D]=0
IRQ/BRK0xFFFE-0xFFEFハード/ソフトハードウェア信号/BRK命令P[I]=1, P[D]=0

詳細

RESET

リセットがかかると (電源 ON 時も含む)、D レジスタPBRDBR はゼロになり、 D フラグはゼロ、I フラグと E フラグは 1 になる。 PC には 0x00FFFC からの 2 バイトの内容が読み込まれる。 リセット時はエミュレーションモードになる。

NMI

NMI がかかると、ステータスフラグと PBR と PC がスタックに積まれ、 PBR はゼロになり、I フラグが 1 になる。 PC には、ネイティブモードの場合は 0x00FFEA から 2 バイト、 エミュレーションモードの場合には 0x00FFFA から 2 バイトの内容が読み込まれる。

IRQ

IRQ がかかると、ステータスフラグと PBR と PC がスタックに積まれ、 PBR はゼロになり、I フラグが 1 になる。 PC には、ネイティブモードの場合は 0x00FFEE から 2 バイト、 エミュレーションモードの場合は 0x00FFFE から 2 バイトの内容が入る。 I フラグが 1 の場合、 IRQ は禁止される。 エミュレーションモードの場合は BRK と同じアドレスにジャンプするため、注意が必要。

ABORT

ABORT がかかると、ステータスフラグと PBR と PC がスタックに積まれ、 PBR はゼロになり、I フラグは 1 になる。 PC には、ネイティブモードの場合には 0x00FFE8 から 2 バイト、 エミュレーションモードの場合は 0x00FFF8 から 2 バイトの内容が入る。

COP

COP 命令を実行すると、ステータスフラグと PBR と PC がスタックに積まれ、 PBR はゼロになり、I フラグが 1 、D フラグが 0 になる。 PC にはネイティブモードの時は 0x00FFE8 から 2 バイト、 エミュレーションモードの場合は 0x00FFF8 から 2 バイトの内容が入る。

BRK

BRK 命令を実行すると、ステータスフラグと PBR と PC がスタックに積まれ、 PBR はゼロになり、I フラグが 1、D フラグが 0 になる。 PC には、ネイティブモードの時は 0x00FFE8 から 2 バイト、 エミュレーションモードでは 0x00FFFE から 2 バイトの内容が入る。 エミュレーションモードの場合、IRQ と同じアドレスにジャンプするため、注意が必要。

割り込み処理について

ネイティブモード (16 bit のアキュームレータと、8 bit / 16 bit のインデックスレジスタ) 時と、 エミュレーションモード時ではスタックに詰まれるデータの内容が異なるので注意する必要がある。

エミュレーションモードでは、割り込みが開始されると、 プログラムカウンタの上位バイト、下位バイト、ステータスレジスタ の順番でスタックにレジスタの内容がプッシュされる。

ネイティブモードでは、これに加えて 先頭にプログラムバンクレジスタ (PBR) がプッシュされ、 レジスタをプッシュした後、ステータスレジスタの 10 進モードビットがクリアされ、IRQ フラグがセットされる (NMI 以外の時)。 最後にプログラムバンクレジスタが 0 にセットされ、 65816 の IRQ ベクタの指すアドレスにジャンプする。

エミュレーションモードで動作している時、 RAM バンクが 0 以外にセットされていると、 プログラムバンクの値を失う。 これには 2 つの解決方法がある。 1 つは、RAM バンク 0 以外でエミュレーションモードを動かさない。 もう 1 つは、エミュレーションモードでバンク 0 以外を使う時に、 事前にプログラムバンクの値をメモリの保存するようにしておく。

ネイティブモードの時は IRQ ベクタと BRK ベクタが分離されている。 これにより、ステータスレジスタのビット 5 (BRK) をポーリングする必要がなくなる。 エミュレーションモードの時にはこれが動作しないので、 BRK フラグと IRQ のソースを確認する必要がある。

ネイティブモード時は、BRK 命令が 2 バイト長となる。 ゼロ BRK 命令はオプションで"シグネチャ"バイトが付く。 これは、デバッグ時に複数の BRK 割り込みを識別する目的で使われる。

COP はコプロセッサ割り込みを指す (COP 命令参照)。

IRQ がトリガーされた時、現在の命令は割り込み開始前に完了される。 割り込み遅れ時間は 7 クロック分。 タイムクリティカルな IRQ を作成する場合、 WAI 命令を使うと、割り込み開始まで CPU を停止させることができる。

ABORT ベクタは、65816 の ABORT ピンが LOW になった時に参照される。 このピンは、65816 にのみ存在する (6502 には存在しない)。


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-27 (日) 15:53:05 (1512d)