061. Adc indirect y

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

Урок 61 из 356 · tests/chapter_01_cpu/test_061_ADC_indirect_y.py

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

emulator/cpu/opcodes.py

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

opcodes.adc_indirect_y and OPCODE_TABLE[0x71]

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

Этот последний вариант адресации ADC связывает существующий вспомогательный метод адреса indirect_y с существующей инструкцией adc, работающей со значением, для опкода $71.

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

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

OPCODE_TABLE = {
    # ... existing entries ...
    0x71: adc_indirect_y,
}

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

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

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

Не передавайте адрес, возвращённый indirect_y, напрямую в adc; adc принимает байт, хранящийся по этому адресу.

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

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

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

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