018. Lda absolute x

Добавить LDA с адресацией absolute,X ($BD).

Урок 18 из 356 · tests/chapter_01_cpu/test_018_LDA_absolute_x.py

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

emulator/cpu/addressing_modes.py
emulator/cpu/opcodes.py

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

addressing_modes.absolute_x
opcodes.lda_absolute_x
opcodes.OPCODE_TABLE[$BD]

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

Absolute,X прибавляет X к полному 16-битному базовому адресу. В отличие от zero-page,X, результат может перейти из одной 256-байтовой страницы в следующую.

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

# emulator/cpu/addressing_modes.py
def absolute_x(cpu) -> int:
    base = cpu.fetch_word()
    return base + cpu.x


# emulator/cpu/opcodes.py
from emulator.cpu.addressing_modes import absolute_x


def lda_absolute_x(cpu) -> None:
    address = absolute_x(cpu)
    lda(cpu, cpu.bus.read(address))


OPCODE_TABLE = {
    # Preserve existing entries.
    0xBD: lda_absolute_x,
}

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

$12FF + X=$01 становится $1300; переноса внутри zero page не происходит.

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

Переход через страницу не меняет расчёт эффективного адреса. Дополнительное поведение по числу циклов намеренно оставлено за рамками этого урока.

Вне рамок

  • штрафы циклов при переходе через страницу
  • absolute,Y
  • косвенная адресация

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

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