043. Ldy zero page
Добавьте LDY zero page ($A4).
Урок 43 из 356 · tests/chapter_01_cpu/test_043_LDY_zero_page.py
Файл для обновления
emulator/cpu/opcodes.pyРасположения
opcodes imports of zero_page and ldy
opcodes.ldy_zero_page
opcodes.OPCODE_TABLE[$A4]Зачем нужен этот шаг
В отличие от непосредственной LDY, LDY нулевой страницы вычисляет операнд в адрес, читает байт по этому адресу и затем делегирует поведение регистра и флагов инструкции ldy.
Полный пример реализации
# emulator/cpu/opcodes.py
from emulator.cpu.addressing_modes import zero_page
from emulator.cpu.instructions import ldy
def ldy_zero_page(cpu: CPU):
addr = zero_page(cpu)
value = cpu.bus.read(addr)
ldy(cpu, value)
OPCODE_TABLE = {
# Preserve existing entries.
0xA4: ldy_zero_page,
}Важные инварианты
- $A4 сопоставляется с ldy_zero_page и потребляет один байт операнда
- zero_page возвращает адрес в диапазоне $0000-$00FF
- обработчик выполняет одно чтение данных и передаёт в ldy это значение, а не адрес
ldyобновляет Zero и Negative
Распространённое заблуждение
Передача addr напрямую в ldy загрузила бы номер ячейки нулевой страницы, а не хранящийся там байт.
Вне рамок задания
- кодировки LDY zero-page,X и absolute
- новые вспомогательные функции режимов адресации
- тайминг циклов
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_043_LDY_zero_page.py -v