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