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