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