019. Lda absolute y

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

Урок 19 из 356 · tests/chapter_01_cpu/test_019_LDA_absolute_y.py

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

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

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

addressing_modes.absolute_y
opcodes.lda_absolute_y
opcodes.OPCODE_TABLE[$B9]

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

Absolute,Y обладает тем же 16-битным поведением адресации, что и absolute,X, но использует регистр Y. Отдельные вспомогательные функции делают выбранный индексный регистр явным и проверяемым.

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

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


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


def lda_absolute_y(cpu) -> None:
    address = absolute_y(cpu)
    lda(cpu, cpu.bus.read(address))


OPCODE_TABLE = {
    # Preserve existing entries.
    0xB9: lda_absolute_y,
}

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

  • вспомогательная функция использует Y, а не X
  • два байта операнда считываются до прибавления Y
  • при переходе через страницу сохраняется полный 16-битный результат

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

Копирование absolute_x без замены cpu.x на cpu.y может пройти тесты, если оба регистра случайно содержат одинаковое значение.

Вне рамок

  • штрафы циклов при переходе через страницу
  • режимы indirect indexed
  • универсальные вспомогательные функции для индексных адресов

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

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