150. Cmp absolute
добавить опкод CMP absolute ``0xCD``.
Урок 150 из 356 · tests/chapter_01_cpu/test_150_CMP_absolute.py
Зачем нужен этот шаг
Абсолютный CMP позволяет сравнить A с байтом в любом месте памяти CPU, сохраняя разделение между декодированием little-endian эффективного адреса и семантикой флагов.
На этом шаге уроки 146–149 уже предоставляют семантику CMP, импорт и режимы immediate/zero-page. Добавьте в `emulator/cpu/opcodes.py` ровно следующее:
def cmp_absolute(cpu: CPU):
addr = absolute(cpu)
value = cpu.bus.read(addr)
cmp(cpu, value)
OPCODE_TABLE = {
...
0xCD: cmp_absolute,
}`emulator/cpu/addressing_modes.py::absolute получает little-endian слово через CPU.fetch_word; таким образом, CD 00 02 сравнивает A со значением, считанным по адресу $0200`. C/Z/N могут измениться; A, Overflow, X, Y и память остаются неизменными; опкод и слово продвигают PC на три байта.
Заблуждение: слово операнда является адресом, а не непосредственным значением для сравнения, и его байты не в формате big-endian. Вне рамок урока: CMP absolute,X, absolute,Y, (indirect,X) и (indirect),Y — уроки 151–154; CPX/CPY следуют далее.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_150_CMP_absolute.py -v