022. Sta zero page

Добавление инструкции STA и опкода нулевой страницы ($85).

Урок 22 из 356 · tests/chapter_01_cpu/test_022_STA_zero_page.py

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

emulator/cpu/instructions.py
emulator/cpu/opcodes.py

Расположения

instructions.sta
opcodes imports of sta and zero_page
opcodes.sta_zero_page
opcodes.OPCODE_TABLE[$85]

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

Уроки о загрузке передавали значения в lda. STA устанавливает дополняющую границу записи: режим адресации предоставляет адрес назначения, а инструкция записывает A через шину CPU, не изменяя флаги процессора.

Полная реализация примера

# emulator/cpu/instructions.py
def sta(cpu, address: int) -> None:
    value = cpu.a
    cpu.bus.write(address, value)


# emulator/cpu/opcodes.py
from emulator.cpu.addressing_modes import zero_page
from emulator.cpu.instructions import sta


def sta_zero_page(cpu) -> None:
    address = zero_page(cpu)
    sta(cpu, address)


OPCODE_TABLE = {
    # Preserve existing entries.
    0x85: sta_zero_page,
}

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

  • sta получает адрес, а не значение, прочитанное по этому адресу
  • запись выполняется через cpu.bus.write
  • $85 потребляет один байт операнда и сохраняет A по адресу $00nn
  • STA не изменяет флаги Zero и Negative, в том числе когда A равен $00 или установлен бит 7

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

Не копируйте cpu.bus.read(address) из обработчика LDA: STA записывает A по разрешённому адресу и не выводит флаги из сохранённого байта.

Вне рамок

  • другие режимы адресации STA
  • добавление новых вспомогательных функций для режимов адресации
  • тайминги циклов и эффекты аппаратной части при записи

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

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