027. Sta indirect x
Добавление STA с индексно-косвенной адресацией ($81, записывается как `(d,X)`).
Урок 27 из 356 · tests/chapter_01_cpu/test_027_STA_indirect_x.py
Файл для обновления
emulator/cpu/opcodes.pyРасположения
opcodes.sta_indirect_x
opcodes.OPCODE_TABLE[$81]Зачем нужен этот шаг
Тест 020 установил разрешение указателя (d,X) для загрузки. Этот урок повторно использует тот же расчёт итогового адреса как адрес назначения для записи, оставляя механику указателей вне инструкции sta.
Полная реализация примера
# emulator/cpu/opcodes.py
def sta_indirect_x(cpu) -> None:
address = indirect_x(cpu)
sta(cpu, address)
OPCODE_TABLE = {
# Preserve existing entries.
0x81: sta_indirect_x,
}Важные инварианты
- X индексирует расположение указателя в нулевой странице перед разыменованием
- выбор указателя и чтение его старшего байта циклически ограничены нулевой страницей
- 16-битный результат указателя является адресом назначения для записи
- $81 потребляет один байт операнда и не обновляет флаги
Распространённое заблуждение
Не прибавляйте X к итоговому значению указателя. В (d,X) X выбирает, где читается указатель, а sta записывает A по адресу, который хранится в этом указателе.
Вне рамок
- изменения в indirect_x или sta
- STA с адресацией indirect,Y
- тайминги циклов
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_027_STA_indirect_x.py -v