NES TDD

290. Определение контроллера

Определить чистый объект состояния контроллера NES.

Урок 290 из 356 · tests/chapter_07_controller_input/test_290_controller_definition.py

Файлы для создания на этом шаге

emulator/input/controller.py

Зачем нужен этот шаг

Прежде чем подключать ввод с контроллера к адресу $4016 на CpuBus, нужна чистая модель данных для стандартного контроллера NES. Это позволяет легко тестировать механизм контроллера, не задействуя pygame, CpuBus, выполнение ROM или тайминг кадров.

Что такое стандартный контроллер NES?

У стандартного контроллера восемь кнопок

Источники

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

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

Порядок последовательного чтения на уровне железа

first read  -> A
second read -> B
third read  -> Select
fourth read -> Start
fifth read  -> Up
sixth read  -> Down
seventh read -> Left
eighth read -> Right

Важное отличие

Некоторые ассемблерные подпрограммы NES сдвигают эти считанные значения в RAM так, что A оказывается в бите 7 байта, принадлежащего игре. Это не означает, что железо сначала передаёт Right. Эмулятор должен моделировать порядок последовательного считывания железа.

Пример предлагаемой реализации

from dataclasses import dataclass


BUTTON_A = 1 << 0
BUTTON_B = 1 << 1
BUTTON_SELECT = 1 << 2
BUTTON_START = 1 << 3
BUTTON_UP = 1 << 4
BUTTON_DOWN = 1 << 5
BUTTON_LEFT = 1 << 6
BUTTON_RIGHT = 1 << 7


@dataclass
class Controller:
    a: bool = False
    b: bool = False
    select: bool = False
    start: bool = False
    up: bool = False
    down: bool = False
    left: bool = False
    right: bool = False

    strobe: bool = False
    captured_buttons: int = 0
    read_index: int = 0

Вне рамок этого шага

  • маршрутизация CpuBus $4016
  • привязка клавиатуры pygame
  • порт контроллера 2
  • контроллеры расширения Famicom
  • поведение сбоя чтения DMC/контроллера

Запустить этот урок

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