155. Instruction cpx

реализовать поведение CPX, не зависящее от режима адресации.

Урок 155 из 356 · tests/chapter_01_cpu/test_155_instruction_cpx.py

Зачем нужен этот шаг

CPX нужно единое, ориентированное на значение определение флагов отсутствия заёма, равенства и результата с переносом при вычитании, прежде чем добавлять опкоды для конкретных режимов адресации.

На этом шаге, после всех уроков по CMP, добавьте ровно этот символ в `emulator/cpu/instructions.py`:

def cpx(cpu: CPU, value: int):
    result_8 = (cpu.x - value) & 0xFF

    # Flags:
    cpu.flags.set_carry_flag(cpu.x >= value)
    cpu.flags.set_zero_flag(cpu.x == value)
    cpu.flags.set_negative_flag((result_8 & 0b1000_0000) !=0)

Вычитание с переносом используется только для получения флага Negative. Carry означает отсутствие беззнакового заёма (X >= value), а Zero проверяет равенство. X, операнд, память, A, Y, PC и Overflow не изменяются, поскольку результат нигде не сохраняется и эти места остаются нетронутыми.

Заблуждение: CPX — это не SBC, она не использует флаг Carry и не записывает результат вычитания обратно в X. Вне рамок: импорт `cpx в emulator/cpu/opcodes.py` и её обработчики для непосредственного, нулевой страницы и абсолютного режимов (уроки 156-158), а также CPY (159-162).

Запустить этот урок

uv run pytest tests/chapter_01_cpu/test_155_instruction_cpx.py -v