205. Обработчик флагов, флаг decimal
добавить поддержку бита Decimal.
Урок 205 из 356 · tests/chapter_01_cpu/test_205_flags_handler_decimal_flag.py
Зачем нужен этот шаг
На этом шаге добавьте символы `DECIMAL_FLAG, FlagsHandler.set_decimal_flag и FlagsHandler.get_decimal_flag в emulator/cpu/flags_handler.py`. Этот помощник оставляет манипуляцию битом 3 в абстракции состояния, необходимой для последующих операций управления флагами. CPU NES сохраняет D, хотя ADC/SBC не используют десятичную (BCD) арифметику 6502.
Предлагаемая реализация
DECIMAL_FLAG = 1 << 3
class FlagsHandler:
def set_decimal_flag(self, enabled: bool):
if enabled:
self.cpu.p |= DECIMAL_FLAG
else:
self.cpu.p &= ~DECIMAL_FLAG
def get_decimal_flag(self) -> bool:
return bool(self.cpu.p & DECIMAL_FLAG)Инвариант: установка или сброс D сохраняет все остальные биты P, особенно соседний бит Interrupt Disable. Распространённое заблуждение — сброс через `p &= DECIMAL_FLAG`, который сохраняет D и разрушает несвязанные флаги.
Вне рамок: функции инструкций и отображения опкодов относятся к шагам 206 и 207. Десятичный режим ADC/SBC не должен вводиться для CPU NES.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_205_flags_handler_decimal_flag.py -v