206. 指令标志控制

实现标志控制操作。

206 / 356 · tests/chapter_01_cpu/test_206_instruction_flag_controls.py

本步骤存在的原因

在本步骤中,添加 `emulator/cpu/instructions.py 中的符号 clcseccliseicldsedclv。每个函数都将一个状态位的变更委托给现有的 cpu.flags` API,包括步骤 205 中的 Decimal 辅助函数。

建议实现

def clc(cpu: CPU):
    cpu.flags.set_carry_flag(False)
def sec(cpu: CPU):
    cpu.flags.set_carry_flag(True)
def cli(cpu: CPU):
    cpu.flags.set_interrupt_disable_flag(False)
def sei(cpu: CPU):
    cpu.flags.set_interrupt_disable_flag(True)
def cld(cpu: CPU):
    cpu.flags.set_decimal_flag(False)
def sed(cpu: CPU):
    cpu.flags.set_decimal_flag(True)
def clv(cpu: CPU):
    cpu.flags.set_overflow_flag(False)

不变式:每个函数只改变其对应的位,并保持所有其他标志、寄存器、S、PC 和内存不变。CLI 清除的是中断禁止掩码;它不会清除某个中断事件。另一个常见的误解是把 CLV 或任何清除操作当作对整个状态寄存器的重置。

前置条件:步骤 205 添加了 Decimal 辅助函数。范围之外:`emulator/cpu/opcodes.py` 的导入与映射属于步骤 207。

运行本课

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