0

我正在为 NES 编写一个模拟器,我正在尝试运行超级马里奥兄弟。一切运行良好,除了游戏使用 nametable 1 时发生的一些屏幕闪烁。

如果您不知道,SMB 在顶部有一个恒定的分数条显示(大约 31 条扫描线),其下方的屏幕其余部分水平滚动。此分数显示仅位于 Nametable 0(和 nametable 2,因为映射器使用垂直镜像)。

游戏在 NMI 开始时将 PPUCTRL 设置为名称表 0,然后等待精灵 0 命中(发生在第 30 行左右),然后根据屏幕其余部分的要求将名称表设置为 0 或 1。

我的模拟器发生了什么,即使在第一条扫描线被渲染之前,PPUCTRL 也被设置为奇数。结果,它显示了正确名称表中的分数栏,我得到了闪烁。

我使用标准模拟器 fceux 确认了该行为。PPUCTRL 也设置为奇数。但是那里的模拟器仍然从左边的名称表中提取。

我对 PPUCTRL 的理解不正确吗?PPU 是否总是在 sprite 0 命中之前使用 nametable 0?

4

0 回答 0