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