Одним из пунктов списка моих желаний после прочтения первого отчета с пати в 1991 году стало посещение европейской демопати и участие в соревнованиях compo. Я участвовал в NAID ’96 и даже занял там место, но моей мечтой всегда было соревноваться с лучшими из лучших. Я рад объявить о том, что спустя шесть месяцев упорной работы с хорошими друзьями и невероятно талантливыми людьми нам это удалось. Наше демо 8088 MPH победило в oldskool demo compo Revision 2015. (Моей личной победой стало то, что наше демо показали в compo последним, что стало знаком уважения организаторов.) 7 апреля 2015 года в мире не было эмуляторов IBM PC, способных правильно запускать наше демо; они зависали или вываливались ещё до завершения демо, а цвета были искажены. То же относится и ко всему остальному железу, кроме целевого (см. ниже). Чтобы увидеть, что такое 8088 MPH, я рекомендую вам посмотреть видео записи демо, запущенного на реальном железе:
В демо так много технологических открытий, сделанных впервые в мире, а мы эксплуатируем железо так, как никто до нас не додумывался, поэтому будет честным рассказать, как же нам это удалось. Одной из моих должностей была «организатор» демо, поэтому я расскажу о нём сцена за сценой, вкратце объяснив основы каждого трюка. О частях, написанный мной, я расскажу чуть подробнее, но для глубокого анализа технологий я буду обновлять этот пост, чтобы можно было оставить ссылки на посты reenigne, VileR и Scali. Мы надеемся, что этот рассказ привлечёт интерес к «олдскульному» программированию ПО для платформы. После прочтения этого обзорного поста рекомендую пройти по ссылкам на статьи, где подробнее рассматриваются отдельные части демо.
- 1K colours on CGA: How it’s done
- 8088 PC Speaker MOD player: How it’s done
- More 8088 MPH how it’s done
- 8088 MPH: How it came about
- CGA in 1024 Colors – a New Mode: the Illustrated Guide
- Sprites? Where we’re going, we don’t need… sprites!
- 8088 MPH: The polygons
Более общая информация:
- блог reenigne
- Using Photoshop as a CGA Bitmap Paint Program
- Scali’s Openblog (категория retroprogramming)
Спецификации целевого оборудования
Прежде чем приступать к отдельным частям, давайте разберёмся с тем, какой была целевая система для этого демо: IBM 5150 1981 года (он же самый первый «IBM PC») с 640 КБ ОЗУ, флоппи-дисководом, CGA-картой IBM и встроенным динамиком. Содержимое системы:
- ЦП 8088 на 4,77 МГц. Кажется, что 5 МГц — это много по сравнению с другими 8-битными микропроцессорами, но для считывания одного байта ЦП требуется 4 цикла. Поэтому по сравнению с другими 8-битными ЦП наподобие 6502 или 6809, способными считывать байт за один цикл, фактическая тактовая частота 8088 ближе к (4,77 / 4) = 1,19 МГц.
- Видеоадаптер с 9-контактным интерфейсом RGBI и композитным видеоинтерфейсом RCA NTSC. Управляется генератором символов Motorola 6845. Нет никаких устройств для изменения текстовых символов, шрифт всегда одинаков.
- Встроенный динамик; нет ни звуковой карты наподобие Sound Blaster, ни специального звукового оборудования наподобие SID Commodore64. Динамиком можно управлять контактом таймера для создания прямоугольного сигнала или с помощью bit-banging непосредственно через порт или однократный таймер.
Кажется, что требования 640 КБ ОЗУ — это слишком круто, но в первые IBM PC вполне можно было их установить, более того, для 1985 года это довольно обычный объём. Если вы всё ещё хотите повозмущаться, то учтите, что единственный эффект, которому требуется такой объём ОЗУ — это полосы kefrens bars. Он необходим, чтобы повторяющийся паттерн повторялся не так часто и был приятнее глазу. Мы могли уменьшить его, но тогда бы зрители заметили, что паттерн повторяется быстрее. С эффектом kefrens bars демо использует 507 КБ ОЗУ; без него — всего 349 КБ. Большинство эффектов использует гораздо меньше памяти, а некоторые вообще крошечные, например плазма занимает всего 6 КБ (в том числе и графика баннера), а для изображения девушки требуется всего 18 КБ (на 2 КБ больше, чем размер самих данных изображения). Мы намеренно пожертвовали размером в пользу скорости. Это было осознанное решение, чтобы уместить в 8 минут выполнения демо (ограничение конкурса compo) как можно больше эффектов. Если бы у нас было ещё несколько минут времени выполнения, то мы, возможно, смогли бы уместить всё демо в 256 КБ или даже меньше, но паузы между эффектами были бы больше. Также стоит заметить, что существуют две различные версии IBM CGA, которые в основном различаются способом генерации композитных цветов. У нас было одинаковое количество CGA-карт IBM «старого» и «нового» стиля, поэтому мы решили создавать графику для «старого». Если у вас CGA-карта «нового» стиля, то демо всё равно будет работать, но с немного искажёнными цветами.
Технический обзор
Использованные инструменты разработки
- Turbo C
- Turbo Pascal
- Turbo Assembler
- Turbo Debugger
- Visual C++
- OpenWatcom
- NASM (и YASM)
- DOSBox
- Несколько настоящих IBM 5160 (это аппаратный аналог 5150, но его легче найти в реальном мире)
Все файлы данных встраивались непосредственно в файлы .exe/.com. Благодаря этому удалось сохранить всё в одном двоичном файле, то есть данные можно подвергнуть компрессии (см. ниже). В большинстве циклов разработки используется проектирование в wetware (в голове), кодинг на современных системах (или в DOSBox, запущенном на современной системе), тестирование/отладка в DOSBox с последующим переносом на реальное железо для финального тестирования. Когда эффект стал настолько изощрённым, что перестал запускаться в эмуляторе, цикл разработки замедлился, потому что тестирование можно было выполнять только на реальном оборудовании. Для переноса кода на оборудование мы использовали различные способы: Scali пользовался кабелем последовательного интерфейса, у меня была ethernet-карта с драйвером пакетов и mTCP; на пати мы использовали 8-битный адаптер IDE ISA (Silicon Valley ADP-50), соединённый с адаптером CF-to-IDE, чтобы превратить карту CF в жёсткий диск. Для перемещения информации мы использовали кард-ридер USB CF. Самым интригующим был способ reenigne, который пользовался специальным контроллером, подключенным к порту клавиатуры. Он использовал заводским тестовым режимом IBM BIOS в качестве «последовательного порта для бедных». (Надеюсь, Эндрю напишет об этом подробнее!)
Загрузчик, API и общая структура
У всех нас были свои любимые языки и среды, поэтому на раннем этапе работы мы решили создать общий «загрузчик», который будет выполнять файлы .EXE и .COM, чтобы разработчики могли разрабатывать эффекты в любой подходящей им среде. Эта концепция не нова; по тем же самым причинам она использовалась в знаменитом демо Second Reality. Та же техника использовалась ещё раньше для множества демо для других платформ. (Прежде, чем вы спросите: нет, мы не копировали код Second Reality; на самом деле. мы даже не советовались с разработчиками, потому что нам нужно было писать необычайно компактный код, чтобы минимизировать занимаемый объём памяти, который при этом должен был работать на 8088 (в коде Second Reality используются опкоды 80186)). Службы API загрузчика собираются примерно в 450 байт кода. Загрузчик отвечает за следующие аспекты:
- Воспроизведение фоновой музыки
- Маскирование процесса загрузки и процесса предварительных расчётов эффектов с помощью текста в стиле «мегадемо»
- Сервисы синхронизации (такие как прерывание обратного хода кадровой развёртки в ПО и задаваемый пользователем счётчик обратного отсчёта)
Выполнение эффектов с помощью загрузчика состоит из следующей процедуры:
- Печать текста на экране и его анимирование с помощью прерывания и регистра начального адреса 6845
- Выполнение эффекта
- Эффект выполняет распаковку, предварительные расчёты, а затем сообщает загрузчику, что готов начинать
- Загрузчик очищает подвижный экранный текст, после чего сообщает эффекту, что он может начинать
- Эффект запускается, начинается магия
Чрезвычайно важно было правильно спроектировать эту часть работы, потому что любые баги вызвали бы крушение всего демо. Структура этой части была завершена ещё до написания первой строки кода. Для любопытных я выложил онлайн диздок. (Загрузчик написан мной.) Воспроизведение фоновой музыки должно было стать как можно простым, чтобы не влиять ни на какие эффекты. С практической точки зрения единственным вариантом был простой PC-писк, меняющийся (или пропадающий) в каждом кадре, поэтому фоновая музыка состоит только из 60-герцового писка. Для генерирования значений таймера динамика использовалась программа композиции MONOTONE. Даже несмотря на то, что код воспроизведения состоит всего из 18 строк на ассемблере, на экране он занимает две растровые строки, то есть что-то более сложное заняло бы ещё больше ресурсов ЦП, а некоторые полноэкранные 60-герцовые эффекты просто невозможно стало бы реализовать.
Сжатие исполняемого файла
Ещё одним аспектом, который рассматривался на самых ранних этапах разработки, была возможность сжатия исполняемого файла. Нам нужно было выяснить следующее:
- Действительно ли возможно выполнить компрессию настолько, чтобы она себя оправдывала?
- Достаточно ли быстра декомпрессия, чтобы избежать долгих пауз в демо?
- Влияет ли процедура декомпрессии на систему в процессе декомпрессии? (например, не отключает ли она прерывания и не делает ли чего-то столь же ужасного, что полностью испортило бы демо?)
Я взял большинство классических и современных упаковщиков исполняемых файлов и провёл тесты со старыми программами, которые походили на то, что мы собирались делать. Результаты приятно меня удивили. Уровни сжатия были достаточно высокими, чтобы мы могли позволить себе встроить заранее вычисленные данные, а не считать их на лету. При этом декомпрессия оказалась достаточно быстрой, настолько, что полная загрузка программы с дискеты на самом деле была даже немного быстрее, чем если бы она загружалась несжатой. В конце концов мы выбрали победителя — pklite. Для сравнения я выложил данные результатов тестов онлайн. (Если я упустил какие-то упаковщики, имеющие значительные преимущества по сравнению с моим набором, то сообщите мне об этом. Для DOS создано примерно 100 упаковщиков, но если они не сжимают лучше, чем apack или upx, или не распаковывают быстрее, чем pklite или lzexe, которые при всём этом совместимы с 8088, то я ничего не хочу о них знать.)
Разбивка по сценам
Ниже я объясню каждый эффект по сценам. Как сказано выше, подробно я буду описывать только те сцены, над которыми работал сам; если остальные члены команды захотят, то напишут технический анализ своих частей. Описание каждого эффекта идёт после скриншота эффекта.
Это интро выполняло две задачи: оно должно было познакомить зрителей с системой и объяснить, с какими сложностями нам пришлось столкнуться, создавая демо мирового уровня на таком железе, и в то же время умерить их ожидания. Очевидно, что текстовый режим симулируется; по сути, я дублировал базовые функции BIOS обработки текстового режима, но симулировал их в графическом режиме. Мерцание курсора и текста реализовано аналогично тому, как это делает 6845, усиливая иллюзию. (Почти) невозможно изменить начальный адрес отображения графического режима таким образом, чтобы каждая отдельная растровая строка бралась из другого места, поэтому разворачивание начального экрана реализовано грубой силой — копированием новых растровых строк в память, скрытую обратным ходом кадровой развёртки. Начальный экран пропадает при помощи «эффекта затемнения» с верхнего края, выполненного операцией «И» с маской для последовательных строк экранных данных.
Многие люди думают, что начальный экран — это та же картинка, которую демонстрировал VileR несколько лет назад. Но это не так! Он переделал её под 16-цветный композитный сигнал специально для этого демо, а также немного её подредактировал.
Эффект качания был достигнут созданием программного прерывания обратного хода кадровой развёртки, выполняемой каждый раз в одном месте экрана (сразу после последней отображённой строки), с последующей обработкой её процедурой изменения начального адреса отображения 6845. Для передачи прерыванию информации о том, настало ли время удаления букв, были использовали флаги. Удаление выполняется простым применением REP STOSW для заполнения экранной памяти чёрными строками. Так как 6845 отображает две экранных строки на «строку», текст может двигаться только в чётные строки, поэтому движение выглядит не таким плавным, как должно. Честно говоря, можно было заставить их двигаться в любую строку, но это было бы затратно с точки зрения ЦП. Весь смысл загрузчика — в использовании как можно меньших ресурсов ЦП, поэтому пришлось пойти на этот компромисс. Для других эффектов симулируемое прерывание обратного хода кадровой развёртки тоже реализовано с помощью сервисов API загрузчика. Эффекты могут отключать его, заново инициализировать и привязывать/отвязывать от него собственные процедуры.
Эффект муара был реализован с помощью основы текстового режима 40×25, растянутых ASCII-символов блоками в половину символа, а также кучей кода с раскруткой циклов. Круги выбраны, чтобы продемонстрировать классический эффект, но на самом деле в этом эффекте можно комбинировать два любых изображения. Этот эффект создавал reenigne.
Rotozoomer — это та же самая замученная старая процедура, которую я показывал в 1996 году на 8086 compo, только оптимизированная и ускоренная для отрисовки только каждой второй строки. Недопонимание между мной и VileR привело к использованию не самой лучшей для демонстрации эффекта текстуры, но он всё равно неплохо работает. Были планы добавить 60-герцовую версию этого эффекта, но у нас не хватило времени.
Фундаментальная концепция 1024-цветного режима — это сильное надругательство над текстовым режимом 80×25 со включенным NTSC. Изначально VileR придумал этот трюк для 512 цветов, но reenigne удалось увеличить количество цветов до 1024 с помощью трюка с контроллером ЭЛТ. Некоторые люди думали, что всё демо сделано в этом режиме. Но это не так, потмоу что 80-строчный текстовый режим страдает от знаменитого дефекта в виде «снега» CGA при непосредственной записи в ОЗУ CGA в этом режиме. К сожалению, это заметно в эффекте плазмы (см. ниже). Кстати, я увидел эту картинку в 2013 году, и именно тогда понял, что должен собрать всех этих людей для создания демо. Посмотрите, это же потрясающе! Когда я её увидел, у меня челюсть отвисла. Если бы я не видел, как совместная работа VileR и reenigne привела к этой картинке, то демо 8088 MPH могло и не появиться.
На самом деле эти звёзды — результат работы кода с раскруткой цикла и таблицы предварительно вычисленных значений, которые вместе берут байт из одного места и перемещают в другое место в видеопамяти. Хотя у нас были готовы и другие рисунки, например, вихрь, мы посчитали, что звёздное небо больше подходит для типичного oldskool-демо. Эффект создавал reenigne.
Часть со спрайтами похожа на чёрную магию, но на самом деле это сочетание использования написанного Scali компилятора спрайтов и вертикальной регулировки экрана с помощью регистра начального адреса 6845. В CGA есть только один экран видеопамяти, поэтому при смещении адреса вниз происходит скроллинг экрана вверх, а данные на краях экрана повторяются. Однако данные не повторяются равномерно вдоль границы, поэтому требуется обработка. Выполнялось отслеживание таймера, чтобы знать, когда отрисована строка, содержащая последний пиксель спрайта, после чего спрайт перерисовывался. (Другими словами, перерисовка спрайта была упражнением «обгони луч».) Тайминги были очень плотными, чтобы избежать эффекта разрыва экрана/спрайта.
Тоже часть эффекта скомпилированного спрайта, здесь отображается 30 векторных мячей при 30 Гц. У нас был другой эффект, демонстрировавший меньшее количество мячей с частотой 60 Гц, но у Scali в последний момент возникла идея, чтобы они составляли какую-нибудь надпись, например «8088», «IBM» или что-то подобное, поэтому он написал код изменения на пати. Обновление выполняется с помощью двойной буферизации; спрайты занимают на экране только небольшую прямоугольную область, поэтому параметры контроллера ЭЛТ экранного режима были перепрограммированы таким образом, чтобы создать видеорежим с небольшой областью посередине физического экрана, использующий всего половину доступной видеопамяти. Так мы получили настоящую скрытую страницу, в которой можно было отрисовывать/стирать векторные мячи, которая затем становилась видимой с помощью регистра начального адреса отображения 6845.
Эта плазма использует вариацию 1024-цветного экранного режима, который можно обновлять только с помощью байта атрибута (что ограничивает количество цветов до 256). Эффект выполняет запись только когда ЭЛТ-луч выполнять горизонтальный или вертикальный обратный ход. К сожалению, тайминг, необходимый для правильной реализации, по какой-то причине перестал работать на пати (возможно, так получилось потому, что мы изменили порядок эффектов), поэтому вдоль левой части экрана можно видеть строку шума, и немного шума сверху. Это моя вина, потому что я писал этот эффект с помощью процедуры ленивого опроса. Увы, но CGA-«снег» всё равно есть, а ведь без всей обработки обратного хода развёртки эффект мог бы работать на 60fps. В демо со «снегом» он работает с частотой всего 20fps. Возможно, VileR подробнее напишет о том, как устроен эти экранный режим и цветовая система, и если это случится, я обновлю ссылки в начале статьи. Если мы возьмёмся за финальную версию демо, то исправление этого бага будет одним из самых приоритетных [прим. пер.: в видео из начала статьи показана уже финальная версия]. На самом деле, я уверен, что reenigne сможет заменить эффект опроса на эффект с подсчётом циклов, что не только устранит «снег», но и увеличит скорость.
1024-цветный режим через каждые две строки перепрограммирует начальный адрес. Я воспользовался этим поведением, чтобы создать простой эффект «стекания» для потрясающего изображения VileR. Вы можете заявить, что возможны гораздо более изощрённые эффекты (здесь можно вспомнить демо Copper), но мне не хватило времени, чтобы сделать его ещё лучше.
Этот классический эффект Kefrens bars был создан reenigne в режиме 320x200x4. Это эффект с подсчётом циклов, потому что тут просто нет времени для отслеживания горизонтального обратного хода. Чтобы обеспечить постоянное количество циклов, мы сделали многое, в том числе изменили интервал обновления DRAM системы по умолчанию с 18 на 19, чтобы периоды обновления DRAM соответствовали доступам к ЭЛТ-контроллеру.
Этот эффект делал Scali, он вдохновлялся собственным демо 1991 года, в котором тоже присутствовал большой тор. Здесь происходит следующее:
- Вычисляются и отрисовываются только изменившиеся части экрана. Это минимизирует объём передаваемых данных, необходимых для обновления экрана (это та же идея «дельта-отрисовки», которая использовалась в XDC). Мы сделали так, потому что видеопамять CGA имеет состояние ожидания, поэтому чем меньше в неё записываешь, тем лучше.
- Использован режим 320x200x4 с сочетанием фона и палитры, что создаёт такую специфическую композитную цветовую палитру со множеством оттенков синего.
- При растеризации для помощи с затенением применён дизеринг.
На пати reenigne заявил, что должно быть возможно перезапускать начальный адрес ЭЛТ-контроллера для каждой растровой строки. При этом можно было бы получить видеорежим высотой всего 100 сток, что даст нам 1024-цветный режим с разрешением 80×100. На изображении выше показан результат такого кода плюс очень долгой работы по созданию программы моделирования композитного сигнала CGA NTSC, написанной reenigne за несколько месяцев до этого для выполнения преобразования изображений. (Нет, мы никому её не даём. И прежде вы спросите, скажу, картинки с девушкой и CGA 1k не являются простым преобразованием, их VileR вручную рисовал в Photoshop, а экраны 4-colors/16-colors/”Until Now” создавались в дополненной версии написанного им Pablodraw.) У нас не было времени, чтобы поместить на эту картинку текст. Показанные выше люди идут в том же порядке, что и в титрах: Trixter, reenigne, Scali, VileR, Phoenix и virt. Приносим свои извинения coda и puppeh, но, как вы видите, если ещё больше сжать картинку, то лица будет вообще не узнать. Простите!
И, наконец, добивающий удар: мультиканальный музыкальный движок для PC speaker. Мы не хотели просто копировать движок для ZX Spectrum, да и другие движки наподобие использованного Music Construction Set, а вместо этого решили поднять планку невероятно высоко: мы воспроизводим через динамик mod-файл protracker. Существуют и другие проигрыватели mod через динамик, но для них требуется 10-мегагерцовый 80286, и они едва справляются с выводом с частотой дискретиации 6 КГц. Наш проигрыватель точно воспроизводит все эффекты protracker, микшируя и выводя звук на динамик в реальном времени с частотой 16,5 КГц, и всё это на 4,77-мегагерцовом процессоре. Это было творение reenigne, ставшее истинным техническим достижением, требовавшим для реализации нестандартного
- Чтобы структуры данных и данные сэмплов соответствовали способу индексации памяти 8088, было выполнено предварительное преобразование модуля. Данные сэмплов тоже были конвертированы.
- Вычисление и вывод каждого сэмпла должны занимать ровно 288 циклов, в противном случае звук начинает заикаться. Достичь этого было очень сложно. 4,77 МГц / 288 = 16572 Гц.
- Вывод звука выполнялся традиционными техниками широтно-импульсной модуляции (ШИМ), например, такими, которые сделали популярным Realsound компании Access. ШИМ динамика выполняется привязкой входного контакта динамика к каналу 2 программируемого таймеру прерывания (PIT), с последующим программированием PIT 2 байтовыми значениями. В сконфигурированной таким образом системе любое значение, передаваемое PIT 2, передаёт динамик в высокую область памяти (HIGH) и начинает отсчёт, а когда отсчёт завершается (т.е. достигается переданное значение), датчик снова переносится в низкую область (LOW). Это приводит к «писку» несущей слышимой частоты; именно поэтому вывод должен быть быстрым (16,5 КГц), чтобы несущая частота была выше диапазона слуха человека.
Забавный факт: после предварительного преобразования мелодии и превращения её в самоиграющий .exe готовый результат после сжатия оказывается меньше, чем исходный модуль.
Спринт на пати
На пати мы приехали с готовым на 90% проектом. До появления на пати мы создали то, что казалось нам достойным участия в конкурсе, а также два «спасательных» видео, одно для вывода на большой экран, а во втором было записано демо, запущенное на настоящем железе, в качестве доказательства для судей. Мы опасались, что оборудование, которое мы берём с собой, повредится при перевозке, поэтому решили подстраховаться и показать хоть что-нибудь. К счастью, компьютеры IBM 5160 reenigne и Scali прибыли невредимыми (что особенно примечательно тем, что reenigne пришлось перевозить машину из Британии в Германию на нескольких поездах!). Также мы привезли две CGA-карты, два устройства для захвата и три разных способа переноса новых фрагментов ПО с наших ноутбуков на старое железо. Никогда нельзя подготовиться ко всему! БОльшую часть времени кодинга на пати мы занимались добавлением kefrens и фотографии в конце демо, устранением багов, добавлением красивых переходов, вырезанием секунд из каждой части, чтобы соответствовать ограничениям compo, а также изменением порядка частей, чтобы интро вдохновлённой BTTF мелодии virt'а совпадала с частью демо со спрайтами. Почти всё время перед compo мы потратили на кодинг, приём пищи и гигиену, а пообщаться с людьми нам удалось только после. Хотя мы приехали с программой, которая почти была готова для участия в compo, потраченное в течение пати время оказалось бесценнным — мы смогли превратить сырой черновик в том, что могло по-настоящему конкурировать за первое место. Мы все находились за одним столом, а значит, могли мгновенно общаться. Мы усвоили урок: редко что может заменить работу лицом к лицу! Одним из результатов такого совместного труда на пати было решение изменить титры в конце с исключительно текстового скроллинга с переменной скоростью на более плавный скроллинг в стиле ANSI, который, по моему мнению, стал наилучшей реализацией по сравнению всеми теми частями, которые мы взяли из дома. Для экономии времени (и для правильной конвертации видео — простите, но большинство людей не знает, как правильно работать с чересстрочным видео), я предложил дать Gasman'у видео в формате 720@60p. NTSC-вывод CGA слегка отличается; вместо 262,5 строк на поле он генерирует 262. Это означает, что он генерирует 59,92 полей (29,96 кадров) в секунду вместо широковещательного стандарта NTSC в 59,94 (29,97 fps). Это не позволяет использовать большинство современных устройств захвата; например, у Scali был высококачественный Blackmagic Intensity Shuttle, но он не смог захватить сигнал. По опыту я знал, что некоторые дешёвые устройства видеозахвата, такие как Terratec Grabby или Dazzle DVC100, имеют больший допуск, потому что они были предназначены для использования с VCR-источниками сигнала, поэтому я привёз с собой эти устройства и отправил одно reenigne для тестирования. Для захвата мы использовали DVC100 с небольшими изменениями усилителя-корректора, чтобы захват выглядел как можно более близким к выводу ЭЛТ-монитора. Чтобы дополнительно улучшить видеозахват, мы использовали в качестве ПО захвата VirtualDub, у которого есть опция динамического ресэмплинга входящего аудиосигнала для соответствия частоте кадров захвата на случай, если она слегка смещена. Такое сочетание ПО и железа работало очень хорошо. Для захвата звука мы сначала прицепили к динамику зажимы-«крокодилы», но Scali привёз с собой Sound Blaster, у которого был настоящий контакт PC speaker, и к нему можно было подключиться внутренним кабелем, поэтому для захвата использовали его.
Взгляд в будущее
Посмотрев демо и прочитав статью, вы можете задаться вопросом — есть ли ещё пространство для усовершенствований? Верьте или нет, но оно существует — совершенно точно возможны альтернативные способы генерации звука и дополнительные хитрости с извлечением циклов. Мы могли встроить в демо больше эффектов, но нам не хватило времени: во-первых, времени на разработку, во-вторых, времени воспроизведения демо, потому что в дисциплине compo на Revision лимит состовляет 8 минут или меньше. В сумме я знаю всех совместно работавших над демо людей уже 60 лет. Работа над демо вместе с ними была честью и привилегией. Будем ли мы снова работать вместе? Я бы сказал, что это определённо возможно; на следующий день после compo мы набросали несколько идей, например, создание игры вместо демо. Лично я выгорел и потрачу несколько следующих недель на игры, которые давно хотел пройти, и на восстановление здоровья. Кроме того, у меня есть несколько других крупных проектов, которые я хочу запустить этим летом, один из которых очень ждёт сообщество по сохранению программного обеспечения для PC, а второй — это онлайн-музей звуковых карт. Но кто знает…
Бонус — как выглядит 8088 MPH в DOSBox:
Автор: PatientZero