146. Instruction cmp

реализовать независимое от режима адресации поведение CMP.

Урок 146 из 356 · tests/chapter_01_cpu/test_146_instruction_cmp.py

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

CMP требует единого, основанного на значении определения семантики: Carry без заёма, Zero для равенства и Negative по обёрнутому вычитанию — прежде чем добавлять какие-либо режимы адресации.

На этом шаге, перед уроками по конкретным режимам адресации сравнения, добавьте в `emulator/cpu/instructions.py` ровно следующий символ:

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

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

CMP выполняет беззнаковое сравнение, используя обёрнутое вычитание только для N. C означает отсутствие заёма (A >= значение), Z означает равенство, а N — бит 7 результата. A, Overflow, память, X, Y и PC неизменны.

Заблуждение: Carry устанавливается, а не сбрасывается, когда A не меньше операнда, и результат вычитания никогда не сохраняется. Вне рамок урока: импорт `cmp` и опкоды CMP — уроки 147 и далее; CPX/CPY — уроки 155–162.

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

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