Команда помнит адрес, а не число

Перед двадцать восьмым уровнем игра предлагает короткое интерактивное вступление: три тумблера задают адрес, и лампа показывает, что лежит в ячейке памяти. Здесь — то же самое в тексте.

Опыт: загляни в ячейку

Перед вами оперативная память. Три тумблера задают номер ячейки — от 0 до 7, — а лампа Data показывает содержимое. В ячейках 2, 3, 4, 5 и 6 заранее лежат числа 1, 2, 4, 8 и 15. Выставьте адрес 2 — лампа покажет 1, адрес 6 — покажет 15. Лампа показывает то, что лежит в ячейке, а не её номер.

Прогноз: что вычтет SUB 1

В программе встречается команда SUB 1. Вычтет ли она единицу? Нет. SUB не умеет читать число прямо из команды: в четырёх битах операнда произвольное число не поместится, поэтому SUB трактует операнд как адрес ячейки. SUB 1 вычтет то, что лежит в ячейке RAM[1], — а там может быть что угодно.

Правило: операнд — это адрес

Команды SUB N и AND N читают ячейку RAM[N], и только LDA загружает само число из операнда. Поэтому числа, которые нужны программе постоянно, заранее селят в память: LDA 1 загружает единицу в аккумулятор, STA 2 записывает её в ячейку RAM[2] — и дальше SUB 2 вычитает именно её. Такие заранее записанные числа называют константами.

Где это используется

На двадцать восьмом уровне программа разбирает кнопки геймпада побитовыми масками 1, 2, 4 и 8, а маска 15 обрезает координаты по краю экрана. Заготовка уровня записывает эти пять констант в ячейки RAM[2]…RAM[6] ещё до основного цикла — дальше команды AND и SUB читают их из памяти на каждом шаге.

Пройти вступление в игре · Гайд уровня 28 · Все вступления