284. 验证:CPU 写入 PPU 内存后进行渲染

验证:CPU 写入 PPU 内存,然后 Console 渲染背景帧缓冲。

284 / 356 · tests/chapter_05_rendering_pipeline/test_284_VALIDATION_cpu_writes_ppu_memory_then_render.py

如果前面的 CPU、PPU、总线和渲染步骤都已完成,本测试不需要新的实现。

为什么需要这项验证

模拟器现在有两条重要的路径

CPU/PPU write path:
    CPU program writes PPUADDR/PPUDATA
    -> PPU memory changes

Rendering path:
    Console.render_background_framebuffer()
    -> reads current PPU memory
    -> returns Framebuffer

这个测试验证这两条路径观察到的是同一个 PPU 状态。

端到端路径

CPU executes STA $2006/$2007
    -> CpuBus routes $2000-$2007 to PPU registers
    -> PPUADDR selects PPU memory address
    -> PPUDATA writes through PpuBus

Console.render_background_framebuffer()
    -> reads nametable/palette/pattern memory from console.ppu
    -> renders pure Framebuffer data

微型 CPU 程序的行为

write $01 to PPU $2000
    nametable[0] = tile ID 1

write $0F,$01,$02,$03 to PPU $3F00-$3F03
    background palette 0 maps color index 3 to NES color $03

合成的 CHR 设置

为了这项验证,CHR 数据直接在 PPU 内存中准备好。这样可以让测试专注于 CPU 对名称表/调色板 RAM 的写入以及渲染路径。对于 Mapper000/CHR ROM,CHR 图形通常来自卡带。

预期结果

top-left framebuffer pixel uses get_nes_rgb_color($03)

重要的不变量

CPU 写入和 Console 渲染必须使用同一个 PPU 实例。

范围之外

  • pygame 显示
  • 真实的 ROM 测试夹具
  • 通过卡带加载 CHR ROM
  • 精灵
  • 滚动
  • OAMDMA

运行本课

uv run pytest tests/chapter_05_rendering_pipeline/test_284_VALIDATION_cpu_writes_ppu_memory_then_render.py -v