015. Lda zero page

Добавить LDA с адресацией zero-page ($A5).

Урок 15 из 356 · tests/chapter_01_cpu/test_015_LDA_zero_page.py

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

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

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

addressing_modes.absolute, changed from returning a value to an address
addressing_modes.zero_page
CPU.step, updated $AD branch and new $A5 branch

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

Адресация zero-page кодирует адрес одним байтом операнда. Этот урок также закрепляет переиспользуемое правило: режимы адресации памяти возвращают адреса, а код опкода выполняет итоговое чтение с шины перед вызовом инструкции.

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

# emulator/cpu/addressing_modes.py
def absolute(cpu) -> int:
    return cpu.fetch_word()


def zero_page(cpu) -> int:
    return cpu.fetch_byte()


# emulator/cpu/cpu.py
from emulator.cpu.addressing_modes import zero_page
from emulator.cpu.instructions import lda


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

        if opcode == 0xA5:
            address = zero_page(self)
            value = self.bus.read(address)
            lda(self, value)
            return

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

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

  • zero_page потребляет ровно один байт операнда
  • zero_page и absolute теперь возвращают адреса
  • итоговое чтение с шины выполняет CPU.step
  • lda по-прежнему отвечает за A и Z/N

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

Операнд $10 означает адрес $0010, а не значение $10 и не адрес относительно текущего счётчика команд.

Вне рамок

  • диспетчеризация через таблицу опкодов, введённая в тесте 016
  • перенос через границу страницы при индексной адресации zero-page
  • тайминг циклов

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

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