179. Bvs 相对寻址

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

179 / 356 · tests/chapter_01_cpu/test_179_BVS_relative.py

前置条件:步骤 171 已添加 `instructions.bvs。在这一步中,向 emulator/cpu/opcodes.py` 添加以下内容:

from emulator.cpu.instructions import bvs

def bvs_relative(cpu: CPU):
    offset = relative(cpu)
    bvs(cpu, offset)

OPCODE_TABLE[0x70] = bvs_relative

将导入项和映射项合并进已有的分组结构中。

这一步存在的原因

`relative 消费并转换位移量的符号,然后步骤 171 的 instructions.bvs` 在 Overflow 置位时从操作数之后的 PC 出发分支。

不变量:`0x70` 映射到单参数处理函数,并在两条路径上都会消费其操作数;Overflow 置位时应用该偏移量,Overflow 清零时 PC 停留在操作数之后。标志位和内存保持不变。常见误解:BVS 不会设置 Overflow,并且未跳转的分支仍然会占用并消费两个指令字节,包括其操作码。

不在本步范围内:步骤 180 会独立地为 JMP 添加 `addressing_modes.indirectjmp` 指令以及绝对/间接寻址 JMP 操作码 API 要到后续的步骤 181-183 才会出现,此处不得添加。

运行本课

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