060. Adc indirect x

Подключить ADC (indirect,X) (опкод $61) к диспетчеризации CPU.

Урок 60 из 356 · tests/chapter_01_cpu/test_060_ADC_indirect_x.py

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

emulator/cpu/opcodes.py

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

opcodes.adc_indirect_x
OPCODE_TABLE[$61]

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

indirect_x сначала прибавляет X к операнду нулевой страницы, считывает указатель в порядке от младшего байта к старшему из нулевой страницы и возвращает итоговый эффективный адрес. Затем обработчик должен считать значение для ADC по этому итоговому адресу.

Полный пример реализации

# emulator/cpu/opcodes.py
def adc_indirect_x(cpu):
    addr = indirect_x(cpu)
    value = cpu.bus.read(addr)
    adc(cpu, value)

OPCODE_TABLE = {
    # ...existing entries...
    0x61: adc_indirect_x,
}

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

  • X индексирует расположение указателя в нулевой странице до разыменования
  • чтение байтов указателя переносится в пределах нулевой страницы
  • цель указателя — это адрес, поэтому итоговое чтение выполняет обработчик
  • PC продвигается всего на два байта

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

Не прибавляйте X к итоговому 16-битному адресу назначения. Это описывает другую операцию; для (indirect,X) X выбирает указатель нулевой страницы до его разыменования.

Вне рамок задачи

  • ADC (indirect),Y, вводимый следующим по номеру тестом
  • учёт циклов
  • изменения в indirect_x или adc

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

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