172. Bcc 相对寻址

将 BCC 接入其相对寻址操作码。

172 / 356 · tests/chapter_01_cpu/test_172_BCC_relative.py

在这一步中,向 `emulator/cpu/opcodes.py` 添加以下内容:

from emulator.cpu.instructions import bcc
from emulator.cpu.addressing_modes import relative

def bcc_relative(cpu: CPU):
    offset = relative(cpu)
    bcc(cpu, offset)

OPCODE_TABLE[0x90] = bcc_relative

导入语句可以合并进文件已有的分组导入中,表项则加入其字面量表中。

这一步存在的原因

`CPU.step 已经消费了操作码,relative 消费并转换那一个字节的带符号操作数,而步骤 164 中的 bcc` 只在 Carry 清零时应用它。

不变量:操作码 `0x90 解析到该单参数处理函数;所有路径都会消费操作数,因此未跳转的分支最终停在 0x8002,而 +5 的分支会跳到 0x8007`。该处理函数本身不改变任何标志位或内存。常见误解:位移量是相对于操作数之后的 PC,而不是相对于操作码地址,并且即便 Carry 阻止了跳转,也必须取出该操作数。

不在本步范围内:BCS、BEQ、BNE、BPL、BMI、BVC 与 BVS 的处理函数/表项属于步骤 173-179。间接寻址 JMP 从步骤 180 开始。

运行本课

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