072. Inc 零页
接入 INC 零页寻址(`0xE6`)。
第 72 / 356 · tests/chapter_01_cpu/test_072_INC_zero_page.py
在本步骤中,以第 071 课的 emulator/cpu/instructions.py:inc 为前提,只在 emulator/cpu/opcodes.py 中添加零页寻址接线。
本步骤存在的原因
操作码处理函数把指令字节转换为有效地址。复用 addressing_modes.zero_page 可以保留操作数取值和 PC 移动的逻辑,同时让 instructions.inc 与寻址模式保持独立。
在 emulator/cpu/opcodes.py 中的建议实现:
from emulator.cpu.instructions import lda, sta, ldx, stx, ldy, sty, tax, txa, tay, tya, adc, sbc, inc
def inc_zero_page(cpu: CPU):
addr = zero_page(cpu)
inc(cpu, addr)在现有的 OPCODE_TABLE 中添加这条完全一致的条目:
0xE6: inc_zero_page,该处理函数被插入到 # ------ INC Opcodes 下方,对应的映射被追加到 OPCODE_TABLE 中。
不变量:zero_page(cpu) 消耗一个操作数字节,返回一个零页地址,并使 PC 前进一次;该处理函数把一次读-改-写委托给 inc;0xE6 映射到该函数对象;指令长度为两个字节;INC 仍然只改变内存和 Z/N。
常见误解:操作数字节是一个地址,而不是要递增的字节本身。不要在处理函数中读取它,也不要在其中重复 INC 的运算逻辑。
范围之外:inc_zero_page_x、inc_absolute 和 inc_absolute_x,以及它们对应的 0xF6、0xEE 和 0xFE 映射,是第 073-075 课的内容。
运行本课
uv run pytest tests/chapter_01_cpu/test_072_INC_zero_page.py -v