063. Sbc immediate

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

Урок 63 из 356 · tests/chapter_01_cpu/test_063_SBC_immediate.py

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

emulator/cpu/opcodes.py

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

the `sbc` import, opcodes.sbc_immediate, and OPCODE_TABLE[0xE9]

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

Это первая обёртка опкода для базовой инструкции sbc. Непосредственный режим уже возвращает значение операнда, поэтому обёртка только получает его и передаёт дальше.

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

# emulator/cpu/opcodes.py
from emulator.cpu.instructions import (
    lda, sta, ldx, stx, ldy, sty, tax, txa, tay, tya, adc, sbc,
)

def sbc_immediate(cpu: CPU):
    value = immediate(cpu)
    sbc(cpu, value)

OPCODE_TABLE = {
    # ... existing entries ...
    0xE9: sbc_immediate,
}

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

  • опкод $E9 соответствует sbc_immediate
  • immediate получает и возвращает ровно один байт операнда
  • это возвращённое значение передаётся напрямую в sbc
  • выполнение двухбайтовой инструкции продвигает PC на два байта

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

Не читайте шину, используя результат immediate; в отличие от вспомогательных методов адресации памяти, он возвращает значение операнда, а не адрес.

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

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

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

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