バードウィーク (FC) のブート処理は実はバグっている
FC版バードウィークは、ハードリセット時に以下のような奇妙な処理を行う (Mesen の場合、brk
命令実行時にブレークするよう設定すると容易に確認できる):
- RESET ハンドラ (
$FD27
) へジャンプする。 - 雑多な初期化処理の後、RAM 初期化ルーチン (
$FE2A
) を呼ぶ。 - RAM 初期化ルーチン内でソフトリセット判定用バイト列の初期化などを行う。
- バグにより RAM 初期化ルーチンからの戻りアドレスが破壊され、
rts
したときプログラムカウンタが$0001
へ飛ぶ。 $0001
上のbrk
命令を実行する。本作では RESET と IRQ のハンドラが共通なので、再度 RESET ハンドラへジャンプする。- 最初から同様の処理を行うが、今度はソフトリセットと判定されるため、RAM 初期化ルーチンの戻りアドレスの破壊が起こらず正常に処理が進む。
これは、RAM 初期化ルーチン内の「ハードリセットならばスタックページをゼロクリアする」というロジックが原因。
本作ではスコア/ハイスコアがスタックページに置かれているので、これらをまとめてクリアしようとしたのだろうが、結果として戻りアドレス領域 $01FE-$01FF
まで破壊してしまっている。結果、rts
実行時にプログラムカウンタは $0001
へ飛ぶ。
しかし、RAM 初期化ルーチンは常にゼロページ全体をゼロクリアするため、$0001
の値は 0 となっている。これは brk
命令であり、本作は IRQ (BRK) 発生時は RESET ハンドラへ飛ぶようになっているため、結果的には前述のように問題なく動くことになる。