143. 指令 bit

实现与寻址方式无关的 BIT 行为。

143 / 356 · tests/chapter_01_cpu/test_143_instruction_bit.py

此步骤存在的原因

BIT 的标志位语义不同寻常:Z 来自 A 与值的 AND 结果,而 N 和 V 复制操作数的相应位,因此一个共享原语就能防止各寻址处理函数出现偏差。

在此步骤中,完成各 EOR 课程后,请在 `emulator/cpu/instructions.py` 中准确添加以下符号:

def bit(cpu: CPU, value: int):
    result_8 = (cpu.a & value) & 0xFF

    # Flags:
    cpu.flags.set_zero_flag(result_8 == 0)
    cpu.flags.set_negative_flag((value & 0b1000_0000) != 0)
    cpu.flags.set_overflow_flag((value & 0b0100_0000) != 0)

BIT 将零测试与两个被复制的操作数位分离开来:Z 反映 `A & value`,而 N 和 V 反映值的第 7 位和第 6 位。 A、Carry、内存、X、Y 和 PC 保持不变;只有 Z/N/V 会被重写。

常见误解:BIT 既不会把 `A & value 存入 A,也不会从该 AND 结果推导出 N/V。 超出范围:将 bit 导入 emulator/cpu/opcodes.py` 并接入零页与绝对寻址操作码属于第 144-145 课。

运行本课

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