014. lda 指令

提取 LDA 指令机制。

14 / 356 · tests/chapter_01_cpu/test_014_instruction_lda.py

要更新的文件

emulator/cpu/instructions.py
emulator/cpu/cpu.py

位置

instructions.lda
CPU.step, existing $A9 and $AD branches

为什么需要这一步

指令定义的是操作数可用之后的状态转换。无论值以何种方式寻址,LDA 总是将其存入 A 并更新 Z/N。

完整示例实现

# emulator/cpu/instructions.py
def lda(cpu, value: int) -> None:
    cpu.a = value
    cpu._update_zero_and_negative_flags(value)


# emulator/cpu/cpu.py
from emulator.cpu.addressing_modes import absolute, immediate
from emulator.cpu.instructions import lda


class CPU:
    def step(self) -> None:
        opcode = self.fetch_byte()

        if opcode == 0xA9:
            return lda(self, immediate(self))

        if opcode == 0xAD:
            return lda(self, self.bus.read(absolute(self)))

        raise NotImplementedError(
            f"Opcode {opcode:02X} not implemented"
        )

重要边界

  • immediate 返回值,而 absolute 返回需要解引用的地址
  • CPU.step 负责选择寻址模式
  • lda 修改 CPU 状态和标志位

常见误解

lda 不应获取指令字节。如果它这样做,指令行为就会与某一个寻址模式耦合。

范围之外

  • 零页 LDA
  • 操作码处理函数和 OPCODE_TABLE
  • 其他加载指令

运行本课

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