089. Asl a 指令

添加面向累加器的 ASL 行为。

89 / 356 · tests/chapter_01_cpu/test_089_instruction_asl_a.py

在这一步中,仅添加 asl_a,以测试 088 中的内存形式作为上下文,将 ASL 操作码映射留给测试 090-094。

生产代码位置与符号

emulator/cpu/instructions.py: `asl_a(cpu: CPU)`

本步骤存在的原因

ASL A 与内存 ASL 具有相同的位与标志规则,但其目标是累加器。使用单独的函数可以避免把 A 当作总线地址来处理。

实现建议

def asl_a(cpu: CPU):
    value = cpu.a
    result = cpu.a << 1
    result_8 = result & 0xFF

    # Set flags
    cpu.flags.set_carry_flag((value & 0b1000_0000) != 0)
    cpu.flags.set_negative_flag((result_8 & 0b1000_0000) != 0)
    cpu.flags.set_zero_flag(result_8 == 0)

    cpu.a = result_8

重要不变量

  • Carry 接收 A 原本的第 7 位
  • A 被掩码为 8 位;Z 和 N 使用该掩码后的结果
  • 不解析任何内存地址,也不修改任何总线位置
  • 除 C、Z、N 之外的状态位均保持不变

常见误解

不要调用内存版的 asl(cpu, cpu.a):累加器的值是数据,而不是地址,ASL A 不得触及内存。

不在本步骤范围内

  • 导入 asl_a 并映射操作码 0x0A(测试 090)
  • 内存操作码包装器及映射(测试 091-094)
  • 周期计时

运行本课

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