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