045. Ldy absolute

Добавьте LDY absolute ($AC).

Урок 45 из 356 · tests/chapter_01_cpu/test_045_LDY_absolute.py

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

emulator/cpu/opcodes.py

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

opcodes imports of absolute and ldy
opcodes.ldy_absolute
opcodes.OPCODE_TABLE[$AC]

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

Абсолютная адресация расширяет LDY за пределы нулевой страницы. Обработчик декодирует уже существующий 16-битный операнд в порядке little-endian, читает по этому адресу и передаёт загруженное значение в ldy.

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

# emulator/cpu/opcodes.py
from emulator.cpu.addressing_modes import absolute
from emulator.cpu.instructions import ldy


def ldy_absolute(cpu: CPU):
    addr = absolute(cpu)
    value = cpu.bus.read(addr)
    ldy(cpu, value)


OPCODE_TABLE = {
    # Preserve existing entries.
    0xAC: ldy_absolute,
}

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

  • $AC сопоставляется с ldy_absolute и потребляет два байта операнда
  • absolute сначала объединяет младший байт, затем старший
  • обработчик читает эффективный адрес и передаёт полученное значение в ldy
  • выполнение продвигается всего на три байта, включая опкод

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

Не меняйте местами байты AC 00 02; уже существующая вспомогательная функция absolute преобразует эти байты операнда в $0200, а не в $0002.

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

  • LDY absolute,X
  • изменение вспомогательной функции абсолютной адресации
  • тайминг циклов

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

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