035. Ldx абсолютный y

Добавление LDX абсолютный,Y ($BE).

Урок 35 из 356 · tests/chapter_01_cpu/test_035_LDX_absolute_y.py

Файл для изменения

emulator/cpu/opcodes.py

Расположения

opcodes.ldx_absolute_y
opcodes.OPCODE_TABLE[$BE]

Почему этот шаг существует

Этот урок завершает семейство опкодов LDX, доступное на данный момент, повторно используя уже существующую вспомогательную функцию абсолютной адресации,Y. Как и в других формах работы с памятью, обработчик вычисляет и читает операнд перед передачей его значения в ldx.

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

# emulator/cpu/opcodes.py
def ldx_absolute_y(cpu: CPU):
    addr = absolute_y(cpu)
    value = cpu.bus.read(addr)
    ldx(cpu, value)


OPCODE_TABLE = {
    # Preserve existing entries.
    0xBE: ldx_absolute_y,
}

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

  • $BE отображается на ldx_absolute_y
  • базовый адрес в формате little-endian индексируется с помощью Y, а не X
  • байт по индексированному адресу передаётся в ldx
  • потребляются два байта операнда, поэтому вся инструкция увеличивает PC на три

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

Не оборачивайте абсолютный,Y адрес в пределах страницы $00; в отличие от нулевой страницы,Y, его индексированный адрес является 16-битным результатом.

Вне рамок

  • инструкции store-X и load-Y
  • изменения в absolute_y или ldx
  • тайминг циклов и штрафы за пересечение страниц

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

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