066. Sbc absolute

Добавляем SBC Absolute.

Урок 66 из 356 · tests/chapter_01_cpu/test_066_SBC_absolute.py

Файл для обновления

emulator/cpu/opcodes.py

Символы для добавления/обновления

opcodes.sbc_absolute and OPCODE_TABLE[0xED]

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

В этом уроке SBC подключается к существующему 16-битному абсолютному адресу с порядком байтов little-endian, следуя той же границе «разрешить-прочитать-делегировать», что и другие опкоды с адресацией памяти.

Полная эталонная реализация

# emulator/cpu/opcodes.py
def sbc_absolute(cpu: CPU):
    addr = absolute(cpu)
    value = cpu.bus.read(addr)
    sbc(cpu, value)

OPCODE_TABLE = {
    # ... existing entries ...
    0xED: sbc_absolute,
}

Важные инварианты

  • absolute потребляет два байта операнда и возвращает 16-битный адрес
  • обработчик читает один байт по этому адресу
  • только sbc изменяет A и арифметические флаги
  • выполнение трёхбайтовой инструкции продвигает PC на три байта

Распространённое заблуждение

Два байта операнда образуют адрес в порядке little-endian; это не значение для вычитания, и их не следует повторно собирать в этой обёртке.

Вне рамок этого шага

  • индексированные абсолютные и косвенные обёртки SBC
  • изменения абсолютной адресации или арифметики SBC
  • тайминг циклов

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

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