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