Карточка 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 целиком; сильным — прикинуть план Змейки заранее (гайд не открывать).

Вопросы для обсуждения

  1. Почему шаг PC — это размер инструкции, а не «один байт всегда»? Приведите архитектуру, где инструкция длиннее двух байт.
  2. Чем LDA 254 отличается от ADD 254? Что окажется в аккумуляторе в каждом случае, если на шине по адресу 254 лежит кнопка «влево»?
  3. Как процессор «узнаёт», что нажата кнопка геймпада, если он умеет только складывать и вычитать числа?
  4. Ветвление JZ физически — что происходит в схеме? (Концепт-чек уровня 28 даёт готовую формулировку: переключение MUX перед PC.)
  5. Зачем хранить координаты точки в RAM, а не в «переменных»? Какие «переменные» есть у процессора на самом деле?
  6. В Змейке задержка сделана пустым циклом. Почему это работает и чем такой способ плох с точки зрения честной инженерии?

Ожидаемые ошибки

Список собран из неверных вариантов концепт-чеков уровней 19, 23, 28 и 29; по мере накопления телеметрии он будет уточняться по реальной доле верных ответов с первой попытки.

  • Ученик говорит: «шаг +2 нужен, чтобы пропускать каждую вторую инструкцию». Реакция: тогда половина программы не исполнялась бы. Наоборот — шаг +2 позволяет исполнить ВСЕ инструкции, каждая из которых занимает два байта.
  • Ученик говорит: «чётные адреса ROM читает быстрее, поэтому шаг +2». Реакция: скорость чтения не зависит от чётности. Шаг определяется форматом инструкции: опкод + операнд.
  • Ученик говорит: «ADD сохраняет результат обратно в память по адресу 254». Реакция: результат остаётся в аккумуляторе; запись в память делает STA, и в порт 254 писать нельзя — это вход геймпада.
  • Ученик говорит: «процессор выполняет if внутри АЛУ на каждом такте». Реакция: условных операторов в железе нет. Есть флаг (Zero) и мультиплексор перед счётчиком: сигнал переключает следующий адрес с PC+2 на адрес перехода.
  • Ученик ищет «аппаратный таймер» в Змейке. Реакция: дисплей только показывает кадр; пауза написана на ассемблере как пустой цикл декремента — программа тратит такты сама.

Критерии оценки

  1. Собрал. Уровни 19, 23–28 закрыты, «Проверить» зелёное.
  2. Собрал и объяснил. Формулирует разницу LDA/ADD, объясняет шаг PC+2 размером инструкции, рисует путь «флаг → MUX → PC» для условного перехода.
  3. Перенёс на новую задачу. Змейка (ур. 29) сдана самостоятельно без раздела «Решение» гайда; либо ученик добавляет в неё свою фичу (ускорение, счёт очков в RAM).

Задача для сильных

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

Парная работа

Программист пишет код ассемблера и проговаривает каждую строку; трассировщик ведёт таблицу «такт → PC → инструкция → аккумулятор» на бумаге и ловит расхождения с ожиданием до запуска. Трассировщик не трогает мышь, но обязан спросить «что лежит в аккумуляторе после этой строки?» каждые пять строк. Смена ролей — между уровнями блока.