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