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