195. Инструкция pla
реализовать поведение PLA.
Урок 195 из 356 · tests/chapter_01_cpu/test_195_instruction_pla.py
На этом шаге измените только `emulator/cpu/instructions.py, добавив pla(cpu). Предварительные условия: STACK_BASE` и установщики флагов нуля/отрицательности уже существуют.
Зачем нужен этот шаг
Извлечение сначала продвигает S к занятому слоту стека, загружает этот байт в A и вычисляет Z и N из только что загруженного аккумулятора.
Предлагаемая реализация
cpu.s = (cpu.s + 1) & 0xFF
cpu.a = cpu.bus.read(0x0100 | cpu.s)
cpu.flags.set_zero_flag(cpu.a == 0)
cpu.flags.set_negative_flag((cpu.a & 0x80) != 0)Поместите эти инструкции в `def pla(cpu: CPU). Можно использовать STACK_BASE и эквивалентную бинарную маску 7-го бита 0b1000_0000`.
Инварианты: увеличивайте и заворачивайте S перед чтением; читайте страницу стека $0100; заменяйте A извлечённым байтом; обновляйте только Z и N, используя бит 7 для N; сохраняйте все остальные биты статуса.
Заблуждение: PLA — это не просто PHA в обратном порядке. В отличие от PHA, он обновляет Z и N из A, но не заменяет весь регистр статуса целиком.
Вне рамок: регистрация опкода $68 относится к шагу 196. PHP и PLP начинаются с шагов 197 и 199; не добавляйте их API или поведение здесь.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_195_instruction_pla.py -v