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_xinc_absoluteinc_absolute_x,以及它们对应的 0xF60xEE0xFE 映射,是第 073-075 课的内容。

运行本课

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