Эта игра, в значительной мере вдохновлённая Space Invaders, написана с нуля для ATtiny2313 и отправлена на недавно прошедший конкурс 1-килобайтных программ на Hackaday.

Непросто поместить такую игру в 1024 байта. Но автор решил получить в результате полнофункциональную игру с подсчётом очков, звуком и VGA-видеовыходом с разрешением в 640х480 и частотой в 60 Гц.

Разумеется, весь код полностью написан на ассемблере, причём для генерации звука и видео запрограммировано получение точных временных интервалов.

Прерывание по таймеру соответствует требованиям к строчной синхронизации VGA, а поскольку кадровая частота получается делением строчной на целое число, оба вида синхронизации можно поместить в одну процедуру обработки прерывания. Для этого в процедуре производится точный подсчёт циклов.

Строчная частота в 31,5 кГц берётся в той же процедуре за основу при получении звуков.

Процедура обработки прерывания отнимает 90% машинного времени, поэтому вся логика игры просчитывается во время обратного хода луча. Несколько конечных автоматов управляют перемещением персонажей, определением положения ракет, и т.п.

Небольшой знакогенератор используется для хранения как шрифта для отображения счёта, так и тайлов и спрайтов.

Всего за несколько часов до окончания приёма материалов код был готов и отправлен на конкурс. В нём оказалось реализовано всё, что планировалось. Генерация стандартного VGA-сигнала (хотя реальное разрешение значительно меньше, чем 640х480 — «огромные квадратные пиксели»), управление от геймпада для SNES или его клона с тремя сигналами Clock, Latch, Data, программные спрайты с плавным перемещением, а не перепрыгиванием из знакоместа в знакоместо, подсчёт очков, циклическая смена тайлов как в оригинале…



Тот самый геймпад:



Вы тоже можете сделать такое же устройство и поиграть в 1-килобайтный аналог Space Invaders. Соберите схему (кварц на 20 МГц не показан, подключается к выводам 4 и 5, разъём справа сверху — для программатора). Автор утверждает, что нарисовал эту схему на смартфоне в 4 часа ночи непосредственно перед отправкой на конкурс. Разумеется, переходник фирмы Parallax необязателен, можно взять просто VGA-разъём.



При применении переходника устройство выглядит так:



Скомпилируйте исходники (программу и файл заголовка) при помощи AVR Studio или GCC, или просто залейте прилагаемый HEX-файл — так быстрее, но вы не сможете покопаться в коде. И можно воочию убеждаться, что аналог Space Invaders, помещающийся в один килобайт — реальность.

Комментарии (9)


  1. AndrewKK
    06.04.2019 08:35
    +3

    ОГОНЬ! автор большой молодец!


  1. shiru8bit
    06.04.2019 08:37
    +8

    Подобные упрощённые версии Space Invaders в 1K на самом деле существовали давно, чтобы иметь сомнения в реальности — начиная, наверное, с 1K Space Invaders (неожиданное название) для ZX80 в 1981, и потом периодически появлялись версии для разных платформ в аналогичных size coding game dev конкурсах. Но этой версии можно поставить жирный плюс, т.к. те игры обычно шли на каком-то конкретном железе, выводящем графику и звук, опрашивающем ввод, а тут даже видеосигнал генерируется в софте, что требует немало кода.


    1. tormozedison Автор
      06.04.2019 13:17

      1K Space Invaders (неожиданное название) для ZX80 в 1981

      Действует полностью самостоятельно, или обращается к ПЗУ?


      1. shiru8bit
        06.04.2019 15:02

        ZX80 генерирует видео наполовину программно, процессор выполняет роль сканера строк, и видео там чисто текстовое — так что без обращения к ПЗУ никак. С другой стороны, там весь объём ОЗУ 1024 байта, и в них также располагается экранный буфер Так что сама игра занимает 496 байт (экран обрезан до 31x16 вместо полных 32x24).


        1. tormozedison Автор
          06.04.2019 16:00

          Тогда и здесь тоже интересно посмотреть, сколько занимает генерация видео, а сколько — сама игра. По времени — сказано: генерация видео — около 90%. А по объёму кода?


  1. IgorPie
    07.04.2019 00:21
    +2

    Машинный цикл — 1 такт, регенерировать ОЗУ — не нужно, 32 РОН. Оставшиеся "жалкие" 10% быстродействия — это производительнось целых двух Z80/6502, чего хватит на логику с лихвой


  1. DolphinSoft
    07.04.2019 17:10
    +1

    Игра, в которой тебя некому убивать — не игра.
    По-поводу ужатия сего поделия, как заметили выше — никаких сложностей не вижу.
    Думаю можно уложиться и в меньший объем, при этом враги будут стрелять в ответ, а выстрелы будут сопровождаться звуком.
    Касаемо генерации видео — с этим справляется 13я Тинька.


    1. Rigidus
      08.04.2019 02:15
      +1

      Нашел 13-ю тиньку, интересно посмотреть как сделать генерацию видео


      1. DolphinSoft
        08.04.2019 05:48
        +1

        Приблизительно вот так, только в B/W цветах.
        Почитать про формирование видео сигнала и изображения, можно например здесь (проект на 45й Тиньке)