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