205. 标志处理器 Decimal 标志

添加 Decimal 位支持。

205 / 356 · tests/chapter_01_cpu/test_205_flags_handler_decimal_flag.py

本步骤存在的原因

在本步骤中,添加 `emulator/cpu/flags_handler.py 中的符号 DECIMAL_FLAGFlagsHandler.set_decimal_flag 以及 FlagsHandler.get_decimal_flag`。该辅助函数将第 3 位的操作保留在状态抽象层内,供后续的标志控制操作使用。尽管 ADC/SBC 并不使用 6502 的 BCD 运算,NES CPU 仍然保留了 D 位。

建议实现

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。不得为 NES CPU 引入 Decimal 模式的 ADC/SBC 行为。

运行本课

uv run pytest tests/chapter_01_cpu/test_205_flags_handler_decimal_flag.py -v