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