117. 立即数 AND
将 AND 立即数暴露为操作码 ``0x29``。
第 117 / 356 · tests/chapter_01_cpu/test_117_AND_immediate.py
在这一步中,使用第 116 课的指令,在 `emulator/cpu/opcodes.py` 中添加其导入、立即数处理函数和操作码表条目。
为什么需要这一步
立即数形式让新引入的 AND 原语能够对字面操作数执行,并建立起它在操作码表中的第一次接入。
建议实现
from emulator.cpu.instructions import (..., and_a)
def and_immediate(cpu: CPU):
and_a(cpu, immediate(cpu))
OPCODE_TABLE = {
...
0x29: and_immediate,
}`emulator/cpu/addressing_modes.py::immediate 调用 CPU.fetch_byte 并将该字节作为值返回。and_a` 把 A & value 的结果存入 A,只改变 Z/N,因此 Carry 和 Overflow 保持不变;操作码加操作数使 PC 前进两个字节,内存不被修改。
误解澄清:立即数模式不返回地址,因此额外调用 `cpu.bus.read` 会把字面值误当作指针来解释。本课不涉及的内容:零页到间接,Y 的 AND 处理函数(第 118-124 课),以及第 125-145 课的 ORA/EOR/BIT 相关工作。
运行本课
uv run pytest tests/chapter_01_cpu/test_117_AND_immediate.py -v