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 存在两个操作码表项。
官方操作码只有一个
0x00BRK 之后的那个字节可以是任意值。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