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