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