159. Instruction cpy
реализовать поведение CPY, не зависящее от режима адресации.
Урок 159 из 356 · tests/chapter_01_cpu/test_159_instruction_cpy.py
Зачем нужен этот шаг
CPY нужен ориентированный на значение примитив сравнения, чтобы все режимы адресации использовали одни и те же правила для флагов отсутствия заёма, равенства и результата с переносом при вычитании.
На этом шаге, после CPX, добавьте ровно этот символ в `emulator/cpu/instructions.py`:
def cpy(cpu: CPU, value: int):
result_8 = (cpu.y - value) & 0xFF
# Flags:
cpu.flags.set_carry_flag(cpu.y >= value)
cpu.flags.set_zero_flag(cpu.y == value)
cpu.flags.set_negative_flag((result_8 & 0b1000_0000) !=0)Вычитание выполняется с переносом исключительно для получения флага Negative; Carry означает отсутствие беззнакового заёма, а Zero означает равенство. Y, операнд, память, A, X, PC и Overflow не изменяются, поскольку CPY не сохраняет результат вычитания.
Заблуждение: CPY не использует существующий флаг Carry и не записывает результат обратно в Y. Вне рамок: импорт `cpy в emulator/cpu/opcodes.py` и её обработчики для непосредственного, нулевой страницы и абсолютного режимов (уроки 160-162).
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_159_instruction_cpy.py -v