Карточка 7. Память и программа
Паспорт концепта
- Уровни: 19 «Шаг вперёд (PC+2)» (15 мин), 23 «Геймпад» (30 мин), 24 «Ручной пиксель» (25 мин), 25 «Проверка на минус» (30 мин), 26 «Бросок кубика» (20 мин), 27 «Hello, Ports!» (25 мин), 28 «Движущаяся точка» (45 мин), 29 «ФИНАЛ: Змейка» (60 мин). Часть 2.
- Суммарно: ~250 минут игры, растягивается на 5–6 занятий. Уровень 29 — финал курса программирования, его стоит оставить целиком на самостоятельную работу с разбором после.
- Результаты обучения: ученик объясняет, почему PC шагает на 2 (инструкция — два байта); отличает чтение константы (LDA N) от чтения по адресу (ADD 254); пишет ветвления через SUB и флаги; использует RAM как переменные и порты как устройства ввода-вывода; самостоятельно программирует Змейку на ассемблере.
- Гайды: ур. 19, ур. 23, ур. 24, ур. 25, ур. 26, ур. 27, ур. 28, ур. 29.
План занятия на 45 минут
Первое занятие блока: уровни 19 и 23. Уровни 24–27 идут вторым-третьим занятиями, 28 — четвёртым, 29 — домашний финал.
- 0–10 мин. Разминка: сколько байт занимает инструкция? С уровня 19 — два: опкод и операнд. Спросите, что сломается, если PC продолжит шагать на +1 (процессор прочитает операнд как опкод).
- 10–25 мин. Уровень 19 самостоятельно, затем разбор концепт-чека. Подчеркните: шаг счётчика определяется размером инструкции, а не скоростью памяти.
- 25–35 мин. Разбор LDA и ADD на примере порта 254: LDA 254 кладёт в аккумулятор число 254, ADD 254 прибавляет то, что по этому адресу лежит. Пусть ученики проговорят разницу своими словами.
- 35–45 мин. Уровень 23 в парах. Домашний кусок: уровень 24 целиком; сильным — прикинуть план Змейки заранее (гайд не открывать).
Вопросы для обсуждения
- Почему шаг PC — это размер инструкции, а не «один байт всегда»? Приведите архитектуру, где инструкция длиннее двух байт.
- Чем LDA 254 отличается от ADD 254? Что окажется в аккумуляторе в каждом случае, если на шине по адресу 254 лежит кнопка «влево»?
- Как процессор «узнаёт», что нажата кнопка геймпада, если он умеет только складывать и вычитать числа?
- Ветвление JZ физически — что происходит в схеме? (Концепт-чек уровня 28 даёт готовую формулировку: переключение MUX перед PC.)
- Зачем хранить координаты точки в RAM, а не в «переменных»? Какие «переменные» есть у процессора на самом деле?
- В Змейке задержка сделана пустым циклом. Почему это работает и чем такой способ плох с точки зрения честной инженерии?
Ожидаемые ошибки
Список собран из неверных вариантов концепт-чеков уровней 19, 23, 28 и 29; по мере накопления телеметрии он будет уточняться по реальной доле верных ответов с первой попытки.
- Ученик говорит: «шаг +2 нужен, чтобы пропускать каждую вторую инструкцию». Реакция: тогда половина программы не исполнялась бы. Наоборот — шаг +2 позволяет исполнить ВСЕ инструкции, каждая из которых занимает два байта.
- Ученик говорит: «чётные адреса ROM читает быстрее, поэтому шаг +2». Реакция: скорость чтения не зависит от чётности. Шаг определяется форматом инструкции: опкод + операнд.
- Ученик говорит: «ADD сохраняет результат обратно в память по адресу 254». Реакция: результат остаётся в аккумуляторе; запись в память делает STA, и в порт 254 писать нельзя — это вход геймпада.
- Ученик говорит: «процессор выполняет if внутри АЛУ на каждом такте». Реакция: условных операторов в железе нет. Есть флаг (Zero) и мультиплексор перед счётчиком: сигнал переключает следующий адрес с PC+2 на адрес перехода.
- Ученик ищет «аппаратный таймер» в Змейке. Реакция: дисплей только показывает кадр; пауза написана на ассемблере как пустой цикл декремента — программа тратит такты сама.
Критерии оценки
- Собрал. Уровни 19, 23–28 закрыты, «Проверить» зелёное.
- Собрал и объяснил. Формулирует разницу LDA/ADD, объясняет шаг PC+2 размером инструкции, рисует путь «флаг → MUX → PC» для условного перехода.
- Перенёс на новую задачу. Змейка (ур. 29) сдана самостоятельно без раздела «Решение» гайда; либо ученик добавляет в неё свою фичу (ускорение, счёт очков в RAM).
Задача для сильных
В Змейке организуйте хвост из нескольких сегментов в RAM: адрес сегмента — по указателю, удлинение — инкремент указателя. Подводный камень — переполнение адресов: договоритесь о кольцевом буфере и объясните, почему без него хвост «уедет» в чужие ячейки.
Парная работа
Программист пишет код ассемблера и проговаривает каждую строку; трассировщик ведёт таблицу «такт → PC → инструкция → аккумулятор» на бумаге и ловит расхождения с ожиданием до запуска. Трассировщик не трогает мышь, но обязан спросить «что лежит в аккумуляторе после этой строки?» каждые пять строк. Смена ролей — между уровнями блока.