199. Инструкция plp
реализовать поведение PLP.
Урок 199 из 356 · tests/chapter_01_cpu/test_199_instruction_plp.py
На этом шаге измените только `emulator/cpu/instructions.py, добавив plp(cpu). Предварительные условия: STACK_BASE` и соглашение о маске статуса из RTI уже существуют.
Зачем нужен этот шаг
PLP продвигает S к сохранённому байту статуса и заменяет P этим байтом после удаления непостоянных битов 4 и 5 этой модели эмулятора.
Предлагаемая реализация
cpu.s = (cpu.s + 1) & 0xFF
flags = cpu.bus.read(0x0100 | cpu.s)
cpu.p = flags & 0b1100_1111Поместите эти инструкции в `def plp(cpu: CPU); эквивалентный адрес STACK_BASE + cpu.s` также выбирает страницу стека $0100.
Инварианты: увеличивайте и заворачивайте S перед чтением; заменяйте, а не объединяйте P; очищайте биты 4 и 5; восстанавливайте все остальные сохранённые биты флагов в точности; не вычисляйте Z или N из числового байта, как это делает PLA.
Заблуждение: PLP не объединяет флаги со старым P выборочно через операцию ИЛИ. Это оставило бы устаревшие флаги, которые сохранённый статус явно очистил.
Вне рамок: регистрация опкода $28 относится к шагу 200. Более поздние API флагов не должны добавляться в эту реализацию.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_199_instruction_plp.py -v