014. Инструкция lda

Выделить механизм инструкции LDA.

Урок 14 из 356 · tests/chapter_01_cpu/test_014_instruction_lda.py

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

emulator/cpu/instructions.py
emulator/cpu/cpu.py

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

instructions.lda
CPU.step, existing $A9 and $AD branches

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

Инструкция определяет переход состояния после того, как операнд уже получен. LDA всегда сохраняет значение в A и обновляет Z/N, независимо от того, каким способом было адресовано это значение.

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

# emulator/cpu/instructions.py
def lda(cpu, value: int) -> None:
    cpu.a = value
    cpu._update_zero_and_negative_flags(value)


# emulator/cpu/cpu.py
from emulator.cpu.addressing_modes import absolute, immediate
from emulator.cpu.instructions import lda


class CPU:
    def step(self) -> None:
        opcode = self.fetch_byte()

        if opcode == 0xA9:
            return lda(self, immediate(self))

        if opcode == 0xAD:
            return lda(self, self.bus.read(absolute(self)))

        raise NotImplementedError(
            f"Opcode {opcode:02X} not implemented"
        )

Важные границы

  • immediate возвращает значение, тогда как absolute возвращает адрес для разыменования
  • CPU.step выбирает режим адресации
  • lda изменяет состояние CPU и флаги

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

lda не должна сама извлекать байты инструкции. Иначе поведение инструкции оказалось бы привязано к одному режиму адресации.

Вне рамок

  • LDA в режиме zero-page
  • функции-обработчики опкодов и OPCODE_TABLE
  • другие инструкции загрузки

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

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