064. Sbc zero page

Добавляем SBC Zero Page.

Урок 64 из 356 · tests/chapter_01_cpu/test_064_SBC_zero_page.py

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

emulator/cpu/opcodes.py

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

opcodes.sbc_zero_page and OPCODE_TABLE[0xE5]

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

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

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

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

OPCODE_TABLE = {
    # ... existing entries ...
    0xE5: sbc_zero_page,
}

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

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

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

zero_page возвращает адрес, а не байт для вычитания; обработчик должен выполнить чтение с шины перед вызовом sbc.

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

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

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

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