エミュレータのフレーム境界

FCEUXではフレーム境界がline240(post-render)となっていますが、この理由がよくわかりませんでした。しかし考えてみると、入力更新タイミングとしてはここが適切なのではないかと思いました。

NESゲームの入力処理はNMIルーチン(line241で呼び出される)内で行われるのが一般的なので、line240で入力更新を行えば確実に入力が読み取られる可能性が高いと考えられます(それならline241開始前に入力更新でもよい、とは言えそうですが)。これが他のタイミング、例えばline0(描画開始ライン)だったとすると、NMIルーチンの処理にかかる時間によっては入力更新と入力処理の順序が入れ替わったり、最悪入力処理の途中で入力を更新してしまう事態も考えられます。実際、自作のNESエミュレータでもフレーム境界をline0からline240に変えただけでFCEUXのムービーがsyncするケースがありました。

他の理由もあるのかもしれませんが、とりあえず入力処理を考えただけでもフレーム境界はNMIの直前あたりに設定するのが無難そうですね。