193. 指令 pha

实现 PHA 行为。

193 / 356 · tests/chapter_01_cpu/test_193_instruction_pha.py

在本步骤中,只修改 `emulator/cpu/instructions.py,添加 pha(cpu)。栈页起始地址为 STACK_BASE = 0x0100`。

本步骤存在的原因

PHA 把 A 复制到 6502 的硬件栈上。入栈操作先写入当前的 $0100 | S 槽位,然后再递减这个 8 位栈指针。

建议实现

cpu.bus.write(0x0100 | cpu.s, cpu.a)
cpu.s = (cpu.s - 1) & 0xFF

把这些语句放入 `def pha(cpu: CPU) 中;用模块级常量 STACK_BASE = 0x0100` 代替字面量效果是等价的。

不变量:只压入 A;先写入再递减;把 S 按 8 位环绕处理;A 和所有状态标志保持不变。

常见误解:先递减 S 并不能实现 6502 的入栈操作;这样写入的是下一个空闲槽位,而不是当前的栈槽位。

范围之外:导入/注册操作码 $48 属于第 194 步。PLA、PHP、PLP、TXS 和 TSX 属于后续的第 195-204 步,这里不得添加。

运行本课

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