088. Asl 指令

添加面向内存的 ASL 行为。

88 / 356 · tests/chapter_01_cpu/test_088_instruction_asl.py

在这一步中,添加可复用的内存指令。累加器行为是测试 089 的内容,操作码包装器从测试 090 开始。

生产代码位置与符号

emulator/cpu/instructions.py: `asl(cpu: CPU, addr: int)`

本步骤存在的原因

内存 ASL 是一个读-改-写操作。指令函数接收一个已解析的地址,以便后续的操作码处理函数可以共享同一套逻辑。

实现建议

def asl(cpu: CPU, addr: int):
    value = cpu.bus.read(addr)
    result = value << 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.bus.write(addr, result_8)

重要不变量

  • Carry 在结果被掩码之前接收旧的第 7 位
  • Zero 和 Negative 反映最终的 8 位结果
  • 只读写所提供的那个地址;A 不受影响
  • 除 C、Z、N 之外的所有状态位均保持不变

常见误解

Carry 并非来自移位结果的第 7 位;它捕获的是从原始值中移出的那一位。

不在本步骤范围内

  • 针对累加器的 asl_a(测试 089)
  • 操作码 0x0A 及内存寻址包装器(测试 090-094)
  • 周期计时以及总线精确的哑写操作

运行本课

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