070. Sbc indirect y

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

Урок 70 из 356 · tests/chapter_01_cpu/test_070_SBC_indirect_y.py

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

emulator/cpu/opcodes.py

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

opcodes.sbc_indirect_y and OPCODE_TABLE[0xF1]

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

Этот последний вариант адресации SBC использует существующий разрешитель indirect_y, чтобы прочитать базовый указатель из нулевой страницы, прибавить Y и подать целевой байт в sbc.

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

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

OPCODE_TABLE = {
    # ... existing entries ...
    0xF1: sbc_indirect_y,
}

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

  • indirect_y читает указатель нулевой страницы до прибавления Y
  • обработчик читает байт по итоговому адресу ровно один раз
  • прочитанное значение передаётся в sbc, которая отвечает за A и обновление флагов
  • выполнение двухбайтовой инструкции продвигает PC на два байта

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

(Indirect),Y не прибавляет Y к ячейке указателя нулевой страницы перед разыменованием; такое предындексирование относится к (Indirect,X).

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

  • более поздние семейства инструкций INC и другие
  • изменения косвенной адресации или арифметики SBC
  • тайминг циклов и штрафы за пересечение страницы

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

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