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