Судя по скринам, это MS - DOS 3.2 На разборки с АДОС потратил в 1988 не более часа. Выяснив, что команда DIR заменена на СФ (Список Файлов) и СС (Список Системных, наверное файлов), решил дальше мозг не ломать. Имея опыт с хреновейшей русификацией ОСРВ (в девичестве UNIX для EC) и ДИАМС (MUMPS для Электроники, которая в девичестве PDP-11) Из отечественного официального софта могу вспомнить только комплект русификации BETA лаборатории Веселовского (железа был жуткий зоопарк) и редактор Лексикон (в МВД был базовым до нынешнего века!!!). Все остальное было стибрено и криво русифицыровано. СУБД Ребус - какой-то из фоксбейсиков, текстовый редактор Фотон 1 - MultiEdit 4. Все русское, что работало, писалось энтузиастами.
Судя по скринам, система загрузилась, отрабатывает команды ver и dir.
Дальше надо смотреть config.sys и autoexec.bat Отвечают за последовательность загрузки файлов. посмотреть можно командой type "имя_файла".
К вопросу о дисководах. Флопповоды (официально НГМД) не отличались хорошей совместимостью. Самыми крутыми считали Seagate, потом болгарские Изот, потом все остальные.
Наших AI-агентов и AI Gateway можно использовать прямо в инструментах разработки.
Подключаете один раз → и дальше задаете вопросы по проекту, редактируете код и запускаете команды в терминале — прямо в рабочем окне.
Как это устроено: среда обращается к модели через OpenAI-совместимый API по вашему ключу. Используете наши модели и инфраструктуру, а интерфейс — привычный редактор или окно чата.
Подключение сводится к трем полям в настройках расширения:
1️⃣Тип провайдера — OpenAI Compatible
2️⃣ Базовый URL агента или AI Gateway
3️⃣ И, наконец, ваш API-ключ.
Дальше можно отправлять запросы модели прямо из кода. Если используете AI Gateway, в настройках доступны и параметры генерации — размер контекста, лимит токенов, температура.
Думаю, многим из вас доводилось в рамках диспансеризации или по предписанию врача идти в лабораторию и сдавать что-то на анализ чего-то. А ещё, уверен, многие хоть раз задумывались: а как вообще работают приборы, которые там стоят, и как они вообще определяют наличие тех или иных гадостей в вашем организме?
Самое время узнать это. Однажды ко мне в руки попал один из таких приборов. В сегодняшней статье попробуем его запустить, посмотрим, что у него внутри, и, конечно, разберёмся, как он работает. Как водится, будет много интересного.
❯ Суть такова
Те, кто уже давно читает мои посты, наверняка удивятся: откуда это у меня вдруг взялся интерес к околомедицинскому оборудованию? Но на самом деле всё до банального просто.
Несколько лет назад известный в наших кругах товарищ @dlinyj скинул мне ссылку на объявление на вторичке, где продавался какой-то медицинский аппарат. Интерфейс на монохромном экране подозрительно напоминал PalmOS, что меня довольно сильно заинтересовало. Если WinCE не то что иногда встречается в спецоборудовании, а буквально была создана для него, то вот подобных девайсов на базе «пальмы» за исключением ТСД и электронной пишущей машинки я вообще не припоминаю. Цена той штуки была вполне молодёжная, и после недолгих раздумий я её заказал.
Через неделю я стал обладателем некоего Bayer Clinitek Status+ — лабораторного анализатора мочи для выявления заболеваний почек или для проведения теста на беременность.
❯ Вообще
На всякий случай напомню: даже если у вас есть на руках какой-то подобный аппарат с набором расходников к нему, он не будет сообщать вам конкретный диагноз. Интерпретацией его показаний должен заниматься только ваш лечащий врач.
Также не будет лишним добавить, что многие медицинские аппараты напрямую контактируют со всякими биологическими жидкостями или препаратами. И если для представленного тут экземпляра это не так важно, то вот, скажем, какой-нибудь анализатор крови я бы не стал трогать без двух пар резиновых перчаток
❯ Обзор оборудования
Ну что же, взглянем, что за девайс мне вообще достался.
А вот и подопытный экземпляр.
Спереди только экран и кнопка включения. Внизу под наклейкой отсек для лотка для препарата (с этого ракурса не виден).
Вид сбоку.
Сзади COM-порт для связи с компьютером и гнездо для БП. Над ними дверца отсека для бумаги.
Снизу заводская наклейка, отсек для батареек и единственный саморез.
❯ Запускаем
Ну что же, взглянем на девайс в работе.
Подаём питание и жмякаем кнопку включения.
Спустя несколько секунд девайс загружается и проходит самотестирование.
После этого на экране появляется вот такой интерфейс.
Слева вверху настройки прибора, снизу две большие кнопки для начала нового тестирования.
Это настройки прибора. Здесь довольно много пунктов, от диагностики до ввода данных об операторе.
Попробуем запустить какой-нибудь тест.
Из аппарата выезжает предметный столик, куда нужно положить тест-полоску, после чего жмякнуть на сенсорном экране START.
Никаких расходников к этому аппарату у меня нет, поэтому тест завершается провалом.
Первая вставшая передо мной проблема — как это разобрать. После выкручивания единственного самореза снизу ничего не снялось.
Оказалось, надо выкрутить ещё и два винта с боков. Находятся они в очень неудобном месте, без углового шестигранника не подобраться.
Да, похоже, у производителя этого прибора какая-то жесточайшая нелюбовь к проводам: все соединения в нижней части сделаны одним-единственным шлейфом очень хитрой формы.
Внутри мы видим батарейный отсек и мотор привода предметного столика. Также виден датчик его выдвижения.
Провода батарейного отсека подпаяны к отдельным пятачкам. Сам шлейф пропущен через ферритовые кольца.
А это мотор, который выдвигает и задвигает предметный столик.
Он же отдельно. Для возможности его мытья он специально сделан съёмным.
Слева лоток для тест-полосок. Выполнен он в виде пластмассовой вставки, если её извлечь, можно обрабатывать не только тест-полоски, но и тест-кассеты. Справа калибровочная область, позволяющая прибору проводить самодиагностику.
Продолжаем разбирать.
Сняв верхнюю часть и отключив парочку шлейфов от дисплея, видим плату управления. Справа от неё термопринтер для распечатки отчётов.
Плата отдельно. Увы, процессора MC68000 на ней не оказалось. Таким образом, работает эта штука не на PalmOS, а на какой-то RTOS или даже чём-то попроще.
ПЛИС явно занимается обработкой сигнала с датчика.
А это HD64F13006F20V — 16-битный управляющий МК.
С обратной стороны платы батарейка RTC, несколько электролитических конденсаторов, пищалка и слот под SD-карту.
Откручиваем ещё один винт и снимаем пластиковое крепление платы.
Под ним сердце прибора — оптическая часть.
Крышка закреплена простыми саморезами, так что снимем её. Вся оптика находится в ней.
На этой плате расположены подсвечивающие образец светодиоды — RGB и УФ.
Сняв металлическую пластину, видим внутренности оптической системы.
Чёрная рамка закрывает ПЗС-матрицу, над ней расположен объектив. Закрученные с локтайтом винты намекают на то, что, не имея алгоритма юстировки, разбирать это всё лучше не стоит.
Световод из оргстекла. Закреплён он ни на чём не был, просто прижимался крышкой с расположенной на ней оптикой.
Больше на шасси прибора ничего интересного нет.
Дисплейный модуль.
Обратная сторона. Маркировка не гуглится, но, судя по всему, у дисплея достаточно простой параллельный интерфейс, который при необходимости легко можно отреверсить.
❯ Как работает этот девайс
Как можно видеть, на самом деле какой-то экзотической начинки конкретно в этом девайсе нет. Здесь практически весь анализ делает не электроника, а химия.
Некоторые знают, что для проведения некоторых исследований существуют подобного вида тест-полоски. Выглядит она как узкий отрезок плёнки, на который нанесены реагенты, меняющие цвет при взаимодействии с детектируемыми веществами. Пользователю остаётся только сравнить свой образец с идущей в комплекте контрольной шкалой.
Более подробно это всё описано тут, так что повторяться не буду.
Так вот. Раз существуют такие штуки с обычной бумажной контрольной шкалой, то почему бы не автоматизировать их считывание? Такое решение позволит ускорить процесс, а заодно и сделать анализ более точным и менее чувствительным к ошибкам оператора.
Именно этим и занимается данный девайс. В меню выбирается тип расходников, после чего тот считывает сканером паттерн цветов и сравнивает отклонение от эталона. Сам девайс ничего этакого не производит, вся его задача состоит в распознавании уже прореагировавших тест-полосок или тест-кассет.
Также в него можно вставлять вот такие вот тест-кассеты, использующиеся для более точных (в сравнении с привычными нам) тестов на беременность.
А это щель сканера, с обратной стороны которой находится световод.
При каждом включении девайс калибруется, сканируя белую полоску на предметном столике.
Попробовал запечатлеть процесс сканирования, заслонив концевик и включив прибор.
❯ Так что в итоге?
В отличие от других девайсов, например, анализаторов крови, этот экземпляр оказался довольно прост. У меня нет сведений о том, так ли он помогает проводить исследования, как говорит об этом производитель, но если вам доводилось пользоваться чем-то похожим или даже обслуживать такие приборы, то будет очень интересно об этом узнать.
Что же до изначальной цели приобретения этой штуки, то, как уже было сказано ранее, никакой PalmOS в нём не оказалось. Так что, возможно, спецоборудования на базе «пальм» (за исключением различных адаптеров к серийным КПК) не существовало вовсе.
Теперь облачной базе данных можно выдать бесплатный публичный IPv6-адрес.
Полезно, если:
1️⃣ Уже раскатали IPv6 в своей инфраструктуре и не хотите держать IPv4 только ради базы
2️⃣ Масштабируете проект и постепенно уходите от дефицитных IPv4-адресов
3️⃣ Строите cloud-native или корпоративную инфраструктуру, где важна поддержка IPv6.
Подключается в пару кликов: при создании новой базы или в настройках существующей «Сеть» → «Публичный IPv6-адрес». Если переключателя IPv6 у базы нет — значит, на вашей сети он пока недоступен.
Стоит открыть исходники любого современного игрового движка – неважно, это C++-рендер, сделанный на коленке, или какая-нибудь гигантская экосистема вроде Unity или Unreal Engine – вы первым делом натыкаетесь на одни и те же знакомые сущности. Все вокруг живет в Vector3: координаты, направления движения, точки столкновений. Каждая частица указывает, куда она смотрит, с помощью Quaternion. А если требуется что-то покруче – переносить и одновременно крутить объект, то Matrix4x4. Это уже как стандарт де-факто: кто пробовал крутить объекты руками, тот точно переписывал код с этими структурами. Ещё конечно же отдельно существуют лучи, плоскости, сферы, bounding boxes, а между ними тянутся километры функций вроде dot(), cross(), normalize(), lookAt(), inverse(), project() и бесконечных преобразований типов.
Привыкаешь к этому быстро. Нам кажется совершенно естественным тасовать эти типы между собой – уж слишком давно так делается по всей индустрии. Но стоит лишь чуток задуматься, и начинает прорезаться легкий когнитивный диссонанс: выходит, вся наша графика построена на наборах несовместимых между собой математических запчастей. Для одного действия нам нужен один тип данных, для второго – другой, а пересчитать простое столкновение луча со сферой или плоскостью без пятого велосипеда никак не получается. Вроде бы всё работает и даже неплохо работает… Но ощущение конструктора из костылей не отпускает.
И самое интересное заключается в том, что так было не обязательно.
И тут интересно вспомнить XIX век. Тогда математики как раз ломали головы над тем, чтобы придумать нормальный универсальный язык для описания пространства – не мелочиться кучей частных формул на каждый случай жизни. William Rowan Hamilton придумывает кватернионы: компактный инструмент для вращений в пространстве, который становится сегодня основой всей компьютерной анимации (даже те же Unity и Unreal ими внутри манипулируют).
Графическое представление таблицы умножения базисных кватернионов (цвет шара определяет первый множитель, цвет выходящей стрелки – второй множитель, стрелка указывает на результат умножения)
Параллельно Hermann Grassmann выносит мозг коллегам идеей: почему бы алгебре не оперировать сразу плоскостями и объемами целиком? Ну действительно: мы привыкли складывать числа и векторы, а как быть с более сложными сущностями? Дальше подключается William Kingdon Clifford, собирает всё это в одну систему – получает Геометрическую Алгебру.
По сути, Клиффорд пытался создать универсальную операционную систему для геометрии.Но индустрия пошла другим путем.
Когда физикам и инженерам понадобилась удобная математика для электромагнетизма и механики, Josiah Willard Gibbs и Oliver Heaviside взяли идеи Клиффорда и разрезали их на части. Из цельной алгебры были извлечены только самые прикладные куски – скалярное и векторное произведения. Так появился привычный нам vector calculus, который сегодня преподают во всех технических вузах и используют почти все графические API.
Фактически современная графика работает не на полной геометрической теории, а на ее урезанной инженерной версии. Проблема этой урезанности особенно хорошо видна на векторном произведении. Все знают формулу:
Она дает вектор, перпендикулярный двум другим. На ней построены нормали, вращения, ориентация треугольников и половина графического пайплайна. Но есть неприятный нюанс: эта операция нормально существует только в трехмерном пространстве. В двумерном мире полноценного векторного произведения нет вообще, а в четырехмерном результат уже перестает быть обычным вектором. То есть одна из фундаментальных операций всей 3D-графики – это математический хардкод под конкретное число измерений.
Клиффорд предложил гораздо более общую идею. Вместо отдельного скалярного и отдельного векторного произведения он ввел единую операцию:
На первый взгляд формула выглядит странно. Слева произведение двух векторов, справа сумма каких-то совершенно разных объектов. Но именно здесь скрывается главная идея Геометрической Алгебры.
Первая часть привычное скалярное произведение. Число. Ничего нового. А вот – это внешнее произведение Грассмана. И его результатом является не вектор, а новый геометрический объект – бивектор.
Бивектор очень трудно понять, если смотреть на него через призму привычной линейной алгебры. Нас с детства учили, что результат взаимодействия двух векторов – это либо число, либо еще один вектор. Но Грассман предложил мыслить иначе. Если два вектора натягивают параллелограмм, то естественным результатом их комбинации должна быть сама ориентированная площадь этого параллелограмма. Не стрелочка, торчащая перпендикулярно плоскости. А сама плоскость.
Бивектор хранит площадь и ориентацию обхода. По сути, это элемент поверхности. Вот тут у многих мир переворачивается: оказывается наше привычное векторное произведение («дай-ка найду нормаль к плоскости») – это такой засекреченный хак ради удобства старой учебной математики! Мы подсознательно заменяем настоящую плоскость перпендикулярным ей вектором просто потому, что так проще считать по старинке. Но Геометрическая Алгебра говорит: зачем вообще выбрасывать информацию о самой плоскости?
В итоге из этой идеи рождается целая лестница геометрических объектов: есть значение (число), есть направление (вектор), есть площадь (бивектор), есть объем (тривектор) – все это элементы единой структуры под капотом! У людей технических такое вызывает лёгкое недоверие («подожди… какой еще вектор-площадь?») – словно кто-то предлагает напрямую сложить яблоки с квадратными метрами. Но идея-то именно в этом: собрать всю геометрию пространства под одной крышей, чтобы перестать тащить за собой гору несовместимых матрешек.
А затем появляется самая странная и одновременно самая мощная концепция – мультивектор. А дальше начинается магия серьёзной математики. Стоит расширить наше 3D-пространство до пятимерного (!) за счет двух спец-направлений – одно станет отвечать за начало координат вселенной, другое символизирует бесконечность во всех смыслах слова. Получаем Conformal Geometric Algebra (CGA): звучит максимально экзотично и сначала похоже на сугубо теоретические упражнения… Но вот что удивительно: CGA позволяет описывать сферы, окружности и прочие объекты как такие же элементы своей алгебры так же естественно, как вы оперируете обычными точками или прямыми.
Выглядит всё это так будто из учебника магии для программиста. На практике же происходит нечто почти магическое: все геометрические объекты начинают описываться одинаково.Точка становится мультивектором. Сфера становится мультивектором. Плоскость тоже становится мультивектором. Причем в CGA плоскость фактически является сферой бесконечного радиуса. Это уже не отдельный тип сущности, а частный случай более общего объекта.
Для программиста это звучит почти еретически. Представьте движок, в котором Plane, Sphere, Ray и Lineперестают быть независимыми структурами и становятся вариациями одной и той же геометрической сущности. Но самое важное начинается дальше.
Сегодня практически любой физический движок содержит десятки специализированных функций:
Каждая написана отдельно. У каждой свои edge cases. В каждой свои проверки на epsilon, вырожденные случаи и численные артефакты.
В CGA идея совершенно другая: пересечение – это не набор специальных алгоритмов, а базовая операция самой алгебры. Вместо огромного набора формул появляются универсальные операции вроде внешнего произведения или операции Meet. Геометрия начинает выглядеть не как коллекция инженерных костылей, а как цельная система преобразований. Еще более радикально это проявляется в трансформациях.
Современная графика использует целый зоопарк представлений. Повороты кодируются кватернионами. Переносы – матрицами. Масштабирование – другими матрицами. Для анимации часто добавляются dual quaternions. Внутри движка постоянно происходит конвертация между разными представлениями одной и той же геометрии.
В CGA все это заменяется единым объектом – ротором. Любое преобразование записывается одинаково:
И неважно, что именно делает RR. Если он кодирует вращение – объект повернется. Если перенос – объект сдвинется. Если масштаб – масштабируется. Формула остается одной и той же.
Для человека, который годами писал графический код, это выглядит почти незаконно. Особенно впечатляет то, как меняется сам стиль программирования. Например, в библиотеке clifford код начинает напоминать скорее школьную геометрию, чем традиционный graphics programming:
from clifford.g3c import *
# Создаем две точки в конформном пространстве point1 = up(eo + 1*e1) point2 = up(eo + 5*e1)
# Линия - это просто внешнее произведение двух точек и бесконечности line = point1 ^ point2 ^ einf
# Сфера с центром в point1 и радиусом r r = 2.0 sphere = point1 - 0.5 * (r**2) * einf
# Ищем пересечение линии и сферы. ОДНА СТРОЧКА! intersection = line.meet(sphere)
В этом фрагменте почти шокирует отсутствие привычных вещей. Нет матриц. Нет ручной тригонометрии. Нет вызовов cos() и sin(). Нет километров условий вроде if(dot < 0). Код начинает выражать не алгоритм вычисления, а саму геометрическую идею. Именно поэтому многие люди, впервые столкнувшиеся с GA, испытывают странное чувство. Возникает ощущение, будто вся современная 3D-графика десятилетиями решала геометрические задачи окольным путем.
Но тогда возникает очевидный вопрос: если Геометрическая Алгебра настолько красива, почему индустрия до сих пор массово не перешла на нее?
Потому что у этой красоты есть цена. Главная проблема – производительность. В конформной алгебре мультивектор в 5D содержит коэффициента. Для сравнения: обычный Vector3 хранит всего три числа. То есть даже простая точка внезапно становится огромной структурой данных. Для CPU-кэша и особенно для GPU это настоящая катастрофа.
Современные видеокарты десятилетиями оптимизировались под операции над четырехкомпонентными векторами и матрицами 4×4. Под них существуют SIMD-инструкции, специализированные блоки вычислений, драйверы и шейдерные пайплайны. Вся индустрия буквально выращена вокруг матричной математики. GA пока остается чужаком на этом празднике жизни.
Есть и другая проблема – психологическая. Геометрическая Алгебра требует полностью перестроить мышление. Разработчик должен отказаться от привычной модели вектор + матрица + кватернион и начать воспринимать геометрию как единую алгебраическую систему. Это не просто новая библиотека. Это почти смена языка мышления.
И все же GA постепенно просачивается в области, где математическая устойчивость важнее, чем каждый такт процессора. В робототехнике она позволяет решать задачи обратной кинематики без многих классических сингулярностей. В компьютерном зрении упрощает работу с проекциями и геометрией камер. В физических симуляциях делает системы ограничений гораздо более естественными.
Самое интересное, что индустрия может прийти к Геометрической Алгебре не через университеты, а через компиляторы. Уже появляются генераторы кода, которые умеют анализировать мультивекторы на этапе сборки, выкидывать нулевые коэффициенты и превращать красивые абстрактные формулы в очень эффективные SIMD-инструкции. То есть разработчик пишет чистую геометрию, а компилятор превращает ее в быстрый машинный код.
И тогда возникает неприятная мысль. Возможно, вся современная архитектура 3D-движков с матрицами, кватернионами и бесконечными специализированными пересечениями – является не вершиной эволюции, а историческим компромиссом, который случайно закрепился на сто лет.
Возможно, правильная математика для графики была придумана еще в XIX веке. И мы только начинаем к ней возвращаться.
Иногда нам нужно найти значение в отсортированном массиве. Простейший алгоритм заключается в последовательном переборе значений, пока мы не встретим искомое значение или не достигнем конца массива. Такой алгоритм иногда называют линейным поиском. В C++ добиться такого же эффекта можно с помощью функции std::find.
Для больших массивов лучшего результата можно достичь с помощью бинарного поиска. Бинарный поиск является классическим алгоритмом, который эффективно находит целевое значение в отсортированном массиве, многократно деля интервал поиска пополам. Начиная со всего массива, он сравнивает целевое значение со средним элементом: если цель меньше, верхняя половина отбрасывается; если больше — отбрасывается нижняя. Этот процесс продолжается, пока цель не будет найдена или интервал не станет пустым. На больших наборах данных бинарный поиск значительно быстрее линейного. В C++ он реализован функцией std::binary_search, которая возвращает true или false в зависимости от существования элемента.
Популярный формат Roaring Bitmap использует массивы 16-битных целых чисел размером от 1 до 4096 элементов. Иногда нам приходится проверить, существует ли значение в этом массиве. Для этого мы используем бинарный поиск.
Я захотел создать более быстрый подход. У меня были две мысли:
Практически все процессоры сегодня имеют инструкции для параллельной обработки данных (также называемая SIMD), которые могут проверять несколько значений за раз. И 64-битные ARM, и x64 процессоры (Intel/AMD) всегда поддерживают сравнение восьми 16-битных чисел с искомым значением используя всего одну инструкцию. Это подсказывает, что не стоит углубляться в бинарном поиске до блоков размером меньше восьми элементов. Кроме того, имеет смысл сравнивать шестнадцать элементов и больше.
Бинарный поиск проверяет одно значение за раз. Однако, современные процессоры могут загружать и проверять более одного значения одновременно. Они обладают прекрасным параллелизмом на уровне памяти. Это говорит о том, что вместо бинарного поиска, стоит попробовать четверичный поиск: вместо того чтобы делить массив пополам, мы можем разделить их на четыре части. Конечный результат может потребовать чуть больше инструкций, но количество инструкций перестанет являться ограничивающим фактором.
Так я и создал алгоритм, который называю SIMD Quad. Это эффективный алгоритм поиска в отсортированных массивах с 16 битными беззнаковыми целыми числами, сочетающий четверичный интерполяционный поиск с SIMD (Single Instruction, Multiple Data). Алгоритм делит массив на блоки фиксированного размера по 16 элементов (возможно, за исключением последнего блока) и использует последний элемент каждого блока как интерполяционный ключ, чтобы быстро сузить область поиска до одного блока, а затем применяет SIMD-инструкции для одновременной проверки всех 16 элементов в этом блоке.
В основе лежит идея выполнения иерархического поиска: сначала используется интерполяционный поиск на более грубом уровне (по границам блоков), чтобы найти блок, содержащий целевое значение, а затем происходит переключение на SIMD для точной параллельной проверки внутри блока. Этот гибридный подход использует и сильные стороны алгоритмической оптимизации, так и аппаратного ускорения (SIMD проверяет несколько элементов за раз).
Начальная проверка: если в массиве менее 16 элементов, выполняется простой линейный поиск
Разбиение на блоки: массив делится на блоки по 16 последовательных элементов. Для массива размером cardinality существует num_blocks = cardinality / 16 полных блоков.
Четверичный интерполяционный поиск: используем последний элемент каждого блока (на позициях 16-1, 32-1 и других) как ключи для интерполяции. Поиск выполняет четверичную (по основанию 4) интерполяцию, чтобы найти блок, в котором, вероятно, находится целевое значение. Это включает в себя сравнение цели с точками, делящими текущий диапазон поиска на четверти.
Выбор блока: после сужения диапазона выбирается подходящий индекс блока lo на основе результатов интерполяции.
SIMD-проверка: если найден верный блок, 16 элементов загружаются в SIMD-регистры (с использованием NEON на ARM или SSE2 на x64), после чего выполняются параллельные сравнения на равенство с целевым значением. Если найдено найдено хотя бы одно совпадание, возвращается true.
Проверка остатка: для элементов, не вошедших в полные блоки (остаток) выполняется линейный поиск.
Каковы результаты этого? Я написал бенчмарк. Бенчмарк работает следующим образом: для каждого массива размером от 2 до 4096 элементов генерируется 100,000 сортированных массивов с 16-битными беззнаковыми целыми числами. Для каждого размера выполняется 10 миллионов запросов на принадлежность в «холодном» режиме (каждый запрос ищет в другом массиве, имитируя промахи кэша) и 10 миллионов запросов в «горячем» режиме (запросы сгруппированы по массивам, каждый массив обыскивается 100 раз подряд, имитируя попадания в кэш). Бенчмарк измеряет среднее время на один запрос для трёх алгоритмов: линейного поиска (std::find), бинарного поиска (std::binary_search) и нового алгоритма SIMD Quad.
Я использую две системы: Apple M4 с Apple LLVM и процессор Intel Emerald Rapids с GCC.
Во-первых, давайте сравним линейный и бинарный поиск.
Intel/GCC
Apple/LLVM
Результат ясен. Бинарный поиск лучше чем линейный поиск, как только массивы становятся большими. Этого следовало ожидать.
На холодном кэше линейный поиск относительно хуже. Этого следует ожидать, потому что он получает доступ к большему количеству данных, вызывая больше ошибок кэша.
Мы установили, что бинарный поиск является чистым победителем по линейному поиску. Давайте теперь сравним с алгоритмом SIMD Quad.
Intel/GCC
Apple/LLVM
Результаты заметно различаются между Intel и Apple. На Intel SIMD Quad более чем вдвое быстрее бинарного поиска на «горячем» кэше. На «холодном» кэше преимущества меньше. На платформе Apple ситуация обратная: именно на «холодном» кэше SIMD Quad оказывается более чем вдвое быстрее, тогда как на «горячем» кэше выигрыш более скромный.
Но важней вывод заключается в том, что во всех случаях SIMD Quad быстрее бинарного поиска.
SIMD-компонент алгоритма довольно прост: мы используем специализированные инструкции, которые сокращают объем работы. ПОэтому легко понять, почму это может ускорить процесс - меньше инструкций, меньше ветвлений.
Но как насчет «четверичной» (quad) части? Тогда я опробовал бинарную версию того же алгоритма. В нем присутствует та же SIMD-оптимизация, но я отказался от четверичного интерполяционного поиска и заменяю его стандартным бинарным поиском.
Intel/GCC
Apple/LLVM
Говоря простыми словами, подход с четверичным поиском (quad) почти и не дает эффекта на Apple, однако на Intel он является неплохой оптимизацией для больших массивов в «холодном» режиме. Четверичный поиск лучше задействует параллелизм на уровне памяти на моём Intel-сервере.
Заключение: мои результаты говорят о том, что, хотя классический бинарный алгоритм из учебника — вполне достойный, его можно улучшить, причем ощутимо. Стандартные алгоритмы зачастую не проектировались под компьютеры с таким объемом параллелизма. Алгоритм SIMD Quad пытается задействовать и параллелизм на уровне памяти, и параллелизм на уровне данных. Более того, я подозреваю, что можно добиться даже большего, чем даёт мой алгоритм. Будьте креативнее!
❯ Исходный код
bool simd_quad(constuint16_t*carr, int32_t cardinality, uint16_t pos) { constexprint32_t gap = 16; if (cardinality < gap) { for (int32_t j = 0; j < cardinality; j++) { if (carr[j] == pos) return true; } return false; } int32_t num_blocks = cardinality / gap; int32_t base = 0; int32_t n = num_blocks; while (n > 3) { int32_t quarter = n >> 2;
Игровые автоматы (все же правильнее их называть — аркадные автоматы, чтобы отличать от автоматов для игры на деньги в казино) — это специальные устройства, предназначенные для запуска видеоигр. Такие устройства были чрезвычайно популярны в 1970-х — 1990-х годах. Но, с массовым появлением домашних игровых консолей и развитием игр для персональных компьютеров, их популярность сошла на нет. Однако, в последнее время наблюдается рост интереса к таким автоматам. Многие любители восстанавливают старые аппараты, а также собирают реплики наиболее популярных игр тех лет. Кстати, интересный факт: самая популярная и прибыльная игра для аркадного автомата — PacMan.
Обычно, игровой автомат представляет собой вертикальный корпус высотой 1,5 — 2 метра с экраном. Перед экраном располагаются органы управления — джойстики и кнопки. Предполагается, что игрок будет стоять за автоматом или сидеть на высоком стуле. В обязательном порядке автомат комплектуется монето- или купюроприемником, чтобы приносить прибыль своему владельцу.
❯ Подбор деталей
Списанный терминал
Для сборки своего автомата я приобрел примерно за 1000 р. списанный терминал. Терминал включает в себя два сенсорных дисплея (один для оператора и один для клиента), фирменный системный блок DELL на процессоре core i3 четвертого поколения, источник бесперебойного питания, термопринтер EPSON для печати талонов и кучу блоков питания с проводами для подключения всего этого добра. Нижняя часть терминала, станина, имеет мощный каркас, сваренный из металлических труб квадратного сечения. Сверху к этому каркасу крепится пластиковая конструкция с дисплеями. По сути, это уже и есть готовый игровой автомат. К нему нужно лишь добавить органы управления, накатить какой-нибудь эмулятор и готово.
Терминал, вид сбоку
Однако, эта конструкция меня не устроила. Если к металлической части вопросов нет — все сделано мощно, добротно и достаточно аккуратно, то к пластику есть претензии. Во-первых, он очень хлипкий. Вся верхняя часть ходит ходуном. Во вторых, внешний вид пластика за время эксплуатации существенно ухудшился. И в третьих, в некоторых местах пластиковые детали и вовсе оказались сломаны. Ну и в четвертых, пластик для игрового автомата — это как-то не аутентично.
В итоге, было решено следующее: нижнюю, металлическую часть оставить и просто подкрасить краской поврежденные места чтобы скрыть следы эксплуатации, а вот верхнюю изготовить заново, из ДСП панелей. При этом, можно сделать форму и внешний вид аппарата более похожими на реальные аппараты тех лет.
С этой же целью, для большей аутентичности, было решено вместо жидкокристаллического дисплея применить электронно-лучевую трубку. Для чего дополнительно были приобретены два телевизора больших диагоналей. Один телевизор подревнее — с выпуклым экраном, фирмы SHIVAKI. Второй — поновее, уже с плоским кинескопом, фирмы SAMSUNG. Оба телевизора были доведены до рабочего состояния. У первого была проблема с кадровой разверткой — из-за микротрещины вокруг вывода микросхемы, последняя периодически пропадала. Второй же оказалось достаточным просто очистить от векового слоя пыли и грязи.
ТВ «Самсунг»
ТВ «Шиваки»
Тот, что подревнее, с выпуклым экраном, конечно, больше подходит. Но, с другой стороны, кинескоп у него уже хорошенько так подсел и качество картинки оставляет желать лучшего. Поэтому предварительно было решено использовать менее аутентичный телевизор с плоским кинескопом.
❯ Выбор платформы
Какую же игровую платформу реализовать на этом автомате? В этом вопросе у меня не было никаких колебаний, конечно же — Dendy (она же NES), самая популярная приставка моего детства!
Сейчас все маркетплейсы завалены разного качества копиями этой приставки, причем, уже с зашитыми играми. Например, мной был приобретен такой образец.
Современный клон приставки NES и его внутренности
У него, помимо собственного дисплея, есть выходы RCA для вывода изображения и звука на телевизор. В принципе, ничего не мешает запитать устройство от сетевого источника питания, подпаяться проводами к кнопкам и использовать этот девайс в качестве основы для автомата.
Качество картинки с клона на ТВ «Самсунг»
Качество картинки с клона на ТВ «Шиваки» (телевизор почему-то не распознал систему цветности NTSC приставки)
Но, покупать готовую приставку и просто засовывать ее в свой корпус — не наш метод. У меня давно лежала без дела китайская отладочная плата на ПЛИС Cyclone IV, почему бы не собрать на ней свой собственный клон приставки, причем, такой какой нужно именно мне? На плате, помимо самой ПЛИС имеется память SDRAM на 32 Мб, небольшая EEPROM на 4 кБита, часы DS1302Z с батарейкой, разъем VGA, разъем под SD карту, разъемы для различной периферии, светодиодный семисегментный индикатор, кнопки и зуммер. Питается плата от источника питания 5В. На ПЛИС можно реализовать внутреннюю логику приставки, а имеющуюся периферию использовать для ввода/вывода.
Отладочная плата FPGA Cyclone IV
❯ NES на ПЛИС
Схема игровой приставки довольно проста. Она состоит из центрального процессора PR2A03-7- на основе широкоизвестного ядра MOS6502, видеопроцессора RP2C02-7-, статической памяти процессора 2 кБ, видеопамяти 2 кБ и всякой мелкой логики. На картридже приставки располагаются 32 кБ ПЗУ процессора и 8 кБ ПЗУ видеопроцессора. Это самая минимальная конфигурация системы. Есть, конечно, и более сложные картриджи, с бОльшим количеством памяти и специальными логическими схемами — мапперами, которые хитрым образом подключают банки дополнительной памяти вместо имеющейся, но их пока не будем использовать. Длинные игры со сложным геймплеем для игрового автомата не очень подходят стилистически.
Инженер Андрей Корж вместе с другими энтузиастами проделал огромную работу и выложил в своем репозитории полные потактовые клоны процессора PR2A03-7- и видеопроцессора RP2C02-7-. Если, например, взять такой модуль процессора, модуль видеопроцессора, добавить к ним модули ОЗУ, ПЗУ, соединить их между собой согласно схемы приставки, прописать логику, то, по идее, на ПЛИС должна полностью собраться приставка NES. Вроде бы, такая задумка не выглядит слишком сложной.
Вывод изображения из и видеопроцессора RP2C02-7- осуществляется в виде трех сигналов R, G, B и сигнала синхронизации. На отладочной плате имеется разъем VGA, через который также выходят сигналы R, G, B и синхронизация. Ничего мудрить не нужно, достаточно спаять кабель-переходник по следующей схеме:
Схема переходника с разъема VGA на SCART
В качестве заготовки кабеля я использовал старый VGA кабель от монитора. Один 15-контактный разъем я отрезал и припаял вместо него разъем SCART. Сигналы R, G, B в разъеме SCART идентичны по уровню и импедансу интерфейсу VGA, их можно подключать напрямую. Аналоговый сигнал на отладочной плате формируется простейшим резистивным ЦАП. А вот сигналы синхронизации требуют немного внимания. Прежде всего, в телевизоре не используются отдельно сигналы кадровой VS и строчной HS синхронизации, а используется их синхросмесь. Я ее подключил на контакт HS. Также, для переключения разъема SCART в режим RGB необходимо подать напряжение около 1 В на контакт 16. Его я взял с выхода VS, на который ПЛИС должна выводить постоянно лог. 1. В цепях HS и VS на отладочной плате стоят резисторы по 22 Ом. Их необходимо увеличить до 100 Ом (резистор в цепи VS) и 180 Ом (в цепи HS) соответственно. Эти резисторы можно просто добавить в кабель-переходник, если не хочется портить отладочную плату. Также по кабелю идут сигналы звука левого и правого каналов. На разъеме VGA они подключены к неиспользуемым контактам 12 и 15.
Резистивный ЦАП для вывода звука
Звук выводится аналогичным способом, с помощью простейших резистивных ЦАП, аналогичных тем, через которые формируются сигналы RGB. Их два — 6-разрядный (выход суммы каналов SQA + SQB + RND + TRIA) и 7-разрядный (выход канала дельта-модуляции). Эти резисторы пришлось смонтировать отдельно на небольшой макетной плате и подключить к разъему на плате с ПЛИС. С резистивного ЦАП звук нужно будет подать на вход Audio IN телевизора.
И действительно, все получилось! После нахождения и исправления некоторых ошибок, приставка заработала. Вначале, для отладки я записал в ПЗУ прошивку генератора тестового сигнала, так как этот образ требует всего по 8 кБ ПЗУ процессора и ПЗУ видеопроцессора.
Данные для ПЗУ можно взять из файла *.nes. Структура этого файла довольно проста: вначале идет заголовок 16 байт, потом данные ПЗУ процессора (16 или 32 кБ) и в конце данные ПЗУ видеопроцессора (8 кБ). Файл можно легко разобрать с помощью любого шестнадцатиричного редактора, например WinHEX.
Тестовое изображение на дисплее отладочной платы
К сожалению, имеющихся на борту ПЛИС Cyclone IV ячеек памяти недостаточно для организации даже минимальной рабочей конфигурации приставки 16 кБ/8 кБ. Их хватило только для генератора тестового сигнала. Поэтому было решено реализовать следующую схему: для хранения ПЗУ процессора использовать имеющуюся на плате память SDRAM, ПЗУ видеопроцессора организовать в виде SRAM (поскольку видеопроцессор обращается к своей памяти намного чаще), а в SDRAM загружать данные с SD карты. Вроде бы, такая схема выглядит как рабочий вариант. Это уже достаточно сложная логика для аппаратной реализации, поэтому я подключил к системе дополнительное процессорное ядро (назовем его APU).
❯ APU
(Примечание, чтобы не было путаницы: в терминологии приставки Dendy обычно термином APU называют микросхему PR2A03-7-, центральный процессор 6502 вместе со звуковым сопроцессором).
Чтобы не изобретать велосипед, я взял уже имеющееся в проекте ядро процессора 6502. А почему бы и нет? Писать на ассемблере для процессора полувековой давности — весьма увлекательное занятие. Итак: берем процессорное ядро, к нему обязательно необходимо добавить ПЗУ, в котором будет лежать его исполняемый код. ПЗУ процессора 6502 должно располагаться в самом конце его адресного пространства. Например, в последних 2 кБ. Также потребуется ОЗУ, пусть тоже будет 2 кБ, сильно много не нужно. В нем процессор организует стек и хранит всякие переменные. В диапазон адресного пространства 8…16 кБ будем подключать память SRAM, в которую будут заливаться данные ПЗУ видеопроцессора. Да, еще нужно будет организовать несколько регистров ввода-вывода, чтобы читать данные с SD-карты и управлять как самой приставкой (отбирать шину и держать в сбросе приставку на время пересылки данных), так и некоторыми другими устройствами на отладочной плате. Например, можно подключить светодиодный индикатор и спикер.
И только я собрался писать на ассемблере 6502 код для чтения SD карты, как мне весьма удачно попалась на глаза статья, где упоминается уже готовый модуль на Verilog для чтения SD карт. Этот модуль чрезвычайно упрощает задачу. С его помощью можно даже отказаться и от дополнительного процессорного ядра и реализовать всю логику исключительно аппаратно. Но, поскольку ядро уже было добавлено, а на ассемблере писать все еще хотелось, было решено его оставить. В этом случае тогда логика работы такая: Файл образа читается из SD карты в память SDRAM. Затем, вспомогательный процессор находит в образе начало игры, считывает заголовок, ищет и загружает в SRAM данные ПЗУ видеопроцессора. Затем устанавливает указатель на начало ПЗУ процессора в памяти SDRAM и передает управление приставке NES. В один файл образа можно напихать большое количество различных игр и по нажатию кнопок управления вспомогательный процессор легко сможет вместо одной игры загружать другую.
Регистры APU
inreg0 — SD card reader status
[7 - 4] [3 - 2] [1 - 0]
card stat (4 bit) card type (2 bit) FS type (2 bit)
На этот регистр выводится состояние модуля чтения SD карты
inreg1 - buttons & sdram data read
[7 - 6] [5 - 4] [3] [2] [1] [0]
buttons +/- (2 bit) not used(2 bit) coin_inp data valid read cmpl file found
Сюда скоммутированы кнопки + и – для переключения игр, сигнал с монетоприемника, сигнал data valid (единица говорит о том, что в буфере лежит байт, прочитанный из SDRAM), и сигналы read_cmpl и file_found с модуля чтения SD карты. Когда контроллер обнаружит файл, он установит бит file_found, когда весь файл будет прочитан в SDRAM установится бит read_cmpl. У примененного модуля чтения SD карты нет такого сигнала, поэтому для его генерации пришлось применить отдельный таймер-счетчик. Если долгое время нет импульсов записи данных с модуля, счетчик досчитывает до максимального значения и формирует сигнал о готовности данных.
inreg2 — address read
[7 - 0]
address byte read (8 bit)
Через этот регистр можно прочитать текущий 24-разрядный адрес на шине записи данных SDRAM. Последний адрес на этой шине после окончания чтения, очевидно, будет равен размеру прочитанного файла. Этот адрес нужен вспомогательному процессору чтобы правильно ориентироваться среди образов игр. С помощью управляющих бит 6 и 7 регистра outreg0 можно выбирать, какая именно часть адреса (младшая, средняя или старшая) будет отображена в этот регистр.
inreg3 — data read
[7 - 0]
data byte read (8 bit)
В этот регистр выводятся данные при чтении из SDRAM.
outreg0 — control register
[7 - 6] [5] [4] [3] [2] [1] [0]
sel addr byte (2 bit) block scroll read NES ext buzzer
rom type ack reset LED enable
Управляющий регистр. Биты 6 и 7 выбирают нужную часть 24-разрядного адреса для чтения. Бит 5 (block rom) блокирует линию адреса 14 процессора NES для правильного чтения ПЗУ в случае если у игры используется только одна 16 кБ страница. Бит 4 (scroll type) устанавливает тип скроллинга. Этот бит управляет линией А10 ОЗУ видеопроцессора, коммутируя его на 10-ю или 11-ю линию шины адреса видеопроцессора. Таким образом обеспечивается вертикальный или горизонтальный скроллинг страниц видеопамяти. В приставке этой линией управляет картридж. В заголовке образа игры за этот бит отвечает нулевой бит 6-го байта. Бит 3 регистра (read ack) нужно устанавливать для запроса чтения байта из SDRAM. Бит 2 (NES reset) вводит NES в состояние сброса, при этом шины SRAM и SDRAM коммутируются на вспомогательный процессор для загрузки образов. Через бит 1 можно помигать светодиодиком на плате. Этот же бит блокирует кнопки на клавиатуре после истечения времени счетчика монетоприемника. Бит 0 управляет буззером. Он кратковременно пищит каждый раз при смене игры и издает длительный писк, если при загрузке образа возникли проблемы.
Эти три байта задают 24-разрядный адрес SDRAM, из которого вспомогательный процессор хочет прочитать байт.
❯ Прошивка APU
Прошивка написана на ассемблере процессора 6502 и после компиляции и преобразовании в формат *.mif попадает в образ для прошивки модуля ПЗУ в проекте на Verilog. Программный код состоит из нескольких сегментов. Поскольку, используется универсальный компилятор CC65, который в общем случае не знает, под какую систему компилируется код, необходимо предварительно настроить файл конфигурации. В файле конфигурации сегментам прописываются их реальные адреса и размер в системе. Например, в нашей самодельной системе сегмент с переменными «DATA» должен располагаться в начале адресного пространства процессора (первые 2 кБ). Сегмент с кодом — в конце адресного пространства (последние 2 кБ). Кроме этих основных сегментов используются еще следующие:
Сегмент «EROPAGE». Процессор 6502 имеет команды быстрого доступа к первым 256 байтам адресного пространства (старший байт адреса равен нулю), поэтому эту область выделяют отдельно для хранени специфических переменных. В частности, индексных переменных для косвенной адресации, которые хранить в ином месте нельзя.
Сегмент «VRAM». Размер 8 кБ. Этот сегмент отображается на статическое ОЗУ, которое, в свою очередь работает ПЗУ видеоконтроллера приставки. В эту область записываются видеоданные из образа изгры.
Сегмент «IO». Сюда отображаютс регистры ввода-вывода APU. 12 регистров на запись, 4 регистра для чтения. Запись и чтение разделены физически для упрощения логики ПЛИС.
Сегмент «VECTORS». В нем прописаны адреса трех векторов прерываний - по сбросу, по NMI и по IRQ. При возникновении этих событий процессор ищет эти адреса в этом сегменте и осуществляет переход.
В сегменте кода сначала идут обработчики векторов прерываний. По прерыванию IRQ (один раз в секунду) происходит обработка логики монетоприемника. Уменьшается счетчик времени и когда он доходит до нуля на индикатор выводится заставка и блокируются органы управления. За 10 сек. до окончания времени подается звуковой сигнал. Перед обработкой прерывания дополнительно сохраняются в стек аккумулятор и регистр Х, так как они используются в обработчике. Прерывание может возникнуть в любой момент, если в это время в регистрах лежали какие-то данные, обработчик их может повредить. По завершению прерывания регистры восстанавливаются.
Обработчик прерывания NMI - просто заглушка. Оно не используются. В обработчике прерывания по сбросу просто осуществляется переход на исполняемый код.
В сегменте кода также расположен знакогенератор семисегментного индикатора. Это фиксированные данные, поэтому помещены в ПЗУ.
Далее идет исполняемый код. Он весьма большого объема, несколько сотен строк. Назначение отдельных блоков поясняют комментарии.
NES выдает сигнал в телевизионном стандарте PAL 15,625 кГц/50 Гц или NTSC 15,734 кГц/60 Гц. Однако у многих возникает желание подключить вместо телевизора монитор VGA. Хотя бы по той причине, что найти монитор VGA сейчас намного проще чем телевизор в хорошем состоянии, имеющий входы RGB. И тут самое простое решение — просто удвоить тактовую частоту видеопроцессора. Тогда он начнет выдавать видеосигнал с частотой 31,25 кГц/100 Гц. Строчная частота, в этом случае, полностью соответствует стандарту VGA, с ней проблем нет. А вот кадровую — 100 Гц — принимают не все мониторы. Большинство ширпотребных офисных ЖК принимают частоту кадров в диапазоне 50...75 Гц (надо смотреть спецификацию на конкретный монитор). Однако у меня нашелся старый кинескопный монитор фирмы HP, который спокойно переваривал 100 Гц. Да и, насколько я помню, многие кинескопные мониторы на закате их эры, 100 Гц принимали без проблем.
Подключение к NES монитора VGA
Далее возникают две проблемы: первая — видеопроцессор, работающий на удвоенной частоте, начинает с удвоенной частотой генерировать прерывание NMI. Это прерывание генерируется в начале кадрового гасящего импульса и в это время процессору нужно обновить картинку на экране. Также, во многих играх к этому прерыванию привязана скорость обновления игровой ситуации. Проще говоря, персонажи и события начинают двигаться в два раза быстрее. Чтобы это обойти, можно, например, пропускать каждое второе прерывание. Тогда скорость игры останется на прежнем уровне.
Вторая проблема — помимо того, что импульсы NMI идут в 2 раза чаще, они становятся в два раза короче. А за это время процессор должен успеть обновить игровую ситуацию на экране. Если процессор останется работать на прежней частоте, он не успеет обновить картинку и на экране появятся артефакты. Значит, также нужно еще увеличить в два раза тактовую частоту процессора. И, в принципе, после этого все более-менее работает, за исключением того, что сигналы звукового сопровождения увеличивают свою тональность на октаву (в два раза). Также в некоторых играх могут возникать артефакты в случае если картинка выводится путем переключения экранов. Если мы пропускаем каждый второй запрос на прерывание, то один экран обновляется нормально, а второй стоит на месте. В общем, изображение как-то более-менее выводится, игра играется, но тут нужно еще глубоко разбираться в таймингах работы CPU и PPU и подгонять их под стандарт. Это задачка на будущее.
Игра POPEYE на мониторе VGA
Другим путем решения этой проблемы (более сложным) является организация буфера на одну строку, который подключается уже к выходу видеопроцессора. В этом случае сама приставка работает в штатном режиме. Видеопроцессор записывает в буфер строку медленно, а схема удвоения считывает эту строку в 2 раза быстрее и два раза подряд.
❯ Подключение джойстиков
В качестве заготовки для джойстиков я приобрел пульт управления видеокамерами от системы видеонаблюдения. На этом пульте имеется, собственно, джойстик, который я предполагал использовать для управления персонажем и большое количество кнопок.
Пульт
Кнопки оказались механические, весьма приличного качества и с приятным тактильным эффектом. Поскольку логика использования аркадного автомата предполагает, в основном, только одного игрока, я решил сделать только один полноценный пульт с джойстиком. А пульт второго игрока сделать вспомогательным, без джойстика, только на кнопках.
Плата с кнопками
Джойстик собран на переменных резисторах (потенциометрах), для преобразования аналогового сигнала с потенциометра собрана простейшая схема.
Схема подключения кнопок и джойстика
В среднем положении движка потенциометра оба транзистора открыты, на выходах А и Б, соответственно, лог. 0 и лог. 1. Если перемещать рукоятку вверх, то верхний транзистор закроется, а нижний останется открытым. На обоих выходах будет лог. 0. При движении вниз, соответственно на выходах будет лог. 1. Преобразовывать эти логические комбинации в нажатие кнопок будет логика внутри ПЛИС. Номиналы резисторов в схеме подобраны так, чтобы при работе совместно с логическими порогами ПЛИС, логика срабатывала примерно в середине движения рукоятки джойстика в том или ином направлении.
Остальные кнопки подключаются напрямую к ПЛИС с помощью простых подтягивающих резисторов.
❯ Доработка телевизоров
Не у всех телевизоров может оказаться в наличии разъем SCART. Также, не все разъемы SCART поддерживают входы RGB. Поэтому может оказаться необходимым доработка телевизоров для подключения по RGB. Так оказалось и у меня. Маленький телевизор фирмы PHILIPS, который я использовал для отладки, имел разъем SCART, а у больших телевизоров, которые я предполагал использовать в самом автомате, разъема SCART не оказалось.
Разобранный телевизор
Однако, у телевизора SAMSUNG на корпусе имелись заглушки под этот разъем, значит в некоторых исполнениях этой модели этот разъем присутствовал. Я предполагал, что, просто впаяв недостающие детали в плату телевизора согласно схемы, я таки получу желаемое. Но получилось не все так гладко. Во первых, сам телевизор оказался подделкой под SAMSUNG. Внутри все было самое дешевое и самое китайское. Ни обозначение самой модели телевизора, ни обозначение шасси (платы) в интернете не гуглилось. Соответственно, уже найти схему оказалось проблемой. После достаточно продолжительного поиска была найдена похожая схема. При поиске очень сильно помогает перечисление основных компонентов — типа процессора, типа микросхем кадровой развертки, усилителя звука и т.д. Например, таким образом:
TV SUPRA шасси CY-PH2529TOP-EW. Состав: проц NT11136PG305EG, тюнер CWC-5053-V8. TDKS BSC25-N0608. кадровая LA78141, УНЧ AN17821A, HOT D1557,БП C4460.
В среде ремонтников хорошим тоном является полное перечисление основных компонентов аппарата перед описанием проблемы.
И на найденной схеме действительно оказался разъем SCART как опциональный элемент. Однако, впаяв все недостающие детали, изображения со входа RGB так и не появилось. Оказалось, необходимо еще дополнительно в сервисном меню телевизора переключить тип видео входа (он может быть композитным AV, компонентным YPrPb, компонентным RGB+Sync). Далее начались пляски с бубном по входу в сервисный режим (плата ведь ноунейм, китайская, какая там секретная комбинация — неизвестно). Это все еще осложнялось тем, что телевизор был куплен без родного пульта, а универсальный пульт мог поддерживать не все команды. Однако, тем не менее, в сервисный режим попасть удалось. Но в нем, кроме настроек синхронизации, геометрии изображения и баланса белого, никаких других настроек, связанных со входом SCART не оказалось. Тогда я решил пойти в лоб и тупо подать сигналы RGB непосредственно на выходные видеоусилители. И изображение, наконец, появилось.
К подаче сигнала на видеоусилители следует прибегать только в крайних случаях. Во первых, схемотехника этих каскадов может кардинально отличаться от аппарата к аппарату. В моем случае повезло — уровень сигнала с ПЛИС (0...3.3В) замечательно подошел и его не пришлось инвертировать. Во вторых, дорогостоящую ПЛИС отделяет от высоковольтных цепей кинескопа только один резистор и один транзистор. На эти сигналы нужно обязательно напаять хотя бы ограничительные стабилитроны. В третьих, теряются регулировки яркости, контрастности и насыщенности. Но, в общем и целом, это все несущественные проблемы.
Есть также еще одна проблема — при включении питания телевизор находится в режиме показа телевизионных каналов. Для переключения его в режим AV нужно кратковременно нажать на соответствующую кнопку на передней панели. Подать сигнал можно, например, с помощью каскада на биполярном транзисторе. Резистор в цепи коллектора должен соответствовать тому сопротивлению, которое стоит у интересующей нас кнопки. В моем случае это 2,2 кОм.
Картинка с этого китайского телевизора мне как-то не очень понравилась. Вроде бы яркость нормальная, и цвета насыщенные, но что-то было в ней не то, не так как в детстве. Да еще и само изображение было кривое и немного подергивалось. Подделка — что с нее взять. А это значит, нужно дальше лезть в схему и искать высохшие или потерявшие емкость конденсаторы или какие то иные неисправности.
Поэтому я решил попробовать аналогичным образом подключить более древний телек фирмы SHIVAKI.
С этим телевизором, как ни странно, все оказалось намного проще. У него уже были разведены дорожки на плате под разъем SCART. И даже не пришлось допаивать дополнительные детали, они все уже были установлены на плате. И картинка на этом телевизоре мне понравилась больше, даже несмотря на изрядно подсевший кинескоп. В конечном итоге, я решил использовать его. А кинескоп заменить уже потом, при случае.
Единственный момент — входы RGB почему то работают только когда телевизор находится в дежурном режиме. В этом режиме вывод звука на динамики блокируется процессором. Пришлось подпаяться проводами и принудительно включить звук.
❯ Изготовление конструкции
Как я писал ранее, верхнюю часть автомата было решено изготовить заново, используя панели ДСП. Для моделирования корпуса я воспользовался программой Fusion 360 фирмы Autodesk. Эта фирма ранее выпускала очень популярный в нашей стране продукт AutoCAD. К чести этой фирмы, она позволяет бесплатно использовать свой продукт (Fusion 360) студентами и для хоббийного (некоммерческого) применения.
3D модель верхней части автомата
Кроме боковых панелей сложной формы и панели с вырезом под кинескоп, все остальные детали сделаны простой прямоугольной формы, что позволяет их выпилить без применения станков с ЧПУ. В качестве материала используется стандартный мебельный щит толщиной 18мм черного цвета без выраженной фактуры.
Пример раскроя деревянных элементов на стандартном мебельном щите
Передняя панель с органами управления сделана из 2мм стали, вырезана на лазере и покрыта краской (молотковая эмаль, цвет антрацит). Для облегчения сгиба передней панели пришлось слегка надрезать линии сгиба болгаркой.
Органы управления (кнопки) предполагается крепить на резьбовых втулках. На макете отверстия под них не закладывались, их необходимо просверлить по месту.
Крепление органов управления
С наружной стороны втулки закреплены винтами с потайными головками. Отладочная плата также крепится на втулках. Она располагается таким образом, чтобы в отверстие был виден светодиодный индикатор. Индикатор заклеен светофильтром красного цвета
Панель управления в собранном виде
Нарезанные детали
Задняя часть с вентиляционными отверстиями изготавливается из ДВП толщиной 4 мм.
Деревянные панели собираются вместе обычными мебельными уголками с помощью мебельных шурупов. Задняя стенка откидывается на длинной мебельной петле. В прорези в верхней части должно вставляться стекло. На стекло будет наклеена полупрозрачная пленка с привлекающим оформлением. Изнутри стекло будет подсвечиваться светодиодной лентой.
Подсветка оформления
С геометрией выреза под кинескоп я, конечно же, не угадал. Кинескоп имеет очень сложную форму, из-за чего его трудно точно измерить. Пришлось немного подпиливать рамку электролобзиком.
Крепление кинескопа
Кинескоп крепится с помощью родных фланцев, снятых с корпуса телевизора.
На панели под стеклом крепятся динамики телевизора. Для беспрепятственного прохода звука в панели сделаны прорези. В полусобранном состоянии:
В процессе сборки
Монтаж платы телевизора:
Монтаж платы телевизора
❯ Подключение монетоприемника
Какой же аркадный автомат и без монетоприемника?! Пошарившись на маркетплейсах я нашел монетоприемник за весьма доступный прайс. Это модель BL-616. Аналогичного вида монетприемники встречаются в продаже и под иными обозначениями.
Монетоприемник подключается всего четырьмя проводами. По двум из них подается питание 12 В. Два остальных — выходы типа «открытый коллектор». К одному из них подключается механический счетчик монет (для контроля), на втором появляются короткие импульсы при приеме монет. Перед использованием монетоприемник необходимо настроить. Во-первых, необходимо задать виды принимаемых монет, во вторых — прогнать через него по 20 монет каждого номинала. Устройство распознает монету по ее весу. При обучении устройство измеряет вес и рассчитывает среднее его значение для каждого номинала.
Общий порядок настройки следующий:
Включить питание, установить переключатель 1 в позицию «NO» (normal open — нормально разомкнутый выход), переключателем 2 — выбрать нужную скорость формирования импульсов (fast, medium, slow);
Нажать одновременно кнопки «ADD» и «MINUS», отпустить, на индикаторе появится «A»;
Нажать и отпустить кнопку «SET», появится «E»;
Кнопками «ADD», «MINUS» установить кол-во различных типов монет для приема (1...6);
Нажать кнопку «SET»;
На дисплее появилось «H1» — количество экземпляров монеты типа 1 для калибровки монетоприемника;
Кнопками «ADD», «MINUS» установить значение H для первого типа монет;
Нажать кнопку «SET»;
На дисплее появилось «P1» — количество выдаваемых импульсов при успешном приеме монеты типа 1 (1...50);
Примечание: количество выдаваемых импульсов необходимо сделать пропорциональным стоимости монеты. Например: монета 1 р должна выдавать 1 импульс, монета 5 р должна выдавать 5 импульсов, монета 10 р — 10 импульсов. В этом случае автомат будет добавлять игровое время пропорционально стоимости монеты вне зависимости от порядка ввода монет.
Кнопками «ADD», «MINUS» установить значение количества выдаваемых импульсов для первого типа монеты;
Нажать кнопку «SET»;
На дисплее появилось «F1» — задается точность опознания монеты типа 1 (1...30), можно ввести 10;
Кнопками «ADD», «MINUS» установить значение F для первого типа монеты;
Нажать кнопку «SET»;
Повторить последние 9 пунктов для других типов монет.
На дисплее появится «0»;
Калибровка монетоприемника:
Нажать два раза кнопку «SET»;
На дисплее появилось «A1» — опускаем в монетоприемник монеты типа 1 в количестве H1 для калибровки;
По загрузке последней монеты раздастся звуковой сигнал и на дисплее появится «A2»;
Опускаем в монетоприемник монеты типа 2 в количестве H2 для калибровки;
По загрузке последней монеты раздастся звуковой сигнал и на дисплее появится «A3»;
Опускаем в монетоприемник монеты типа 3 в количестве H3 для калибровки;
После ввода всех монет на дисплее появится «0».
Монетоприемник готов к приему монет. Можем опускать различные монеты, на дисплее будет высвечиваться количество импульсов.
Смонтированный монетоприемник
При получении сигнала с монетоприемника APU добавляет игровое время, например по 1 мин на импульс. Время индицируется на светодиодном индикаторе. По истечении этого времени органы управления игрой блокируются (кроме кнопки START, чтобы игрок смог поставить игру на паузу и докинуть еще монет). Таймер тактируется от отдельного делителя, формирующего сигнал с периодичностью 1 с. Этот сигнал заведен на прерывание IRQ процессора APU. Таким образом, раз в секунду процессор отвлекается от своей работы и обрабатывает логику монетоприемника.
❯ Питание
Телевизор питается от 230 В сам. Отладочная плата питается через USB от 5-вольтового преобразователя. Преобразователь, светодиодная лента и монетоприемник питаются напряжением 12В от отдельного адаптера. Адаптер и телевизор соединены вместе и одновременно включаются тумблером, расположенном сзади устройства. Все разводка собрана в коммутационной коробке, в которой также дополнительно смонтированы защитные предохранители. В принципе, можно все необходимые напряжения взять сразу из телевизора, если внимательно изучить его схему. Но, в этом случае не получится быстро заменить один телевизор на другой без переделки схемы, а я пока таки надеюсь найти экземпляр с более живым кинескопом.
Монтаж коммутационной коробки и адаптера питания
Дополнительно в коммутационной коробке можно будет смонтировать реле, автоматически отключающее телевизор после некоторого времени бездействия для экономии ресурса ЭЛТ. Но это уже идея на будущее.
Аппарат в сборе
Вот такой вот получился аппарат. Небольшое видео про автомат можно посмотреть на YouTube. Вопросы и замечания прошу писать в комментариях.
Чуть ли главной проблемой всех проектов объекта «Укрытие» было чем и как перекрыть дыру в энергоблоке сверху. Во-первых, нужны были конструкции с большими пролётами, что само по себе дело дорогое и сложное даже в нормальных условиях. Во-вторых, монтаж должен по минимуму требовать прямого вмешательства людей. В-третьих, нужно обеспечить нормальные условия для захоронения разрушенного реактора. В-четвёртых, делать надо было всё быстро.
Из всего списка работ технически самой простой были, пожалуй, СМР по кровле машинного зала. Родная была загрязнена радиацией и пробита мешками, сбрасываемыми с вертолётов в начале по ЛПК (ликвидации последствий катастрофы). Вместе с этим собирались заделать все оконные проёмы «чтобы не дуло» из них радиацией.
Просто закрыть сверху плитами или металлическими листами машзал не получалось, дабы не перегрузить итак уже пострадавшие конструкции. Решили проблему оригинально: шесть решетчатых колонн высотой 20 м и сечением 3х4 м ставились с шагом 12 м вдоль стены машзала. На них сверху опирались фермы длиной 51 м и сечением 3,5х3,5 м. Получалась своеобразная буковка Г, на которую сверху монтировалась кровля из металлических листов. Бетонировалось всё только в нижней части. Вся конструкция в сумме весила более 600 т.
Доставка колонны для перекрытия машзала. Источник: Е.А. Козлова. Схватка с неизвестностью. 2021
Окна закрывались сотней щитов по 500 кг. Из-за сильной радиации, исходящей из помещений, люди не могла находиться напротив проёмов. Чтобы избежать лишнего облучения, в НИКИМТ разработали фиксаторы, которые сами крепились в оконных проёмах. Монтаж осуществлялся краном ДЭК-250.
И вот строителям предстояла самая сложная задача — перекрыть центральный зал (ЦЗ) с реактором. В разрушенном месиве железобетона предстояло найти более-менее целые опоры (а ведь часть несущих конструкций отклонилось до 3 м от своего первоначального положения), укрепить их в условиях высокой радиации — «партизаны» работать могли всего по 10 мин, а то и меньше. Для осмотра места монтажа краном возили защищённую капсулу «батискаф», из которой, через освинцованное стекло, инженеры изучали обстановку. Дополнительные снимки делались с вертолёта.
Так выглядели конструкции, которые вскоре должны были выдержать до 700 т нагрузки. Источник: Е.А. Козлова. Схватка с неизвестностью. 2021
Сперва думали установить две основные балки сечением в метр и длиной 50 м, на которые положить 27 труб. Балки в двух местах должны были опираться на шахты выхлопа реактора, пострадавшие от нагрева, посему, для разгрузки, решено было смонтировать пространственный блок, названный «Самолётом». Очистка мест монтажа проходила оригинально: Demag поднимал бетонную плиту или трубу и сгребал ими мусор. Для усиления будущих опор их стали заливать бетоном с использованием дистанционно устанавливаемой опалубки — решетчатого прямоугольника, опутанного слоями рыболовной сети («песочницы»). Чтобы избежать протечек, конструкции обматывали поролоном (что в последствии скажется на долговечности «Укрытия»). 3-я опора, где балки опирались на остатки стен, укрепили балками, названными «Коронкой» весом 10 т, 4-я была усилена «Зубом» — Г-образным каркасом массой 28 т. Бетоновод длиной 550 м пришлось тащить из 3-го блока через все помещения, пробивая стены.
«Самолёт», монтируемый на эти подготовленные опоры, состоял из двух балок Б-2, соединённых между собой перемычками. Каждая массой по 65 т, длиной 40 м и высотой 3,4 м. Изготовили их из стали 09Г2С. Ширина пролёта между ними — до 38 м. Там разместились две трубы калибра 800 мм, обеспечивавшие пространственную жёсткость конструкции блока. В целом «Самолёт» весит 165 т — как недогруженный Ту-95МС. Делали её почти месяц. Подъём начался 20 сентября и в его разгаре у крана 520-тонный суперлифт оторвался от земли и с треском и скрежетом повис в воздухе. Правая гусеница просела, лопнул один из тросов от собственного противовеса и стрелы крана начали изгибаться. Вся махина массой за 1500 т начала качаться в воздухе. На беду поднялся ветер и начал раскачивать ещё и блок. Срочно догрузили суперлифт и аккуратно опустили ценный груз на землю. Поломку удалось ликвидировать за сутки и 23 сентября «Самолёт» сел куда надо. Правда, стрела снова начала гнуться. С завершением этой операции все поздравил лично Е.П. Славский.
Ахтунг! Самолёт в воздухе! Источник: Е.А. Козлова. Схватка с неизвестностью. 2021
1 октября, с небольшим отставанием от графика, начали укладывать трубный накат. Каждая труба — 34,5 м длиной, 1220 мм диаметром, толщиной стенки 15,2 мм. Чтобы не раскатились с боков был приварен гнутый швеллер (местами сваривали что-то среднее между швеллером и двутавром). Вес — около 21,2 т. Монтировать их было проще, чем предыдущих монстров, но хочешь - не хочешь, а 3 часа отдай. Но обошлось без эксцессов. Главной проблемой стали лишь частые обрывы связи.
Представьте себе летящий навстречу Урал с прицепом длиной с две современные фуры! Источник: Е.А. Козлова. Схватка с неизвестностью. 2021
Теперь настало время закрыть всё герметичным покрытием. Сперва думали сделать 600-мм слой бетона, под что и рассчитывался трубный накат, но потом физики и инженеры подумали, посчитали и решили, что лучше всё-таки сделать лёгкий металлический кожух, который будет продуваться через систему вентиляции с фильтрами.
По бокам от «Самолёта» разместили по балке Б-1, схожими конструктивно с Б-2, но имеющие скос с конца, и с торца — небольшую («всего» 28 м длиной и 18 т массы) балку Б-5 из двух сваренных двутавров.
Балка Б-1 готовится к монтажу. Источник: Е.А. Козлова. Схватка с неизвестностью. 2021
Сверху это накрывалось шатром перекрытия центрального зала, т.н. «Собачьим домиком». Это конструкция в форме расплющенной коробки из 4-мм стали без двух стенок. Для устойчивости к нему приварены балки Б-3 из двух двутавров, сваренными между собой решетчатыми связями. Размер шатра — 35х18х15 м, масса — 120 т. «Домик» закрывает пространство в месте примыкания к основанию трубы 3-го и 4-го блоков. С ним проблемы начались на стадии сборки — тащить было неудобно, ещё и конструкция гнулась. Всего для сборки и транспортировки задействовали 2 крана Liebherr и 4 ДЭК-251. Монтировался шатёр на месте двумя блоками (северный назван «Кошкин дом»). Все работы завершили 10 октября.
Так везли часть шатра для монтажа. Источник: Е.А. Козлова. Схватка с неизвестностью. 2021
Чтобы закрыть проломленную стену с южной стороны нужны была опора под покрытие на месте разрушенной деаэраторной этажерки. Там был пролёт более 60 м, где не сохранилось чего-то держабельного. Проблему решали две монолитные опоры и положенная на них балка «Мамонт». Отдельно забетонировали помещения под этажеркой, чтобы получить прочное основание. Залили 15000 куб. м раствора. Потом взялись за опоры. Из-за сильной радиации и гор мусора точной разведки не провели и, как при устройстве опор под «Самолёт», провели по лестница 3-го блока бетоновод и начали заливать. 500 кубов, 1000, 2000, а завалы никак не заполняются. Оказалось, что бетон утекал аж до нижних помещений АЭС! Закидали дыры мусоров и таки залили восточную опору. С возведением западной начались свои проблемы — было слишком много мусора, пришлось его давить 30-метровой забетонированной трубой. Установили опалубку — и снова утечки, но уже из-за того, что сетки «песочницы» порвались. Увидели это не сразу, т.к. из-за фона туда люди не могли пройти сами (да и протёкший бетон местами уменьшил высоту дверных проёмов до 40 см). Заделали дыру связкой швеллеров. Дополнительно основание опор засыпке щебнем и пролили бетоном. Когда сыпали щебень начался такой грохот, что начальство было решило, что ЧАЭС рушится. Сама опора была сделана из 87-мм металлического блока, названного «Табуретка».
Монтаж «Табуретки». Источник: Е.А. Козлова. Схватка с неизвестностью. 2021
На фото выше у опоры под «Мамонта» можно увидеть тонкую длинную балку — это «Осьминог». Эта 100-метровая конструкция массой в 180 т (с учётом бетонирования) — самая длинная среди смонтированных при строительстве «Саркофага». Нужна была для выравнивания мест для опоры щитов покрытия. На удивление, проблем с её установкой не было. Но конструкции основания были хлипкие, покосившиеся чутка и решили под балку от греха подальше примотать каждые 3 м рыболовецкие сети, которые залили бетоном. И тут оказалось, что длины бетоноводов не хватает. «Партизаны» через сильные завалы и при фоне, позволявшем работать лишь 5 минут, протянули новые шланги.
Опоры же для «Мамонта» тем временем протестировали на прочность, нагрузив ящиками со свинцом общей массой до 400 т и более.
Сама балка — это туша длиной 70 м и массой свыше 172 т. Сперва стоянку крана пришлось выравнивать щебнем, ибо проседала гусеница. Потом оказалось, что вплотную подогнать к стене мешали наплывы бетона. Люди вручную скалывали их. Кран поехал… и проколок колесо суперлифта о торчащий мусор. Срочно пришлось облегчать многотонную тушу от противовеса и менять камеру. Начали поднимать балку — и снова, как с «Самолётом», суперлифт крана поднялся в воздух. Пришлось опускать «Мамонта», аккуратно подтаскивать к крану, уменьшая вылет стрелы. Подняли снова, уже нормально. Балка весит на 70 м от трубы и оказывается, что при развороте оттяжками, как планировалось, она снесёт шатёр ЦЗ. Опять пришлось опускать груз на землю и перестроповывать. И снова «Мамонт» в воздухе, уже зависает над опорами… Бах! 172 т врезаются в стену 3-го блока. Сотрясается вся конструкция, но и «Мамонт», и здание целы. Спустя ещё немного времени балка садится в проектное положение. Подъём, начавшийся в 7 утра 2 ноября, окончился лишь ночью.
«Мамомонт» на месте. Источник: Е.А. Козлова. Схватка с неизвестностью. 2021
Дополнительно вдоль осей 50 и Б (южная и западная части энергоблока) установили две балки-короба и заполнили их бетоном. Покрытие ЦЗ собирались монтировать сразу же, но при установке первого блока на балку «Мамонт» отвалилась плита, повредив кран. Конструкция стала криво и нужно было время на ремонт пострадавшего Demag 21, потому решили сперва сделать защиту блока с западной стороны. Щели между косячным блоком, стеной и соседями закрывались ликвидаторами ближе к концу стройки.
Это была так называемая контрфорсная стена. Вообще, возводить её собирались сразу же после работ с каскадной стеной, но затянули из-за того, что при монтаже балок перекрытия она бы мешала работе крана. Контрфорсная стена — это высокая и тонкая конструкция из 10 металлических блоков, заполненных бетоном. Каждый блок имеет высоту 45 м, ширину 6 м, толщину 1 м и объёмное ребро жёсткости. Всё выполнено из 2-мм листов стали 10ХНДП, покрытых с внешней стороны слоем защиты от коррозии. Основание блока из двутавровых балок. Вес всей городухи — 76 т (по другим источникам — 90 или даже 100 т). Монтируются они на выровненном бетонном основании, благо радиация в месте работ упала на порядки.
Основание делалось в виде плиты шириной 20 м с маяками для точной установки конструкций. Блоки контрфорсной стены собирались на территории монтажного управления. Затем их везли на участок монтажа, где вертикализировались и задвигались на место. С последним подгадила погода. Туманы мешали обзору крановщика через камеры, как и наблюдателям, располагавшими всё теми же камерами и биноклями. Качество стойких к радиации камер-то было отвратительным. Из-за этого графики работы кранов ломались и стройка затягивалась.
Не так всё просто было с монтажом: тяжеленный блок приходилось держать на весу, пока заливали под него основание и бетон набирал хотя бы 30% прочности. Из-за неточностей последний блок не влезал и его доработали (не напильником, но всё-таки) по месту. А после возникли проблемы с заливкой внутренней полости бетоном, из-за чего только 6 м высоты контрфорсной стены были укреплены изнутри. И если снаружи металл окрасили, то изнутри он начал гнить от души. Позже начались из-за этого проблемы с прочностью контрфорсной стены и пришлось делать робота-магнитохода, чтобы обследовать конструкцию.
И вот только теперь всё было готово, чтобы начать монтаж покрытия. Делалось это блоками в форме расплющенной буквы Г, названных «клюшками». Делались они из 4-мм стального листа на каркасе из прокатных балок. «Клюшки» с северной стороны в количестве 18 шт. по 7 т монтировались на 4-й уступ каскадной стены и балку Б-1. С южной стороны, между балками «Мамонт» и Б-1, поставили 10 «больших клюшек» по 20 т. Под ними, между «Мамонтом» и «Осьминогом», расположились 5 13-тонных «нижних клюшек». Сбоку, по оси 50, с опорой на балку-короб ставились 25-тонные «малые клюшки». Ниже них, от балки до контрфорсной стены, шли 25-тонные «кепки». В углу, между «Мамонтом» и балкой-коробом, проём закрыли 30-тонной объёмной конструкцией. Между «Осьминогом» и машзалом зашили блоками «юбки». Проблемы возникли с «нижними клюшками» — их опора, балка «Осьминог», прогнулась и блоки ставились криво. По идее, надо было снимать балку и делать новую, но стройка итак выбивалась из графика. В итоге всё равно вместо 2-3 дней сидели две недели, в прямом смысле допиливая «клюшки» на месте.
Поверх трубного наката монтировалась лёгкая кровля. Здесь применили блоки 36х8 м с усилением: снизу, вдоль стыков труб, были уложены маты, наполненные керамзитным гравием и обшитые поролоном. Перед установкой маты пропитывали клеем КИП-Д, который при увлажнении в поролоне разбухал, затягивая щели. Работы кончились к 21 ноября. Всего на устройство лёгкой кровли ушло 6 блоков по 20 т и 28 т матов. После её монтажа излучение наверху Саркофага упало с 1000 Р/ч до 10-40 Р/ч.
На этом завершились основные работы. Всего было залито около 400000 куб. м бетона и смонтировано 7300 т металлических конструкций.
Вентиляцию изолированного энергоблока начали делать в сентябре на базе имевшейся на станции системы вентиляции и очистки воздуха. Она сделана с двумя ветвями — один с естественной тягой с выходом к вентиляционной трубе 3-го и 4-го ЭБ ВТ-2. Вторая ветвь — с принудительной тягой через изолированное помещение с фильтрами. Всего за час система могла прокачивать до 220000 куб. м, но… Количество щелей в Саркофаге было таково, что вентиляция была естественной — площадь дыр (простите, отверстий) на 1989 г. была 1000 кв. м!
Источник: А.А. Боровой, Е.П. Велихов. Опыт Чернобыля (работы на объекте «Укрытие»). В 4-х томах. 2012-2015
А вот средства наблюдения за реактором начали делать ещё до строительства «Укрытия» и работы по ним так или иначе идут до сих пор.
И вот наконец, после стольких усилий, 28 ноября 1986 г. правительственной комиссией был подписан документ о сдаче объекта «Укрытие» в эксплуатацию. Последнюю подпись поставил главный инженер Чернобыльской АЭС Н.А. Штейнберг 30 ноября.
«Укрытие» стало уникальнейшим объектом. Сделано ли оно криво? Несомненно. Можно ли было делать лучше? Можно, но тогда бы стройка шла дольше и гораздо больше людей потратили на ней своё здоровье. Выполнил ли Саркофаг свою задачу? Да. Так что под защитой Нового Безопасного Конфайнмента старое «Укрытие» надёжно будет хранить ближайшие десятилетия радиоактивную дрянь в своём нутре.