199. 指令 plp

实现 PLP 行为。

199 / 356 · tests/chapter_01_cpu/test_199_instruction_plp.py

在本步骤中,只修改 `emulator/cpu/instructions.py,添加 plp(cpu)。前置条件:STACK_BASE` 以及 RTI 中状态掩码的约定已存在。

本步骤存在的原因

PLP 把 S 前移到保存状态字节的位置,并在去除本模拟器模型中不持久化的第 4 位和第 5 位之后,用该字节替换 P。

建议实现

cpu.s = (cpu.s + 1) & 0xFF
flags = cpu.bus.read(0x0100 | cpu.s)
cpu.p = flags & 0b1100_1111

把这些语句放入 `def plp(cpu: CPU) 中;等价的 STACK_BASE + cpu.s` 地址同样指向栈页 $0100。

不变量:读取前先递增并环绕 S;替换而不是合并 P;清除第 4 位和第 5 位;精确恢复所有其余已保存的标志位;不要像 PLA 那样根据数值字节计算 Z 或 N。

常见误解:PLP 并不会有选择地把标志位或运算进旧的 P 中。这样做会残留一些本应被压栈状态显式清除的过期标志。

范围之外:注册操作码 $28 属于第 200 步。这里不得添加之后才引入的标志相关 API。

运行本课

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