Два бытовых вентилятора, установленные по углам лаборатории КБ-3, вхолостую гоняли по кругу тяжелый, неподвижный воздух. В приоткрытые окна тянуло пылью и нагретой толевой крышей.
Алексей Морозов стоял у окна, прислонившись плечом к теплой раме, и методично вытирал влажный лоб скомканным носовым платком. В лаборатории царил тот специфический, концентрированный хаос, который всегда предшествует либо великому прорыву, либо окончательному провалу. Запах канифоли марки ФК-2 висел в воздухе плотной взвесью, оседая на языке сладковатой горечью.
На центральном монтажном столе разворачивалась битва за визуализацию. Олег Тимофеев и Наташа Рогова склонились над макетной платой видеоконтроллера. То, что лежало перед ними, напоминало кусок текстолита, на который кого-то вырвало цветной медной проволокой. Десятки тончайших жил тянулись от микросхем к разъемам, образуя трехмерную паутину. Рядом громоздился массивный корпус осциллографа. Его экран светился в полумраке душной комнаты, рисуя две ломаные линии сигналов.
Чуть поодаль стоял обычный черно-белый телевизор, переделанный под монитор. На его выпуклом экране плясала бешеная, раздражающая глаз рябь. Белые вспышки, хаотичные полосы, срывы синхронизации. Классический, эталонный «снег». Когда оба устройства одновременно пытались обратиться к памяти, происходила коллизия, и на экран летел цифровой мусор.
Олег держал в руке паяльник. Его пальцы едва заметно подрагивали от перенапряжения и выпитого за день растворимого кофе. На кончике жала дымилась крошечная капля припоя.
Наташа не отрывала взгляда от экрана осциллографа. Ее пальцы мягко, с хирургической точностью крутили ручки развертки на передней панели С1–70, растягивая зеленую линию сигнала так, чтобы увидеть фронты импульсов.
— Не сходится, Олег, — негромко произнесла она, вглядываясь в фосфоресцирующий график. — Мы снова пытаемся вклиниться в цикл шины, когда процессор выставляет адрес. У него приоритет жесткий.
— Нам придется полностью перепаять блок арбитража, — констатировала она, придвигая к себе справочник. — Мне нужны временные диаграммы процессора. Точные задержки от среза первого такта до выдачи адреса…
Морозов отлепился от окна. Процесс пошел. Архитектура начала обретать плоть, избавляясь от детских болезней прямой конфронтации. Он оставил инженеров-аппаратчиков наедине с их миллиметровкой и медными проводами, и неторопливо пошел вглубь лаборатории.
Там, за отдельным столом, огражденным от остального мира высокими стопками технической документации, сидел Евгений Громов.
Если на столе Олега царил хаос из металла и припоя, то у Громова разворачивалась бумажная трагедия. На столе, на стульях и даже на полу длинными, бесконечными складками лежали распечатки с АЦПУ. Широкая перфорированная бумага «гармошкой», испещренная моноширинным шрифтом, напоминала внутренности какого-то поверженного бюрократического монстра. Рядом стоял граненый стакан с давно остывшим, черным, как деготь, кофе.
Евгений сидел, ссутулившись, обхватив голову руками. Перед ним лежал толстый кусок кода BIOS операционной системы CP/M, который они скопировали в московском подвале. После того как первая же попытка выполнить команду чтения каталога привела к аппаратному зависанию всей системы, Громов взял на себя программную часть вины. Он был уверен, что сможет обойти конфликт доступа программно, вставив циклы задержки между обращениями к болгарскому дисководу ИЗОТ.
Морозов остановился за спиной программиста. Слышно было, как тяжело дышит Громов.
Для Евгения концепция разделения системы на слои не представляла сложности. Он прекрасно понимал, как базовая дисковая операционная система общается с ядром, а ядро — с железом через систему базового ввода-вывода. Проблема лежала в иной плоскости. Перед ним находился код, написанный по ту сторону океана для контроллеров, которых не существовало в советской природе.
Громов пытался написать процедуру ПДП для дисковода вслепую.
На полях распечаток виднелись десятки вариантов расчетов машинных тактов. Громов пытался вычислить безопасные циклы ожидания методом простого перебора. Чтобы не гонять код каждый раз через транслятор на большой институтской ЕС ЭВМ, он работал «на живую». Через примитивную программу-монитор, прошитую в макете, он вбивал шестнадцатеричные коды пустых операций (NOP) прямо в оперативную память. Вбивал измененный код, передавал управление ядру, и система снова и снова намертво висла: контроллер и процессор не успевали обслужить поток байтов в пределах одного оборота диска, а протокол обмена требовал жестких временных рамок.
Евгений с раздражением отбросил карандаш. Грифель с сухим треском сломался о поверхность стола.
— Это черный ящик, Леша, — прохрипел Громов, не оборачиваясь. Голос его был сухим от табачного дыма. — Помнишь, в американских исходниках БИОСа была дурацкая таблица трансляции секторов? Я решил, что это программный костыль под их специфический контроллер, и выкинул ее из кода, пустив чтение подряд, один к одному. А теперь я пытаюсь вставлять заплаты с пустыми тактами NOP, чтобы процессор успевал за дисководом. А он не успевает! Контроллер шлет прерывание раньше, шина схлопывается, и мы получаем ту самую «пилу» на осциллографе. Мы бьемся лбом в кирпичную стену.
Алексей смотрел на измятые листы распечаток. В его прошлой-будущей жизни, если программист сталкивался с подобной проблемой, он открывал браузер, вбивал номер чипа и через три секунды получал подробный даташит в формате PDF. Информационный голод был побежден. Здесь же, в тысяча девятьсот восьмидесятом, информация являлась самым страшным дефицитом.
Но у Морозова был чит-код. В свое время он написал несколько программных эмуляторов старых процессоров чисто из академического интереса, досконально изучив физику работы их периферии.
Алексей придвинул к себе свободный табурет и сел рядом с Громовым. Он взял со стола обломок карандаша и придвинул к себе чистый лист бумаги.
— Ты не там ищешь проблему, Женя, — ровным, лишенным эмоций голосом произнес Морозов. — И очень зря выкинул таблицу. Ты пытаешься затормозить процессор. А нужно было оставить обманку для дисковода.
Громов поднял воспаленные, красные от недосыпа глаза.
— В смысле обманку? Физику вращения блина ты как обманешь? Головка читает сектор за сектором подряд. Если я не успеваю забирать данные, они теряются.
— Американцы читают их подряд только в том случае, если они записаны физически подряд, — Морозов взял карандаш и нарисовал круг, разделив его на сектора, нумеруя их в странном порядке: 1, 4, 7, 2, 5, 8. — Интерливинг. Чередование секторов. Тебе не нужно вставлять пустые такты. Верни в BIOS таблицу трансляции, но пересчитай смещение. Прочитал первый сектор, а пока процессор переваривает данные, головка пропускает два физических сектора. К моменту, когда ядро готово принять следующий блок, под головку как раз подъезжает второй логический сектор. Для нашего кварца и болгарского блина сделай коэффициент чередования три к одному. Шина разгрузится аппаратно.
Громов рефлекторно потянулся за своей тетрадью, но рука его замерла на полпути. Евгений смотрел на листок бумаги. В его глазах отражалась сложная гамма эмоций. Сначала — вспышка чистого понимания изящного алгоритмического решения. Это было настолько просто и гениально, что решало проблему без единого аппаратного костыля.
Но следом за пониманием пришло нечто иное. Подозрение.
Громов медленно перевел взгляд на Алексея.
— Леша… — Евгений произнес это имя так, словно пробовал его на вкус. — Откуда ты это взял? Я полдня бился над этой таблицей в коде, думая, что это криптография какая-то или защита от копирования! А ты не только сходу понял, как она работает, но и в уме выдаешь мне готовый пересчитанный коэффициент чередования для болгарского дисковода и нашего процессора, словно сам этот стандарт разрабатывал.
В лаборатории на мгновение стало тише. Только глухо шумели вентиляторы, да на другом конце комнаты тихо переговаривались Олег с Наташей, лязгая кусачками.
Морозов не отвел взгляда. Лицо его оставалось непроницаемым маской усталого советского инженера. Он прекрасно понимал, что сейчас ходит по очень тонкому льду. Его знания были аномалией, необъяснимым артефактом, разрушающим логику времени.
— Пока вы, Женя, по вечерам пиво пьете в рюмочной на площади, — Алексей откинулся на спинку табурета и позволил себе легкую, сухую ухмылку, — я провожу время в спецхране. Там, если иметь правильный допуск от товарищей в серых костюмах, можно найти отличные переводы закрытых американских мануалов. Включая технические бюллетени компании Ай-Би-Эм. Главное — уметь читать между строк и запоминать нужные страницы. А тот провал просто заставил меня вспомнить ту самую нужную страницу из зеленой папки.
Громов прищурился. В его взгляде явственно читалось сомнение. Оправдание было сшито белыми нитками. Даже с допуском спецчасти, запомнить так много специфических деталей о работе неизвестного железа было задачей на грани человеческих возможностей. Громов был системщиком, он чувствовал логические нестыковки в легенде Морозова так же остро, как баги в собственном коде.
Но Морозов нажал на единственно правильную болевую точку — систему. Упоминание спецхрана и кураторов из КГБ в те годы работало как идеальный блокиратор любых дальнейших расспросов. Легенда о сакральном знании, добытом в недрах всемогущего государственного аппарата, была единственным приемлемым объяснением невозможного.
Громов тряхнул головой, отгоняя сомнения. Ему было плевать, марсианин Морозов или шпион. У него в руках находился ключ к запуску операционной системы.
— Три к одному, говоришь… — пробормотал Евгений, выхватывая листок из-под руки Алексея. — Изящно.
Громов развернулся к клавиатуре терминала, мгновенно забыв о сомнениях. Его пальцы зависли над клавишами на долю секунды, а затем обрушились на пластик. Лабораторию наполнил сухой, пулеметный треск кнопок. Через примитивную программу-монитор он вбивал шестнадцатеричные коды прямо в оперативную память макета, на лету формируя новую таблицу трансляции секторов и подпрограмму низкоуровневой разметки диска.
Морозов молча встал и отошел на пару шагов, скрестив руки на груди. Кризис доверия миновал. Пока что.
Через сорок минут непрерывной работы, поминутно сверяясь с исчерканным блокнотом, Громов ударил по клавише ввода с такой силой, что терминал жалобно скрипнул.
— Заплата готова. Я пересчитал контрольные суммы вручную, — хрипло отрапортовал Евгений. — Подпрограмма разметки висит в памяти. Теперь отформатируем чистую болванку с нужным чередованием, запишем загрузчик, а затем перенесем системные утилиты с нашего московского оригинала. Поскольку дисковод у нас всего один, придется пожонглировать дискетами, перекачивая файлы по кусочкам через оперативку. Давай чистую.
Алексей подошел к столу, у которого стоял ИЗОТ, и подал программисту черную восьмидюймовую болванку.
Следующие полчаса превратились в изматывающее механическое упражнение. Дисковод рычал и клацал шаговым двигателем, а Громов, с красными от недосыпа глазами, поочередно вставлял в широкую щель то московский мастер-диск, то их новую, отформатированную дискету с измененным чередованием секторов.
Наконец, перенос файлов завершился. Евгений извлек исходный диск и бережно убрал его в коробку. Внутри болгарского монстра осталась только их собственная дискета, затвор опустился с громким, лязгающим щелчком, похожим на звук взводимого ружья.
На другом конце лаборатории Олег и Наташа бросили свои паяльники и подошли ближе. Атмосфера сгустилась. Все четверо прекрасно помнили фиаско, когда на этом самом моменте система превратилась в кусок мертвого железа.
— Даю питание на логику, — скомандовал Морозов, щелкнув тумблером на массивном блоке питания. Загудели трансформаторы.
— Инициализация контроллера. Сброс. Старт, — Громов нажал комбинацию клавиш на терминале.
Сначала ничего не происходило. Затем внутри болгарского монстра проснулся тяжелый электродвигатель. Стол под дисководом мелко завибрировал, набирая рабочие обороты шпинделя. Загорелся красный светодиод.
Шаговый искатель дисковода издал резкий, скрежещущий звук. Вжик. Вжик. Механика грубо, но точно позиционировала магнитные головки над нулевой дорожкой.
На экране монитора побежали белые строки инициализации. Ядро процессора считывало байты с магнитного носителя.
Экран моргнул. И в левом верхнем углу появилось лаконичное, сияющее в полумраке приглашение системы:
«A»
Никто не произнес ни слова. Громов сглотнул вязкую слюну. Это была лишь загрузка. Главный тест был впереди. В прошлый раз система умерла именно на попытке прочитать структуру файлов.
Пальцы Евгения зависли над клавиатурой. Он медленно, словно преодолевая физическое сопротивление воздуха, напечатал три буквы.
D. I. R.
И нажал клавишу ввода.
В ту же секунду Олег Тимофеев впился взглядом в экран осциллографа, который был подключен к шине данных макета.
Шаговый двигатель ИЗОТа снова заскрежетал, перескакивая между дорожками. Дисковод начал гнать поток данных в оперативную память.
Зеленая линия на осциллографе дрогнула, но не рассыпалась в хаотичную пилу. Импульсы шли ровными, прямоугольными пакетами. Физическое чередование секторов сработало. Пока под головкой проходили промежуточные сектора, процессор успевал переварить данные, выставить нужный адрес и освободить шину к приходу следующей порции. Никакой аппаратной коллизии.
На экране столбцами побежал текст.
A: BIOS.ASM
A: STAT.COM
A: PIP.COM
A: DUMP.ASM
Список файлов выводился ровно, без единого артефакта, без сбоев и зависаний. Система дышала. Она работала стабильно, подчиняясь логике, вписанной в нее людьми.
Дисковод сухо щелкнул, отводя головки, и красный светодиод погас. Внизу экрана снова зажглось приглашение командной строки, ожидающее новых указаний.
В лаборатории КБ-3 стало тихо. Только монотонно гудели вентиляторы.
Громов медленно откинулся на спинку стула. Он потер воспаленные глаза краем растянутого свитера и посмотрел на Морозова. В его взгляде больше не было подозрений. Было только абсолютное, чистое профессиональное уважение.
— Оно держит, — тихо сказал Евгений. — Шина выдержала. Мы обошли узкое место.
Олег Тимофеев с шумом выдохнул, словно последние пять минут не дышал вообще, и растрепал пятерней свои и без того всклокоченные волосы.
— Идеальная форма сигнала, — подтвердил он, постучав пальцем по стеклу осциллографа. — Шина данных чистая, ни одного всплеска помех. Значит, мы с Наташей можем спокойно допаивать блок арбитража для видеоконтроллера. Если ядро так гладко отрабатывает прерывания дисковода, мы сможем незаметно пропихнуть в циклы ожидания и чтение видеопамяти.
Наташа устало, но счастливо улыбнулась, привалившись плечом к металлическому стеллажу.
Морозов подошел к Громову и тяжело, по-мужски похлопал его по плечу. Ткань свитера под пальцами была влажной от пота.
— Отличная работа, Женя, — сказал Алексей, глядя на мерцающий список файлов. — Вы сделали это. Завтра мы сводим ваш стабильный дисковый ввод-вывод с видеоконтроллером Олега. И если телевизор покажет нам этот же каталог без снега, мы получим полнофункциональный прототип.
Алексей смотрел на макетную плату, на светящиеся экраны, на уставших, измотанных, но светящихся изнутри людей. Внутри него разливалось спокойное, глубокое удовлетворение. Здесь не было пафоса спасения родины или построения светлого будущего. Это было суровое, прагматичное инженерное ремесло. Они брали неподатливый, капризный советский кремний, связывали его законами жесточайшей логики и заставляли работать так, как он работать не должен был. Они шаг за шагом выковывали систему, которая завтра изменит правила игры в этом НИИ, а послезавтра — во всей стране.
— Ладно, архитекторы будущего, — Морозов посмотрел на настенные часы, стрелки которых неумолимо приближались к трем часам ночи. — Обесточиваем стенды. На сегодня чудес достаточно. Завтра нам понадобятся свежие головы, чтобы свести этот зоопарк в единую шину.
Громов потянулся к тумблеру питания ИЗОТа, но на секунду задержал руку, словно прощаясь с живым существом. Щелчок. Экран терминала погас, схлопнувшись в яркую белую точку, которая медленно растаяла во тьме лаборатории. Но каждый из присутствующих знал — система больше не была мертвым железом. Она ждала своего часа.