NES程序NMI中CMP指令失效问题排查求助
NES精灵显示问题排查方案
核心逻辑验证
- 确认NMI中OAM DMA执行:必须在NMI中通过
STA $4014触发OAM DMA,将CPU侧的OAM缓冲区(通常是$0200-$02FF)数据传到PPU的OAM RAM。如果缺少这一步,修改OAM数据后PPU不会同步,精灵无法显示。 - 检查精灵数据格式:每个精灵占4字节,顺序为
Y坐标(0-239) → Tile索引 → 属性 → X坐标(0-255)。确保你设置的Y坐标在屏幕范围内,Tile索引对应ROM中存在的有效图形。 - 核对NMI中的对比逻辑:确认代码是
LDA $20后与#$00对比,分支指令(如BEQ)是否正确指向显示精灵的代码块,而非相反。
主循环与内存检查
- 验证主循环运行状态:确认控制器读取逻辑没有卡住主循环——读取控制器必须先写
$4016为1,再写0锁存输入,之后才能读取按键状态。若这一步出错,主循环可能停滞,但RAM监视器仍会显示之前写入的$20=$00。 - 排查内存冲突:确认没有其他代码(如其他中断、子程序)意外修改
$20地址。可以用FCEUX的内存写入断点,监控$20的写入操作,确认只有主循环在修改它。
PPU基础配置检查
- 开启精灵显示:PPU控制寄存器
$2001的bit1(精灵显示使能位)必须设为1,否则PPU会忽略所有精灵数据。 - 启用NMI:PPU控制寄存器
$2000的bit7(NMI使能位)必须设为1,否则NMI不会触发,OAM更新逻辑根本不会执行。 - 确认调色板设置:精灵调色板存于
$3F10-$3F1F,确保你给精灵设置的调色板索引对应非透明颜色,避免精灵因和背景同色而不可见。
调试工具使用
- 用FCEUX的PPU查看器:直接查看OAM RAM中的精灵数据,确认Y/X坐标、Tile索引是否符合预期。
- 单步调试NMI:在NMI入口处设置断点,逐行执行代码,检查每一步的寄存器值和内存变化,确认对比逻辑和OAM修改是否正确执行。
- 检查编译脚本:确认ld65链接脚本将RAM区域
$0000-$07FF设为可读写,$20属于该范围;PRG-ROM代码被正确链接到$8000-$FFFF区域。
内容的提问来源于stack exchange,提问作者user17512255
相关产品推荐
相关产品推荐

