205. 标志处理器 Decimal 标志
添加 Decimal 位支持。
第 205 / 356 · tests/chapter_01_cpu/test_205_flags_handler_decimal_flag.py
本步骤存在的原因
在本步骤中,添加 `emulator/cpu/flags_handler.py 中的符号 DECIMAL_FLAG、FlagsHandler.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