069. Sbc indirect x

Добавляем SBC (Indirect,X).

Урок 69 из 356 · tests/chapter_01_cpu/test_069_SBC_indirect_x.py

Файл для обновления

emulator/cpu/opcodes.py

Символы для добавления/обновления

opcodes.sbc_indirect_x and OPCODE_TABLE[0xE1]

Зачем нужен этот шаг

SBC получает предындексированный косвенный доступ за счёт сочетания существующего разрешителя indirect_x со стандартной обёрткой чтения из памяти и делегирования инструкции.

Полная эталонная реализация

# emulator/cpu/opcodes.py
def sbc_indirect_x(cpu: CPU):
    addr = indirect_x(cpu)
    value = cpu.bus.read(addr)
    sbc(cpu, value)

OPCODE_TABLE = {
    # ... existing entries ...
    0xE1: sbc_indirect_x,
}

Важные инварианты

  • indirect_x прибавляет X к операнду нулевой страницы перед чтением указателя
  • байты указателя и их оборачивание в пределах нулевой страницы обрабатываются разрешителем
  • обёртка читает по итоговому адресу и передаёт этот байт в sbc
  • выполнение двухбайтовой инструкции продвигает PC на два байта

Распространённое заблуждение

Не читайте ячейку указателя нулевой страницы как операнд SBC; indirect_x возвращает итоговый 16-битный целевой адрес, содержимое которого нужно прочитать.

Вне рамок этого шага

  • обёртка SBC для (Indirect),Y
  • изменения косвенной адресации или арифметики SBC
  • тайминг циклов

Запустить этот урок

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