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