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