293. Validación: la CPU lee el mando en 4016

PRUEBA DE VALIDACIÓN: un programa de CPU lee bits del mando desde $4016.

Lección 293 de 356 · tests/chapter_07_controller_input/test_293_VALIDATION_cpu_reads_controller_4016.py

Este no es un paso de implementación para el estudiante.

No hay nada nuevo que construir en este archivo. Esta prueba valida que las piezas ya construidas funcionan juntas:

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

Por qué existe esta validación

Las pruebas anteriores demostraron el objeto Controller y el enrutamiento de $4016 en CpuBus de forma aislada. Esta prueba demuestra que una secuencia real de instrucciones de la CPU puede usar esa ruta.

Referencias

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

Forma del sondeo del mando de la NES

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

Las ocho lecturas devuelven

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

Programa mínimo usado aquí

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 ...

Distinción importante

Esta validación almacena cada bit serie en un byte de RAM independiente por claridad. Muchos ejemplos de ensamblador de la NES desplazan los bits hacia un único byte resultado. Eso es política del código del juego, no comportamiento del hardware del mando.

Fuera de alcance

  • Mapeo de teclado de pygame
  • Bucle de main.py
  • Puerto de mando 2
  • Mandos de expansión de Famicom
  • Comportamiento de glitch de lectura de DMC/mando
  • Fixtures de ROM comerciales

Ejecutar esta lección

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