195. 指令 pla
实现 PLA 行为。
第 195 / 356 · tests/chapter_01_cpu/test_195_instruction_pla.py
在本步骤中,只修改 `emulator/cpu/instructions.py,添加 pla(cpu)。前置条件:STACK_BASE` 以及零标志/负标志的设置函数均已存在。
本步骤存在的原因
出栈操作先把 S 前移到已占用的栈槽位,把该字节载入 A,再根据新载入的累加器值推导出 Z 和 N。
建议实现
cpu.s = (cpu.s + 1) & 0xFF
cpu.a = cpu.bus.read(0x0100 | cpu.s)
cpu.flags.set_zero_flag(cpu.a == 0)
cpu.flags.set_negative_flag((cpu.a & 0x80) != 0)把这些语句放入 `def pla(cpu: CPU) 中。可以使用 STACK_BASE 以及等价的第 7 位掩码 0b1000_0000`。
不变量:读取前先递增并环绕 S;读取栈页 $0100;用取出的字节替换 A;只更新 Z 和 N,用第 7 位来判断 N;其余状态位保持不变。
常见误解:PLA 并不只是反向的 PHA。与 PHA 不同,它会根据 A 更新 Z 和 N,但并不会替换整个状态寄存器。
范围之外:注册操作码 $68 属于第 196 步。PHP 和 PLP 分别从第 197 步和第 199 步开始,这里不得添加它们的 API 或行为。
运行本课
uv run pytest tests/chapter_01_cpu/test_195_instruction_pla.py -v