246. Ppuctrl 位常量

定义 PPUCTRL ($2000) 的位常量。

246 / 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_246_ppuctrl_bit_constants.py

参考资料

https://www.nesdev.org/wiki/PPU_registers#PPUCTRL

要更新的文件

emulator/ppu/ppu.py

要添加的常量

CTRL_BASE_NAMETABLE_MASK
CTRL_VRAM_INCREMENT_BY_32
CTRL_SPRITE_PATTERN_TABLE
CTRL_BACKGROUND_PATTERN_TABLE
CTRL_SPRITE_SIZE_8X16
CTRL_MASTER_SLAVE_SELECT
CTRL_NMI_ENABLE

为什么需要这一步

PPUCTRL 是位于 $2000 的 CPU 可写控制寄存器。它是一个字节,每个位或位域都控制着一种不同的 PPU 行为。

其位布局通常写作

VPHB SINN

含义

V = NMI enable at VBlank
P = master/slave select, mostly unused on normal NES
H = sprite size, 8x8 or 8x16
B = background pattern table address
S = sprite pattern table address
I = PPUDATA VRAM address increment, +1 or +32
NN = base nametable select, two-bit field

重要范围

本测试只要求定义命名常量。这些位控制的大部分行为将在后续实现渲染、VBlank/NMI 和精灵时再实现。

已实现的行为

CTRL_VRAM_INCREMENT_BY_32 controls whether PPUDATA increments vram_addr by
1 or 32.

建议的实现伪代码

# PPUCTRL ($2000) bits: VPHB SINN
CTRL_BASE_NAMETABLE_MASK = 0b0000_0011
CTRL_VRAM_INCREMENT_BY_32 = 1 << 2
CTRL_SPRITE_PATTERN_TABLE = 1 << 3
CTRL_BACKGROUND_PATTERN_TABLE = 1 << 4
CTRL_SPRITE_SIZE_8X16 = 1 << 5
CTRL_MASTER_SLAVE_SELECT = 1 << 6
CTRL_NMI_ENABLE = 1 << 7

超出范围

  • NMI 生成
  • 精灵大小行为
  • 图案表渲染行为
  • 基础命名表行为
  • 主/从 EXT 引脚行为

运行本课

uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_246_ppuctrl_bit_constants.py -v