ファミコン開発:バンク切り替え中にIRQやNMIが発生する可能性
mmc3のバンク切り替えは$8000にバンク種類(プログラムか、キャラバンク、又そのアドレスを含めた種類)を設定し、その後にバンク番号を指定します。その最中にIRQやNMIが発生し、しかも割り込み先で$8000の内容が書き換えられてしまうと…戻ってきたときに意図しないバンクを切り替えてしまうことになります。具体的には以下のようなケースです。
lda #$06 ; prg80
sta $8000 ; バンクの種類をセット
;-- ここでIRQ発生。$8000の内容が書き換えられた!
lda #$01 ; バンク番号
sta $8001 ; バンク切り替え実行
当然$8000の内容が違っていれば、この後どのような事態になるか想像つきません。バンク切り替えするときは先にバンク番号をメモリに保存しておくと良いようです。
mmc3_bank_type = $FF
lda #$06 ; prg80
sta mmc3_bank_type
sta $8000 ; バンクの種類
;-- ここでIRQ発生。$8000の内容が書き換えられた!
lda #$01 ; バンク番号
sta $8001 ; バンク切り替え実行
IRQやNMIなどの割り込み中にバンク切り替えを行った場合は、終了前にmmc3_bank_typeを$8000に入れて終了させればOKです。
似たようなケースで$2005や$2006でも
可能性を考えるといろいろなケースがありそうです。$2005や$2006のように2回書き込む必要があるPPUアクセスで、その最中にIRQが発生して…かつその中で$2005に書き込んでしまったら? 最悪の事態を回避するために、重要なポイントではlda $2000を実行して実行回数をリセットしたほうが良さそうです。