013. Режимы адресации immediate и absolute

Выделить режимы адресации immediate и absolute.

Урок 13 из 356 · tests/chapter_01_cpu/test_013_addressing_modes_inmediate_absolute.py

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

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

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

addressing_modes.immediate
addressing_modes.absolute
CPU.step, existing $A9 and $AD branches

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

Режимы адресации определяют, откуда инструкция берёт операнд. Выделение этого механизма позволяет CPU.step сосредоточиться на выборе опкода, сохраняя при этом уже установленное поведение для непосредственной и абсолютной LDA.

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

# emulator/cpu/addressing_modes.py
def immediate(cpu) -> int:
    return cpu.fetch_byte()


def absolute(cpu) -> int:
    return cpu.fetch_word()


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


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

        if opcode == 0xA9:
            self.a = immediate(self)
        elif opcode == 0xAD:
            address = absolute(self)
            self.a = self.bus.read(address)
        else:
            raise NotImplementedError(
                f"Opcode {opcode:02X} not implemented"
            )

        self._update_zero_and_negative_flags(self.a)

Важное различие

immediate(cpu) возвращает значение. absolute(cpu) возвращает адрес, который путь обработки опкода должен разыменовать через шину.

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

Не стоит заставлять каждый режим адресации возвращать загруженное значение. Инструкциям записи (store) тоже понадобятся адреса, поэтому режимы, возвращающие адрес, должны оставаться независимыми от LDA.

Вне рамок

  • instructions.lda, введённая в тесте 014
  • адресация zero-page и индексная адресация
  • таблица опкодов

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

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