- PVSM.RU - https://www.pvsm.ru -
Решил вспомнить счастливое детство и полазить по сайтам демосценеров — с удивлением обнаружил, что многие выкладывают релизы под.. FreeBSD [1].
FreeBSD — мягко говоря не самая подходящая система для занятия оптимизированной графикой, поэтому наличие такого количества демо целенаправленно создаваемых под эту систему озадачило.
Поскольку я немного понимаю в компьютерах и использую 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]
Словом демосцена это про спецэффекты и преодоление — как впихнуть невпихуемое туда где ему не место, чтобы стало круто и все офигели. И все действительно офигевают. На полном серьезе.
Ниже несколько классических примеров в качестве иллюстрации.
Все что вы видите на видео делает «программулина» в 177 килобайт. Это почти в 10 раз меньше размера 3.5 дюймовой дискеты [36], если кто‑то еще помнит такое устройство.
Исходники тоже уже выложены [37], если кому интересно.
Это уже большое демо — целых 26 Мегабайт! Правда это все еще раз в десять меньше вашей обычной сборки очередного корпоративного говнопроекта, но тем не менее.
Также у группы есть свой очень крутой сайт [38] с кучей других красивых демо.
И снова 172кб бинарник рисует и поет всю эту красоту.
Позволю процитировать автора:
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], народ подкинул еще пару интересных проектов, которые просто необходимо упомянуть.
32 байта:
echo 'B013CD10C51F380F10276BDBE58A0F0209028FBFFE02483F4BE460FEC875E7C3' | xxd -r -p - dirojed.com
dosbox dirojed.com
Вот так это выглядит в живую:
4кб приложение генерирует такую красоту:

Это не статичная картинка и не 3D модель — это алгоритмы, чистая математика, тот самый «матан» который вы так не любили все годы в ВУЗе.
Вот тут [42] алгоритм из демо повторен с помощью WebGL:

Ниже детальный пошаговый разбор алгоритма, от самого автора:
Тестовая машина — мой боевой некроноутбук Lenovo T440:
Загружен 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 для большинства) для создания более драматичных скриншотов.
Выглядит это демо возможно не так круто:

Но как говорится есть один нюанс, в виде списка поддерживаемых платформ:
#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 );
}
Но едем дальше.
Motorola Inside [49] 2004, 1е место
Исходный код находится вот тут [50], несмотря на то что архив аж от 2009го года — все отлично собирается в современном окружении.
Количество поддерживаемых платформ снова вызывает восторг:

Чтоб я так жил, как вы портируете в общем.
Вот так это демо вживую выглядит на моей FreeBSD:

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++;
}
Как говорится удачи разобраться со ссылочной логикой, это именно тот случай когда на трезвую голову понимание достигнуто быть не может.
Motorola Inside [52] 2005, 1е место, релиз на Амиге да.
Вот так выглядит запуск на фоне собственных исходников:

Исходный код можно скачать вот тут [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;
}
Это целая группа [2], которая стабильно ваяет и выкладывает релизы под FreeBSD. Напрочь отбитые финские товарищи, исходники всех демо доступны по ссылке [54].
2е место на Assembly, [55] 2013
К сожалению это демо у меня так нормально и не заработало, хотя и собралось — что‑то тонкое с видео.
4е место на Assembly [56] 2015
Кадр с ней как раз в шапке статьи, благо выглядит максимально эпично:

Исходный код можно скачать вот тут [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.
Instanssi [60] 2018, 1е место
Вот так демо выглядит в работе на моей FreeBSD:

Исходники все там [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]:
Так что дух хардкора еще очень даже жив.
P.S.
Это немного отцезурированная и доработанная версия статьи, оригинал [66] которой доступен в нашем блоге.
Мы небольшая команда ветеранов ИТ‑индустрии, создаем и дорабатываем самое разнообразное программное обеспечение, наш софт автоматизирует бизнес‑процессы на трех континентах, в самых разных отраслях и условиях.
Оживляем давно умершее [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
Нажмите здесь для печати.