192. 隐含寻址的 Rti

注册隐含寻址的 RTI。

192 / 356 · tests/chapter_01_cpu/test_192_RTI_implied.py

前置条件:第 191 步已添加 `rti。在本步骤中,只修改 emulator/cpu/opcodes.py,导入该符号并在 OPCODE_TABLE` 中注册操作码 $40。

本步骤存在的原因

RTI 是单字节的隐含寻址指令。`CPU.step()` 已经取出了 $40,其余所有输入都来自栈,因此分发必须直接接到该操作上,而不消耗任何操作数。

建议实现

from emulator.cpu.instructions import rti

OPCODE_TABLE = {
    # existing entries
    0x40: rti,
}

不变量:保留所有已有的操作码条目;把整数 $40 精确映射到同一个 `rti 函数对象;不要添加操作数读取或包装函数;让 rti(cpu)` 从栈中确定 PC,而不是按顺序执行。

常见误解:隐含寻址不代表 $40 之后的字节是操作数。若读取该字节,会在 RTI 恢复 PC 之前把下一条指令消耗掉。

范围之外:RTI 的出栈算法属于第 191 步。PHA 及其余栈相关指令从第 193 步开始。NMI 的进入行为属于之后的行为,这里不得提前引入。

运行本课

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