13 июля 2009 в 17:22

Самая маленькая игра в мире (58 байт)

Для тех, кто читал статью в песочнице: добавил раздел «Можно ли сделать игру меньше?».

Прочитав историю одного байта, вспомнил свою историю.

Когда я учился в школе и только начинал программировать меня очень привлекал ассемблер и оптимизация. А именно — кропотливая оптимизация, с подсчетам тактов и байтов. На летних каникулах у меня с двоюродным братом появилась идея написать самую маленькую игру в мире.

Первый прототип, размером 80 байт, был готов на следующий день. (Поскольку о контроле версий тогда я даже не догадывался, то остается верить воспоминаниям). С этого момента началась моя борьба за байты. Помню, довольно быстро размер был уменьшен до 65 (или около того), дальше каждый байт давался все с большим и большим трудом. К концу лета результат был 58 байт.

Сюжет и управление


Вы несетесь по трассе на грузовике с двумя прицепами. Слева от вас разделительная полоса, справа обочина укрытая травой. На дороге встречаются люди и деревья (может ямы). Ваша задача: не сбивать людей и не врезаться в деревья (не попадать в ямы).
Управление: стрелки влево-вправо — поворот; Esc — пауза.


Скриншот




Исходный код


begin: <br>
  ; ds указывает на видеопамять <br>
  push 0b800H <br>
  pop ds <br>
  ; установить графический режим 40×25 <br>
  int 10H <br>
  ; bx = 700H - смещение, по которому находиться грузовик <br>
  mov bh, 7H <br>
  <br>
main_loop: <br>
  ; Задержка и вывод грузовика на экран <br>
  xchg cx, ax  ; mov ah, 0 <br>
  int 1AH <br>
  mov [bx], dl <br>
delay: <br>
  int 1AH <br>
  cmp [bx], dl <br>
  je delay <br>
  <br>
  ; si - смещение следующего препятствия <br>
  xchg ax, si <br>
  add al, dl <br>
  xchg ax, si <br>
  <br>
  xchg ax, cx   ; mov cx, 0 <br>
  <br>
  ; Получение нажатой клавиши <br>
  in al, 60H <br>
  cmp al, 77 <br>
  jnz keytest1  <br>
  ; вправо <br>
  inc bx <br>
  inc bx  <br>
keytest1: <br>
  ; влево <br>
  ja keytest2 <br>
  dec bx <br>
  dec bx <br>
keytest2: <br>
  ; очистка буфера клавиатуры <br>
  mov ah, 0CH <br>
  int 21H <br>
  ; скролл экрана на 1 строчку <br>
  mov ax, 0701H <br>
  mov dx, 1827H <br>
  int 10H <br>
   <br>
  ; вывод препятствия <br>
  mov [si], ax <br>
  ; вывод травы и разделительной полосы <br>
  mov [di+51], dx <br>
  ; проверка что перед грузовиком нет препятствий <br>
  cmp [bx], dh <br>
  ja main_loop <br>
  <br>
  ret <br>

Архив с исходником и бинарником (для компиляции использовался Tasm)

Комментарии


В XP программа работает, но таймер работает не гладко и сначала не обнулено состояние клавиатуры. В DosBox'е работает без проблем.

В исходнике, две инструкции (push 0b800H и mov [di+51], dx) записаны в машинном коде (db 68H, 00H, 0b8H и db 89H, 55H, 51H), это связано с тем, что Tasm их не воспринимал в режиме компиляции по умолчанию. По-моему он требовал включения инструкций x386, хотя могу и ошибаться.

Можно ли сделать игру меньше?


Скорее всего — да. Много места занимает прокрутка экрана (8 байт) и задержка (10 байт). Если поменять направление движения (препятствия надвигаться снизу вверх), то скролл можно заменить быстрым выводом символа перевода строки (mov al, 0Ch; int 29h). Задержку можно заменить проверкой состояния двойного слова по адресу 0040:006Сh. Там должен находиться счетчик отсчетов таймера с полуночи (Timer ticks since midnight).

UPD: Спасибо! Перенес в блог «Ассемблер»

UPD2: Imp5 подсказывает, что я не совсем прав. Shifticida — игра для двоих игроков, которая занимает 32 байта. Так что правильное название топика: «Самая маленькая гоночная игра в мире»
Денис Потапов @PatapSmile
карма
264,0
рейтинг 0,0
Обо всём и ни о чём
Самое читаемое Разработка

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

  • +32
    Приятно, что есть ещё фанаты асма. Прекрасно, коллега!
  • +44
    Вот она, старая школа! Каждый байт на вес золота!
    • +13
      ну не только старая.
      По-хорошему, програмеры разных микроконтроллеров порой тоже весьма зажаты в байтах…
    • +2
      Это да, а сейчас 1 полигон в игре больше. Производители железа развратили кодеров:)
      • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
  • +7
    Приятно, что такая игра загрузится за 0,0004 сек на мегабитном канале интернета.
    Кстати, пустая SWF-ка, в которой ничего нет, занимает 36 байт.
    • +9
      Вспоминается аналогия:
      программа на WPF занимает 20кб, но что бы ее запустить нужно .netFramework 3.5 который весит 200мб :)
      • +93
        программа на ассемблере занимает 58 байт. Но чтобы ее запустить — нужен i386 процессор весом около 50 грамм :)
        • +3
          предлагаемая версия не использует 32-битных инструкций, так что берите ещё ниже :)
          • +6
            Те процессоры были тяжелее :)
            • 0
              Не факт. i8088 в пластиковом корпусе будет легче i80386DX в керамическом.
              Хотя Am486SX в PQFP возможно ещё легче был.
              • 0
                Страшно даже подумать, что 88-й был выпущен в 79-м. Спустя 30 лет всего 64)
  • +51
    Много места занимает прокрутка экрана (8 байт)…


    Таких людей осталось мало, и скоро, к сожалению, совсем не будет. Vale!
    • +69
      Это угроза автору? )))
    • +1
      будет и осталось.

      например, моя программа ExactMouse для win32 написана на Ассемблере (-:
  • +1
    Отлично, моё почтение.
  • НЛО прилетело и опубликовало эту надпись здесь
  • +5
    o_O

    Графика, конечно, не как в .kkrieger, но и места занимает в полторы тысячи раз меньше. Респект.
  • +1
    А не выпустить ли железяку на микроконтроллере и с маленьким ЖК экраном с набором таких игр?
    • +59
      Как бэ уже давно:
      • +1
        Вот и надо обойти китайцев, и сделать у нас такую штуку, только игры будут более оригинальные, ведь по части выдумки нам равных нет.
        • +3
          По части выдумки равных нет. А по части производства и продаж: сложнее. Хотя могло бы пользоваться спросом.
        • +5
          Проблема в том что они будут непопулярны. Они не смогут конкурировать с игровыми возможностями обычных телефонов. :)
          • +2
            Мода как известно развивается по спирали, так что вполне вероятно что через какое-то время такого рода игры опять будут популярны. Можно вместо устройства просто писать программы для телефонов.
            • 0
              тем более некоторые устройства уже снова начинают понимать ассемблер)
              такие как siemens и sony ericsson с поставленным на них эльфпаком
        • +13
          Уже обошли:)
        • 0
          И весить отечественный девайс будет пол кило, не меньше :)
          Это была байка такая, не знаю, факт или нет: собрали мобильник полностью из российских деталей. Получился агрегат весом 950 грамм.
          • +1
            Зачем байки слушать — ГЛОНАСС который никуда не влезает и жрет как паровоз
            www.3dnews.ru/auto/glospace_sgk_70/
            • +2
              Ага, даже шутка такая есть.
              На уссурийского тигра ВВП надел ГЛОНАСС-передатчик, чтобы всегда знать, где находится это редкое животное. Теперь все знают, где тигр — там, где его с передатчиком оставили, т.к. передвигаться с ним он уже не может.
        • 0
          Ну тетрис же русский изобрел.
          www.youtube.com/watch?v=O0gAgQQHFcQ
    • +4
      Ага, и тетрисом назвать! Наверняка никто такого не делал
      • +1
        То тетрис, а здесь можно напихать сотни маленьких программ.
        • +2
          к концу популярности подобных устройств там были и подобные гонки. Единственно поле было поменьше…

  • 0
    очень здорово!
  • +2
    Снимаю шляпу. Вы — золотой человек!
  • +5
    Какой добрый топик… Душу греет! А в сравнение на ум приходит только подкованная Левшой блоха.

    Поставлю всем плюсов…
  • +13
    В детстве, когда я мечтал о компьютере БК0010, или хотя бы о программируемом калькуляторе, я написал еще более короткую игру, которая шла на калькуляторе, у которого можно было табом менять значения, выводимые на экран.

    В ячейку Х вводилось число 555555.

    В ячейку Y вводилось число 222222.

    Затем, нажимая на кнопку таб, собственно можно было начать наблюдать игру: «Танцующие змеи»:
    • +4
      Я тоже начинал программировать на программируемом калькуляторе МК-61 (до сих пор жив и работает, не так давно даже пользовался по прямому назначению) и БК-0010 (и БК-0011М).

      Помню как в одном журнале увидел программу для МК-61 играющую в игру «Бридж», и при этом занимающую то ли 8, то ли 16 байт. Другой аналог этой программы занимал более 100 байт, и играл гораздо медленее и хуже.
      • 0
        Эх, были времена… Помню, тоже «программировал» игры на МК-52. Тоже читал журналы (кажется, то был ж-л «Техника-молодежи», кстати, отличный журнал), там публиковали исходники игр с комментариями. Читатели даже нашли недокументированные возможности, когда числа при переполнении разрядов превращались в «монстров» :)
        • 0
          я тоже с мк-56 начинал программировать. учитель офигела когда я принес его в школу и ее глазах написал игру быки и коровы. с тех пор разрешили с десятым классом мне семикласснику ходить на информатику. но я очень скоро понял что они там ничем интересным не занимаются и попросился паралленьно еще и с 11 классом ходить. в итоге после 7 класса уже программировал на бейсике для БК.
      • +1
        Точно меньше 10, скорее всего 9 байт. Можно поискать. При этом у него была выигрышная стратегия ))
    • +16
      ЕГГОГ!
    • +1
      Спасибо, поностальгировал:
      F Прг

      01.5 02.5 03.5 04.5 05.5 06.5 07.5 08.5
      09.B↑
      10.2 11.2 12.2 13.2 14.2 15.2 16.2 17.2
      18.(F ¤)
      19.(БП 18)

      F Авт
      В/О
      С/П
    • 0
      Эхехе, ностальгия… МК-54 и МК-61, программы из «Техники Молодёжи», игры «Бесконечная история» и «Лабиринт» — помните такое? Особенно игрушки, которая даже умудрялись не занимать всю доступную память калькулятора, а игрались так, что современные «шедевры» отдыхают.
      Самой большой неприятностью казался однострочный экран. «Эх, а вот с многострочником я бы наворотил!» — главная мысль того времени.
      А потом уже появилась какая-то из «Электроник»-клонов «Спектрума». До сих пор дома пылится, кстати.
  • +2
    во сколько уложитесь при добавлении блекджека и шлюх во второй версии?
    шютка, респект.
  • 0
    Игра «подтормаживает» сама по себе, или у меня железо старое?
    зы: про подтормаживает — я не шучу
    • +2
      Скорее всего это следствие «В XP программа работает, но таймер работает не гладко»
    • 0
      Вы запускаете под XP? Там таймер работает не так как в DOS'е. Попробуйте запустить с опцией «Эмуляция совместимого аппаратного таймера» (Compatible timer hardware emulation).
  • НЛО прилетело и опубликовало эту надпись здесь
    • +7
      Юные дарования сейчас могут писать только крестики-нолики, требующие 8 ядер и гигабайт памяти ..(
      • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      я начинал с Правцов болгарских, писал на машинных кодах там, потом перешёл на Спектрум, ассемблер, затем 0x86.
      • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    сурово. интересно, действительно она самая маленькая?
  • +2
    Шикарно. Уважаю и завидую.
  • +2
    Называлась эта игра «Слалом»
  • +3
    а вы демки писать не пробовали? =)
    • +3
      кстати да, вам бы в демосцену ;)
      • +1
        я думаю, после годика эскпериментов парень бы выдал неплохие 4k-демки ;)
    • +2
      Пробовал, но был молод и поэтому особенных результатов не достиг)

      В тот момент, когда я заканчивал свой килобайтный 3д движок, мне показали 4кб демку Меша (названия точно не помню, но в архивах должна где-то быть) — 10 минут 3д сцен и музыки. Она убила мою веру в себя.
      • +1
        посмотрите Seven Heaven, тоже очень стоящая работа
        я когда ее в первый раз увидел — долго смотрел на свой комп и думал, как это вообще возможно )) потом понял
        на самом деле советую скачать некоторые демки, которые распространяются вместе с сорцами, там много интересного
        • 0
          сорри, опечатался — Heaven Seven
          • 0
            Меня Chaos Theory от демо-группы Conspiracy ещё поразила. :)

            Впрочем, любителям этой темы стоит основательно покопаться в архиве демосцены. Особого внимания заслуживают конкурсные работы с демо-пати Assembly, Breakpoint, The Gathering и почившей в бозе Mekka & Symposium.
            • +1
              о да
              это история
              я уже и не сосчитаю, сколько я оттуда скачал и насмотрелся
              вот умеют же некоторые с компом обращаться!
              • 0
                а меня в своё время, очень потрясла fr08v101
                да и сейчас тоже запустил, посмотрел, нет слов…
                • +1
                  а Elevated уже видели?
                  • 0
                    я когда такое смотрю, убеждаю себя что это все в винде уже прописано, а они просто вызвали недокументированную функцию воспроизведения ;-)
  • 0
    Офигенно!
  • –1
    Ещё бы несколько таких людей и можно переписывать исходники Мира, тогда бы улучшилась производительность всех людей на земле. )))
    • +2
      размер как правило никак не связан с производительностью ;)
      • 0
        Автор в данном случае считал байты, но так же увлекался, судя по его рассказу, и тактами ,.)
      • –1
        Производи́тельность — внесистемная величина, равная отношению объема проделанной работы к времени, за которое она была совершена.

        Есть две программы, выполняющие одно и то-же(объем проделанной работы) первая — 50 байт, вторая — 100, соответственно первая выполняется за 50 тактов, вторая за 100 (если считать одна команда — один байт). Какая программа быстрее и, соответственно, у которой
        больше производительность?
        • +4
          Производительность больше у второй, там развёрнуты все циклы :-P
        • +3
          Вероятно, если я расскажу, что в программе могут быть операторы переходов, это станет для вас открытием )
  • +3
    Хорошая тема! Любителям минимализма: www.guimp.com/
    • 0
      1. Кликнуть на flash.
      2. Выбрать игру.
      3. Играть.
      • 0
        Cheat: Win+Plus ;)
  • 0
    А у вас в игре скроллинг плавный? (игру не запускал) Смотрелось бы отлично. Делается через запись в контроллер ЭЛТ, просто пишется значение по определенным адресам, в справочниках кажется Фроловых было описание.
    • 0
      если запускать из под XP — не плавный, прыгает
      до для такого размера файла — простительно
    • 0
      Нет. Скроллинг посимвольный (8 пикселей за раз). Все из-за размера, насколько я помню, только чтобы обратиться к контроллеру надо было 3-4 инструкции.
    • 0
      Вместе с этим еще можно символы грузовика в шрифте модифицировать, сдвигая на пиксель вверх, тогда и скроллинг плавный будет и грузовик дергаться не будет :)
  • 0
    Потрясающе!
  • +1
    эх, потерял свою реализацию конвейевской «Жизни» с встроенным редактором… тоже байт 70 было :)
  • +1
    Когда-то занимался подобными вещами на Спектруме.
  • 0
    Хорошо что хоть кто-то еще этим занимается :)
    Интерестно было потыркаться… Молодость всполмнил…
  • +1
    Даешь второй уровень!
  • 0
    Быстро так едет)
  • +6
    Автор молодчага, а я свой асм забросил, лет 6 назад. Вспомнились строки из «Программистской молодости»:

    «Но это время прошло, но это было давно,
    Теперь y каждого нудной работы полно,
    И заказчик-дурак тычет мышкой в картиночки гордо...»


    "… Теперь нам лень изощряться, оптимизировать код,
    И интерфейс с дураками мы пишем из году в год,
    Свыклись с мощной машиной, отвыкли от всякого риска.
    Забыли коды команд и старых трюков запас..."

    Удачи автору!

  • 0
    Шикарно! И летние каникулы с толком провели)
  • +4
    игра в 32 байта, правда, жанр другой.
    www.pouet.net/prod.php?which=50234&howmanycomments=100
    • 0
      Хаха! Одна из первых вещей, которые я делал на флэше в школьном далеком прошлом: files.webi.ru/m_down/peretiaganki.swf.html
      • +2
        А вы таки на асме попробуйте ;-)
        • –2
          Я не пишу на асме. Мне за это минус? Новые правила хабра? Хм…
          • +2
            Да нет, не новые. Просто это примерно как если бы вам похвастались что его картины выставляются в Эрмитаже, на что вы ответили бы что «да, эт прикольно. я тоже на заборах хорошо рисую» :)

            К слову, минус ставил не я.
    • 0
      Спасибо за ссылку, добавил в топик. Исходник было интересно почитать.
    • +15
      Уважаемый, вы заставили моё сердце встрепеннуться. Cреди комментов на поуёте, была ссылка на игрушку K.Y.K.

      Так вот, Dr. Max — это я (;

      а k.y.k. мы писали с моим однокласником. так сказать «на перегонки». модемов тогда ещё не было в нашей деревушке, по этому мы активно менялись дискетами в классе (боже мой, сколько всего интересного влезало в эти 1457664 байта! Умопомрочительно!).

      Я сделал первую версию весом байт в триста. Серёга на следующий день принём версию в 280 или около того… я сдела 188… он ответил на это 128 байтами… кончилось тем, что я упаковал это в 37.

      до сих пор с умилением вспоминаю эти дни… (;

      Сейчас доделаю кой чего по дому и может выложу куда архивчики этих забавных древностей (если компашка с бэкапом не накрылась).

      p.s. Кто этот Pirx и откуда он взял мою игрушку и инфо о ней? ооочень интересно… (8
    • +2
      Вот, может кому будет интересно. «Я изучаю ассемблер» называется. (;

      не смотрите на даты, там небольшой косяк с ними. по идее всё это происходит в 1997 году (может осенью, а может весной). из-за этого же косяка очень сложно восстановить порядок в котором они были написаны. но, подозреваю что чем меньше получаемый комок, тем более поздняя это версия. (8

      narod.ru/disk/10887439000/kyk_history.tar.bz2.html

      сейчас поставлю себе dosbox и буду смотреть чего там ещё есть в этом архивчике (а там что-то уж сильно дофига всего :)

      Только вот очень обидно, что не сохранились серёгины версии. Хоть и без исходников, но всё равно забавно было бы поизучать.
  • 0
    Спасибо, поностальгияровал. Тоже на tasm'е писал и оптимизировал.
  • 0
    Жаль старые версии потерялись, интересно было бы почитать про процесс оптимизации :)
  • +1
    Когда-то давно реализовывал программку, которая тупо выводила на экран cpuid. Уложился в 14 байт, и то только благодаря какой-то случайности, вроде последовательности регистров при массовом запихивании в стек.

    Но теперь, думаю, что можно и меньше сделать ;)
  • 0
    Это целое искусство…
  • –1
    на дороге встречаются люди и деревья. и столбы перебегают иногда ;)
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Чем больше у человека доступных ресурсов — тем больше он будет лениться. Зато такие задачки как эта, когда приходится действовать в очень ограниченных рамках, заставляют по-настоящему шелевить мозгами :)
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Раньше именно байтами и измерялись.
        • 0
          А демо сцена, точнее говоря 4KB и 64KB интро, тогда что, полная свобода действий?
      • 0
        Раньше ограничением был объем памяти, сейчас — высокая нагрузка. Изменился вектор и приемы, но проблема не исчезла
  • +1
    как вам знаменитый kkrieger? www.theprodukkt.com/kkrieger
    • –1
      интересно, влезла бы она на DVD-болванку, если бы ее делали товарищи из Rockstar Games :)
  • +1
    Искренне завидую, во времена ассемблера я под стол пешком ходил, а про такие вещи остается только слушать старших коллег :)
    • 0
      Никогда не поздно начать. Ниша однокристаллок еще вовсю асм юзает.
  • –2
    Асма-асма) Люди умели ценить ресурсы, сейчас бывает взглянешь на код, так как-будто специально пишут чтобы подлиннее, да потяжелее, особенно этим страдают Java-кодеры.
    • +2
      Расскажите это Java ME разработчикам, они с вами вместе посмеются.
      Или разработчикам LinkedIn, который написан на Java.

      И вообще, только вот грязи не надо.
  • +4
    Огромный респект автору!

    Я тоже начинал с MK-52 и с журналом «Техника-Молодежи», кстати, очень помогло в институте на информатике (сразу посадили самостоятельно изучать… хм… бейсик на Ямахах, он кстати от Майкрософта был) и ..., вы не поверите — астрономии! Дали задание: кто напишет самую короткую программу для преобразования сферических координат — вот тогда пятерку я этим себе честно заработал.

    А еще был такой ПК «Вектор», кстати, нравился он мне больше чем БК, т.к. там аж целых 32Кб было под видеопамять выделено, а это 256*256*16 из 256 возможных цветов… предел мечтаний! :) Правда видеопамять там была по уродски устроена, постраничная, цвет пиксела складывался из битов расположенных друг от друга на расстоянии 8 Килобайт. И чтоб одну точку поменять, надо было 4 байта изменить, но зато благодаря такой организации памяти можно было видеопамять под данные отдавать за счет уменьшения битности цвета…

    А игруху я писал, это я в тетрадке, по тактам процессора рассчитывал, насколько та или иная процедура на ассемблере будет более быстрой для вывода спрайта. «Профилирование» кода в тетрадке… :)

    И дисковода не было грузился с магнитофона, загрузишь с магнитофона ассемблер, напишешь, сохранишь на кассету исходник, скомпилируешь, скинешь на кассету, выгрузишь ассемблер, загрузишь что скомпилировал, потестируешь… и все по новой — романтика!

    А сейчас? Столько возможностей, пиши на чем хочешь, для чего хочешь! И порой думаешь: эх, молодежь нынче ленивая стала — им сейчас все на блюдечке с голубой каёмочкой, а они — лентяи, ничего делать не хотят! Но вот только сейчас от всего этого IT изобилия я периодически испытываю настоящий шок — так все быстро меняется, появляется так много новых технологий, что только успеешь освоить одну, как она уже устаревает. Поэтому и молодежи сейчас даже видимо тяжелее, чем нам, они другие сейчас так как время сейчас другое…

    • +2
      все меняется, время летит. и даже если нас самих вернуть в то время, то не повторятся те эмоции, тот дух, тот интерес, что бывало оторвешься чаю попить — в окно взглянул — а там рассвет.
      • 0
        Со всем уважением, последнее — повторяется — и еще как! (сейчас танцую с бубном вокруг GLSL...)
  • +1
    Супер! Побольше бы таких фанатов ассемблера. :)
  • 0
    Просто топик добра!
    • 0
      я бы сказал сказал умиления и ностальгирования)
  • +1
    По поводу сюжета. Интересная такая дорога, где поперёк вмещается более чем три десятка грузовиков и прямо на полотне растут деревья. =))) Если действительно сменить направление прокрутки, то можно придумать что-нибудь по поводу батискафа и мин. ;)
  • 0
    Весьма достойно, браво :)
  • 0
    Не перевелись еще богатыри на земле Русской. Порадовали :)
  • 0
    Вы используете функции вызова BIOS и DOS для работы с экраном и клавиатурой.
    • 0
      Так точно!
      • +1
        Читер! ;)
  • 0
    Кто как, а я и щас байты считаю. На Микроконтроллерах. Сижу вот пишу маленькуй маленькую кооперативную ОС. Пока укладываюсь в 400байт.
  • –1
    Молодооость…

    Вспоминаю FORTH :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.