293. 验证 CPU 读取控制器 4016

验证测试:CPU 程序从 $4016 读取控制器位。

293 / 356 · tests/chapter_07_controller_input/test_293_VALIDATION_cpu_reads_controller_4016.py

这不是学员实现步骤。

本文件无需构建任何新内容。本测试验证已构建的各部分能否协同工作:

CPU instructions
    -> CpuBus.write($4016, value)
    -> Controller.write_strobe(value)
    -> CpuBus.read($4016)
    -> Controller.read_bit()
    -> CPU stores observed bits into RAM

为什么需要这项验证

之前的测试分别验证了 Controller 对象和 CpuBus $4016 路由。本测试证明真实的 CPU 指令序列可以使用该路径。

参考资料

https://www.nesdev.org/wiki/Standard_controller
https://www.nesdev.org/wiki/Controller_reading_code

NES 控制器轮询流程

write 1 to $4016
write 0 to $4016
read $4016 eight times

这八次读取返回

A, B, Select, Start, Up, Down, Left, Right

此处使用的简短程序

LDA #$01
STA $4016     ; strobe high, capture live buttons

LDA #$00
STA $4016     ; strobe low, serial reads advance

LDA $4016
STA $0000     ; A bit

LDA $4016
STA $0001     ; B bit

... repeated through Right bit ...

重要区别

本验证将每个串行位存储到单独的 RAM 字节中以提高可读性。许多 NES 汇编示例会将这些位移位合并到一个结果字节中。那是游戏代码的策略,而非控制器硬件行为。

超出本步骤范围

  • pygame 键盘映射
  • main.py 循环
  • 控制器端口 2
  • Famicom 扩展控制器
  • DMC/控制器读取毛刺行为
  • 商业 ROM 测试固件

运行本课

uv run pytest tests/chapter_07_controller_input/test_293_VALIDATION_cpu_reads_controller_4016.py -v