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