- PVSM.RU - https://www.pvsm.ru -

Демосцена и FreeBSD

Решил вспомнить счастливое детство и полазить по сайтам демосценеров — с удивлением обнаружил, что многие выкладывают релизы под.. FreeBSD [1].

FreeBSD — мягко говоря не самая подходящая система для занятия оптимизированной графикой, поэтому наличие такого количества демо целенаправленно создаваемых под эту систему озадачило.

Поскольку я немного понимаю в компьютерах и использую FreeBSD в качестве одной из основных ОС, решил немедленно собрать и запустить самые интересные проекты.

Ghosts of Mars by Faemiyah, на моей домашней FreeBSD.

Ghosts of Mars by Faemiyah [2], на моей домашней FreeBSD.

Для непосвященных

Демосцена[1] [3][2] [4][3] [5][4] [6] (англ. [7] demoscene) — киберкультура [8], зародившаяся в конце 1970-х годов [9] вместе с распространением первых домашних компьютеров [10]. Это направление компьютерного искусства [11], главной особенностью которого является выстраивание сюжетного видеоряда, создаваемого в реальном времени компьютером, по принципу работы компьютерных игр [12].

Демосцена [13] это было и есть и будет круто.

Наверное все серьезные игровые движки и все компьютерные спецэффекты были созданы (и делаются поныне) бывшими сценерами:

4players.de reported that "numerous" demo and intro programmers, artists, and musicians were employed in the games industry by 2007. Video game companies with demoscene members on staff included Digital Illusions [14], Starbreeze [15], Ascaron [16],[43] [17] 49Games, Remedy [18], Techland [19], Lionhead Studios [20],[44] [21] Bugbear [22], Digital Reality [23], Guerrilla Games [24], and Akella [25].[45] [26]

The Tracker music [27] which is part of Demoscene culture could be found in many Video games of the late 1990s and early 2000s, such as the Unreal [28], Unreal Tournament [29], Deus Ex [30], Crusader: No Remorse [31], One Must Fall: 2097 [32], Jazz Jackrabbit [33] and Uplink [34].[46] [35]

Словом демосцена это про спецэффекты и преодоление — как впихнуть невпихуемое туда где ему не место, чтобы стало круто и все офигели. И все действительно офигевают. На полном серьезе.

Ниже несколько классических примеров в качестве иллюстрации.

fr-041: debris. by Farbrausch

Все что вы видите на видео делает «программулина» в 177 килобайт. Это почти в 10 раз меньше размера 3.5 дюймовой дискеты [36], если кто‑то еще помнит такое устройство.

Исходники тоже уже выложены [37], если кому интересно.

Lifeforce by Andromeda Software Development

Это уже большое демо — целых 26 Мегабайт! Правда это все еще раз в десять меньше вашей обычной сборки очередного корпоративного говнопроекта, но тем не менее.

Также у группы есть свой очень крутой сайт [38] с кучей других красивых демо.

heaven seven by Exceed

И снова 172кб бинарник рисует и поет всю эту красоту.

Craft by lft

Позволю процитировать автора:

Craft is a demo running on its own minimalistic demo platform. The demo platform is based on an ATmega88 [39] microcontroller.

В самом начале видео демонстрируется та самая «own minimalistic demo platform», на которой вся эта красота запускается.

После публикации статьи на ЛОРе [40], народ подкинул еще пару интересных проектов, которые просто необходимо упомянуть.

Dírojed by Řrřola

32 байта:

echo 'B013CD10C51F380F10276BDBE58A0F0209028FBFFE02483F4BE460FEC875E7C3' | xxd -r -p - dirojed.com
dosbox dirojed.com

Вот так это выглядит в живую:

Dosbox это такой эмулятор, скачать версию для Windows можно вот отсюда.

Dosbox это такой эмулятор, скачать версию для Windows можно вот [41] отсюда.

Hoody by Rgba

4кб приложение генерирует такую красоту:

Демосцена и FreeBSD - 3

Это не статичная картинка и не 3D модель — это алгоритмы, чистая математика, тот самый «матан» который вы так не любили все годы в ВУЗе.

Вот тут [42] алгоритм из демо повторен с помощью WebGL:

Демосцена и FreeBSD - 4

Ниже детальный пошаговый разбор алгоритма, от самого автора:

Тестовое окружение

Тестовая машина — мой боевой некроноутбук Lenovo T440:

Встроенная графика Intel, 8Гб памяти и FreeBSD 13.1 14.0 14.1

Встроенная графика Intel, 8Гб памяти и FreeBSD 13.1 14.0 14.1

Загружен i915kms, xorg настроен через modesetting [43]:

[alex@cruella ~]$ cat /usr/local/etc/X11/xorg.conf.d/20-intel.conf 
Section "Device"
 Identifier "Intel Graphics"
 Driver "modesetting"
  Option "DRI" "true"
EndSection

Все демо по‑умолчанию запускаются в полноэкранном режиме, но я запускал в окне (ключ ‑w для большинства) для создания более драматичных скриншотов.

Planet Hively by Illi Recentes ImperatoreS & Up Rough

Выглядит это демо возможно не так круто:

Демосцена и FreeBSD - 6

Но как говорится есть один нюанс, в виде списка поддерживаемых платформ:

#PLATFORM = os4
# PLATFORM = win32
# PLATFORM = linux
# PLATFORM = aros
# PLATFORM = aros64
# PLATFORM = ppc-aros
# PLATFORM = morphos-cross
# PLATFORM = beos
# PLATFORM = ppc-beos-cross
# PLATFORM = gp2x
# PLATFORM = alpha-linux-cross
# PLATFORM = ia64-linux-cross
# PLATFORM = amd64-linux-cross
# PLATFORM = s390-linux-cross
# PLATFORM = s390x-linux-cross
# PLATFORM = arm-linux-cross
# PLATFORM = sparc-linux-cross
# PLATFORM = psp
# PLATFORM = hppa-linux-cross
# PLATFORM = ppc-linux-cross
# PLATFORM = m68k-linux-cross
# PLATFORM = mips-linux-cross
# PLATFORM = mipsel-linux-cross
# PLATFORM = sh3-linux-cross
# PLATFORM = sh4-linux-cross
# PLATFORM = ppc64-linux-cross
# PLATFORM = sparc64-linux-cross
# PLATFORM = avr32-linux-cross
# PLATFORM = bsdi
# PLATFORM = qnx6
# PLATFORM = solaris
# PLATFORM = skyos
# PLATFORM = openserver5
# PLATFORM = openserver6
# PLATFORM = unixware7
# PLATFORM = mint
PLATFORM = i386-freebsd7
# PLATFORM = amd64-freebsd7-cross
# PLATFORM = sparc64-freebsd7-cross
# PLATFORM = ia64-freebsd6-cross
# PLATFORM = alpha-freebsd5-cross
# PLATFORM = riscos-cross
# PLATFORM = hppa-hpux
# PLATFORM = ia64-hpux
# PLATFORM = zaurus-cross
# PLATFORM = syllable
# PLATFORM = netbsd
# PLATFORM = alpha-netbsd4-cross
# PLATFORM = amd64-netbsd4-cross
# PLATFORM = hppa-netbsd4-cross
# PLATFORM = m68k-netbsd4-cross
# PLATFORM = mipseb-netbsd4-cross
# PLATFORM = mipsel-netbsd4-cross
# PLATFORM = ns32k-netbsd2-cross
# PLATFORM = ppc-netbsd4-cross
# PLATFORM = sh3eb-netbsd4-cross
# PLATFORM = sh3le-netbsd4-cross
# PLATFORM = sh5le-netbsd3-cross
# PLATFORM = sparc-netbsd4-cross
# PLATFORM = sparc64-netbsd4-cross
# PLATFORM = vax-netbsd4-cross
# PLATFORM = arm-netbsd4-cross
# PLATFORM = m68010-netbsd4-cross
# PLATFORM = xbox
# PLATFORM = i386-openbsd
# PLATFORM = alpha-openbsd-cross
# PLATFORM = amd64-openbsd-cross
# PLATFORM = arm-openbsd-cross
# PLATFORM = hppa-openbsd-cross
# PLATFORM = ppc-openbsd-cross
# PLATFORM = mips64-openbsd-cross
# PLATFORM = sh4-openbsd-cross
# PLATFORM = sparc64-openbsd-cross
# PLATFORM = m68k-openbsd-cross
# PLATFORM = sparc-openbsd-cross
# PLATFORM = aix
# PLATFORM = irix
# PLATFORM = irix_marq
# PLATFORM = pandora

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

Вот так это демо выглядит будучи запущенным на Raspberry Pi:

Исходники и сборка

Исходники выложили относительно недавно, скачать можно вот тут [44]. К сожалению со сборкой есть ряд проблем.

Во-первых авторы забыли выложить часть ресурсов и при запуске демка будет ругаться. Для исправления, нужно вытащить папку tunes из этого [45] pull request и подложить в корень проекта.

Дальше нужно будет в файле makefile раскомментировать строку:

PLATFORM = i386-freebsd7

И заменить gcc на gcc12:

####### DEFAULT SETTINGS HERE #######

CFLAGS = -Wall -O2
LFLAGS = 

CC = gcc12
DEBUGLIB =
TARGET = planethively

FASTMATH = -ffast-math

Собирать необходимо с помощью gmake, стандартный make FreeBSD не подойдет.

Написано демо целиком на чистом Си с использованием SDL [46] (для тех платформ где он есть разумеется).

Ниже пара интересных приемов, найденных в исходном коде.

Быстрое вычисление квадратного корня [47]:

static inline int fastsqrt( int n )
{
  if( n > 32767 ) return sqrt( n );
  return isqrt[n];
}

Генерация белого шума [48]:

void hvl_GenWhiteNoise( int8 *buf, uint32 len )
{
  uint32 ays;
  ays = 0x41595321;
  do {
    uint16 ax, bx;
    int8 s;
    s = ays;
    if( ays & 0x100 )
    {
      s = 0x80;
      if( (LONG)(ays & 0xffff) >= 0 )
        s = 0x7f;
    }
    *buf++ = s;
    len--;
    ays = (ays >> 5) | (ays << 27);
    ays = (ays & 0xffffff00) | ((ays & 0xff) ^ 0x9a);
    bx  = ays;
    ays = (ays << 2) | (ays >> 30);
    ax  = ays;
    bx  += ax;
    ax  ^= bx;
    ays  = (ays & 0xffff0000) | ax;
    ays  = (ays >> 3) | (ays << 29);
  } while( len );
}

Но едем дальше.

Chrysler by Fit & Bandwagon

Motorola Inside [49] 2004, 1е место

Исходный код находится вот тут [50], несмотря на то что архив аж от 2009го года — все отлично собирается в современном окружении.

Количество поддерживаемых платформ снова вызывает восторг:

Демосцена и FreeBSD - 7

Чтоб я так жил, как вы портируете в общем.

Вот так это демо вживую выглядит на моей FreeBSD:

Демосцена и FreeBSD - 8

Сборка и исходники

Cобирается это демо также только с помощью gmake, необходимо поправить Makefile, поставив СС=gcc12:

CC = gcc12
CFLAGS = -O2 -ffast-math `sdl-config --cflags`
#LDFLAGS = `sdl-config --libs` -lm
LDFLAGS = `sdl-config --static-libs` -lm
OBJ = data.o kirjaimet2.o kokko.o maf.o main.o mosaic.o pallot.o plasma.o
ratas.o stripes.o video.o cool_mzx/cool_mzx.a
...

Написано все на чистом Си (а вы сомневались?), также с использованием SDL для поддерживаемых платформ. Ниже некоторые интересные моменты в исходниках.

Заданная PI [51]-константа для Амиги:

#ifdef AMIGA
#define M_PI 3.1415927
#endif

Элегантный способ проверить правильность нескольких вызовов подряд:

int readall(void)
{
    int val=0;
    val+=readfile("data/tehas2.mod",&musakki);
    val+=readfile("data/dd.raw",&dd);
    val+=readfile("data/na_eka.raw",&na_eka);
    val+=readfile("data/na_toka.raw",&na_toka);
    val+=readfile("data/onnettomuus.raw",&onnettomuus);
    val+=readfile("data/paa.raw",&paa);
    val+=readfile("data/siunaus.raw",&siunaus);
    val+=readfile("data/ukko.raw",&ukko);
    val+=readfile("data/ratas.raw",&ratas);
    val+=readfile("data/kooste.raw",&kooste);
    val+=readfile("data/chrysler.raw",&chrysler);
    return(val);
}

И сам вызов c проверкой:

  if(readall()!=0)
    {
        printf("Problem loading datasn");
        return(0);
    }

Отображение кадра из видео:

    src=frame[no]*40*200;
    dst =buffer;
    for (y=0; y<AH; y++)
	for (x=0; x<(AW/8); x++) {
	    ip1=bitti_muunnos+video[src]*8;
	    *dst++ = *ip1++;
	    *dst++ = *ip1++;
            src++;
	}

Как говорится удачи разобраться со ссылочной логикой, это именно тот случай когда на трезвую голову понимание достигнуто быть не может.

Hex Pistols by Fit

Motorola Inside [52] 2005, 1е место, релиз на Амиге да.

Вот так выглядит запуск на фоне собственных исходников:

Демосцена и FreeBSD - 9

Сборка и исходники

Исходный код можно скачать вот тут [53].

Для сборки необходимо опять заменить CC=gcc на CC=gcc12 в Makefile, все просто. Написано все снова на чистом Си и SDL (для всех платформ кроме Амиги).

Из интересных приемов, например вот такое чтение RGB цвета и упаковка его в одну переменную с побитовым сдвигом:

        /* Background */
        if(!strcmp("backcolr",str))
        {
            fscanf(s,"%d%d%d",&r,&g,&b);
            cgm->back=(r<<16)+(g<<8)+b;
        }

Faemiyah

Это целая группа [2], которая стабильно ваяет и выкладывает релизы под FreeBSD. Напрочь отбитые финские товарищи, исходники всех демо доступны по ссылке [54].

Yog-Sothoth by Faemiyah

2е место на Assembly, [55] 2013

К сожалению это демо у меня так нормально и не заработало, хотя и собралось — что‑то тонкое с видео.

Ghosts of Mars by Faemiyah

4е место на Assembly [56] 2015

Кадр с ней как раз в шапке статьи, благо выглядит максимально эпично:

Демосцена и FreeBSD - 10

Сборка и исходники

Исходный код можно скачать вот тут [57].

Собирается проект уже «по‑современному» — с помощью cmake:

mkdir build
cd build
cmake ..

Запуск:

./ghosts_of_mars -w -r 800x600

Тут указывается оконный режим -w и разрешение -r 800x600

Исходный код уже на нескольких языках: C, C++ плюс специальный скрипт на Python [58] для минимизации.

Графика все также на SDL, но уже используются шейдеры и Boost.

Все сложнее и серьезнее — ребята идут к успеху

Но проблемы те же, например свой генератор случайных чисел:

/// More random random.
///
/// It's better to discard a few bottom-most bits to achieve better randomness.
///
/// param op Modulator for random.
/// return Random value in range [0, op[.
static int irand(int op)
{
  return (dnload_rand() >> 4) % op;
}

Отладочные блоки на макросах по хардкору:

#if 1
    {
      const float mul = 65535.0f / largest;

      for(unsigned ii = 0; (IMAGE_SIDE * IMAGE_SIDE > ii); ++ii)
      {
        g_image_data[ii] = static_cast<uint16_t>(65535 - g_image_preprocess[ii] * mul);
      }
    }
#else
    {
      const float mul = 255.0f / largest;

      for(unsigned ii = 0; (IMAGE_SIDE * IMAGE_SIDE > ii); ++ii)
      {
        g_image_data[ii] = 255 - static_cast<uint8_t>(g_image_preprocess[ii] * mul);
      }
    }
    gfx::image_png_save(std::string("lol.png"), IMAGE_SIDE, IMAGE_SIDE, 8, g_image_data);
#endif

Что такое #if 1 [59]:

Only the first block will be processed -— until someone changes the 1 to a 0. Then the other block will be compiled. This is a convenient way to temporary switch blocks of code in and out while testing different algorithms.

Adarkar Wastes by Faemiyah

Instanssi [60] 2018, 1е место

Вот так демо выглядит в работе на моей FreeBSD:

Демосцена и FreeBSD - 11

Сборка и исходники

Исходники все там [61] же, сборка и запуск аналогичны предыдущей работе.

Проект реализован на C++, SDL и Boost, плюс появилась маленькая вставка на ассемблере — для синтезатора. И очень много шейдеров.

Ниже опишу несколько интересных решений, найденных в исходном коде. Опять кастомный генератор случайных чисел, но уже другая реализация:

/** BSD random var. */
static bsd_u_long bsd_rand_next = 2;

int bsd_rand(void)
{
  /*
   * Compute x = (7^5 * x) mod (2^31 - 1)
   * without overflowing 31 bits:
   *      (2^31 - 1) = 127773 * (7^5) + 2836
   * From "Random number generators: good ones are hard to find",
   * Park and Miller, Communications of the ACM, vol. 31, no. 10,
   * October 1988, p. 1195.
   */
  long hi, lo, x;
  /* Must be in [1, 0x7ffffffe] range at this point. */
  hi = (long)(bsd_rand_next / 127773);
  lo = (long)(bsd_rand_next % 127773);
  x = 16807 * lo - 2836 * hi;
  if (x < 0)
    x += 0x7fffffff;
  bsd_rand_next = (bsd_u_long)x;
  /* Transform to [0, 0x7ffffffd] range. */
  return (int)(x - 1);
}
void bsd_srand(bsd_u_int seed)
{
  /* Transform to [1, 0x7ffffffe] range. */
  bsd_rand_next = (seed % 0x7ffffffe) + 1;
}

Обработка указанного разрешения (ключ -r 800x600 помните?):

/// Parse resolution from string input.
///
/// param op Resolution string.
/// return Tuple of width and height.
boost::tuple<unsigned, unsigned> parse_resolution(const std::string &op)
{
  size_t cx = op.find("x");  
  if(std::string::npos == cx)
  {
    cx = op.rfind("p");
    if((std::string::npos == cx) || (0 >= cx))
    {
      std::ostringstream sstr;
      sstr << "invalid resolution string '" << op << ''';
      BOOST_THROW_EXCEPTION(std::runtime_error(sstr.str()));
    }
    std::string sh = op.substr(0, cx);
    unsigned rh = boost::lexical_cast<unsigned>(sh);
    unsigned rw = (rh * 16) / 9;
    unsigned rem4 = rw % 4;
    return boost::make_tuple(rw - rem4, rh);
  }
  std::string sw = op.substr(0, cx);
  std::string sh = op.substr(cx + 1);
  return boost::make_tuple(boost::lexical_cast<int>(sw), boost::lexical_cast<int>(sh));
}

Препроцессинг (макросы) в прямо в коде шейдеров:

float i_fov = 1.73;
  //float i_fov = 1.0 / tan(60.0 / 180.0 * PI * 0.5);
#if defined(USE_LD)
  perspective[0][0] = i_fov / (float(screen_size.x) / float(screen_size.y));
#elif (DISPLAY_MODE == -800) || (DISPLAY_MODE == 800) || (DISPLAY_MODE == -1200) || (DISPLAY_MODE == 1200)
  perspective[0][0] = i_fov / 1.6;
#else // Assuming 16/9.
  perspective[0][0] = i_fov / 1.78;
#endif

Демосцена умерла?

Наверное заметили, что все описанные в статье проекты достаточно старые?

Если покопаться в сети — окажется, что большая часть сайтов посвященных демосцене находятся в архивном состоянии, фестивали сценеров уже особо не проводятся и так далее.

Словом, может сложиться неприятное ощущение что демосцена умерла. Я вообщем-то тоже так думал, а затем нашел свежее и прекрасное:

Слово автору:

Решил реализовать новую концепцию на БК0011 — рисование картинок под музыку. Надеюсь на продолжение:) Релиз и исходные тексты: https://www.pouet.net/prod.php?which= [62]... Трек: https://zxart.ee/rus/avtory/k/kuvo/ar [63]...

Если кто не знает, вот что такое БК0011 [64]:

Персональный компьютер БК 0011М (1980-е годы)

Персональный компьютер [65] БК 0011М (1980-е годы)

Так что дух хардкора еще очень даже жив.

P.S.

Это немного отцезурированная и доработанная версия статьи, оригинал [66] которой доступен в нашем блоге.

0x08 Software

Мы небольшая команда ветеранов ИТ‑индустрии, создаем и дорабатываем самое разнообразное программное обеспечение, наш софт автоматизирует бизнес‑процессы на трех континентах, в самых разных отраслях и условиях.

Оживляем давно умершее [67]чиним никогда не работавшее [68] и создаем невозможное [69] — затем рассказываем об этом в своих статьях.

Автор: alex0x08

Источник [70]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/freebsd/395679

Ссылки в тексте:

[1] FreeBSD: https://www.pouet.net/prodlist.php?platform%5B%5D=FreeBSD

[2] Faemiyah: https://www.pouet.net/groups.php?which=10768

[3] [1]: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%BE%D1%81%D1%86%D0%B5%D0%BD%D0%B0#cite_note-1

[4] [2]: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%BE%D1%81%D1%86%D0%B5%D0%BD%D0%B0#cite_note-Flenov-2

[5] [3]: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%BE%D1%81%D1%86%D0%B5%D0%BD%D0%B0#cite_note-3

[6] [4]: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%BE%D1%81%D1%86%D0%B5%D0%BD%D0%B0#cite_note-4

[7] англ.: https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA

[8] киберкультура: https://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D0%B1%D0%B5%D1%80%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D1%83%D1%80%D0%B0

[9] 1970-х годов: https://ru.wikipedia.org/wiki/1970-%D0%B5_%D0%B3%D0%BE%D0%B4%D1%8B

[10] домашних компьютеров: https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80

[11] компьютерного искусства: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%BE%D0%B5_%D0%B8%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE

[12] компьютерных игр: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%B8%D0%B3%D1%80%D0%B0

[13] Демосцена: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%BE%D1%81%D1%86%D0%B5%D0%BD%D0%B0

[14] Digital Illusions: https://en.wikipedia.org/wiki/Digital_Illusions

[15] Starbreeze: https://en.wikipedia.org/wiki/Starbreeze

[16] Ascaron: https://en.wikipedia.org/wiki/Ascaron

[17] [43]: https://en.wikipedia.org/wiki/Demoscene#cite_note-4sceners_2007_p1-43

[18] Remedy: https://en.wikipedia.org/wiki/Remedy_Entertainment

[19] Techland: https://en.wikipedia.org/wiki/Techland

[20] Lionhead Studios: https://en.wikipedia.org/wiki/Lionhead_Studios

[21] [44]: https://en.wikipedia.org/wiki/Demoscene#cite_note-4sceners_2007_p2-44

[22] Bugbear: https://en.wikipedia.org/wiki/Bugbear_Entertainment

[23] Digital Reality: https://en.wikipedia.org/wiki/Digital_Reality

[24] Guerrilla Games: https://en.wikipedia.org/wiki/Guerrilla_Games

[25] Akella: https://en.wikipedia.org/wiki/Akella

[26] [45]: https://en.wikipedia.org/wiki/Demoscene#cite_note-4sceners_2007_p3-45

[27] Tracker music: https://en.wikipedia.org/wiki/Music_tracker

[28] Unreal: https://en.wikipedia.org/wiki/Unreal_(1998_video_game)

[29] Unreal Tournament: https://en.wikipedia.org/wiki/Unreal_Tournament

[30] Deus Ex: https://en.wikipedia.org/wiki/Deus_Ex_(video_game)

[31] Crusader: No Remorse: https://en.wikipedia.org/wiki/Crusader:_No_Remorse

[32] One Must Fall: 2097: https://en.wikipedia.org/wiki/One_Must_Fall:_2097

[33] Jazz Jackrabbit: https://en.wikipedia.org/wiki/Jazz_Jackrabbit

[34] Uplink: https://en.wikipedia.org/wiki/Uplink_(video_game)

[35] [46]: https://en.wikipedia.org/wiki/Demoscene#cite_note-46

[36] дискеты: https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BA%D0%B5%D1%82%D0%B0

[37] выложены: https://github.com/farbrausch/fr_public

[38] крутой сайт: http://www.asd.gr/#

[39] ATmega88: http://www.atmel.com/

[40] ЛОРе: https://www.linux.org.ru/gallery/screenshots/17170931?cid=17173619

[41] вот: https://www.dosbox.com/

[42] тут: https://www.shadertoy.com/view/WsSBzh

[43] modesetting: https://man.archlinux.org/man/modesetting.4

[44] тут: https://github.com/pete-gordon/planet-hively

[45] этого: https://github.com/pete-gordon/planet-hively/pull/3/commits

[46] SDL: https://www.libsdl.org/

[47] квадратного корня: https://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D1%80%D0%B5%D0%BD%D1%8C

[48] белого шума: https://en.wikipedia.org/wiki/White_noise

[49] Motorola Inside: https://www.pouet.net/party.php?which=293&when=2004

[50] тут: http://ftp.kameli.net/pub/fit/chrysler/

[51] PI: https://en.wikipedia.org/wiki/Pi

[52] Motorola Inside: https://www.pouet.net/party.php?which=293&when=2005

[53] тут: http://ftp.kameli.net/pub/fit/hex_pistols/

[54] ссылке: https://github.com/faemiyah/faemiyah-demoscene

[55] Assembly,: https://www.pouet.net/party.php?which=7&when=2013

[56] Assembly: https://www.pouet.net/party.php?which=7&when=2015

[57] тут: https://github.com/faemiyah/faemiyah-demoscene_2015-08_4k-intro_ghosts_of_mars/tree/0c9055e60ea4a6f9c6a3a30775f81d7c8dded32a

[58] скрипт на Python: https://github.com/faemiyah/dnload

[59] #if 1: https://stackoverflow.com/questions/2266060/why-would-somebody-use-an-if-1-c-preprocessor-directive

[60] Instanssi: https://www.pouet.net/party.php?which=1544&when=2018

[61] там: https://github.com/faemiyah/faemiyah-demoscene_2018-03_4k-intro_adarkar_wastes/tree/b9bf6549ee6e99036db90241ef12817796aec7c8

[62] https://www.pouet.net/prod.php?which=: https://www.pouet.net/prod.php?which=

[63] https://zxart.ee/rus/avtory/k/kuvo/ar: https://zxart.ee/rus/avtory/k/kuvo/ar

[64] БК0011: https://computer-museum.ru/articles/personalnye-evm/901/

[65] компьютер: https://asdela.ru/slobodskoj-kirov-kazan-2012-chast-3/

[66] оригинал: https://blog.0x08.ru/demoscene-on-freebsd

[67] давно умершее: https://blog.0x08.ru/xerox-alto-bcpl-hello-world

[68] чиним никогда не работавшее: https://blog.0x08.ru/running-from-websphere-esb

[69] невозможное: https://blog.0x08.ru/call-webservice-from-dos

[70] Источник: https://habr.com/ru/articles/841062/?utm_campaign=841062&utm_source=habrahabr&utm_medium=rss