Дверь лаборатории КБ-3 поддалась не сразу, скрипнув петлями под нажимом плеча. Иван Михайлович Ильин протиснулся в проём спиной вперёд, тяжело ступая стоптанными ботинками по линолеуму. В руках он держал массивную картонную коробку, перевязанную суровой бечёвкой, с размашистыми фиолетовыми штампами ОТК на боку. Следом, так же придерживая вторую коробку снизу, вошёл Морозов.
Воздух лаборатории смешался с запахом холодного складского помещения, промасленной бумаги и технического вазелина.
— Дорогу, — скомандовал Михалыч, кивком указывая на ближайший свободный стол. — И чашки уберите, пока я эту бандуру прямо на них не поставил.
Саша Птицын торопливо сгреб со столешницы провода и пустые чашки. Михалыч с кряхтением опустил коробку на стол. Висящая над ними лампа дневного света едва заметно мигнула. Морозов поставил ношу рядом, выдохнул, разминая затекшие пальцы, и смахнул с рукава пыль.
За дверью в коридоре стояли еще три такие же коробки.
Олег Тимофеев, до этого прозванивавший переплетение проводов на макетной плате цветового модуля, выпрямился, потирая переносицу. Володя Артемьев и Зоя Мельникова, стоявшие у зоны комплектовки, подошли ближе. Даже из дальнего угла, где обитали аналоговики, высунулись две любопытные головы.
— Вот ваши железные драгоценности, — Михалыч хлопнул ладонью по картону, выбивая облачко серой пыли. — Пять ИЗОТов. Добыты с боем, потом и такой-то матерью через зеленоградский контур и товарища майора.
Володя не отрывал взгляда от коробок. Пять абсолютно новых дисководов были редкостью. Зоя уже прикидывала, в какой журнал вписывать серийные номера.
Евгений Громов отодвинулся от клавиатуры.
— Пять штук, — кивнул Громов. — А партия новых машин у нас сколько? Пятнадцать.
— Пока пятнадцать, — ответил Морозов.
— Прекрасная арифметика, — усмехнулся Громов. — Значит, пять машин у нас будут умными, с дисководами и операционной системой, а десять останутся глухими калькуляторами с кассетным магнитофоном? Или мы будем носить эти ИЗОТы по столам, перетыкая шлейфы, пока разъемы не сотрутся в пыль?
— Сергеев обещал выбить еще десять, — сказал Морозов, присаживаясь на край стола. — Но ты сам знаешь, сколько весит обещание без точной даты в накладной. Может, через месяц. Может, к лету. А может, нам пришлют не болгарские ИЗОТы, а что-то другое, что внезапно появится на складе.
Зоя тихонько вздохнула: ровная комплектовка партии не складывалась. Птицын переводил взгляд с Морозова на Громова, пытаясь понять, радоваться дисководам или готовиться к новому авралу.
Михалыч достал из кармана потертого пиджака перочинный нож, щелкнул лезвием и аккуратно, чтобы не повредить картон, разрезал бечёвку на первой коробке. Поднял створки. Внутри, в ложементе из пенопласта и слоях бумаги, лежал дисковод с широкой щелью для восьмидюймовых дискет и массивным рычагом замка.
Громов подошел ближе, сдвинул пенопласт и заглянул внутрь, выискивая разъем для шлейфа данных.
— Массивненько, — оценил он. — Шаговый двигатель, судя по весу, от трактора.
Птицын протиснулся между Михалычем и Громовым, заглядывая в коробку.
— Алексей Николаевич, а разве нельзя просто написать под этот ИЗОТ жесткие процедуры и забыть? — спросил Саша. — У нас же есть описание интерфейса. Шаг вперед, шаг назад, опустить головку, прочитать дорожку. Если мы знаем, что у нас пока только эти пять штук, почему не сделать систему прямо под них? В прошлых «Сферах» ведь тоже ИЗОТы стоят.
Громов шумно выдохнул.
— Саша, — начал он. — Если я напишу систему прямо под этот болгарский трактор, то завтра, когда Михалыч принесет нам не ИЗОТ, а, скажем, киевский накопитель или вообще ГДР-овский «Роботрон», твоя аккуратная программа пойдет прахом. Станет гвоздем, которым намертво прибили дверь.
Морозов поднял руку.
— Женя абсолютно прав, — Морозов взял со стола чистую перфокарту и повернулся к Птицыну и Володе Артемьеву. — Парни, представьте, что прикладная программа — это пассажир в такси, которому нужно доехать до вокзала. Это и есть команда «прочитай сектор». Ему абсолютно все равно, как водитель выжимает сцепление, какой жиклер стоит в карбюраторе и как именно поворачиваются колеса.
Морозов нарисовал на перфокарте две горизонтальные линии, разделив пространство на три слоя.
— Если мы пришьем логику чтения жестко к ИЗОТу, наш пассажир будет вынужден сам рулить. И когда мы поменяем машину на другую, он не сможет ехать, потому что педали будут в другом месте. Наша МикроДОС должна быть разделена. Верхний слой — программы. Средний слой — логика файлов и распределения дискового пространства. А вот нижний слой, самый зависимый от железа, должен прятать в себе всю механику.
Громов коротко кивнул.
— Программа просит: дай мне логический сектор номер десять, — подхватил Громов. — А нижний слой лезет в таблицу параметров. Смотрит: ага, у нас сейчас подключен ИЗОТ. У него столько-то дорожек, такой-то шаг, задержка после перемещения головки — пятнадцать миллисекунд. И сам крутит этот шаговый двигатель. Все остальное железо нас не волнует.
Володя Артемьев, внимательно слушавший разговор, почесал затылок.
— Подождите, Алексей Николаевич. А как мы тогда партию собирать будем? — спросил он. — У нас пятнадцать плат. Если дисководов всего пять, значит, машины будут физически разными? Одни с контроллерами, другие без?
Зоя тут же открыла толстую прошнурованную тетрадь, готовясь записывать.
— Вот именно, — поддержала она Володю. — Как мне их по ведомости проводить? «Сфера-82 полноценная» и «Сфера-82 обделенная»?
Морозов улыбнулся.
— Нет, Володя. Машины будут абсолютно одинаковыми. Системная плата, память, порты — всё это ставится на все пятнадцать штук. Разъем под контроллер дисковода паяем везде. Машина без установленного ИЗОТа остается стандартной «Сферой-82», которая просто ждет свой привод.
— Запиши нормальными словами для паспорта, — попросил Громов Зою. — «Базовая конфигурация, подготовленная к установке накопителя». И пусть только кто-нибудь попробует припаять провода напрямую к плате вместо того, чтобы поставить нормальный разъем. Я лично этому рационализатору руки оторву.
Ближе к полудню в кофейной комнате на шатком столике у окна зашумел электрический чайник. Рядом стояли ручная мельница и несколько кружек.
Морозов стоял у окна, глядя на заснеженный внутренний двор института. Громов сидел на подоконнике с кружкой, в которую плеснул сгущенки. Птицын примостился рядом.
— Пять дисководов на пятнадцать машин, — задумчиво произнес Морозов, не оборачиваясь. — Ждать милости от снабжения мы не можем. Зеленограду нужны рабочие стенды. Школе нужны машины. Нам самим нужно на чем-то гонять тесты.
— Кассеты, — мрачно предложил Громов. — Будем грузить МикроДОС с ленты по десять минут, слушая писк. Как в каменном веке.
— Нет. Это убьет саму идею профессионального рабочего места. Человек не должен ждать загрузки операционной системы дольше, чем выкуривается сигарета. — Морозов повернулся к лаборатории. — Жень, что мы можем достать быстрее и в больших объемах, чем точную механику?
Громов прищурился.
— Кремний. ПЗУшки. Микросхемы памяти достать проще, чем прецизионные моторы.
— Именно. Значит, часть стартовой логики должна переехать в ПЗУ.
Громов резко поставил кружку на подоконник, едва не расплескав кофе.
— Алексей, тормози. Только старт. Если ты сейчас предложишь зашить всю операционную систему в постоянную память, я уволюсь. Я потом каждую ошибку в коде буду исправлять паяльником и ультрафиолетовой лампой! Обновляемость системы — это святое.
Морозов рассмеялся, примирительно подняв руки.
— Успокойся. Только старт. В ПЗУ будет лежать минимальный загрузчик. Таблица входов нижнего слоя. Базовый опрос клавиатуры и вывод на экран, чтобы машина могла хотя бы моргать курсором. И самое главное — она должна уметь прочитать первый блок с диска.
— А если диска нет? — тихо спросил Птицын. — Если это одна из тех десяти машин, которым ИЗОТ не достался?
Морозов ободряюще кивнул.
— Хороший вопрос, Саш. Если диска нет, машина должна запросить этот загрузочный блок по кабелю у той, где он установлен.
Мимо кофейного столика как раз проходила Люба Ветрова. Услышав последнюю фразу, остановилась.
— По кабелю? — переспросила Люба. — Через весь стол? Алексей Николаевич, вы помните, что у нас тут не вакуум? Сначала докажите мне, что этот ваш обмен не будет ловить помеху от каждого включенного паяльника в комнате. И от того, что Михалыч в соседнем кабинете настольную лампу включил.
— Докажем, Люба, — кивнул Морозов. — Будем делать нормальную развязку. Оптопары, коаксиал, правильная земля.
— Ловлю на слове, — Люба поправила очки и пошла дальше.
Громов проводил ее взглядом, чуть прищурившись, и повернулся к Морозову.
— То есть, ты хочешь сказать, что машина без дисковода будет кричать в линию: «Дайте систему!»? — уточнил Громов.
— Да. По тому самому кольцу, — кивнул Морозов. — Узел с дисководом получает маркер и отправляет загрузочный блок по нужному адресу.
Птицын нахмурился, оценивая алгоритм.
— Запросы физически следуют по очереди с маркером. Если загрузки ждут несколько машин, они начнут просить одни и те же блоки друг за другом. Мы получим многократные последовательные чтения дискеты на каждый ответ.
Громов отрицательно качнул головой.
— Предварительное чтение. Ведущий узел при запуске сетевого загрузчика один раз считывает системную область в выделенный буфер ОЗУ. На время загрузки других машин он занят кольцом. На запрос мастер выдает нумерованный блок из буфера. Ошибка контрольной суммы принятого по линии блока ведет к повторной передаче того же блока из оперативной памяти.
— Для передачи используется чистая системная область с дискеты. Текущее содержимое памяти ведущей машины остается в стороне, — добавил Морозов. — Повторное чтение дискеты нужно только после смены системного носителя, нового запуска сетевого загрузчика или в случае, если контрольная сумма самой системной области в буфере не совпала с эталонной.
Они подошли к закрепленному на стене листу ватмана. Морозов взял карандаш и нарисовал четыре прямоугольника, соединив их линиями. Олег Тимофеев оторвался от осциллографа. Наташа Рогова, заполнявшая таблицу уровней сигналов, подошла ближе.
— Наше кольцо, — Морозов коснулся грифелем верхнего прямоугольника. — Здесь машина с ИЗОТом. Узел номер один, мастер-загрузчик. А внизу, — он обвел три нижних прямоугольника, — стоят три рабочие машины, которым привод сейчас не достался. Узлы два, три и четыре.
Птицын внимательно смотрел на ватман. До этого он возился со статусами передачи, а теперь схема требовала написания полноценного загрузчика.
— Саш, стендовый загрузчик — твой участок, — сказал Морозов. — Маркер ходит по кругу. Пустая машина получает право говорить и просит: «Жду загрузочный блок ноль». Узел один ловит запрос, берет данные из буфера, дожидается маркера и выдает блок в линию.
— Я же только базовый обмен с буфером наладил, — произнес Птицын, с тревогой глядя на схему. — Одно дело просто пакеты туда-сюда гонять и ошибки сумм ловить, а тут надо систему в пустую память укладывать и управление ей передавать.
Громов усмехнулся, опираясь плечом о край доски.
— Вот именно. Транспортный уровень ты поднял, молодец. Теперь поверх этих пакетов тебе надо написать строгий автомат, о котором мы только что говорили. Цикл приема блока, склейка в памяти, подтверждение или повтор. И так по кругу, без самодеятельности, пока весь стартовый код не окажется в оперативной памяти.
— А сколько байтов в блоке? — спросил Птицын.
— Не больше ста двадцати восьми, — не задумываясь, ответил Громов, — Небольшой кусок. Чтобы не съедать рабочую область буферами, и чтобы, если помеха его побьет, можно было быстро запросить его заново.
Олег Тимофеев шагнул вперед, глядя на схему.
— Кольцо на доске и кольцо на монтажном столе — это разные физические миры, Алексей Николаевич, — заметил он, крутя в пальцах обрезок провода. — Нам нужны аккуратные коаксиальные кабели. Нормальные байонетные разъемы на задней стенке. И понятное поведение линии, если кто-то пнет кабель ногой или выдернет его на ходу. Кольцо не должно обрываться целиком из-за одного дурака.
— И делать это все будем последовательно, — сказала Наташа, — Сначала стабильное кольцо на двух узлах. Снимаем уровни, пишем в протокол. Если чисто — цепляем третью машину. И только потом, Саша, пускаем твой реальный загрузочный блок, а не всё сразу.
Морозов кивнул, соглашаясь со всеми условиями. Схема на доске постепенно обрастала реальными номиналами и допусками.
— Принято, — кивнул Морозов. — Саш, слышал Наташу? Сначала стабильная физика на двух узлах, потом транзит, потом обрыв.
Птицын глубоко вздохнул, пряча исписанный блокнот в карман.
Пять коробок с дисководами стояли у стены. Володя Артемьев раскладывал на столе системные платы, сверяя их с чертежами. Зоя сидела за столом над ведомостью.
Михалыч стоял рядом.
— Значит так, молодежь, — гудел Михалыч. — Железо само себя не учтет. У меня на балансе пятнадцать комплектов деталей для плат и пять приводов. Дефицит не должен расползтись по ящикам. Каждая пайка — строго по схеме.
Володя поднял голову от платы.
— Иван Михайлович, Алексей Николаевич, — позвал он, заметив проходящего мимо Морозова. — Я хочу уточнить. Если мы собираем одинаковые машины под кольцо, значит, на каждой из пятнадцати плат я должен впаять разъем для сетевого кабеля? И микросхемы приемопередатчиков?
— Верно, Володя, — подтвердил Морозов, останавливаясь. — Схема сопряжения для кольца становится базовой комплектацией «Сферы-82».
— А ПЗУ с загрузчиком? — не унимался Володя. — Его тоже на все пятнадцать?
— На все. Даже та машина, у которой будет свой ИЗОТ, должна иметь возможность загрузиться по сети, если ее собственный привод выйдет из строя.
Зоя пощелкала костяшками счетов.
— Алексей Николаевич, тогда как мне маркировать готовые изделия? — спросила она. — Они же вроде одинаковые, но на деле — разные.
Морозов придвинул стул и сел рядом со сборщиками.
— Зоя, давай добавим в паспорт раздел для отметок контроля. База у всех одинаковая. Пиши: «дисковый тракт проверен с эталоном», «сетевой обмен проверен» и подписи. А в самом конце просто указывай комплектацию: либо номер локального ИЗОТа, либо «режим ожидания накопителя».
Михалыч кивнул.
— Вот это дело. Без бумажки мы букашки, а с бумажкой — вычислительный центр. Пять ИЗОТов прямо сейчас получат инвентарные номера краской на задней стенке. Я вам не дам их путать.
Громов крикнул из-за соседнего стола:
— И подпишите на каждом приводе, по какой таблице параметров его отстроили! А то вы их потом перепутаете, и мы будем полдня искать, почему одна машина читает нормально, а другая хрустит головками, как трактор на щебёнке!
Михалыч погрозил Громову сухим, узловатым пальцем, но спорить не стал. Он и сам понимал, что программист прав.
Вечером Морозов подошел к столу видеогруппы. Олег и Наташа сидели перед раскрытым телевизором. На экране светилась стабильная, хотя и грубоватая цветная мозаика — результат работы второго, графического режима видеоплаты «Сферы-82».
Морозов долго смотрел на экран. Цвета были чистыми, границы прямоугольников почти не дрожали. Наташа проделала огромную работу по стабилизации синхросигналов.
— Работает, — негромко сказал Морозов. — Выжали из кинескопа максимум.
— Работает, — эхом отозвалась Наташа, не отрывая взгляда от осциллографа. — Прогрев держит. Питание Люба вылизала, наводок по земле почти нет.
— Хорошо, — сказал Морозов. — С новой машиной понятно. А схему приставки для старой «Сферы-80» пора готовить к публикации.
Олег отложил отвертку:
— Я тут прикидывал. Журнальную доработку надо описать максимально просто. Радиолюбитель или кружок спаяет её на коленке из доступных деталей.
Громов подошел к их столу.
— Главное, чтобы старая машина оставалась черно-белой по умолчанию, — напомнил он. — Основной видеовывод не трогаем.
— Не трогаем, — кивнул Олег. — Плата расширения просто слушает определенный порт. Программа пишет текст, как обычно, а потом кидает координаты и код цвета. Приставка подмешивает цвет поверх монохрома. Никакой графики, только раскраска букв и фона. Схемотехнически это не так сложно: регистр-защелка, немного логики, простой ЦАП на резисторах.
— И программное управление простейшее, — добавил Громов. — Вызов порта командой OUT в Бейсике. Пока никаких переделок ПЗУ.
Пусть сначала побалуются раскраской из-под Бейсика или через маленькую кассетную библиотеку. Если приживется — тогда будем думать о новой версии системы для восьмидесятых. Главное — чтобы старая программа даже не догадывалась, что она работает в цвете, пока сама его не попросит.
Птицын, пришедший забрать осциллограф, с интересом спросил:
— А мои цветовые тесты, которые я для 82-й машины написал, придется сильно переделывать под эту приставку?
Громов усмехнулся.
— Придется, Саша. Адресация портов другая. И мы это обязательно перепишем. Но только после того, как ты покажешь мне, как твой сетевой загрузчик без ошибок загружает систему в пустую память по кольцу десять раз подряд.
На центральном столе стоял один из распакованных дисководов ИЗОТ. Толстый плоский шлейф тянулся от него к плате опытной «Сферы-82». Володя Артемьев наклеивал на заднюю панель привода бирку с инвентарным номером.
Зоя Мельникова сидела за столом, перенося карандашные отметки в чистовик ведомости. В графе «Комплектация» напротив первых пяти номеров появились галочки, а напротив остальных десяти — четкая надпись: «Резерв под локальный накопитель».
Громов выписывал на листке системные входы для нового нижнего слоя МикроДОС.
Морозов стоял у стены. На столе между двумя платами «Сфер» лежал первый спаянный коаксиальный кабель с массивными разъемами.
Птицын сидел перед экраном второй, «бездисковой» машины. Он запустил простейшую проверочную программу — пока еще не полноценную загрузку по линии связи, а только тест физического уровня поверх программы опроса кольца.
На экране моргнул курсор. Затем появилась строчка:
УЗЕЛ 2: ЗАПРОС МАРКЕРА…
Спустя долю секунды, когда первая машина обработала сигнал и перевела линию в нужное состояние, на экране Птицына высветилось:
МАРКЕР ПРИНЯТ. ПЕРЕДАЧА ТЕСТОВОГО БАЙТА… ОК.
Морозов смотрел на светящиеся буквы. Коробки с дисководами так и стояли у стены — пять штук на пятнадцать машин. Он подошел к столу Птицына, проверил подключение сетевого кабеля к разъему системной платы и кивнул.