190. BRK 隐含寻址

接入隐含寻址的 BRK 操作码 $00。

190 / 356 · tests/chapter_01_cpu/test_190_BRK_implied.py

前置条件:第 189 步已完成 `brk 及其所需的状态位行为。在本步骤中,在 emulator/cpu/opcodes.py` 中添加以下导入与直接映射:

from emulator.cpu.instructions import brk

OPCODE_TABLE = {
    # existing entries...
    0x00: brk,
}

操作码

0x00 -> BRK

目标

把操作码 0x00 添加到 OPCODE_TABLE 中。

学习指引

BRK 通常被列为隐含寻址指令,但它有一个特殊的长度:

opcode byte:       $00
padding byte:      one ignored byte after $00
total length:      2 bytes

这并不意味着 BRK 存在两个操作码表项。

官方操作码只有一个

0x00

BRK 之后的那个字节可以是任意值。CPU 会跳过它,并在该字节之后压入返回地址。

示例

$8000: 00    BRK opcode
$8001: AB    padding/signature byte, ignored by BRK
$8002: EA    next real instruction

在 CPU.step() 执行完 BRK 之后,压入的返回地址应为 $8002。

本步骤存在的原因

`CPU.step 取出 $00 并把 PC 前进一次;直接分发到 brk` 会处理隐含的填充字节,并完成所有栈操作与向量跳转工作。不变量:只有一个表项,且没有寻址方式的取值操作;填充字节的内容不影响 A 或目标地址;第 189 步中 BRK 的状态与栈规则保持不变。常见误解:BRK 在体系结构上的两字节长度,并不意味着操作码本身是两字节,也不意味着需要操作数解码的包装函数。

本步骤范围之外:RTI/$40 属于第 191-192 步。硬件中断分发、NMI、共用的栈辅助函数以及后续的操作码 API 都不属于本次改动。

运行本课

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