043. Ldy zero page

Добавьте LDY zero page ($A4).

Урок 43 из 356 · tests/chapter_01_cpu/test_043_LDY_zero_page.py

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

emulator/cpu/opcodes.py

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

opcodes imports of zero_page and ldy
opcodes.ldy_zero_page
opcodes.OPCODE_TABLE[$A4]

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

В отличие от непосредственной LDY, LDY нулевой страницы вычисляет операнд в адрес, читает байт по этому адресу и затем делегирует поведение регистра и флагов инструкции ldy.

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

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


def ldy_zero_page(cpu: CPU):
    addr = zero_page(cpu)
    value = cpu.bus.read(addr)
    ldy(cpu, value)


OPCODE_TABLE = {
    # Preserve existing entries.
    0xA4: ldy_zero_page,
}

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

  • $A4 сопоставляется с ldy_zero_page и потребляет один байт операнда
  • zero_page возвращает адрес в диапазоне $0000-$00FF
  • обработчик выполняет одно чтение данных и передаёт в ldy это значение, а не адрес
  • ldy обновляет Zero и Negative

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

Передача addr напрямую в ldy загрузила бы номер ячейки нулевой страницы, а не хранящийся там байт.

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

  • кодировки LDY zero-page,X и absolute
  • новые вспомогательные функции режимов адресации
  • тайминг циклов

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

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