Хотел сделать демку с тех самых пор, как познакомился с этим явлением компьютерной субкультуры на классическом примере польской Lyra II. Также регулярно хотел выставить что-нибудь на крупнейшем российском демопати, Chaos Constructions, но каждый раз не доходили руки. Наконец-то удалось удовлетворить обе потребности сразу, в стиле Ван Дамма (двойной удар, с вертушки) — сделать и выставить AONDEMO. В конкурсе ZX Spectrum 640K Demo.
Вашему вниманию предлагается подробное руководство, как именно можно докатиться до жизни такой.
История
Телефоны с Автоматическим Определителем Номера (АОН), также известные как «определитель» или «электронный секретарь», появились в СССР примерно в 1989 году, и в последующие 15 лет бурно развивались, пройдя путь от средства заработка студентов, безработных инженеров (наряду со сборкой Спектрумов) и целых кооперативов, до основного предмета деятельности довольно крупных компаний. В середине 1990-х годов подобный телефон встречался чуть ли не в каждой квартире, и любой пользователь телефонной сети на раз мог по характеру гудков в трубке понять, определяется ли сейчас его номер (поддельные гудки и характерный звук запроса). К 2004 году популярность подобных аппаратов сошла на нет, сам сервис определения номера на АТС сначала стал платным, а потом и вовсе был упразднён, сменившись на более современный европейский стандарт. Повсеместное распространение мобильной связи быстро загнало проводные телефоны в глубокий андерграунд, где всё ещё выходят непонятно кем востребованные «элитные» потомки АОН 90-х (Палиха).
Сцена разработчиков и сборщиков ранних АОН — это как бы параллельная отечественному Спектруму реальность. Радиолюбительские корни и романтика. Стихийная разработка, развитие и кустарное производство. Схожее железо, схожие интересы, схожий период и объём популярности. Многие люди поначалу одновременно занимались тем и другим. Юные авторы всесоюзно известного ПО (Павлу Суходольскому, автору Руси, было тогда около 15 лет), невозбранное заимствование кода друг у друга, копирайты и послания в коде, фидошные адреса, статьи в прессе, книжки, мифология, и многое другое. Весьма масштабная, но уже основательно занесённая песками времени история начала цифрового века, ещё ждущая своих исследователей.
АОН и я
Моё знакомство с АОН состоялось в первой половине 90-х, уже после первых увиденных игр на Спектруме и Денди, но незадолго до начала созидательно-программировательной деятельности. Мне нравилось ковыряться с этими телефонами, экспериментировать с последовательностями клавиш в свежих или незнакомых прошивках, слушать популярные мелодии в «компьютерном» исполнении и удивляться «компьютерным» голосам, а также вычитывать в инструкциях упоминания неведомых артефактов «запись на магнитофон», «шлейф охраны», «голосовая плата», «бипер». Друг детства помогал своему отцу собирать подобные аппараты, а я увлекался электроникой и только-только увлёкся компьютерами, и таким образом урывками приобщался к тайному знанию про Z80, ВВ55 и другие магические обозначения. Одновременно «определители» стали появляться у всех друзей. Они часто ломались и попадали в мои руки с просьбой попробовать починить, чем я и занимался, иногда успешно, чаще нет. В 2000-х эта деятельность сошла на нет.
В 2013 году при раскопках самых дальних углов квартиры я наткнулся на пару сохранившихся телефонов и вспомнил былые времена. Немного позже тогдашние изыскания в области 1-битной музыки, DIY-синтезаторов и особо старых компьютеров типа KIM-1, навели меня на мысль, что АОН — это же готовый, вполне полноценный одноплатный компьютер, который может быть задействован в нестандартных музыкальных целях (как драм-машина или секвенсор). Исполнившись энтузиазма, я начал писать эмулятор и разбирать старые прошивки, но вскоре обнаружилось, что найденные ранее телефоны были вполне успешно выброшены в процессе уборки. Тема была отложена в долгий ящик.
Постепенно различные интересы, затеи и предметы — разработка PCSPE для PC Speaker, воспоминания и интерес к старым телефонам с АОН и их истории, чтение сайта 155la3 про редкие советские радиодетали (изумительные сегментные индикаторы!), старые идеи про музыкальное применение этого железа, приобретение множества АОНов на Avito, а также электронных запчастей и инструментов для разных проектов, продолжение работы над эмулятором, и так далее — сложились в нужную схему. Незадолго до Мультиматографа 2018 наконец-то оформилась логическая связь между сущностями «демо» и «телефон» (насколько я могу вспомнить, это было вызвано увиденным словосочетанием «демка для калькулятора» ), и началась целенаправленная работа. Конечно, ничего существенного за неделю с небольшим сделать не удалось, дело замедлилось, но возобновилось с приближением CC2018. В лучших традициях, ударным трудом и неимоверными усилиями за два дня и ночь перед пати удалось допридумать, донаписать и отладить большую часть задуманного, снять и смонтировать видео, и рано поутру отправить работу на конкурс.
Уже после релиза я узнал, что семисегментные дисплеи не редкий гость в работах для Wild Сompo. Но я таковых не видел и про них ранее не слышал.
Железо
По сути АОН представляет собой простейший одноплатный компьютер с семисегментным дисплеем, телефонной клавиатурой и интерфейсом сопряжения с телефонной линией. На протяжении полутора десятка лет железо менялось, начиная от конструкции на КР580ВМ80 (i8080) 1989 года и заканчивая заказным чипом R100-XP компании Русь-Телеком 2003 года (8051, периферия и аналог AY-3-8910 на одном кристалле), со множеством промежуточных остановок и ответвлений.
Я выбрал самую классическую и популярную версию разработки 1990 года, исторически и технически наиболее близкую духу Спектрума: Z80 на частоте 4 МГц ровно, 2 килобайта статического ОЗУ, 8-64 килобайт ПЗУ, порт 8255 и таймер 8253 со входной частотой 1 МГц. Один из каналов таймера генерирует прерывания, другой звук, третий не задействован. Эта схема была представлена в виде «большой» и «маленькой» плат, первая предназначалась специально для установки в корпус латвийского кнопочного телефона VEF-TA-12, вторая ставилась в самые разнообразные импортные телефоны, в основном клоны офисных Panasonic. Для этих плат существовали разнообразные прошивки, в частности, Арктур-36, Селена, Лира, Алло. И, конечно, самая знаменитая — Русь, до 23 версии включительно.
Перепрограммировать телефон очень просто — достаточно любого 5-вольтового ПЗУ нужного объёма и программатора. Я использовал различные EEPROM со старых материнских плат и свежие Winbond W27C512, закупленные в Китае, а также самый простой и доступный программатор WizardProg-87.
Наибольшей сложностью при работе с железом оказалось состояние панелек под ПЗУ на платах древностью в четверть века и более. Они изначально не отличались высоким качеством, а в наше время контакт в них постоянно теряется, что затрудняет определение — ошибка ли это в написанном коде или просто неконтакт в панельке. Я пытался решить этот вопрос установкой ZIF-сокета, но высота других компонентов на плате не позволила его впаять, а этажерка из разъёмов для наращивания высоты, вставляемая в оригинальную панельку, также страдала от постоянной потери контакта.
Эффекты
Перед началом разработки демо я написал, а точнее дописал начатый ещё в 2014 году, эмулятор АОН. Пришлось доразобраться с некоторыми неочевидными моментами, а также применить чужой код эмуляции таймера 8253, чтобы получить более-менее нормальный звук и частоту прерываний. Наличие эмулятора и хотя бы рудиментарных отладочных возможностей в нём многократно ускоряет разработку. Далее код в основном тестировался в эмуляторе, и лишь иногда на железе, чтобы убедиться, что всё работает правильно и нормально смотрится на светодиодном дисплее с динамической индикацией, адекватную имитацию которой я сделать пока не смог.
Код писался в обычном SjAsmPlus. У АОН довольно причудливая карта памяти, вероятно следствие минимизации переделок железа при расширении объёмов ПЗУ под новые, более крутые прошивки. В результате, хотя и можно установить до 64 килобайт ПЗУ, в памяти доступно только 32 килобайта, чередующиеся банками по 8 килобайт с ОЗУ. 32-килобайтные половинки полного объёма ПЗУ можно переключать выводом в порт, но для демо это не понадобилось, всё поместилось в 32К. В образе ПЗУ 8-килобайтные банки должны идти подряд, без зазоров, поэтому посредством директив ассемблера и BAT-файла пришлось организовать размещение банков по нужным адресам с дополнением нулями, раздельное сохранение и объединение в финальный образ.
Примерно половина эффектов в демо написана честным кодом, а вторая половина, на которую уже совершенно не хватало времени, сделана в виде анимации. Рисовалась анимация в набросанном на скорую руку редакторе-запиляторе LED9ED, скачать который можно на моём сайте.
В связи с довольно высокой плотностью эффектов, порядка 4 секунд на один эффект, и постепенной перетасовке эффектов, ближе к крайнему сроку оказалось, что полностью отсутствует содержание центральной 16-секундной части демо, где музыкальная псевдо-полифония разворачивается в полную силу. Срочно был придуман откровенный филлер-эффект, хотя и довольно залипательный, с падающими сегментами, чередующийся с ранее написанным анализатором спектра. Пришлось понадеяться, что высокая плотность звуковой информации отвлечёт внимание от затянутости действия на дисплее.
Первые имена в блоке приветствий — дань уважения энтузиастам прошлого. Это имена авторов прошивок АОН, найденные в заставках и коде.
Хотя это и было не совсем в тему, упустить возможность показать знаменитую семисегментную надпись ЕГГОГ было бы непростительно. Наиболее логичное место для неё нашлось в самом конце — демо начиналось имитацией сбоя, и завершилось сообщением об ошибке.
Разбор программной реализации эффектов не имеет особого смысла, всё достаточно прозрачно. Главной особенностью платформы, о которой стоит упомянуть, является необходимость программной динамической индикации, то есть надо постоянно перебирать разряды дисплея и включать нужные сегменты. Это сделано посредством прерываний. Частота прерываний выбрана довольно высокой, 960 герц (~4166 тактов на прерывание), а индикация сделана посредством списка произвольной длины, описывающего порядок включения разрядов. Помимо стабильной индикации с приличной яркостью это позволило легко сделать два эффекта — «зависание» с характерной яркой восьмёркой (перестаёт работать перебор разрядов) и эффект изменения яркости (в одном цикле некоторые разряды включаются несколько раз). В нормальном режиме индикации частота обновления дисплея составляет около 106 герц, что устранило заметное глазу мерцание и упростило последующую съёмку на видео.
Музыка
Единственный звуковой канал АОН построен на одном из каналов таймера 8253 и по сути копирует устройство PC Speaker, только с другой входной частотой — то есть он может гудеть звуком заданной высоты, пока процессор занимается своими делами. Возможности изменять форму и громкость сигнала при этом нет. Так как я уже некоторое время плотно занимался темой музыки на классическом PC Speaker'е — написал VST-инструмент PCSPE для удобного создания таковой музыки в современных DAW и накопил опыт аранжировки строго монофонических мелодий (в один момент времени всегда звучит только одна нота) — решение было очевидно: не писать очередной 1-битный движок, а просто сделать музыку в PCSPE и адаптировать под АОН. Это и менее трудозатратно, и аутентично по звучанию, и идеологически верно — выжать необычное из привычного.
Музыка писалась в Reaper. Так как художественной задумкой для начала демо была имитация стандартного запуска прошивки Русь, я точно повторил эту мелодию, имитировал некоторые типичные звуки (нажатие кнопок, стандартный звонок), и построил из них ритмическую композицию. Далее трек постепенно развивался, исходя из начальной идеи, по пути постепенного усложнения — всё больше и больше партий, создающих иллюзию одновременного звучания нескольких каналов. Так как идеей самого сложного в демо эффекта был бегающий влево-вправо символ с разными уровнями яркости, напоминающий светотехнику машины Kitt, я также сделал вставку с мелодией из Knight Rider и нашёл ей подходящее место.
Выбранная платформа очень ограничена в визуальных средствах, и для повышения зрелищности изначально было решено делать трекмо, то есть точную синхронизацию музыки и визуальных эффектов. Поэтому музыка и сюжет демо в основном придумывались и писались параллельно. В отличие от трекеров, где видно только текущий паттерн и ордер-лист, в Reaper'е можно видеть трек и его структуру целиком, а также легко переставлять фрагменты местами. Это помогало в принятии решений о структуре и наполнении демо.
К сожалению, точно засинхронизировать эффекты с музыкой оказалось очень непросто. Звук в моём сыром эмуляторе не совсем совпадает с отображением, частое тестирование на железе затруднительно, а на разработку нормальной системы синхронизации по временным меткам уже не хватало времени. Как результат, местами можно видеть не совсем точное попадание эффектов в музыку. Пока оставалось время, по ходу дела тайминги подгонялись вручную, но в итоге пришлось смириться с не самой точной синхронизацией и публиковать как есть.
Помимо звуков, прошивки для АОНов были примечательны голосовыми сэмплами. В процессе работы я разобрал в общих чертах их формат хранения и прослушал сэмплы, в которых нашлось немало любопытного (3-4 разных голоса, ненавязчивое заимствование их из прошивки в прошивку, фразы отсылания абонента в различные места). Была идея сделать в демо речевую вставку, составленную из этих сэмплов, говорящую что-то неожиданное узнаваемым голосом. Но на придумывание хорошей идеи и её реализацию не хватило времени. Как интересный факт, голос в старых прошивках хранится в виде 4-битных сэмплов с частотой дискретизации 4500-5000 Гц, и играется через ШИМ на таймере.
Видео
Чтобы показать демо для необычного железа, не имея возможности присутствовать с этим железом на пати, понадобилось записать и смонтировать видео — не совсем обычное занятие для программиста при создании демо.
В процессе разработки использовалось два аппарата, один совершенно непрезентабельный с маленькой платой и один хорошо сохранившийся классический VEF-TA-12 с большой платой. Тестирование проводилось в основном на первом, а последние отладочные штрихи и запись видео — на втором. Он также отличается в выгодную сторону визуально более крупными цифрами на дисплее, хотя тип индикатора в нём такой же. Наверное сыграло роль меньшее расстояние от дисплея до светофильтра.
Интересной особенностью этого дисплея, калькуляторного АЛС318, оказалось то, что у всех экземпляров АОНов с ним, которые есть у меня в наличии, часть разрядов заметно утратила яркость. Скорее всего дело в том, что АОНы любили зависать, а при зависании динамическая индикация перестаёт работать и надолго зажигается полной яркостью один из разрядов. Хотя можно было бы выбрать и поставить наиболее живой дисплей, я не стал ничего предпринимать по этому поводу, решив, что это добавит аутентичности в видео.
Снималось всё в последний момент в большой спешке, на обычную видеокамеру, и потом быстро-быстро монтировалось в Blender — потому что там я хоть как-то это умею, а ничего другого под рукой не было. Вступительная часть призвана напомнить, что это за чудо техники, и пояснить, каким образом туда попала другая программа. В планах также был кадр со вставкой ПЗУ в плату, но от него пришлось отказаться по причине состояния панельки ПЗУ, требующего выполнять замену двумя руками с долгим нецензурным кряхтением.
Релиз и результаты
Раздел для тех, кто интересуется жизнью демосцены и организационными тонкостями.
Как получилось, что демо оказалось в категории ZX Spectrum. Буквально за две недели до события была введена поправка в правила, говорящая, что к участию в этой категории допускаются работы «для ZX Spectrum совместимых компьютеров и других компьютеров выпущенных не позднее 1991 года». Фактически категория превратилась в Combined Oldschool Demo, то есть демо для любых старых компьютерных платформ, причём по соображениям сценово-политического характера название осталось прежним. Конечно же это вызвало некоторое количества непонимания и критики, и уже начало становиться локальным сценовым мемом.
Дополнительно, на самом пати по причине недостаточного количества работ в разных конкурсах большую часть демо для редких платформ и Wild объединили в Combined Demo, а в ZX Demo помимо моей работы попала только одна не-ZX работа. В сложившейся ситуации я считаю, что уместнее было бы выделить эти две работы в Combined, оставив на этот раз конкурс с ZX Spectrum в названии только для ZX Spectrum. Если бы я знал о таком положении вещей на момент отправки работы, то выбрал бы категорию Combined Demo.
По каким соображениям я решил не выставляться в категории Wild (в ней традиционно выставляются работы в формате видео и анимации, хотя теоретически она также предназначена и для работ на нестандартных платформах). Не спорю, что по сути работа очень близка к этому направлению. Но всё же это реальное демо, с реальным TRD бинарником и исходниками, для реальной и весьма популярной в прошлом платформы, родственной нашим домашним компьютерам. Его можно легко запустить и посмотреть на реальном железе — нужен только программатор, как и в случае с приставками. Само железо тоже вполне доступно, определённо доступнее, чем, например, ZX-81. Также есть какой-никакой эмулятор. Иными словами, это не разовая уникальная сложно повторяемая акция в виде видеоролика (типа демки для банкомата или редкой модели фотоаппарата), посмотреть мою работу и сделать нечто подобное теперь достаточно легко сможет любой желающий.
Скачать
AONDEMO с исходниками
AONZ80Emu для Windows
LED9ED для Windows
PCSPE для DAW с поддержкой VSTi
Автор: shiru8bit